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

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

MQL5のIsStopped()関数は、「現在動作しているプログラム(EA、スクリプト、インジケーター)に対して、MetaTrader 5(MT5)側から停止命令が出ているか」を確認するための関数です。

実務開発において、初心者が最も陥りやすい罠が「ループ処理の暴走」です。例えば、過去1,000本分のローソク足を解析する、あるいは複雑な計算を行う重いループを書いた場合、その処理が終わるまでMT5の停止命令が無視されてしまうことがあります。

具体的には、以下のようなシーンで活用します。
– ユーザーがチャートからEAを削除した時。
– MT5自体を閉じようとした時。
– EAの設定を変更して再起動がかかった時。

この関数を適切に組み込んでいないと、EAを削除したはずなのにバックグラウンドで処理が残り続け、PCの動作が重くなったり、意図しないタイミングで誤発注をしてしまうなどのトラブルを招きます。堅牢なシストレ開発において、IsStopped()は「安全装置」としての役割を担います。


2. 構文と戻り値

IsStopped()関数の仕様は非常にシンプルです。パラメーターは不要で、どこからでも呼び出すことができます。

bool IsStopped();

戻り値

  • true: プログラムを停止するよう命令が出ている状態。
  • false: プログラムが正常に動作を継続して良い状態。

MT5プラットフォーム側で「EAの削除」「チャートの閉鎖」「MT5の終了」などの操作が行われると、内部フラグが立ち、この関数が true を返すようになります。


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

以下は、過去の膨大なデータを走査する際や、時間のかかる計算ループ内で IsStopped() を使用する実践的な例です。

//+------------------------------------------------------------------+
//| 過去データを大量に解析するサンプルスクリプト                           |
//+------------------------------------------------------------------+
void OnStart()
{
    int limit = 1000000; // 100万回の計算ループを想定

    Print("計算を開始します...");

    for(int i = 0; i < limit; i++)
    {
        // --- ここが重要 ---
        // ループの各ステップで、停止命令が出ていないかチェックする
        if(IsStopped())
        {
            Print("ユーザーによる停止命令を検知しました。処理を中断します。");
            // 処理を安全に終了させるための後処理をここに書く
            return;
        }

        // 何らかの重い計算処理(例:数学的計算や配列操作)
        double result = MathSqrt(MathPow(i, 2.0));

        // 1万回ごとに進捗を表示
        if(i % 100000 == 0) 
            Print("計算中... ", i, " / ", limit);
    }

    Print("すべての計算が正常に完了しました。");
}

このコードでは、ループの途中でユーザーがスクリプトを停止(右クリックで削除など)した場合、即座に IsStopped()true となり、return によって安全に処理が終了します。


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

(1) チェックを入れすぎない、入れなさすぎない

非常に高速なループ(ナノ秒単位の処理)の中で毎度 IsStopped() を呼び出すと、関数呼び出し自体のオーバーヘッドで処理速度がわずかに低下します。逆に、数秒かかるような重い処理の後にしかチェックしないと、EAがなかなか終了せずストレスの原因になります。バランスが重要です。

(2) IsStopped() は「強制終了」ではない

この関数はあくまで「止まってくださいという命令が出ていますよ」と教えてくれるだけです。true が返ってきた後に、実際に return したりループを抜ける処理を書くのは開発者の責任です。これを見落とすと、フラグが true なのに延々と計算を続ける「ゾンビEA」になってしまいます。

(3) OnInit内での利用

初期化処理(OnInit)が非常に長いEAの場合も、途中で IsStopped() をチェックすべきです。MT5起動直後にチャートを閉じた場合など、初期化中に終了命令が飛んでくることがあるためです。


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

プロレベルのアルゴリズムトレードを実践する上で、コードの最適化と同じ、あるいはそれ以上に重要なのが「実行環境の物理的な距離」です。IsStopped() を使ってどれだけ論理的に完璧なコードを書いたとしても、ご自宅のPCから一般的なインターネット回線を通じて注文を出している限り、プロの世界では勝負になりません。

自宅PCでの運用は、プロバイダー経由のネットワーク遅延(レイテンシ)が発生し、MT5上の表示価格とサーバー側の実価格が乖離する「スリッページ」を頻発させます。コンマ数秒の遅れが、本来得られるはずだった利益を削り、致命的な損失へと変えてしまうのです。約定スピードを極限まで高め、24時間365日安定したトレードを実現するには、証券会社のサーバーに物理的に近いデータセンター内に設置された「専用VPS」の活用が不可欠です。低遅延な環境こそが、ロジックを100%機能させるための大前提となります。

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

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

コメント

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