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

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

MQL5の ChartWindowOnDropped() 関数は、EA(エキスパートアドバイザー)、スクリプト、またはインジケーターがチャート上の「どのウィンドウ」にドロップされたかを特定するための関数です。

MT5のチャート画面は、価格推移を表示する「メインウィンドウ(インデックス 0)」と、RSIやMACDなどのオシレーターが表示される「サブウィンドウ(インデックス 1以降)」で構成されています。実務開発において、この関数は以下のようなシーンで重宝されます。

  • GUIの表示位置の最適化: ユーザーがEAをサブウィンドウに投げ入れた際、そのウィンドウのサイズに合わせてボタンやラベルの配置を自動調整する。
  • 特定のインジケーターとの連動: 既存のインジケーターが表示されているサブウィンドウを特定し、そのウィンドウ内に重ねてグラフィックを描画する。

初心者がつまずきやすいポイントは、この関数が「ドロップされた瞬間(初期化時)」の情報を取得するためのものであるという点です。後からウィンドウの構成が変わった場合には、別の手法(ChartWindowFind など)を組み合わせる必要があることを覚えておきましょう。

2. 構文と戻り値

この関数の構文は非常にシンプルで、引数は不要です。

int  ChartWindowOnDropped();
  • 戻り値:
    • EAやスクリプトがドロップされたチャートウィンドウのインデックスを返します。
    • 0 はメインウィンドウを指します。
    • 1 以上の数値は、サブウィンドウの番号を指します。

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

以下は、EAをチャートに適用した際、どのウィンドウにドロップされたかを判定し、そのウィンドウ内に「適用完了」のラベルを表示する実用的なサンプルコードです。

//+------------------------------------------------------------------+
//|                                           SampleDroppedQuery.mq5 |
//|                                  Copyright 2024, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // EAがドロップされたウィンドウ番号を取得
    int droppedWindow = ChartWindowOnDropped();

    // 取得した情報をターミナルの「操作履歴」に出力
    Print("EAがドロップされたウィンドウインデックス: ", droppedWindow);

    // メインかサブかによって処理を分岐させる例
    string message;
    if(droppedWindow == 0)
    {
        message = "メインチャートに適用されました。";
    }
    else
    {
        message = "サブウィンドウ " + IntegerToString(droppedWindow) + " に適用されました。";
    }

    // チャート上にラベルを作成して表示位置を指定
    CreateLabel(droppedWindow, message);

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 指定したウィンドウにラベルを作成する関数                               |
//+------------------------------------------------------------------+
void CreateLabel(int windowIndex, string text)
{
    string labelName = "DropInfoLabel";

    // 既存のオブジェクトがあれば削除
    ObjectDelete(0, labelName);

    // ラベルの生成(windowIndexで表示先を指定)
    if(ObjectCreate(0, labelName, OBJ_LABEL, windowIndex, 0, 0))
    {
        ObjectSetString(0, labelName, OBJPROP_TEXT, text);
        ObjectSetInteger(0, labelName, OBJPROP_CORNER, CORNER_LEFT_UPPER);
        ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, 20);
        ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, 20);
        ObjectSetInteger(0, labelName, OBJPROP_COLOR, clrYellow);
        ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 12);

        ChartRedraw();
    }
}

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

  1. コンテクストの限定: ChartWindowOnDropped() は、基本的に OnInit() 内や、ドラッグ&ドロップが発生した直後の処理で使用するものです。実行中にウィンドウ構成が変わっても、この関数の戻り値が自動的に更新されるわけではありません。
  2. インジケーターでの挙動: インジケーターで #property indicator_chart_window を指定している場合、強制的にメインウィンドウ(0)に描画されるため、この関数の活用場面は限られます。主にサブウィンドウ用インジケーター(indicator_separate_window)で有効です。
  3. 座標取得との混同: マウスが「今どこにあるか」を知りたい場合は、この関数ではなく OnChartEvent 内の CHARTEVENT_MOUSE_MOVE を利用します。ChartWindowOnDropped はあくまで「適用時のスナップショット」であると認識してください。

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

プロレベルのアルゴリズムトレードにおいて、ロジック以上に勝敗を分けるのが「物理的な通信レイテンシ(遅延)」です。どれだけ優れたEAを開発し、ChartWindowOnDropped で完璧なUIを構築したとしても、自宅のPCから一般的なインターネット回線で注文を出している限り、機関投資家やプロのクオンツには太刀打ちできません。

FX市場ではコンマ数秒の遅延が「スリッページ」を引き起こし、本来得られるはずだった利益を削り取ります。特にボラティリティが高い局面では、ネットワークの遅延は致命的な損失に直結します。極限まで約定スピードを高め、24時間安定した稼働を実現するためには、MT5のサーバーに物理的に近いデータセンターに設置された「専用VPS」の活用が不可欠です。本気でシストレでの収益化を目指すエンジニアにとって、VPSは単なるツールではなく、トレード環境における必須のインフラと言えます。

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

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

コメント

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