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

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

ChartIndicatorDeleteは、指定したチャートウィンドウから特定のインジケーターを削除するための関数です。

実務開発において、EA(エキスパートアドバイザー)がチャート上にテクニカル指標を自動で表示させることは珍しくありません。しかし、「EAを停止したのにインジケーターだけがチャートに残ってしまう」という状態は、ユーザー体験を損なうだけでなく、他の分析を妨げる原因になります。

実務での主な活用シーン:
* クリーンアップ処理: EAがチャートから削除された際(OnDeinit時)、EAが表示させたインジケーターを自動で消去する。
* 動的なロジック切り替え: トレンド相場とレンジ相場で使用するインジケーターを動的に入れ替える。
* ダッシュボード機能: ボタンクリックなどのイベントに合わせて、インジケーターの表示・非表示を切り替える。

初心者が特につまずきやすいポイントは、「削除に使う名前はファイル名ではない」という点です。この関数で指定するのは、インジケーターの「短縮名(ショートネーム)」であるということを意識する必要があります。

2. 構文と戻り値

ChartIndicatorDelete関数の構文は以下の通りです。

bool ChartIndicatorDelete(
   long           chart_id,      // チャートID(0は現在のチャート)
   int            sub_window,    // サブウィンドウ番号(0はメインウィンドウ)
   string         indicator_shortname // インジケーターの短縮名
);

パラメーター解説

  1. chart_id: 操作対象のチャートIDを指定します。通常、現在のチャートであれば 0 または ChartID() を使用します。
  2. sub_window: インジケーターが表示されているウィンドウ番号です。メインウィンドウは 0 です。オシレーター系など、チャート下の別枠に表示されている場合は 1 以上の数値を指定します。
  3. indicator_shortname: 削除したいインジケーターの「短縮名」です。カスタムインジケーターの場合、プログラム内で IndicatorSetString(INDICATOR_SHORTNAME, "名前") で設定した文字列になります。

戻り値

  • 成功した場合:true
  • 失敗した場合:false
    • 失敗した理由は GetLastError() 関数で確認できます。

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

以下のサンプルは、EAの起動時にRSI(相対力指数)をサブウィンドウに表示し、EAがチャートから削除される時にそのRSIを自動で削除するコードです。

//+------------------------------------------------------------------+
//|                                     IndicatorDelete_Example.mq5  |
//+------------------------------------------------------------------+
#property strict

// インジケーターの短縮名を定義
string rsi_name = "My_RSI_Sample";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // 1. RSIのハンドルを取得
    int rsi_handle = iRSI(_Symbol, _Period, 14, PRICE_CLOSE);

    if(rsi_handle == INVALID_HANDLE) {
        Print("RSIハンドルの取得に失敗しました。");
        return(INIT_FAILED);
    }

    // 2. インジケーターに短縮名をセット(削除時に必要)
    // 注意: 標準インジケーターをChartIndicatorAddで追加する場合、
    // 内部的に名前が決まっていることが多いですが、ここでは概念を説明します。

    // 3. チャートの新しいサブウィンドウにRSIを追加
    if(!ChartIndicatorAdd(0, 1, rsi_handle)) {
        Print("インジケーターの追加に失敗。エラーコード:", GetLastError());
    }

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // 4. EA終了時にチャートからRSIを削除
    // 第2引数の1はサブウィンドウ番号、第3引数はインジケーターの短縮名
    // 標準RSIの場合、通常は "RSI(14)" のような名前になります。
    if(ChartIndicatorDelete(0, 1, "RSI(14)")) {
        Print("RSIを正常に削除しました。");
    } else {
        Print("RSIの削除に失敗。エラーコード:", GetLastError());
    }
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // ロジック実行
}

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

  1. 短縮名の不一致(最も多いミス):
    ChartIndicatorDelete に渡す名前は、ファイル名(RSI.ex5など)ではありません。インジケーターのプロパティや、データウィンドウに表示される名前を指定する必要があります。不明な場合は、ChartIndicatorName 関数を使って現在チャートに存在するインジケーター名を列挙して確認するのが確実です。

  2. サブウィンドウ番号の指定:
    インジケーターがどのウィンドウに存在するかを正確に把握する必要があります。インジケーターを削除してもサブウィンドウ自体は(空になっても)残る場合があるため、ウィンドウごと消したい場合は ChartCustomDoubleTap や別の処理の検討が必要になることもあります。

  3. 非同期実行:
    ChartIndicatorDelete はチャートへのコマンド送信であり、関数が true を返した瞬間に画面から消えているとは限りません。描画更新を強制したい場合は、直後に ChartRedraw() を呼び出すのがベストプラクティスです。

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

プロのクオンツエンジニアとして、ロジック以上に重視すべきなのが「実行環境」です。どれほど高度なインジケーター制御やエントリーロジックを組み込んでも、自宅のPC環境から一般的なインターネット回線を通じて注文を出している限り、機関投資家や専業トレーダーには決して勝てません。家庭用回線では、パケットの揺らぎ(ジッター)や数ミリ秒〜数百ミリ秒のネットワーク遅延(レイテンシ)が不可避であり、これがスリッページを引き起こし、期待期待値を大幅に削り取ります。

自動売買において、1ミリ秒の遅延は収益曲線を右肩下がりに変える致命的な要因となります。極限まで約定スピードを高め、意図した価格で正確に約定させるためには、ブローカーのサーバーと同じデータセンター内に位置する、もしくは超低遅延で接続された「専用のVPS(仮想専用サーバー)」の利用が必須です。安定した電源、24時間稼働の保証、そして物理的距離を短縮するネットワーク環境。これらが揃って初めて、プログラムは設計通りのパフォーマンスを発揮します。本気でシストレを運用するなら、VPSへの投資を惜しむことは、利益を捨てることと同義であると理解してください。

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

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

コメント

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