MQL4MQL5 スクリプト 注文・決済
全ポジションを決済したい(EA のポジションだけも可)
結論:ポジションの一覧を後ろから順にループして、1つずつ決済します。マジックナンバーで絞れば特定の EA の分だけ決済できます。
考え方
一括決済は「ポジションを1つずつ選んで決済する」ループで作ります。決済すると一覧の番号がずれるため、最後(総数 − 1)から 0 に向かって逆順に回すのがポイントです。ここでは、通貨ペアとマジックナンバーで絞り込める一括決済スクリプトを例にしています。
- ポジションの総数を取得し、最後から順にループする
- 通貨ペア・マジックナンバーの条件に合わないものは飛ばす
- 条件に合うポジションを決済し、失敗したらログに出す
そのまま使えるコード
MetaEditor の「新規作成」で「スクリプト」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Scripts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
#property script_show_inputs
// ポジションを一括決済するスクリプト(MT4)
input bool InpThisSymbol = true; // true=このチャートの通貨ペアだけ
input int InpMagic = -1; // マジックナンバー(-1 ならすべて)
void OnStart()
{
int closed = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--) // 後ろから回す
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderType() > OP_SELL) continue; // 待機注文は除く
if(InpThisSymbol && OrderSymbol() != _Symbol) continue;
if(InpMagic >= 0 && OrderMagicNumber() != InpMagic) continue;
RefreshRates();
if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 30))
closed++;
else
Print("決済失敗 ticket=", OrderTicket(), " error=", GetLastError());
}
Print(closed, " 件決済しました");
}MQL5(MT5)
#property script_show_inputs
// ポジションを一括決済するスクリプト(MT5)
#include <Trade\Trade.mqh>
input bool InpThisSymbol = true; // true=このチャートの通貨ペアだけ
input long InpMagic = -1; // マジックナンバー(-1 ならすべて)
void OnStart()
{
CTrade trade;
int closed = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--) // 後ろから回す
{
ulong ticket = PositionGetTicket(i);
if(ticket == 0) continue;
if(InpThisSymbol && PositionGetString(POSITION_SYMBOL) != _Symbol) continue;
if(InpMagic >= 0 && PositionGetInteger(POSITION_MAGIC) != InpMagic) continue;
if(trade.PositionClose(ticket))
closed++;
else
Print("決済失敗 ticket=", ticket, " ", trade.ResultRetcodeDescription());
}
Print(closed, " 件決済しました");
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- EA の中で使うときは、OnStart() の中身を関数にして、決済したいときに呼びます。
- 買いだけ・売りだけ決済したいときは、ポジションの種類(OrderType()・POSITION_TYPE)の条件を足します。
注意点
- 0 から順に回すと、決済で番号がずれて一部のポジションが残ります。必ず後ろから回します。
- FIFO ルールのある口座では、古いポジションから決済する必要があります(MT4 エラー150、MT5 10045)。
このコードで使っている関数
うまく動かないときに出やすいエラー
あわせて読みたいレシピ
- 待機注文(指値・逆指値)をすべて取り消したいMQL4 は OrderType() が OP_BUYLIMIT 以上の注文を OrderDelete()、MQL5 は OrderGetTicket() で順に取り出して trade.OrderDelete() します。
- 金曜日の指定時刻にポジションを決済したい(週末持ち越しを避けたい)サーバー時刻の曜日(day_of_week が 5)と時刻を判定し、指定時刻を過ぎたら全決済し、新規注文も止めます。
- チャートにボタンを置いて、押したら注文したいOBJ_BUTTON を作り、OnChartEvent() で CHARTEVENT_OBJECT_CLICK を受け取ってボタン名を判定します。
- 保有中のポジション数を数えたいポジションの一覧をループし、通貨ペア・マジックナンバー・売買の向きで絞って数えます。
「注文・決済」のレシピ一覧
- 成行で買い・売りの注文を出したい
- 損切り・利確を pips で指定して注文したい
- 指値・逆指値注文を出したい
- 全ポジションを決済したい(EA のポジションだけも可)
- 待機注文(指値・逆指値)をすべて取り消したい
- 注文に失敗したら何回か再試行したい
- 利益が出たら半分だけ決済したい












