前回は MqlTradeResult構造体 について解説しました。
改めて前回の内容をおさらいをしておくと、
- MqlTradeResult構造体は、トレードサーバーに送られた注文内容の結果がどうなったのかを受け取る役割を担っている。
- MqlTradeResult構造体は注文が正しく行われたかどうかの確認と、正しく行われなかった場合の回路を組み込むために主に利用される。
- メンバ変数 .retcode には注文の成功/失敗(失敗理由)が格納される。
- メンバ変数 .retcode に格納されている値が、コード10008(TRADE_RETCODE_PLACED)と10009(TRADE_RETCODE_DONE)の場合は注文が成功。それ以外のコード値が格納されている場合、何らかの問題があったことを示す。
ということをお伝えしました。
さて、【中級・実際にEAを作ろう編】に突入してからの、直近5回の講座記事でEAから注文を出すための知識は身についたはずです。
- 第57回「ネッティングとヘッジング」
- 第58回「成行注文と執行方式について」
- 第59回「フィルポリシーについて」
- 第60回「OrderSend関数とMqlTradeRequest構造体」
- 第61回「MqlTradeResult構造体について」
今回は、今までの知識を使って、実際に注文を出す記述を、順を追って書いていきたいと思います。
MqlTradeRequest構造体とMqlTradeResult構造体のインスタンスを宣言する。
今回は成行買い注文を入れるプログラムを記述していきます。
まず最初にやることは、MqlTradeRequest構造体とMqlTradeResult構造体のインスタンスを宣言することです。
void OnStart()
{
//MqlTradeRequest構造体とMqlTradeResult構造体のインスタンスを宣言
MqlTradeRequest request={};
MqlTradeResult result={};
}
request と result というインスタンスが完成しました。
構造体の各メンバの初期値をまとめてゼロにリセットするには、インスタンスに空白の{}を代入するか、ZeroMemory関数を使います。この初期値リセットが行われていないと売買がされない可能性がありますので確実に記述しておくようにしましょう。
構造体のメンバをまとめて初期化する手順、ZeroMemory関数などについては↓の記事で言及しておりますのでご参照ください。
これで、まずはOrderSend関数に渡す引数ができたことになります。
これをたたき台にして、MqlTradeRequest構造体のインスタンスであるrequest の各メンバに、成り行き買い注文に必要な値を記述していきます。
MqlTradeRequest構造体の各メンバに必要な値を入れていく
成行買い、ロットは0.1ロット、取引銘柄はプログラムを実行するチャートの銘柄、ストップロスとテイクプロフィットは設定しない。
という前提でサンプルコードを記述します
request.action=TRADE_ACTION_DEAL;
成行注文なので、.action にはTRADE_ACTION_DEALを設定します。
request.type=ORDER_TYPE_BUY;
買い注文なので、.type にはORDER_TYPE_BUYを設定します。
request.symbol=_Symbol;
取引銘柄はプログラムを実行するチャートの銘柄を指定したいので、.symbolには定義済み変数_Symbolを設定します。
request.volume=0.1;
ロット数は0.1としたいので、.Volumeは0.1とします。
request.type_filling=ORDER_FILLING_IOC;
フィルポリシーを設定する.type_fillingですが、どのフィルポリシーを選択すればよいのかは、執行方式によって変わります。コチラの→フィルポリシーの確認方法をご参照ください。
※現在私がサンプルコードの挙動確認しているのがXMTradingであり、確認の結果選択すべきフィルポリシーはORDER_FILLING_IOCと判明しているので、.type_fillingには今回ORDER_FILLING_IOCを設定します。
request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
成行の買い注文なので、注文価格を設定する.Price にはAsk値が入ります。Ask値を取得するには、SymbolInfoDouble関数を使います。第2引数に、定数SYMBOL_ASKを記述することによって取得できます。
request.sl=0;
request.tp=0;
今回はストップロス(損切り価格)とテイクプロフィット(利益確定価格)は設定しないので、.sl と.tpには0を入れておきます。
request.deviation=3;
スリッページを設定する.deviationについてですが、XMTradingの執行方式がmarket執行方式のため、値入力は省略してもいいのですが、もしinstant執行方式またはRequest執行方式の場合は入力する必要があります。一応.deviation にも暫定的に「3」 という数字を入れておきます。
request.magic=1234;
マジックナンバーを設定する.magicには「1234」 という数字を便宜上設定しました。
今回は直接数字を入力しましたが、マジックナンバーはinput変数を使ってパラメータ化したものを代入できるようにしておくのが、便利で一般的です。
input変数については↓の記事をご覧ください。
とりあえずこれで、各メンバの値設定は完了しました。
わからなくなってきたら、各用語のリンクをクリックして調べられるようになっているので都度確認していただければと思います。
メンバの値設定が完了したら、次はOrderSend関数を記述します。
OrderSend関数を記述する。
OrderSend関数の記述については、requesとresultというMqlTradeRequest構造体とMqlTradeResult構造体をデータ型としたインスタンスをそれぞれ第1引数と第2引数をOrderSend関数に記述するだけです。
OrderSend関数の後の記述は、前回も使ったものです。
MqlTradeResult構造体のメンバである.retcodeに格納されている値が10008(TRADE_RETCODE_PLACED)もしくは10009(TRADE_RETCODE_DONE)なのか、
それ以外なのかで注文の成否を確認する記述です。
OrderSend(request,result);
if(result.retcode==TRADE_RETCODE_PLACED ||result.retcode==TRADE_RETCODE_DONE)
{
Print("注文が成功しました。 リターンコード= ",result.retcode);
}
else Print("注文が失敗しました。リターンコード= ",result.retcode);
全体のコード
全体のコードは以下のようになっています
// スクリプトが実行されたときに呼び出される特別な関数
void OnStart()
{
// MqlTradeRequest構造体のインスタンスを初期化。取引リクエストのパラメータを設定するために使用
MqlTradeRequest request={};
// MqlTradeResult構造体のインスタンスを初期化。取引の結果を受け取るために使用
MqlTradeResult result={};
// 取引のアクションタイプを指定 (TRADE_ACTION_DEAL = 即時実行)
request.action=TRADE_ACTION_DEAL;
// 注文のタイプを指定 (ORDER_TYPE_BUY = 買い注文)
request.type=ORDER_TYPE_BUY;
// 取引する通貨ペアを指定 (現在選択している通貨ペア)
request.symbol=_Symbol;
// 取引量を指定 (ここでは0.1ロット)
request.volume=0.1;
// 注文の執行方式を指定 (ORDER_FILLING_IOC = Immediate or Cancel、即時実行またはキャンセル)
request.type_filling=ORDER_FILLING_IOC;
// 注文の価格を指定 (現在のAsk価格)
request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
// ストップロス価格を0に設定 (使用しない場合)
request.sl=0;
// テイクプロフィット価格を0に設定 (使用しない場合)
request.tp=0;
// 価格の逸脱度を指定 (最大3ポイントの逸脱を許容)
request.deviation=3;
// 注文に割り当てるマジックナンバーを指定 (EAが注文を識別するために使用)
request.magic=1234;
// 注文送信関数を実行し、結果をresultに格納
OrderSend(request,result);
// 注文の結果をチェック (TRADE_RETCODE_PLACED または TRADE_RETCODE_DONE = 注文が成功した場合)
if(result.retcode==TRADE_RETCODE_PLACED || result.retcode==TRADE_RETCODE_DONE)
{
// 注文成功のメッセージを出力
Print("注文が成功しました。 リターンコード= ", result.retcode);
}
else
{
// 注文失敗のメッセージを出力
Print("注文が失敗しました。リターンコード= ", result.retcode);
}
}
プログラムを実際に実行してみると・・・↓
まとめ
今回は 今までの知識を生かして実際に成り行き買い注文を出すコード について順を追って解説しました。
今回の記事では以下のことを学びました
注文は、
・MqlTradeRequest構造体とMqlTradeResult構造体のインスタンスを宣言する。
↓
・MqlTradeRequest構造体の各メンバに必要な値を入れていく。
↓
・OrderSend関数を記述する。
というプロセスで記述していく。
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
コメント