前回は、「発注判定」のプログラミングについて書きました。 今回は、その「発注判定」プログラムを活かして、「ドテン決済」するプログラムの書き方です。
この「ドテン決済」のプログラムの書き方・理屈がわかれば、これまでの記事で、最低限必要な「発注」~「決済」のプログラミングができる様になります。
※ 説明に使用する「無料EAサンプル」を、入手されていない方は、以下のリンクからダウンロードしてください。
→ 「無料EAサンプル」ダウンロードへ
●「1.2移動平均交差システム-1」
2つの移動平均線が交差したタイミングで売買します。 MT4組み込み
テクニカル指標のiMA()関数を使用しています。
ファイル名:CEF2MACross_01.mq4
1.ドテン決済プログラミングの考え方
さて「ドテン決済」は、「発注判定」での買い・売りシグナルが逆になった場合に、保有中のポジションを決済し、反対方向の新規ポジションの発注をします。
ドテン決済の流れを図で表すと、以下の様なイメージです。
つまり「ドテン決済」は、本来的に「発注判定」のプログラムを流用する事ができる概念です。
2.具体的なプログラミングの方法
さて、具体的なプログラミング方法についてです。 サンプルEAで使われている「COMFFERED MT4 EA Framework」での決済プログラムは、コールバック関数「EAToClose()」内に書きます。
※ 「EAToClose()」の詳細は、ユーザーズガイド「4.1.5 コールバック関数:EAToClose()」を参照ください。
しかし、実際にプログラミングする事は、発注判定のプログラムを呼び出し、現在のポジションと反対方向のシグナルが出ているか確認するだけです。 実はこのプログラムは、製品が提供しているMQ4形式テンプレート・ファイルに書かれており、EA作成者は特段、プログラムを追加で書く必要がありません。
具体的には、MQ4形式テンプレート・ファイルで、以下の様に書かれています。
bool EAToClose(int vTicket , double vCmd, int vCond, int vOrderBarIdx , int vBarIdx)
{
bool result = FALSE;
double openPrice , slPrice , targetPrice , lots;
//-- ここに処理を記述する
// 決済したい場合は、resultにTRUEを代入する
// if( 何か条件式 ) result = TRUE;
if( !result ) result = EAToOrder(vCmd*(-1),1, FALSE , vBarIdx, openPrice , slPrice , targetPrice , lots); // ドテンによる手仕舞い
//--
return (result);
}
今回一番のミソは、上記プログラムの下線部です。
3.プログラムの解説
呼び出している「EAToOrder」は、お客様が発注判定をプログラミングする「コールバック関数」です。 ここで第一引数の「vCmd*(-1)」の部分で、現在のポジションの向きと反対方向のシグナルを指定します。
この「EAToOrder」の結果がTRUE(真)であれば、反対方向のシグナルが出た、という事ですので、結果、EAToClose()からTRUEが返却され、製品側で決済オーダをFX業者に送信します。
「vCmd」には、現在のポジションの向きが数値で格納されており、「買いポジション」であれば「1」、「売りポジション」であれば「-1」です。 つまり前述のプログラムの様に、vCmdに「-1」を掛けることで符号を逆転させ、現在のポジションと逆向きのポジションを表す数値に変換する事ができます。
次回も、サンプルを使ったEAプログラミングの続きを説明しようと思います。
ご不明な点は、お気軽にお問合せください。
ご質問は、ブログコメント以外にも、以下でお待ちしています。
ご不明な点は、お気軽にご質問ください。
【 問い合わせ先 】