【MQL5】Sleep関数の使い方と自動売買実装コード

1. Sleep関数の概要と実務での活用法

MQL5におけるSleep()関数は、プログラムの実行をミリ秒(1/1000秒)単位で指定した時間だけ一時停止させるための関数です。一見すると「ただ止めるだけ」の単純な関数に思えますが、実務的なアルゴリズムトレードにおいては非常に重要な役割を果たします。

トレードサーバーとの通信において、注文が拒否された(リクオート)際や、サーバーが一時的に混雑している際に、即座に再リクエストを投げると「スパム行為」とみなされて接続を切断されるリスクがあります。そこでSleep()を挟むことで、サーバー側に負荷をかけず、安定したリトライ処理を実現します。また、複数のインジケーターの計算完了を待つ場合や、ループ処理内での負荷調整など、プログラムの「余裕」を作るために欠かせないツールです。

2. 構文と戻り値

Sleep()関数の構造は非常にシンプルです。

void Sleep(
   int milliseconds   // 停止させる時間(ミリ秒)
);
  • パラメーター: milliseconds(整数型)。プログラムを何ミリ秒停止させるかを指定します。1秒停止させたい場合は「1000」を入力します。
  • 戻り値: なし(void)。実行すると指定時間だけ処理が止まり、時間が経過すると次の行から処理が再開されます。

3. 具体的な使い方・実践サンプルコード

実務で最も多く使われる「注文失敗時のリトライ処理」のコード例を紹介します。サーバーが一時的にビジー状態である場合、1秒待機して最大3回まで再試行するロジックです。

//+------------------------------------------------------------------+
//| 注文実行関数(リトライ機能付き)                                     |
//+------------------------------------------------------------------+
bool ReliableOrderSend(MqlTradeRequest &request, MqlTradeResult &result)
{
   int max_retries = 3;    // 最大リトライ回数
   int retry_delay = 1000; // リトライ時の待機時間(1秒)

   for(int i = 0; i < max_retries; i++)
   {
      // 注文を送信
      if(OrderSend(request, result))
      {
         Print("注文成功");
         return true;
      }
      else
      {
         // サーバーがビジー状態(エラーコード 10018など)の場合にSleep
         int error_code = GetLastError();
         Print("注文失敗。エラーコード: ", error_code, " 回数: ", i+1);

         // 最終試行でなければ待機してリトライ
         if(i < max_retries - 1)
         {
            Print(retry_delay, "ミリ秒待機して再試行します...");
            Sleep(retry_delay); 
         }
      }
   }
   return false;
}

4. 使用上の注意点とよくあるエラー

Sleep()を使用する際には、MQL5特有の制限に注意が必要です。

  1. カスタムインジケーターでは使用不可: OnCalculate()OnInit()などのインジケーター内ではSleep()は動作しません。インジケーターはチャート表示のメインスレッドを共有しているため、停止させるとチャート全体がフリーズしてしまうからです。
  2. ストラテジーテスターでの挙動: バックテスト中、Sleep()はプログラムの実行を実際に止めるわけではなく、シミュレーション上の時間を進めるだけです。そのため、バックテストの実行速度が低下することはありませんが、リアル環境と同じ感覚で使うと挙動が異なる場合があります。
  3. ティックの取りこぼし: Sleep(5000)(5秒停止)を実行している間、EAは価格の変化(OnTickイベント)を一切検知できません。激しく価格が動く相場では、停止中に有利な価格を逃す「機会損失」のリスクがあることを理解しておく必要があります。

5. 【重要】自動売買における約定スピードと環境の罠

どれほど優れたロジックを組み、Sleep()でスマートなリトライ処理を実装したとしても、物理的なネットワーク環境が劣悪であればすべてが台無しになります。自宅のPCや一般的な光回線でEAを稼働させる場合、トレーダーの注文が証券会社のサーバーに届くまでに数十〜数百ミリ秒の遅延(レイテンシ)が発生します。このわずかな遅延の間に価格が滑り(スリッページ)、バックテストでは勝てていたロジックがリアル口座では損失を出し続けるという「環境の罠」に陥ります。

プロのクオンツエンジニアが極限まで約定スピードを追求するのは、この遅延を1ミリ秒でも削ることが利益に直結することを知っているからです。物理的な距離をゼロに近づけるため、証券会社のサーバーと同じデータセンター内、あるいは至近距離に設置された専用のVPS(仮想専用サーバー)を利用することは、自動売買において「推奨」ではなく「必須」の条件です。安定した電源、24時間稼働の安定性、そして低レイテンシ。この基盤があって初めて、プログラムは本来のパフォーマンスを発揮できるのです。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました