サンプルコード 一覧へ戻る

MQL5サンプルコード

【サンプルコード】MT4とMT5のOrderSendの違い【サンプルコードで比較】

OrderSendはMT5で大幅に書き方が変わりました。MT4とMT5での書き方の違いを比較しながら解説します。

スポンサーリンク / Sponsored links

MT4とMT5でOrderSendはだいぶ違う

MetatradorでEAを作る際、一番の要になるOrderSendコマンドですが、実はMT4(MQL4)とMT5(MQL5)で大分書き方が変わっています。

OrderSendの違いを以下に 纏めました。

ここでMT5(MQL5)への移植に挫折した人の助けになれば幸いです。(と言いながら、私自身も少し前まで挫折した1人でしたが。汗)

MT4(MQL)で成行買い注文を出したい場合のサンプルコード

例えば、MT4(MQL4)で

  • 0.1ロット
  • ドル円
  • 買い(成行)
  • SL/TP 0.05

の注文を出したい場合、

double SL = 0.05;
double TP = 0.05;
int MagicNumber = 123456;
double lots = 0.1;

OrderSend(USDJPY,OP_BUY,lots,Ask,3,Bid-SL,Bid+TP,"aaa",MagicNumber,0,Blue);

で約定できました。

極端な話、変数宣言を省いてしまえば、

OrderSend(USDJPY,OP_BUY,0.1,Ask,3,Bid-0.05,Bid+0.05,"aaa",123456,0,Blue);

の1行で済んでしまった。

MQL5で同じ注文を出す場合・・・サンプルコード

これがMT5(MQL5)になると、

MqlTick last_tick;
SymbolInfoTick(_Symbol,last_tick);
   
double Ask=last_tick.ask;
double Bid=last_tick.bid;

double SL = 0.05;
double TP = 0.05;
int MagicNumber = 123456;
double lots = 0.1;

   MqlTradeRequest request = {};
   MqlTradeResult result = {};

   request.action = TRADE_ACTION_DEAL;
   request.type = ORDER_TYPE_SELL;             // 注文タイプ
   request.magic = MagicNumber;             // マジックナンバー(識別用)
   request.symbol = USDJPY;              // 通貨ペア名
   request.volume = lots;              // ロット数
   request.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK);// 注文価格
   request.sl = Bid+SL;             // ストップロス価格
   request.tp = Bid-TP;           // リミット価格
   request.deviation = 3;               // スリッページ
   request.expiration = 0;             // 有効期限
   request.comment = "aaa";              // コメント

   OrderSend(request, result);
   return result.retcode;

・・・控えめに言って、めちゃくちゃ行数が多くなりました。

これは何かというと、クラス構成と言って、プログラム業界では割とよくある文法。

とはいえ、スクリプト言語に近かったMQL4のOrderSendしか見た事ない人は面食らいますね。汗

最後から2行目の

OrderSend(request, result)

が実際の注文を出しているコマンドで、requestとresultという2種類の引数を渡しています。

このrequestの引数の中にactionとかtypeとかロット数とかの設定がまとめて梱包されていて、先立って宣言しておいた引数達をOrderSendコマンド発行の際に渡すようなイメージです。(語彙力)

メタクオーツ社のホームページによると、「request.〇〇」の〇〇に入るのは以下のようです。

  ENUM_TRADE_REQUEST_ACTIONS   action;           // 取引の種類
  ulong                         magic;           // エキスパートアドバイザー ID(マジックナンバー)
  ulong                         order;           // 注文チケット
  string                       symbol;           // 取引シンボル
  double                       volume;           // 約定のための要求されたボリューム(ロット単位)
  double                       price;           // 価格
  double                       stoplimit;       // 注文のストップリミットレベル
  double                       sl;               // 注文の決済逆指値レベル
  double                       tp;               // 注文の決済指値レベル
  ulong                         deviation;       // リクエストされた価格からの可能な最大偏差
  ENUM_ORDER_TYPE               type;             // 注文の種類
  ENUM_ORDER_TYPE_FILLING       type_filling;     // 注文実行の種類
  ENUM_ORDER_TYPE_TIME       type_time;       // 注文期限切れの種類
  datetime                     expiration;       // 注文期限切れの時刻 (ORDER_TIME_SPECIFIED 型の注文)
  string                       comment;         // 注文コメント
  ulong                         position;         // Position ticket
  ulong                         position_by;     // The ticket of an opposite position

