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() です。
OrderClose() でよく出るエラー
OrderClose() を使う逆引きレシピ
- 全ポジションを決済したい(EA のポジションだけも可)ポジションの一覧を後ろから順にループして、1つずつ決済します。マジックナンバーで絞れば特定の EA の分だけ決済できます。
- 利益が出たら半分だけ決済したいMQL4 は OrderClose() のロットに保有量より小さい値、MQL5 は trade.PositionClosePartial(チケット, ロット) を使います。
- 一定時間たったポジションを決済したい現在のサーバー時刻 TimeCurrent() から約定時刻を引いて保有時間(秒)を求め、上限を超えたら決済します。
- 金曜日の指定時刻にポジションを決済したい(週末持ち越しを避けたい)サーバー時刻の曜日(day_of_week が 5)と時刻を判定し、指定時刻を過ぎたら全決済し、新規注文も止めます。












