外国為替アルゴリズム取引:エンジニアのための実用的な物語
公開: 2022-03-11ご存知かもしれませんが、外国為替(外国為替、またはFX)市場は、通貨ペア間の取引に使用されます。 しかし、あなたはそれが世界で最も流動的な市場であることを知らないかもしれません。
数年前、好奇心に駆られて、メタトレーダー4取引プラットフォームでデモ口座を作成し、シミュレーションを(偽金で)実行することで、外国為替アルゴリズム取引の世界に最初の一歩を踏み出しました。
「取引」の1週間後、私はお金をほぼ2倍にしました。 私自身の成功したアルゴリズム取引に刺激されて、私はより深く掘り下げ、最終的には多くのFXフォーラムにサインアップしました。 すぐに、私はアルゴリズム取引システム(購入するか販売するかを決定するルールセット)、カスタムインジケーター、市場の気分などについて何時間も読んでいました。
私の最初のクライアント
この頃、偶然にも、誰かが単純な取引システムを自動化するソフトウェア開発者を見つけようとしていると聞きました。 これは、Javaでの並行プログラミング(スレッド、セマフォ、その他すべてのジャンク)について学んでいた大学時代にさかのぼります。 この自動化されたシステムは、私の高度なデータサイエンスコースの仕事よりもはるかに複雑ではないと思ったので、仕事について尋ねて、参加しました。
クライアントは、株式関連のアクションを実行するためにMetaTrader4プラットフォームで使用される関数型プログラミング言語であるMQL4で構築されたアルゴリズム取引ソフトウェアを望んでいました。
取引プラットフォーム(この場合はMeta Trader 4)の役割は、外国為替ブローカーへの接続を提供することです。 次にブローカーは、市場に関するリアルタイムの情報をプラットフォームに提供し、売買注文を実行します。 外国為替取引に慣れていない読者のために、データフィードによって提供される情報は次のとおりです。
Meta Trader 4を介して、さまざまな時間枠でアクセス可能な内部機能を使用してこのすべてのデータにアクセスできます:毎分(M1)、毎分(M5)、M15、M30、毎時(H1)、H4、D1、W1、MN 。
現在の価格の動きはティックと呼ばれます。 言い換えれば、ティックは通貨ペアのビッドまたはアスク価格の変化です。 活発な市場では、1秒あたりのティック数が多い場合があります。 遅い市場では、ダニなしで数分かかることがあります。 ダニは、通貨市場のロボットの鼓動です。
このようなプラットフォームを介して注文する場合、特定の通貨の特定のボリュームを売買します。 また、ストップロスとテイクプロフィットの制限を設定します。 ストップロスリミットは、トレードをあきらめる前に失う余裕のあるピップ(価格変動)の最大量です。 テイクプロフィットの制限は、キャッシュアウトする前にあなたが有利に蓄積するピップの量です。
クライアントのアルゴリズム取引の仕様は単純でした。彼らは2つの指標に基づく外国為替ロボットを望んでいました。 背景として、指標は過去のデータ(たとえば、過去n日間の最高価格値)に基づいているため、市場の状態を定義して取引の決定を行う際に非常に役立ちます。 多くはメタトレーダー4に組み込まれています。しかし、私のクライアントが興味を持っていた指標はカスタム取引システムから来ました。
彼らは、これらのカスタムインジケーターの2つが交差するたびに、特定の角度でのみ取引したいと考えていました。
ハンズオン
手を汚すと、MQL4プログラムの構造が次のようになっていることがわかりました。
- [プリプロセッサディレクティブ]
- 【外部パラメータ】
- [グローバル変数]
- 【初期化機能】
- [Deinit関数]
- 【スタート機能】
- 【カスタム機能】
スタート関数は、市場が動くたびに実行されるため、すべてのMQL4プログラムの中心です(エルゴ、この関数はティックごとに1回実行されます)。 これは、使用している時間枠に関係なく当てはまります。 たとえば、H1(1時間)の時間枠で操作していても、開始関数は時間枠ごとに何千回も実行されます。
これを回避するために、関数を期間単位ごとに1回実行するように強制しました。
int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...
インジケーターの値を取得する:
// Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }
インジケーターとその角度の交点を含む決定ロジック:
int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }
注文の送信:
void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }
興味がある場合は、GitHubで実行可能な完全なコードを見つけることができます。