ちなみに、

  • request.action
  • request.type
  • request.type_filling
  • request.type_time

の4つはセットできるコマンドが決まっているので、以下で記載しておきます。(MQL5はMQL4と違ってどんどん更新されているので、そのうち更に増えるかもしれません)

request.actionとして使えるコマンド

request.action 

TRADE_ACTION_DEAL	成行注文を出す
TRADE_ACTION_PENDING	指値注文を出す
TRADE_ACTION_SLTP	決済逆指値/決済指値を変更する
TRADE_ACTION_MODIFY	注文済の注文のパラメータを変更する
TRADE_ACTION_REMOVE	注文を削除する
TRADE_ACTION_CLOSE_BY	ポジションを決済する

request.typeとして使えるコマンド

request.type

ORDER_TYPE_BUY	成行買
ORDER_TYPE_SELL	成行売
ORDER_TYPE_BUY_LIMIT	指値注文(Buy)
ORDER_TYPE_SELL_LIMIT	指値注文(Sell)
ORDER_TYPE_BUY_STOP	逆指値注文(Buy)
ORDER_TYPE_SELL_STOP	逆指値注文(Sell)
ORDER_TYPE_BUY_STOP_LIMIT	注文価格に達したら指値/逆指値注文を発注する(Buy)
ORDER_TYPE_SELL_STOP_LIMIT	注文価格に達したら指値/逆指値注文を発注する(Sell)
ORDER_TYPE_CLOSE_BY	ポジション決済

request.type_timeとして使えるコマンド

request.type_time

ORDER_TIME_GTC	明示的にキャンセルされるまで有効
ORDER_TIME_DAY	現在の取引日のみ有効
ORDER_TIME_SPECIFIED	有効期限まで有効な注文
ORDER_TIME_SPECIFIED_DAY	注文が指定された日の 23:59:59 まで有効

一応パラメータはあるのですが、指定したことないですね・・。
 デフォルトでGTCになってる気がします。

request.type_fillingとして使えるコマンド

request.type_filling

ORDER_FILLING_FOK
ORDER_FILLING_IOC
ORDER_FILLING_RETURN

うーん、、部分注文っぽいのですが、大玉を注文する時用?

0.1ロットくらいでしか取引したことないから分かりません・・・。 ご存じの方がいらっしゃったらこっそり教えて頂けると泣いて喜びます。

通りすがりさんからコメント頂きました!
↓こういう事のようです。

ORDER_FILLING_FOKのFOKはFill Or Killの略で、注文した全数量が約定しない場合は取引を全く成立させない

ORDER_FILLING_IOCのIOCはImmediate Or Cancelの略で、注文した全数量が約定しない場合は、約定できる分だけ取引を成立させて残りの分の注文は取消す

ORDER_FILLING_RETURNはMQL5のリファレンスを見るに部分約定したときに残りの数量分の注文を残しておくようですね

通りすがりさん、情報ありがとうございました!

というわけで、MQL4とMQL5のOrderSendの書き方の違いでした。

結構違いましたね。

コメント / Comments

  1. 通りすがり より:

    ORDER_FILLING_FOKのFOKはFill Or Killの略で、注文した全数量が約定しない場合は取引を全く成立させない
    ORDER_FILLING_IOCのIOCはImmediate Or Cancelの略で、注文した全数量が約定しない場合は、約定できる分だけ取引を成立させて残りの分の注文は取消す
    ORDER_FILLING_RETURNはMQL5のリファレンスを見るに部分約定したときに残りの数量分の注文を残しておくようですね

    • たこねぎFX たこねぎFX より:

      通りすがりさま

      コメントありがとうございます!
      早速記事に反映させて頂きました!
      なるほどです。市場の状況に合わせて取扱い方法を変えるという事なのですね。
      中には大玉を取り扱う人もいるでしょうし、色々考慮されているのですね。
      大変勉強になりました。

タイトルとURLをコピーしました