信頼できる待機注文削除関数

本記事で公開しているライブラリーは公開当時のままで、古くなっております。最新版のライブラリーはメルマガ登録いただくことでダウンロードできます。

ゴミとなった待機注文はきちんと削除しよう

待機注文を削除する、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日

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG