EAで売買注文を出すコード OrderSend() | MT5 EA

EA を作るにあったって、何はなくとも売買注文を出さなければ!そんなわけで、 OrderSend() をコーディング。

OrderSend() 成行の買い注文

MQL 5 は、オブジェクト指向プログラミング(OOP)スタイルです。MQL4で売買注文を出すコードとお作法が少々異なります。

void OnTick(){
  MqlTradeRequest req; // 取引リクエスト
  MqlTradeResult  res; // 取引結果

  req.action=TRADE_ACTION_DEAL; // 成行注文の即時実行
  req.magic=12345; // マジックナンバー
  req.symbol="USDJPY"; // 銘柄名
  req.volume=0.1; // ロット
  req.price=SymbolInfoDouble("USDJPY",SYMBOL_ASK); // 取引価格 ASK 
  req.sl=0; // ストップロス
  req.tp=0; // テイクプロフィット
  req.deviation=5; // ポイント指定の最大価格偏差
  req.type=ORDER_TYPE_BUY; // 成行買い注文

  if(!OrderSend(req,res))
    Print("OrderSend error ",_LastError);
    PrintFormat("retcode=%u  deal=%I64u order=%I64u",res.retcode,res.deal,res.order);
}

MQL4 では、OrderSend("USDJPY",OP_BUY,0.1,Ask,3,0,0);で済んでたことを思うと、明らかにコード量が多いですね。MQL4 ならエラーチェックの Print くらいの文量です。

取引リクエスト構造体

構造体とは、void型を除いた任意タイプの要素集合のことです。

MqlTradeRequest req で宣言後、各種パラメータを代入します。OrderSend() を実行します。

取引リザルト構造体

MqlTradeResult は、取引操作結果の詳細を表します。取引サーバーでブローカーが取引リクエストをどのように扱ったかが分かります。「約定したよ。」とか「無効だよ。」「注文チケットは〇〇だよ。」などなど。if 文でチェックしているのは、OrderSend() そのものが MT5 で実行できたかどうかです。注文がディーラーに通ったかどうか、ではありません。