MQL4で注文を出すとき、必ず使うのがOrderSend()関数です。この関数の第2引数には「注文タイプ」を指定する必要があります。
「OP_BUYは分かるけど、OP_BUYLIMITとOP_BUYSTOPの違いって何?」「指値と逆指値がごっちゃになる…」という方も多いのではないでしょうか。
この記事では、MQL4の注文タイプ定数 全6種類を一覧表で整理し、それぞれのコードサンプル付きで徹底解説します。これを読めば、すべての注文タイプを自信を持って使い分けられるようになります。
注文タイプ定数の一覧(全6種類)
まずは全体像を把握しましょう。MQL4で使える注文タイプ定数は以下の6つです。
| 定数名 | 数値 | 種類 | 説明 |
|---|---|---|---|
| OP_BUY | 0 | 成行注文 | 現在価格で買い(ロング) |
| OP_SELL | 1 | 成行注文 | 現在価格で売り(ショート) |
| OP_BUYLIMIT | 2 | 指値注文 | 現在価格より下で買い予約 |
| OP_SELLLIMIT | 3 | 指値注文 | 現在価格より上で売り予約 |
| OP_BUYSTOP | 4 | 逆指値注文 | 現在価格より上で買い予約 |
| OP_SELLSTOP | 5 | 逆指値注文 | 現在価格より下で売り予約 |
数値の0〜5を直接書いても動作しますが、定数名を使うことで可読性が格段に上がります。必ず定数名を使いましょう。
成行注文:OP_BUY と OP_SELL
成行注文は「今すぐ約定させたい」ときに使う、最も基本的な注文タイプです。
OP_BUY(買い成行注文)
買い注文はAsk(売値)で約定します。買うときはスプレッド分だけ高い価格で約定する点に注意してください。
// 買い成行注文の例
int ticket = OrderSend(
Symbol(), // 現在の通貨ペア
OP_BUY, // 買い注文
0.1, // 0.1ロット
Ask, // 買いはAsk価格を指定
3, // スリッページ許容(ポイント)
0, // ストップロス(0 = なし)
0, // テイクプロフィット(0 = なし)
"Buy Order", // コメント
12345, // マジックナンバー
0, // 有効期限(成行では無関係)
clrBlue // チャート上の矢印色
);
if(ticket < 0)
{
Print("買い注文エラー: ", GetLastError());
}
else
{
Print("買い注文成功! チケット番号: ", ticket);
}
OP_SELL(売り成行注文)
売り注文はBid(買値)で約定します。OP_BUYとの違いは、指定する価格がBidになる点です。
// 売り成行注文の例
int ticket = OrderSend(
Symbol(), // 現在の通貨ペア
OP_SELL, // 売り注文
0.1, // 0.1ロット
Bid, // 売りはBid価格を指定
3, // スリッページ許容
0, // ストップロス
0, // テイクプロフィット
"Sell Order", // コメント
12345, // マジックナンバー
0, // 有効期限
clrRed // チャート上の矢印色
);
if(ticket < 0)
{
Print("売り注文エラー: ", GetLastError());
}
重要ポイント:買いはAsk、売りはBid。これを逆にするとERR_INVALID_PRICE(エラーコード129)が発生します。初心者がつまずきやすいポイントなので、しっかり覚えておきましょう。
指値注文:OP_BUYLIMIT と OP_SELLLIMIT
指値注文は「今より有利な価格になったら約定させたい」ときに使います。逆張りエントリーに向いている注文タイプです。
OP_BUYLIMIT(買い指値注文)
現在のAsk価格より下の価格を指定して、「そこまで下がったら買いたい」という注文です。押し目買いのイメージです。
// 買い指値注文:現在価格より50pips下で買い予約
double entryPrice = Ask - 50 * Point * 10; // 50pips下(5桁ブローカーの場合)
int ticket = OrderSend(
Symbol(),
OP_BUYLIMIT, // 買い指値注文
0.1,
entryPrice, // 現在のAskより下の価格
3,
entryPrice - 30 * Point * 10, // SL:エントリーから30pips下
entryPrice + 60 * Point * 10, // TP:エントリーから60pips上
"BuyLimit Order",
12345,
0, // 有効期限(0 = 無期限)
clrBlue
);
if(ticket < 0)
Print("買い指値注文エラー: ", GetLastError());
OP_SELLLIMIT(売り指値注文)
現在のBid価格より上の価格を指定して、「そこまで上がったら売りたい」という注文です。戻り売りのイメージです。
// 売り指値注文:現在価格より50pips上で売り予約
double entryPrice = Bid + 50 * Point * 10;
int ticket = OrderSend(
Symbol(),
OP_SELLLIMIT, // 売り指値注文
0.1,
entryPrice, // 現在のBidより上の価格
3,
entryPrice + 30 * Point * 10, // SL:エントリーから30pips上
entryPrice - 60 * Point * 10, // TP:エントリーから60pips下
"SellLimit Order",
12345,
0,
clrRed
);
if(ticket < 0)
Print("売り指値注文エラー: ", GetLastError());
逆指値注文:OP_BUYSTOP と OP_SELLSTOP
逆指値注文は「今より不利な価格になったら約定させたい」ときに使います。一見すると不利に思えますが、ブレイクアウト狙いの順張りには非常に有効です。
OP_BUYSTOP(買い逆指値注文)
現在のAsk価格より上の価格を指定します。「レジスタンスを上抜けたら買いたい」というブレイクアウト戦略で使います。
// 買い逆指値注文:現在価格より50pips上で買い予約(上抜けブレイク狙い)
double entryPrice = Ask + 50 * Point * 10;
int ticket = OrderSend(
Symbol(),
OP_BUYSTOP, // 買い逆指値注文
0.1,
entryPrice, // 現在のAskより上の価格
3,
entryPrice - 30 * Point * 10, // SL
entryPrice + 60 * Point * 10, // TP
"BuyStop Order",
12345,
0,
clrBlue
);
if(ticket < 0)
Print("買い逆指値注文エラー: ", GetLastError());
OP_SELLSTOP(売り逆指値注文)
現在のBid価格より下の価格を指定します。「サポートを下抜けたら売りたい」というブレイクアウト戦略で使います。
// 売り逆指値注文:現在価格より50pips下で売り予約(下抜けブレイク狙い)
double entryPrice = Bid - 50 * Point * 10;
int ticket = OrderSend(
Symbol(),
OP_SELLSTOP, // 売り逆指値注文
0.1,
entryPrice, // 現在のBidより下の価格
3,
entryPrice + 30 * Point * 10, // SL
entryPrice - 60 * Point * 10, // TP
"SellStop Order",
12345,
0,
clrRed
);
if(ticket < 0)
Print("売り逆指値注文エラー: ", GetLastError());
注文タイプの分類整理
6つの注文タイプを改めて分類すると、大きく2つのグループに分けられます。
成行注文(即時約定)
- OP_BUY(0):今すぐ買う
- OP_SELL(1):今すぐ売る
待機注文(予約注文)
- OP_BUYLIMIT(2):今より下で買い予約(逆張り)
- OP_SELLLIMIT(3):今より上で売り予約(逆張り)
- OP_BUYSTOP(4):今より上で買い予約(順張り)
- OP_SELLSTOP(5):今より下で売り予約(順張り)
EAのプログラムでは、成行注文だけで十分なケースも多いですが、ブレイクアウトEAや押し目買いEAを作るなら待機注文の理解は必須です。
OrderType()で注文タイプを判定する
注文タイプ定数は、注文を出すときだけでなくポジション管理でも重要です。OrderType()関数を使えば、選択中の注文がどのタイプかを判定できます。
// 自分のEAが持つ買いポジションだけを決済する例
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
continue;
// マジックナンバーと通貨ペアで自分の注文か判定
if(OrderMagicNumber() != 12345)
continue;
if(OrderSymbol() != Symbol())
continue;
// 注文タイプで分岐
if(OrderType() == OP_BUY)
{
// 買いポジションを決済
bool result = OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrBlue);
if(!result)
Print("決済エラー: ", GetLastError());
}
else if(OrderType() == OP_SELL)
{
// 売りポジションを決済
bool result = OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrRed);
if(!result)
Print("決済エラー: ", GetLastError());
}
}
ここでも買いの決済はBid、売りの決済はAskを使う点に注意してください。注文時と決済時で使う価格が逆になります。
よくある間違いと注意点
1. 価格の指定ミス(AskとBidの混同)
最も多いエラーがERR_INVALID_PRICE(129)です。以下のルールを覚えましょう。
| 操作 | 使う価格 |
|---|---|
| 買い注文を出す / 売りポジションを決済する | Ask |
| 売り注文を出す / 買いポジションを決済する | Bid |
2. ストップレベルの違反
待機注文の価格が現在価格に近すぎるとERR_INVALID_STOPS(130)が発生します。ブローカーごとに「最低限離さなければならない値幅(ストップレベル)」が設定されています。
// ストップレベルを取得して安全な価格を計算する
int stopLevel = (int)MarketInfo(Symbol(), MODE_STOPLEVEL);
double minDistance = stopLevel * Point;
// 例:OP_BUYLIMITの場合、Ask - minDistance より下の価格を指定する
double safePrice = Ask - minDistance - 10 * Point; // 余裕を持たせる
3. 待機注文の削除はOrderDelete()を使う
初心者がよく間違えるのが、待機注文の削除にOrderClose()を使ってしまうケースです。
- OrderClose():成行注文(OP_BUY / OP_SELL)の決済に使う
- OrderDelete():待機注文(LIMIT / STOP系)のキャンセルに使う
// 待機注文を削除する正しい方法
if(OrderType() == OP_BUYLIMIT || OrderType() == OP_SELLLIMIT ||
OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
{
bool result = OrderDelete(OrderTicket());
if(!result)
Print("待機注文の削除エラー: ", GetLastError());
}
待機注文に対してOrderClose()を使うとERR_INVALID_FUNCTION_PARAMVALUE(4051)などのエラーになるので注意しましょう。
まとめ
MQL4の注文タイプ定数は全部で6種類あり、大きく3つのカテゴリに分類できます。
- 成行注文:OP_BUY(0)/ OP_SELL(1)→ 今すぐ約定
- 指値注文:OP_BUYLIMIT(2)/ OP_SELLLIMIT(3)→ 有利な価格で予約(逆張り向き)
- 逆指値注文:OP_BUYSTOP(4)/ OP_SELLSTOP(5)→ 不利な方向で予約(ブレイクアウト向き)
覚えるべきポイントは以下の3つです。
- 買いはAsk、売りはBidを必ず守る
- 待機注文はストップレベルを考慮した価格を設定する
- 成行注文の決済はOrderClose()、待機注文のキャンセルはOrderDelete()を使う
まずはOP_BUYとOP_SELLの成行注文から始めて、慣れてきたら指値・逆指値注文にも挑戦してみてください。注文タイプを使い分けられれば、EAの戦略の幅が大きく広がります。