バックテスト
アルゴリズム取引システムを構築したら、1)それが適切に動作しているかどうか、2)それが使用した外国為替取引戦略が何か良いかどうかを知りたいと思いました。
バックテスト(「バックテスト」と書かれることもあります)は、過去のイベントの下で特定の(自動化されているかどうかに関係なく)システムをテストするプロセスです。 つまり、過去を現在のプロキシとして使用してシステムをテストします。
MT4には、外国為替取引戦略をバックテストするための許容可能なツールが付属しています(現在、より優れた機能を提供するより専門的なツールがあります)。 まず、時間枠を設定し、シミュレーションの下でプログラムを実行します。 ツールは、各ユニットについて特定の価格で開き、特定の価格で閉じ、指定された高値と安値に到達する必要があることを認識して、各ティックをシミュレートします。
プログラムのアクションを過去の価格と比較すると、プログラムが正しく実行されているかどうかがわかります。
バックテストから、FXロボットのリターン率をランダムな時間間隔でチェックしました。 言うまでもなく、私はクライアントがそれで金持ちにならないことを知っていました—彼が選んだ指標と決定ロジックは有益ではありませんでした。 サンプルとして、164回の操作でM15ウィンドウ上でプログラムを実行した結果を次に示します。
バランス(青い線)が開始点より下で終了していることに注意してください。
パラメータの最適化とその嘘
バックテストでこのFXロボットの有用性に不安を感じていましたが、外部パラメーターを試してみると、全体的なリターン率に大きな違いがあることに気づき、興味をそそられました。 この特定の科学は、パラメータ最適化として知られています。
リターンレシオの外部パラメータの重要性を推測するためにいくつかの大まかなテストを行い、次のようなものを思いつきました。
または、クリーンアップ:
(私がしたように)パラメータAを使用する必要があると思うかもしれません。しかし、決定は見た目ほど簡単ではありません。 特に、パラメータAの予測不可能性に注意してください。小さなエラー値の場合、その戻り値は劇的に変化します。 言い換えると、パラメータAは、不確実性やシフトが発生するとパフォーマンスが低下するため、将来の結果を過大に予測する可能性が非常に高くなります。
しかし、確かに、将来は不確実です! したがって、パラメータAの戻り値も不確実です。 実際、最良の選択は、予測不可能性に依存することです。 多くの場合、最大リターンは低いが予測可能性が優れている(変動が少ない)パラメーターは、リターンは高いが予測可能性が低いパラメーターよりも望ましいでしょう。
唯一確信できるのは、市場の将来がわからないということです。過去のデータに基づいて市場がどのように機能するかを知っていると考えるのは間違いです。 次に、外国為替予測でこの予測不可能性を認める必要があります。
これは、必ずしもパラメーターBを使用する必要があることを意味するわけではありません。パラメーターAのリターンが低い場合でも、パラメーターBよりもパフォーマンスが優れているためです。 これは、パラメータの最適化により、将来の結果の可能性を誇張するテストが行われる可能性があることを示しているだけであり、そのような考え方は明らかではありません。
全体的な外国為替アルゴリズム取引の考慮事項
その最初のアルゴリズムによる外国為替取引の経験以来、私はクライアントのためにいくつかの自動取引システムを構築してきました。そして、調査する余地が常にあり、さらに外国為替分析を行う必要があると言えます。 たとえば、私は最近、いわゆる「ビッグフィッシュ」の動きを見つけることに基づいたシステムを構築しました。 つまり、時間の小さな単位での巨大なピップのバリエーションです。 これは私を魅了する主題です。
独自のFXシミュレーションシステムを構築することは、外国為替市場の取引についてさらに学ぶための優れたオプションであり、可能性は無限大です。 たとえば、ある市場(たとえば、EUR / USD)のボラティリティの関数として価格変動の確率分布を解読し、ボラティリティ状態ごとの分布を使用して、モンテカルロシミュレーションモデルを作成することができます。あなたが望む精度。 これは熱心な読者のための演習として残しておきます。
外国為替の世界は時々圧倒される可能性がありますが、この記事があなた自身の外国為替取引戦略を始める方法についてあなたにいくつかのポイントを与えたことを願っています。
参考文献
今日では、トレーディングシステムの自動化を構築、テスト、改善するためのツールが数多くあります。たとえば、テスト用のTrading Blox、トレーディング用のNinjaTrader、プログラミング用のOCamlなどです。
私は通貨市場である不思議な世界について広く読んだことがあります。 プログラマーや熱狂的な読者に私がお勧めするいくつかの記事を次に示します。
- BabyPips:これは、外国為替取引についてスクワットを知らない場合の出発点です。
- カーティス・フェイスによるカメの道:これは、私の意見では、外国為替聖書です。 取引の経験があり、いくつかの外国為替戦略を知ったら、それを読んでください。
- トレーディングプロフェッショナルのための技術分析—コンスタンスM.ブラウンによる、今日の激動するグローバル金融市場のための戦略とテクニック
- エキスパートアドバイザープログラミング– AndrewR.YoungによるMetaTrader4のMQLでの自動トレーディングシステムの作成
- トレーディングシステム–アーバンジェックルとエミリオトマシーニによるシステム開発とポートフォリオ最適化への新しいアプローチ:非常に技術的で、FXテストに非常に焦点を当てています。
- Rui PedroBarbosaとOrlandoBeloによるマルチエージェント通貨取引システムのステップバイステップの実装:これは非常に専門的で、取引システムとテストプラットフォームを作成する方法を説明しています。