OrderSend新規注文を出す
成行・指値・逆指値の新規注文を出す関数。MQL5では同名の関数の形がまったく違うため、この関数だけは「引数の違い」では済まず、実務では書き方そのものを変える。
1書式
MQL5にもOrderSendという名前の関数はあるが、引数が構造体2つに変わっている。「引数を並べ替えれば動く」レベルの違いではない。
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=clrNONE );
bool OrderSend( const MqlTradeRequest &request, // 銘柄・数量・価格・SL/TPなどをまとめて渡す MqlTradeResult &result // 結果(注文番号・約定値など)を受け取る );
2引数(MQL4)
| 引数 | 内容 |
|---|---|
| symbol | 通貨ペア |
| cmd | OP_BUY / OP_SELL など |
| volume | ロット数 |
| price | 注文価格(成行はAsk/Bid) |
| slippage | 許容スリッページ(ポイント) |
| stoploss / takeprofit | 損切り・利確の価格(0で無し) |
| magic | 自分のEAだと分かる識別番号 |
3戻り値
MQL4は注文番号(チケット)を返す。失敗すると-1で、理由はGetLastError()で調べる。MQL5はtrue/falseを返し、注文番号はresult.orderに入る。
4実際に動かした結果
損切りが業者の最小距離(stoplevel)より近いと拒否される
最小距離は業者・通貨ペアごとに違う。学習して次回は距離を離す実装や、拒否されたら注文を出さずに終える実装が定石。
デモ口座・USDJPYで成行買いを実行。損切りを業者の最小距離より近く指定した場合の挙動:
| 条件 | 結果 |
|---|---|
| SLを現在値から3pipsで指定 | OrderSend が -1・エラー130(不正なストップ) |
| SLを現在値から10pipsで指定 | 正常に約定 |
5使用例:エラーの内容を見る
int ticket = OrderSend(Symbol(), OP_BUY, 0.10,
Ask, 5, sl, tp, "", 20260924);
if(ticket < 0)
Print("注文失敗 err=", GetLastError());
MetaEditorでコンパイル0エラー・0警告を確認済み。
6MQL4→MQL5の違い
MQL4の1回の関数呼び出しが、MQL5では「注文の内容を構造体に詰める」→「OrderSendに渡す」→「結果を別の構造体で受け取る」という3段階に分かれる。書き換えの実務では、まずMQL4の11引数を MqlTradeRequest のどの項目に対応させるかの一覧を作ってから着手すると早い。
7よくある罠
- 損切り・利確が業者の最小距離(stoplevel)より近いと、エラー130で拒否される。拒否されたときに「線の無い注文」をそのまま持ってしまうと、事故のもと。失敗したら線を離してもう一度、それでも駄目なら注文を出さない、という手順にするのが安全。
- 値段や数量は業者の刻み(ティックサイズ・ロットステップ)に丸めてから送る。丸めないまま送ると、業者によっては黙って拒否される。
8関連する関数
今日はどこを見ればいいか。
ドル円とユーロドルの主要ライン・予想高値安値を、平日の朝に図1枚にまとめています。
朝刊を見る→