本記事で公開しているライブラリーは公開当時のままで、古くなっております。最新版のライブラリーはメルマガ登録いただくことでダウンロードできます。
ゴミとなった待機注文はきちんと削除しよう
待機注文を削除する、MQL4の標準関数にOrderDelete()があります。
はい。OrderSend()やOrderClose()と流れが一緒なので以下割愛です。OrderDelete()が失敗した時を考慮した待機注文削除関数を紹介します。
//+------------------------------------------------------------------+
//|【関数】信頼できる待機注文削除 |
//| |
//|【引数】 IN OUT 引数名 説明 |
//| --------------------------------------------------------- |
//| ○ aTicket チケット番号 |
//| |
//|【戻値】true :正常終了 |
//| false:異常終了 |
//| |
//|【備考】なし |
//+------------------------------------------------------------------+
bool orderDeleteReliable(int aTicket)
{
bool result = false;
int startTime = GetTickCount();
Print("Attempted orderDeleteReliable(#" + aTicket + ")");
while(true){
if(IsStopped()){
Print("Trading is stopped!");
return(-1);
}
if(GetTickCount() - startTime > MAX_RETRY_TIME * MILLISEC_2_SEC){
Print("Retry attempts maxed at " + MAX_RETRY_TIME + "sec");
return(-1);
}
if(IsTradeContextBusy()){
Print("Must wait for trade context");
}else{
result = OrderDelete(aTicket);
if(result){
Print("Successful delete of Ticket #" + aTicket);
return(result);
}
int err = GetLastError();
// 一時的エラーの場合はリトライするが、恒常的エラーの場合は処理中断(リトライしてもエラーになるため)
if(err == ERR_NO_ERROR ||
err == ERR_COMMON_ERROR ||
err == ERR_SERVER_BUSY ||
err == ERR_NO_CONNECTION ||
err == ERR_TOO_FREQUENT_REQUESTS ||
err == ERR_TRADE_TIMEOUT ||
err == ERR_INVALID_PRICE ||
err == ERR_TRADE_DISABLED ||
err == ERR_PRICE_CHANGED ||
err == ERR_OFF_QUOTES ||
err == ERR_BROKER_BUSY ||
err == ERR_REQUOTE ||
err == ERR_TOO_MANY_REQUESTS ||
err == ERR_TRADE_CONTEXT_BUSY){
Print("Temporary Error: " + err + " " + ErrorDescription(err) + ". waiting");
}else{
Print("Permanent Error: " + err + " " + ErrorDescription(err) + ". giving up");
return(result);
}
// 最適化とバックテスト時はリトライは不要
if(IsOptimization() || IsTesting()){
return(result);
}
}
Sleep(SLEEP_TIME * MILLISEC_2_SEC);
}
return(result);
}
サンプルEA
関数だけではイメージが沸きづらいと思いますので、サンプルEAを載せておきます。
「信頼できる待機注文削除関数」のSample.mq4
サイズ: 4.0KB
バージョン: 1.0
公開:2019年10月16日
258 ダウンロード
