本記事で公開しているライブラリーは公開当時のままで、古くなっております。最新版のライブラリーはメルマガ登録いただくことでダウンロードできます。
ゴミとなった待機注文はきちんと削除しよう
待機注文を削除する、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日
210 ダウンロード