joda!!

jodaによるプログラミング芸

初心者向けMQL5 OrderSend()

JODAです。

 

3か月ぶりくらいにFXをしたらストレスで禿げそうです。(一応勝ってます)

 

尊敬するtakuパイセンはリップル底を当てた模様(リアルタイムで見てます)

takuさんにはEAのロジック提供をしていただいているので

代わりにアフィリエイトリンクを貼らせていただきます。

AXIORY(アキシオリー): FXブローカー

上記のリンクから、

パートナーコード:19717

を入力して口座開設していただけたら幸いです。

開設された方は私に連絡お願いいたします。

 

この記事は、MQL4からMQL5へ移行したいのだけどよくわからない

という方向けです。

今回は、MQL4からMQL5へ移行する際にとなる障害となる

OrderSend()について解説していきます。

 

OrderSend()はMQL4でもMQL5でもオーダーを送信する関数です。

MQL4ではパラメーターにシンボルやロットなどを入力すればよかったのですが、

MQL5のOrderSend()は構造体を使ってオーダーを送信します。

構造体についてはこちらから↓

初心者向けmql5 構造体 - jodawithforce’s diary

 

MQL5のOrderSend()は、2つのパラメーターを持ちます。

bool  OrderSend(
  MqlTradeRequest&  request, 
  MqlTradeResult&   result 
  );

MqlTradeRequest MqlTreadRequest型の構造体へのポインタ

MqlTradeResult   MqlTredResult型の構造体へのポインタ

 

です。

OrderSend()自体は、構造体のポインタチェックが成功するとtrueを

失敗するとfalceを返します。

※取引操作が正常に終了したからtureを返すわけではありません。

 

パラメーターを見ていただくとわかると思いますが、

OrderSend()を使って取引操作を行うためには、

  1. MqlTreadRequest型、MqlTreadResult型の構造体を宣言
  2. 必要なメンバーへ代入
  3. OrderSend()関数の実行

という手順が必要です。ここでMQL4ではなじみのない構造体が出てくるわけです。

順を追って解説していきます。

 

[1.MqlTreadRequest型、MqlTreadResult型の構造体を宣言]

 まずは、MqlTreadRequest型、MqlTreadResult型の構造体を宣言します。

MqlTreadRequest型、MqlTreadResult型の構造体は以下のように事前定義されています。

 

MqlTreadRequest型

struct MqlTradeRequest
 {
  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
 };

 

MqlTreadResult型

struct MqlTradeResult
 {
  uint   retcode;         // 操作のリターンコード
  ulong   deal;             // 実行された場合の 約定チケット
  ulong   order;           // 注文された場合のチケット
  double   volume;           // ブローカーによって確認された約定ボリューム
  double   price;           // ブローカーによって確認された約定価格
  double   bid;             // 現在の売値
  double   ask;             // 現在の買値
  string   comment;         // 操作に対するブローカーコメント(デフォルトは取引サーバの返したコードの記述)
  uint   request_id;       // ディスパッチの際に、端末によって設定されたリクエストID
  uint   retcode_external// 外部取引システムのリターンコード
 };

 

上記のように構造体自体の定義は済んでいるわけですから、

構造体の宣言だけすれば大丈夫です。

 

MqlTradeRequest request;    //MqlTreadRequest型の構造体の宣言
MqlTradeResult result;                     //MqlTreadResult型の構造体の宣言

 

構造体名はrequest、resultを使うのが一般的ですが何でもいいです。

 

[2.必要なメンバーへ代入]

1で宣言した構造体のメンバーに代入していきます。

ここで、成行注文なのか、予約注文なのか、価格、TP,SLなどなどを決めていきます。

MQL4でいうところのパラメーターに入力の作業をここでするわけですね。

 

注意する点として、actionに入る識別子によって必須入力メンバーが変わってきます。

今回はトレードに必要な成行注文とリクエスト注文(指値指値)について解説していきます。

 

成行注文の場合

以下のメンバーの入力が必要です。

action

symbol

volume

type

type_filling

 

例)EURUSDで1ロットの成行買い注文をしたいとき

request.action =TRADE_ACTION_DEAL;
request.symbol = "EURUSD";

request.volume = 1;

request.type = ORDER_TYPE_BUY;
request.type_filling = ORDER_FILLING_IOC;

 

とします。

 

リクエスト注文の場合

以下のメンバーの入力が必要です。

action

symbol

volume

price

sl

tp

diviation

type

type_filling

 

成行注文に加えてtpslとdiviation(スリッページ)が追加されるだけですね。

 

[OrderSend()関数の実行]

最後に、OrderSend()関数で構造体に入力した取引操作を行います。

 

例)EURUSD、1ロットの成行買い注文をしたいとき

 

MqlTradeRequest request;    //MqlTreadRequest型の構造体の宣言
MqlTradeResult result;                     //MqlTreadResult型の構造体の宣言

 

request.action =TRADE_ACTION_DEAL;
request.symbol = "EURUSD";

request.volume = 1;

request.type = ORDER_TYPE_BUY;
request.type_filling = ORDER_FILLING_IOC;

 

if(任意のエントリーシグナル){

 OrderSend(request,result);

 

これで注文は送信されるはずですが、

エラー処理を加えていきたいと思います。

以下にコード例を記載します。

 

if(OrderSend(request,result)){        //①
 if(result.retcode != TRADE_RETCODE_DONE){  //②
  Print("retcode",result.retcode);      //③
 }

}

else Print("OrderSend!=ture");    //④

 

①OrderSend()のポインタチェックが成功したかどうかを判定

②result.retcode != TRADE_RETCODE_DONEの時に

③retcodeを出力

※基本的に、result.retcode==TRADE_RETCODE_DONEの時取引操作が正常に終了しています。それ以外の時は何らかのエラーが起きているので、出力しておきます。

④OrderSend()がtureでないので、プリントで出力します。

 

こんな感じでしょうか。

この記事がこれからMQL5をやっていこうとする方々の役に立てば幸いです。