
MQL4 MQL4 の注文関数
OrderClose()
- できること
- 保有中の注文(ポジション)を決済する
- 対応
- MQL4
OrderClose() とは
MQL4 で、保有中の成行注文(ポジション)を決済する関数です。ロット数を保有量より小さくすると一部だけ決済できます。待機注文(指値・逆指値)の取り消しには OrderDelete() を使います。
OrderClose() の書式と引数
bool OrderClose(
int ticket,
double lots,
double price,
int slippage,
color arrow_color=clrNONE
)| 引数 | 型 | 省略時 | 説明 |
|---|---|---|---|
ticket | int | 必須 | 決済する注文のチケット番号。 |
lots | double | 必須 | 決済するロット数。全部決済するなら OrderLots() の値。 |
price | double | 必須 | 決済価格。買いポジションは Bid、売りポジションは Ask。OrderClosePrice() を使うとどちらでも正しい価格になります。 |
slippage | int | 必須 | 許容するスリッページ(ポイント単位)。 |
arrow_color | color | clrNONE | チャートに表示する矢印の色。 |
戻り値
成功すると true、失敗すると false を返します。理由は GetLastError() で確認します。
OrderClose() の使い方(コード例)
// この EA(マジックナンバー 12345)のポジションをすべて決済する
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != _Symbol || OrderMagicNumber() != 12345) continue;
if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue; // 待機注文は除く
if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 30, clrRed))
Print("OrderClose 失敗 ticket=", OrderTicket(), " error=", GetLastError());
}OnTick()・OnStart() などの関数の中に書いて使う例です。MetaEditor でコンパイルできることを確認済みです。
OrderClose() の注意点
- 決済価格の Bid と Ask を逆にするとエラー129(価格が不正)やエラー138(リクオート)になります。OrderSelect() で選んだあと OrderClosePrice() を渡すと間違えません。
- 全決済をループで行うときは、決済すると番号がずれるので、インデックスを大きいほうから小さいほうへ回します。
- 一部決済すると、残りは新しいチケット番号のポジションになります。
- MQL5 にはこの関数はありません。CTrade の PositionClose() を使います。
MQL4 と MQL5 の違い
MQL5 では CTrade クラスの PositionClose(チケット) で決済します。一部決済は PositionClosePartial() です。












