MQL4MQL5 スクリプト 注文・決済
待機注文(指値・逆指値)をすべて取り消したい
結論:MQL4 は OrderType() が OP_BUYLIMIT 以上の注文を OrderDelete()、MQL5 は OrderGetTicket() で順に取り出して trade.OrderDelete() します。
考え方
保有中のポジションの決済と、まだ約定していない待機注文の取り消しは、別の関数で行います。MQL4 では注文一覧の中に両方が入っているため、注文の種類で待機注文だけを選びます。MQL5 では待機注文は「注文」、保有中は「ポジション」と分かれています。
- 注文の一覧を後ろから順にループする
- 待機注文だけを選び、通貨ペアの条件に合うものを取り消す
そのまま使えるコード
MetaEditor の「新規作成」で「スクリプト」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Scripts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// このチャートの通貨ペアの待機注文をすべて取り消すスクリプト(MT4)
void OnStart()
{
int n = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol() != _Symbol || OrderType() <= OP_SELL) continue; // ポジションは除く
if(OrderDelete(OrderTicket()))
n++;
else
Print("取消失敗 ticket=", OrderTicket(), " error=", GetLastError());
}
Print(n, " 件の待機注文を取り消しました");
}MQL5(MT5)
// このチャートの通貨ペアの待機注文をすべて取り消すスクリプト(MT5)
#include <Trade\Trade.mqh>
void OnStart()
{
CTrade trade;
int n = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
ulong ticket = OrderGetTicket(i);
if(ticket == 0 || OrderGetString(ORDER_SYMBOL) != _Symbol) continue;
if(trade.OrderDelete(ticket))
n++;
else
Print("取消失敗 ticket=", ticket, " ", trade.ResultRetcodeDescription());
}
Print(n, " 件の待機注文を取り消しました");
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
注意点
- 現在値が注文価格のすぐ近く(フリーズレベル内)にあると、取り消しが拒否されることがあります。












