OrderSendはMT5で大幅に書き方が変わりました。MT4とMT5での書き方の違いを比較しながら解説します。
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
ORDER_FILLING_FOKのFOKはFill Or Killの略で、注文した全数量が約定しない場合は取引を全く成立させない
ORDER_FILLING_IOCのIOCはImmediate Or Cancelの略で、注文した全数量が約定しない場合は、約定できる分だけ取引を成立させて残りの分の注文は取消す
ORDER_FILLING_RETURNはMQL5のリファレンスを見るに部分約定したときに残りの数量分の注文を残しておくようですね
通りすがりさま
コメントありがとうございます!
早速記事に反映させて頂きました!
なるほどです。市場の状況に合わせて取扱い方法を変えるという事なのですね。
中には大玉を取り扱う人もいるでしょうし、色々考慮されているのですね。
大変勉強になりました。