MQL5 の OrderSend() は非常に複雑です。ですが、注文を出すことに関してあらゆる事がこの関数1つででき、コーディングも厳密なので慣れてくるととても使いやすいです。
OrderSend() と似た関数に OrderSendAsync() があります。基本的には使い方は同じですが、これはHFT(高頻度売買)専用の関数になり仕様が若干異なります。
(※ OrderSendAsync() に関してはこちらの記事で解説しています。)
Contents
- MT4とMT5のオーダーは完全に別物
- OrderSend() でできること
- 使い方:実はとてもシンプル
- 重要:注文の流れ
- MqlTradeRequest 構造体とは?
- 各パラメータの解説
- MqlTradeRequest 構造体で指定するべきパラメータのまとめ表
- エグジットをするには反対売買を行う必要がある!
- 【”エグジット” の際の重大な注意点】ポジション番号として0を指定してしまうと、誤エントリーが起きる
- 【”エントリー” の際の重大な注意点】重複してエントリーが起きる可能性がある
- 両建て解消注文 CloseBy に関して(重要)
- StopLimit 注文とは?(重要)
- MqlTradeResult 構造体とは?
- ZeroMemory() は必要?
- まとめ
MT4とMT5のオーダーは完全に別物
MT4とMT5のオーダーは完全に別物です。
MT4でいうところのオーダーはMT5ではオーダー・ディール・ポジションの3つに分けられますが、今回はその中でもオーダーを送信するための関数です。
細かい分類はこちらの「MQL5のオーダー・ディール・ポジションの包括的な説明」という記事にて解説していますが、
MT5のオーダーとは
”(注文を送る、削除する、変更するといった)トレード操作に関して、自分のMT5のターミナルからFX業者のサーバーに送るリクエスト ”
だと思ってもらって構いません。
要はポジションを開いたり閉じたりするときに使います。
OrderSend() でできること
MT4でいうところの OrderSend(), OrderClose(), OrderDelete(), OrderModify() をすべてこの一つの関数で行います。
同じ関数を使うがゆえに、
ちょっとしたコーディングのミスで完全にやりたい事と別な事をしてしまうことも起こり得ます。
例えば以下のようなことです。
- Order をエグジットしようとして、誤ってエントリーしてしまう
- 既にポジションをもっているのに、もっとないと誤認識してエントリーしてしまう
使い方:実はとてもシンプル
OrderSend() の引数は2つだけです。
bool OrderSend(
MqlTradeRequest& request, // FX会社の取引サーバーに送るリクエストの内容
MqlTradeResult& result // FX会社の取引サーバーから帰ってくる結果
);
引数はともに定義済みの構造体変数になります。
- MqlTradeRequest 型の ‘ request ‘ は、どのような内容の注文であるか(Lot数, 銘柄など)を取引サーバーに送るための構造体で、ロット数、銘柄、ロング・ショート、などはすべてこちらで指定します。
- MqlTradeResult 型の ‘ result ‘ は、取引サーバーから返ってくる結果です。エラーの詳細などもここに含まれています。
※ なお構造体全般に関しては以下の記事で詳しく解説しています⇒ [MQL5] わかりにくい「構造体」の使い方をまとめて一気に解説!
戻り値は bool 型で、入力した MqlTradeRequest 型の ‘ request ‘ に不備がない場合に true を返します。ただし、これは「入力に不備がない」というだけなので、リクエストが成功したという意味では全くありません。成功したかどうかを確認するには result のチェックが必須です。
重要:注文の流れ
簡単な流れは以下の通りです。
▼
▼
▼
▼
▼
3) の OrderCheck に関してはあくまで「推奨」とのことです。実際にMetaQuotes が公式に公開している「トレード送信ライブラリ」 “CTrade” を確認しても OrderCheck は実行されていませんでした(2022/8 時点)。
MqlTradeRequest 構造体とは?
MqlTradeRequest の使い方が一番難しいです。OrderSend() によって何をするかは、この構造体にどのような値を入力するかで決まります。
どのようなトレード操作をするかによって設定するべきメンバー・設定するべきでないメンバーが大きく変わりますので厳格な注意が必要です。
MqlTradeRequest構造体は以下のメンバーによって構成されます。
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // Trade operation type
ulong magic; // Expert Advisor ID (magic number)
ulong order; // Order ticket
string symbol; // Trade symbol
double volume; // Requested volume for a deal in lots
double price; // Price
double stoplimit; // StopLimit level of the order
double sl; // Stop Loss level of the order
double tp; // Take Profit level of the order
ulong deviation; // Maximal possible deviation from the requested price
ENUM_ORDER_TYPE type; // Order type
ENUM_ORDER_TYPE_FILLING type_filling; // Order execution type
ENUM_ORDER_TYPE_TIME type_time; // Order expiration type
datetime expiration; // Order expiration time (for the orders of ORDER_TIME_SPECIFIED type)
string comment; // Order comment
ulong position; // Position ticket
ulong position_by; // The ticket of an opposite position
};
念のためですが、MqlTradeRequest 構造体を宣言してメンバーに値を設定する方法は例えば次のようになります。
MqlTradeRequest MYRequest; // MqlTradeRequest型の変数、'MYRequest' を宣言する
MqlTradeResult MYResult;
MYRequest.symbol = "USDJPY"; // 銘柄を指定
MYRequest.sl = 136.557; // ストップロスを指定
各パラメータの解説
MqlTradeRequest構造体の各メンバーを説明します。
1. action
ENUM_TRADE_REQUEST_ACTIONS 型の変数で、どのようなトレード操作をするかをここで決めます。ENUM_TRADE_REQUEST_ACTIONS 型には以下があります。
-
TRADE_ACTION_DEAL:
成り行き注文に使います。エントリーでもエグジットでも一緒です。
-
TRADE_ACTION_PENDING:
待機注文(逆指値・指値など)を出すときにこれを使います。MT5の待機注文には6種類あり(MT4では4種類)、詳細は ‘type パラメータ’で指定します。
-
TRADE_ACTION_SLTP:
すでに保有中のポジションの SL TP 変更に使います。
-
TRADE_ACTION_MODIFY:
まだ約定していない(=ポジションになっていない)、 pending order(待機注文) の注文価格変更に使います。
-
TRADE_ACTION_REMOVE:
まだ約定していない(=ポジションになっていない)、 pending order(待機注文) の削除に使います。
-
TRADE_ACTION_CLOSEBY:
成り行きの 「両建て相殺エグジット」 注文に使います。
同じ銘柄で両建てが発生している場合、本来なら2回払う必要のある手数料とスプレッドを「MT5が勝手に1回で済ましてくれる」裏ワザ的な注文方法です。うまく活用したいですね。
2. magic
EA特有のマジックナンバーです。なくても注文は通りますが、入力することが強く推奨されています。
3. order
オーダーチケット番号です。
action として TRADE_ACTION_MODIFY か TRADE_ACTION_REMOVE を選んだ場合のみ必須です。変更・削除する「order」のチケット番号を指定します。チケット番号の取得に関してはこちらの記事を見ると非常にわかりやすいと思います。
4. symbol
銘柄を指定します。
- TRADE_ACTION_DEAL / TRADE_ACTION_PENDING / TRADE_ACTION_SLTP の場合: ◎必須。
- TRADE_ACTION_MODIFY / TRADE_ACTION_REMOVE の場合: △省略可能。
- TRADE_ACTION_CLOSE_BY の場合: ×そもそも不要。
5. volume
ロット数を指定します。
- TRADE_ACTION_DEAL / TRADE_ACTION_PENDING の場合: ◎必須。
- TRADE_ACTION_MODIFY / TRADE_ACTION_REMOVE の場合: △省略可能。
- TRADE_ACTION_SLTP / TRADE_ACTION_CLOSE_BY の場合: ×そもそも不要。
6. price
基本的には注文価格(取引の種類によってはトリガーの価格)を設定します。
- TRADE_ACTION_DEAL の場合:
◎成り行き注文なので、買いの場合は Ask、売りの場合は Bid を取得して設定します。なお、これはFX会社の注文方式によっては無視されます。
- TRADE_ACTION_PENDING の場合:
◎stop注文(逆指値)・limit注文(指値)の場合は注文価格。stoplimit注文(MT5特有の注文方式)では約定させたい価格ではなく、「トリガー」にしたい価格を指定します。(stoplimit注文に関して、ここで詳しく後述してます。)
- TRADE_ACTION_MODIFY の場合: ◎変更したい価格に設定します。
- TRADE_ACTION_SLTP / TRADE_ACTION_REMOVE / TRADE_ACTION_CLOSE_BY の場合: ×そもそも不要。
7. stoplimit
MT5特有の待機注文である stoplimit注文を使う場合にのみ指定するパラメータです。(stoplimit注文に関して、ここで詳しく後述してます。)
すなわち action パラメータでは TRADE_ACTION_PENDING が選択され、後述の type として ORDER_TYPE_BUY_STOP_LIMIT / ORDER_TYPE_SELL_STOP_LIMIT が選択された場合のみに入力します。
なお入力する値は 「トリガー」にしたい価格ではなく、約定させたい価格 になります。
8. sl, tp
それぞれSLとTPを設定するためのパラメータです。
- TRADE_ACTION_DEAL (エントリー) の場合: ◎設定したい SLとTP。設定しない場合は0
- TRADE_ACTION_DEAL (エグジット) の場合: ×不要。
- TRADE_ACTION_PENDING の場合: ◎設定したい SLとTP。設定しない場合は0
- TRADE_ACTION_SLTP の場合: ◎それぞれ新しい値に設定します。必須。
- TRADE_ACTION_MODIFY の場合:
◎(注文価格のみを変更する場合で)SL、TPは変更しない場合でも必須です。新しい値を設定するか、変更しない場合は元の値を入力しましょう。
- TRADE_ACTION_REMOVE / TRADE_ACTION_CLOSE_BY の場合: ×そもそも不要。
9. deviation
MT4と名前が違いますが要は許容スリッページです。MT4と同様、point 値で入力します。
- TRADE_ACTION_DEAL / TRADE_ACTION_PENDING の場合: △ブローカーの「執行方式」によっては必須。無視される場合もあります。
- それ以外の場合: ×そもそも不要。
10. type
注文方法の詳細な種類を選択します。
- TRADE_ACTION_DEAL の場合:
◎ORDER_TYPE_BUY / ORDER_TYPE_SELL のいずれかを設定して「買い・売り」を指定します。
なお、エグジットは「反対売買」によって行うので「買いの position」を持っている場合は「売りの order」によってエグジットすることになります。
- TRADE_ACTION_PENDING の場合:
◎stop注文、limit注文、stoplimit注文とその方向を選びます。
ORDER_TYPE_BUY_LIMIT / ORDER_TYPE_SELL_LIMIT / ORDER_TYPE_BUY_STOP / ORDER_TYPE_SELL_STOP / ORDER_TYPE_BUY_STOP_LIMIT / ORDER_TYPE_SELL_STOP_LIMIT のいずれかを指定します。(stoplimit注文に関して、ここで詳しく後述してます。)
- TRADE_ACTION_CLOSE_BY の場合: △ORDER_TYPE_CLOSE_BY を指定します。多分なくても問題ないでしょう。
- TRADE_ACTION_SLTP / TRADE_ACTION_MODIFY / TRADE_ACTION_REMOVE の場合: ×そもそも不要です。
11. type_filling
Volume Filling policy フィリングタイプ というものです。
これは「注文時に指定したロット数(volume 引数)が一度に約定させられない場合にどう処理するか」という処理方法になります。基本的にはFX会社によって決まっているので、MT5のターミナル側から確認することになります。
- ORDER_FILLING_FOK: FOK は Fill or kill の略で、すべて約定できない場合にはオーダーそのものをキャンセルします。
- ORDER_FILLING_IOC: Immediate or Cancel の略です。できるだけ限り約定させて、残りはキャンセルされます。
- ORDER_FILLING_RETURN: 取引サーバー側が全約定するまで市場に注文を出し続ける
だいたいのFX会社はFOK / IOCのいずれかで、稀に複数から選択できるFXブローカーもあります。イメージとしてはほとんどは FOK で、IOC は Axiory や XM くらいでしょうか。
- TRADE_ACTION_DEAL / TRADE_ACTION_PENDING / TRADE_ACTION_CLOSE_BY の場合: △一応省略も可能ですが、基本的には指定するべきです。
- TRADE_ACTION_SLTP / TRADE_ACTION_MODIFY / TRADE_ACTION_REMOVE の場合: ×そもそも不要です。
12. type_time
「待機注文を出す場合に、有効期限をどう設定するか」という設定方法を選びます。以下のいずれかです。
- ORDER_TIME_GTC: キャンセルするまで有効です。
- ORDER_TIME_DAY: 当日のみ有効。
- ORDER_TIME_SPECIFIED: 後述の ‘expiration’ パラメータにて datetime形式の日付(秒まで指定可能)を指定します。
- ORDER_TIME_SPECIFIED_DAY: 後述の ‘expiration’ パラメータにて「指定した日付の23:59:59」まで有効になります。
- TRADE_ACTION_PENDING / TRADE_ACTION_MODIFY の場合:
△設定が推奨されます。省略した場合には GTC(キャンセルするまで有効)になります。 - その他の場合: ×そもそも不要。
13. expiration
待機注文の有効期限(datetime形式)です。
「待機注文を出し、かつ有効期限として ORDER_TIME_SPECIFIED / ORDER_TIME_SPECIFIED_DAY を選んだ場合」のみ指定します。
14. comment
△任意に指定可能なコメントです。
実行するたびに指定できるのがいいですね。MT4なら OrderClose, OrderDelete, OrderModify ではコメントがそもそも指定できませんが MT5ならコメントを指定可能です。
15. position
order パラメータでは OrderTicket(オーダーのチケット番号) でしたが、こちらは PositionTicket (ポジションのチケット番号)を指定します。かなり重要なパラメータです。
使用する状況によって指定する PositionTicket が異なるので注意しましょう。
- TRADE_ACTION_DEAL かつエグジット(決済)をする場合: エグジットしたいポジションのチケット番号を指定します。
- TRADE_ACTION_CLOSE_BY の場合: 両建てを相殺決済したい2つのポジションのうち、片方のポジションのチケット番号を指定します。
- TRADE_ACTION_SLTP の場合: SL, TPを変更したい(現在保有中の)ポジションのチケット番号を指定します。
- その他の場合: ×そもそも不要。
16. position_by
CloseBy 注文によって両建てを解消する場合のみ指定します。両建てを相殺決済したい2つのポジションのうち、position パラメータで指定していない方のポジションチケット番号を指定します。
なお、この場合 position パラメータとposition_by パラメータは順不同です。
MqlTradeRequest 構造体で指定するべきパラメータのまとめ表
上記に各パラメータの使い方を説明しましたが、用途によって必須、省略可、不要になる組み合わせが完全に異なっており、非常にわかりにくいので一覧表にまとめてみます。これで必要なパラメータ・必要でないパラメータを一気に把握できます。
「◎ = 必須、△ = 省略可、 = 不要」を示しています。
(左右にスクロール可能です。)
成り行き Entry 注文 | 成り行き Exit 注文 | 成り行き 「両建て相殺」 注文 | 逆指値・指値 pending order | 保有中 position の SL TP 変更 | 逆指値・指値 pending order の注文価格変更 | 逆指値・指値 pending order の削除 | |||
action | ◎ TRADE_ACTION_DEAL | ◎ TRADE_ACTION_DEAL | ◎ TRADE_ACTION_CLOSE_BY | ◎ TRADE_ACTION_PENDING | ◎ TRADE_ACTION_SLTP | ◎ TRADE_ACTION_MODIFY | ◎ TRADE_ACTION_REMOVE | ||
magic | △ あったほうがいい | △ あったほうがいい | △ あったほうがいい | △ あったほうがいい | △ あったほうがいい | △ あったほうがいい | △ あったほうがいい | ||
order | (OrderTicket) | ◎ Order の Ticket 番号 | ◎ Order の Ticket 番号 | ||||||
symbol | ◎ 銘柄 | ◎ 銘柄 | ◎ 銘柄 | ◎ 銘柄 | △ 省略も可能 | △ 省略も可能 | |||
volume | ◎ ロット数 | ◎ ロット数 | ◎ ロット数 | × 不要 | △ 省略も可能 | ||||
price | ◎ Ask/Bid でよい (ブローカーの注文執行方式によっては無視される) |
◎ Ask/Bid でよい (※ 買いポジを決済するには BID になる) (ブローカーの注文執行方式によっては無視される) |
◎ 逆指値・指値価格 ◎ stoplimit 注文の場合は 逆指値の trigger となる価格 |
◎ New 逆指値・指値価格 | |||||
stoplimit | (stop order → limit order) | △ stoplimit 注文のときに約定させたい指値の価格 (type が下の2つの場合) |
|||||||
sl | ◎ SL | ◎ SL | ◎ New SL | ◎ New SL (変更が必要でない場合は以前の値) |
|||||
tp | ◎ TP | ◎ TP | ◎ New TP | ◎ New TP (変更が必要でない場合は以前の値) |
|||||
deviation | (slippage in points) | △ ブローカーの執行方式によっては必須 | △ ブローカーの執行方式によっては必須 | △ ブローカーの執行方式によっては必須 | |||||
type | ORDER_TYPE_BUY ORDER_TYPE_SELLのいずれか |
[反対売買によって決済する!]
決済したい position が LONG 決済したい position が SHORT |
ORDER_TYPE_CLOSE_BY
(おそらくなくても問題ない) |
ORDER_TYPE_BUY_LIMIT ORDER_TYPE_SELL_LIMIT ORDER_TYPE_BUY_STOP ORDER_TYPE_SELL_STOP ORDER_TYPE_BUY_STOP_LIMIT ORDER_TYPE_SELL_STOP_LIMIT のいずれか |
|||||
type_filling | (すべて約定できない場合) | △ 指定するべき | △ 指定するべき | △ 指定するべき | △ Volume がすべて約定できない場合にどうするかを指定可能 | ||||
type_time | (有効期限) | △ pending order の有効期限の設定方法をえらんだほうがいい | △ pending order の有効期限の設定方法をえらんだほうがいい | ||||||
expiration | (有効期限) | △ 有効期限が 2 か 3 のときに必要になる日付 | △ 有効期限が 2 か 3 のときに必要になる日付 | ||||||
comment | △ どちらでもいい | △ どちらでもいい | △ どちらでもいい | △ どちらでもいい | △ どちらでもいい | △ どちらでもいい | △ どちらでもいい | ||
position | (PositionTicket) | ◎ 決済する position の Position Ticket | ◎ 決済する1つ目の position の Position Ticket | ◎ 保有中 position の Position Ticket | |||||
position_by | ◎ 決済する2つ目の position の Position Ticket |
エグジットをするには反対売買を行う必要がある!
MQL5 には MQL4のようにOrderClose() はないので、エグジット(決済・手仕舞い)は反対売買によって行います。
ただ上記にもあるように、成り行きでエントリーをするときと、成り行きでエグジットするときに設定すべきパラメータの組み合わせはほとんど同じです。
では「どのようにしてエントリーとエグジットを見分けるのか」ということになりますが、エグジットの際には position パラメータで決済するポジションの PositionTicket 番号を設定する必要がある点が大きく異なります。
逆に言うと大きな違いはここだけなので注意が必要です。
以下の記事では、「ポジションを成行で決済する方法」をわかりやすく解説し、ソースコードを公開しています。
⇒ 【公開】MQL5 でポジション決済するコードの書き方を解説!
【”エグジット” の際の重大な注意点】ポジション番号として0を指定してしまうと、誤エントリーが起きる
違いがこれしかないために少しでもプログラミングを間違うと、エグジットしようとしてエントリーをしていまいます。
この「position パラメータ」でTicket番号として0を設定すると、誤ってエントリーが生じてしまうので注意してください。
これが起きる理由としては、MqlTradeRequest 構造体の positionパラメータは(ulong 型なので)初期値は0に設定されており、仮にここに0を代入した場合、「positionが設定されてない = エグジットではなくエントリー注文である」と認識されてしまうためです。
EA内の変数としてPositionTicket番号を管理してたとしても、MT5が勝手に落ちてしまって再起動されてしまい、変数が0になってしまうことも十分に考えられるので、コーディングの際には注意が必要です。
ですので、以下のようにして 「PositionSelectByTicket によるポジションの選択」に失敗したら関数を終了してしまう記述をするのがおすすめです。
if ( PositionSelectByTicket(PositionTicket)==false ) return; // Avoid fallacious entries
【”エントリー” の際の重大な注意点】重複してエントリーが起きる可能性がある
今度は「エントリー」の場合です。
簡単に言うと、MT5 では取引リクエストはオーダー・ポジション・ディールに厳密に区別されているがために、
エントリーシグナルが点灯している場合、オーダーがポジションに変化するまでの間(注文が出てから約定するまでの間)に、もう1回 OrderSend してしまう可能性がある
ということです。
ほとんどのプログラマーは「現在保有中のポジション」を認識するコードを書く際に、ポジションのみの情報を参照して、処理中のオーダーまで完璧に調べようとしないのでこのような問題が起きます。
何らかの原因によって約定まで時間がかかる場合や、高頻度系のシステムで EAの実行間隔が非常に短い場合(数10ミリ秒単位)に起き得る問題です。
成り行きエントリーの場合、取引リクエストの状態が「オーダー」から「ポジション」に変化するまでの時間は、数10ミリ秒~長くても数100ミリ秒 なので起きる可能性は低いですが、しっかりと念頭にいれておきましょう。
今度時間があれば、「この問題を解決するためにどういったコードを書けばいいか」 + 「その際に付随して起き得るその他のトラブルへの対処法」なども全て含めて1つの記事にまとめようと思います。
両建て解消注文 CloseBy に関して(重要)
CloseBy とは1つの銘柄で両建てが発生している場合、本来なら2回払う必要のある手数料とスプレッドを1回分のみ払って両建てを解消する方法です。
ほとんど知られていませんが、非常に有益な注文方法です。
例えば USDJPY のロングとショートをそれぞれ 1Lot 保有している場合、
これらを1つずつ決済するとスプレッドと手数料を2Lot分、払う必要がありますがCloseBy を使うと MT5のターミナル側が勝手に
片方の注文の「手数料+スプレッド分の損失」を0にしてくれます。
※ 詳しい仕様に関して述べると長くなるので、こちらの記事にまとめてます。⇒ [裏ワザ] MT5でCloseBy注文を使って取引コストを少なくする方法
StopLimit 注文とは?(重要)
StopLimit注文・ストップリミット注文は MT5に特有の注文方式です。
基本的な考え方としては、「指値注文」をする際に「逆指値のトリガー」を設定できるということです。
すなわち、
- 注文自体は、「指値での売買注文」である
- だがその「指値での売買注文」が有効になるためには、まずは「指定した価格を逆指値」でトリガーされないといけない
ということです。
これだけだとわかりにくいので、具体例として「買いの StopLimit注文」を考えてみましょう。
こんな感じになります。Stop → Limit の順番なので StopLimit 注文という名前です。
注意するべきなのは、
- トリガー価格は price パラメータで設定する
- 指値価格を stoplimit パラメータで設定する
という点です。逆にしないようにしましょう。
MqlTradeResult 構造体とは?
これは「取引リクエスト」の結果を表す構造体です。どういった結果になったかを確認する際に使います。
MqlTradeResult 構造体の各メンバーは以下の通りです。
struct MqlTradeResult
{
uint retcode; // Operation return code
ulong deal; // Deal ticket, if it is performed
ulong order; // Order ticket, if it is placed
double volume; // Deal volume, confirmed by broker
double price; // Deal price, confirmed by broker
double bid; // Current Bid price
double ask; // Current Ask price
string comment; // Broker comment to operation (by default it is filled by description of trade server return code)
uint request_id; // Request ID set by the terminal during the dispatch
uint retcode_external; // Return code of an external trading system
};
様々な情報が参照可能ですが、重要なのは retcode とorder です。
retcode はエラー確認に重要
OrderSend() を送った際の返り値とその際に GetLastError() で取得できるエラーコードは、「リクエストがサーバー上に置かれたか」の結果であるのに対して、
MqlTradeResult 構造体の ‘retcode’ は「リクエストが実行されたか」に関する結果を示します。
したがってこれらは両方とも確認する必要があります。なお成功した場合には TRADE_RETCODE_DONE(完了した場合) または TRADE_RETCODE_PLACED (設置された場合)が返ってきます。
( ※ 各リターンコードの意味に関してはこちらの記事に解説しています。⇒ [MQL5] MT5の OrderSend()関数 のエラー一覧【MqlTradeResult の retcode】)
エラー処理の方法(ソースコードあり)
したがってエラー処理は例えば以下のようにするといいでしょう。
if(!OrderSend(CRequest,CResult)) { // OrderSend の返り値 && エラーを確認する
int error = GetLastError();
printf ("OrderSend Error : [%s EXIT] for %s failed @(Magic: %d) // OrderSend Error : %d",ExitName,ExitSymbol,MagicNumber,error);
}
if(CResult.retcode != TRADE_RETCODE_DONE && CResult.retcode != TRADE_RETCODE_PLACED) { // MqlTradeResult 構造体のエラーを確認する
printf ("Trade Result Error : [%s EXIT] for %s failed @(Magic: %d) // TradeResult Error : %d",ExitName,ExitSymbol,MagicNumber,CResult.retcode);
}
‘order’ はエグジット時に必要なポジションチケット番号に一致する
‘order’ は実行された order の チケット番号を記録します。これは、以下の際に必要です。
- 指値注文の変更と削除に必要
- order が position に変化して、その position をエグジットしたい場合に必要
2の場合、求められるのは「ポジションチケット番号」ですが、これはここで返ってくる「オーダーチケット番号」と一致します。(⇒ こちらの記事で解説した通り)
これらは他の方法によっても取得可能ですが、念のために MqlTradeResult 構造体からも記録しておくのが良いと思います。
なお ‘deal’ はディールのチケット番号であり完全に別物なので注意しましょう。
ZeroMemory() は必要?
MqlTradeRequest と MqlTradeResult 構造体には前回使った際の変数値が格納されている可能性も高いので、OrderSend() を実行する前には ZeroMemory()によって構造体のメンバーを初期化するとよいでしょう。
MqlTradeRequest CRequest;
MqlTradeResult CResult;
ZeroMemory(CRequest);
ZeroMemory(CResult);
などとなります。
まとめ
今回は OrderSend 関数の使い方を詳しく説明しました。正直、MQL5 に移行するに当たって一番苦労する内容だと思いますが、一度理解してしまえばそこまで難しくありません。
また下記の記事では、「MQL4 から MQL5 に移行する」際にどういった内容をどういった順番で学習していけばよいかをわかりやすく説明しています。MQL5 の習得途中の方に取って非常に有益な内容だと思いますので、ぜひ一度読んでみてください。
⇒ MQL4(MT4) → MQL5(MT5) に移行する際に勉強すべき内容まとめ!
もしわかりにくい部分や疑問点があったら、↓ のコメント欄に残してください(もちろん匿名でも平気です)。
全てしっかりと回答させていただきます。