初心者向けMQL5 OrderSend()
JODAです。
3か月ぶりくらいにFXをしたらストレスで禿げそうです。(一応勝ってます)
尊敬するtakuパイセンはリップル底を当てた模様(リアルタイムで見てます)
takuさんにはEAのロジック提供をしていただいているので
代わりにアフィリエイトリンクを貼らせていただきます。
上記のリンクから、
パートナーコード: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()を使って取引操作を行うためには、
- MqlTreadRequest型、MqlTreadResult型の構造体を宣言
- 必要なメンバーへ代入
- 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をやっていこうとする方々の役に立てば幸いです。