ご存知かもしれませんが、外国為替(外国為替、またはFX)市場は、通貨ペア間の取引に使用されます。しかし、それが世界で最も流動性の高い市場であることに気付いていないかもしれません。
githubを使用してWebサイトをホストする方法
数年前、好奇心に駆られて、デモ口座を作成し、(偽のお金で)シミュレーションを実行することで、外国為替アルゴリズム取引の世界への第一歩を踏み出しました。 メタトレーダー4 取引プラットフォーム。
1週間の「取引」の後、私はお金をほぼ2倍にしました。私自身の成功したアルゴリズム取引に刺激されて、私はより深く掘り下げ、最終的に多くのFXフォーラムにサインアップしました。すぐに、私はアルゴリズム取引システム(購入するか販売するかを決定するルールセット)について読むことに何時間も費やしていました。 カスタムインジケーター 、市場のムードなど。
この頃、偶然にも、誰かが単純な取引システムを自動化するソフトウェア開発者を見つけようとしていると聞きました。これは私が学んでいた大学時代に戻った 並行プログラミング Java(スレッド、セマフォ、その他すべてのジャンク)。この自動化されたシステムは、私よりもはるかに複雑になることはないと思いました 高度なデータサイエンス コースワークなので、仕事について聞いて乗船しました。
クライアントは、で構築されたアルゴリズム取引ソフトウェアを望んでいました MQL4 、株式関連のアクションを実行するためにMeta Trader4プラットフォームで使用される関数型プログラミング言語。
MQL5 その後リリースされました。ご想像のとおり、MQL4の問題のいくつかに対処し、より多くの組み込み関数が付属しているため、作業が楽になります。取引プラットフォーム(この場合はMeta Trader 4)の役割は、外国為替ブローカーへの接続を提供することです。次にブローカーは、市場に関するリアルタイムの情報をプラットフォームに提供し、買い/売り注文を実行します。外国為替取引に慣れていない読者のために、データフィードによって提供される情報は次のとおりです。
Meta Trader 4を介して、さまざまな時間枠でアクセス可能な内部機能を使用してこのすべてのデータにアクセスできます:毎分(M1)、毎分(M5)、M15、M30、毎時(H1)、H4、D1、W1、MN 。
現在の価格の動きは、 ティック 。言い換えれば、ティックは通貨ペアのビッドまたはアスク価格の変化です。活発な市場では、1秒あたりのティック数が多い場合があります。遅い市場では、ティックなしで数分かかることがあります。 ティックは、通貨市場ロボットの鼓動です。
あなたがそのようなプラットフォームを通して注文するとき、あなたは 購入 または 売る 特定の通貨の特定のボリューム。また、ストップロスとテイクプロフィットの制限を設定します。ザ・ ストップロス制限 の最大量です ピップ (価格変動)取引をあきらめる前に失う余裕がある。ザ・ 利益制限 キャッシュアウトする前にあなたが有利に蓄積するピップの量です。
取引の基本(ピップ、注文タイプ、スプレッド、スリッページ、成行注文など)について詳しく知りたい場合は、を参照してください。 ここに 。クライアントのアルゴリズム取引の仕様は単純でした。彼らは2つの指標に基づく外国為替ロボットを望んでいました。背景については、指標は 非常に 過去のデータ(過去の最高価格など)に基づいているため、市場の状態を定義して取引の意思決定を行う際に役立ちます n 日々)。多くはメタトレーダー4に組み込まれています。しかし、私のクライアントが興味を持っていた指標はカスタム取引システムから来ました。
彼らは、これらのカスタムインジケーターの2つが交差するたびに、特定の角度でのみ取引したいと考えていました。
手を汚すと、MQL4プログラムの構造が次のようになっていることがわかりました。
開始関数は、市場が動くたびに実行されるため、すべての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 0) { ticket=0; return(0); } } else Print('OrderSelect failed error code is',GetLastError()); if (ordAbierta == 'OP_BUY' && dragon_min = 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ロボットの有用性に警戒感を覚えましたが、 外部パラメータをいじり始めたとき、私は興味をそそられ、全体的な収益率に大きな違いがあることに気づきました。 この特定の科学はとして知られています パラメータの最適化 。
C ++でヘッダーファイルをコンパイルする方法
リターンレシオの外部パラメータの重要性を推測するためにいくつかの大まかなテストを行い、次のようなものを思いつきました。
または、クリーンアップ:
(私がしたように)パラメータAを使用する必要があると思うかもしれません。しかし、決定は見た目ほど簡単ではありません。具体的には、 予測不可能 パラメータAの:小さなエラー値の場合、その戻り値は劇的に変化します。言い換えると、パラメータAは、不確実性やシフトが発生するとパフォーマンスが低下するため、将来の結果を過大に予測する可能性が非常に高くなります。
しかし、確かに、将来は不確実です!したがって、パラメータAの戻り値も不確実です。実際、最良の選択は、予測不可能性に依存することです。多くの場合、最大リターンは低いが予測可能性が優れている(変動が少ない)パラメーターは、リターンは高いが予測可能性が低いパラメーターよりも望ましいでしょう。
あなたが確信できる唯一のことは、あなたが市場の将来を知らないということです、そして 過去のデータに基づいて市場がどのように機能するかを知っていると考えるのは間違いです。 次に、外国為替予測でこの予測不可能性を認める必要があります。
過去のデータに基づいて市場がどのように機能するかを知っていると考えるのは間違いです。これは、必ずしもパラメーターBを使用する必要があることを意味するわけではありません。パラメーターAのリターンが低くても、パラメーターBよりもパフォーマンスが優れているためです。これは、パラメータの最適化により、将来の結果の可能性を誇張するテストが発生する可能性があることを示しているだけであり、そのような考え方は明らかではありません。
その最初のアルゴリズムによる外国為替取引の経験以来、私はクライアントのためにいくつかの自動取引システムを構築してきました。調査し、さらに外国為替分析を行う余地は常にあると言えます。たとえば、私は最近、いわゆる「ビッグフィッシュ」の動きを見つけることに基づいたシステムを構築しました。つまり、時間の小さな単位での巨大なピップのバリエーションです。これは私を魅了する主題です。
独自のFXシミュレーションシステムを構築することは、外国為替市場の取引についてさらに学ぶための優れたオプションであり、可能性は無限大です。たとえば、ある市場(たとえば、EUR / USD)のボラティリティの関数として価格変動の確率分布を解読し、ボラティリティ状態ごとの分布を使用して、モンテカルロシミュレーションモデルを作成することができます。あなたが望む精度。これは演習として残しておきます 熱心な 読者。
外国為替の世界は時々圧倒される可能性がありますが、この記事があなた自身の外国為替取引戦略を始める方法についてあなたにいくつかのポイントを与えたことを願っています。
今日、トレーディングシステムの自動化を構築、テスト、改善するためのツールの膨大なプールがあります。 Bloxの取引 検査用の、 NinjaTrader 取引のために、 OCaml プログラミングのために、いくつか例を挙げると。
私は通貨市場である不思議な世界について広く読みました。プログラマーや熱狂的な読者に私がお勧めするいくつかの記事を次に示します。
外国為替(またはFX)取引は、外国為替市場で通貨ペア(USDとEURなど)を介して売買します。
外国為替ブローカーは手数料と手数料を通じてお金を稼ぎます。外国為替トレーダーはタイミングに基づいてお金を稼ぐ(または失う):彼らが購入したときと比較して十分に高く売ることができれば、彼らは利益を上げることができます。
バックテストは、過去のイベントを使用して特定の戦略またはシステムをテストするプロセスです。
アルゴリズム取引とは、ロボット/プログラムが、いつ購入または売却するかを指示する一連のルールを使用する場合です。