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

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

MQL5におけるPlotIndexGetIntegerは、カスタムインジケーター内で定義された「プロット(描画ラインやヒストグラム)」に関する設定値を、プログラム実行中に取得するための関数です。

実務レベルの開発において、この関数は主に「現在の描画設定の状態確認」や「動的な描画制御のデバッグ」に活用されます。例えば、ユーザーがパラメーター画面から変更したラインの太さや色を、プログラム側が正しく認識しているかを判定する際などに不可欠です。

初心者の方が特につまずきやすいのは、「バッファインデックス」と「プロットインデックス」を混同してしまう点です。MQL5では、計算データを格納する「バッファ」と、それを画面に表示するための「プロット」は別々に管理されています。PlotIndexGetIntegerは、あくまで「見た目(プロット)」に関するプロパティを取得するためのものであるという点を意識することが、スムーズな開発への第一歩です。

2. 構文と戻り値

PlotIndexGetInteger関数には、取得したい値の種類によって2つのオーバーロード形式が存在します。

基本構文

// (1) プロパティ値を直接返す形式
long PlotIndexGetInteger(
   int  plot_index,        // プロットのインデックス(0から始まる)
   int  prop_id            // プロパティ識別子(ENUM_PLOT_PROPERTY_INTEGER)
   );

// (2) 成功・失敗をboolで返し、参照渡しで値を受け取る形式(修飾子が必要な場合)
bool PlotIndexGetInteger(
   int  plot_index,        // プロットのインデックス
   int  prop_id,           // プロパティ識別子
   int  modifier,          // プロパティの修飾子(色のインデックスなど)
   long& value             // 値を受け取る変数
   );

パラメーター

  • plot_index: インジケーター内で #property indicator_plots で定義した順番に基づくインデックス(0から開始)です。
  • prop_id: 取得したい項目のIDを指定します。
    • PLOT_LINE_WIDTH: ラインの太さ
    • PLOT_LINE_COLOR: ラインの色
    • PLOT_LINE_STYLE: ラインの種類(実線、点線など)
    • PLOT_DRAW_TYPE: 描画タイプ(ヒストグラム、ジグザグなど)
  • modifier: 多色表示設定(PLOT_COLOR_INDEXES)を使用している場合に、何番目の色を取得するかを指定します。

戻り値

指定したプロパティの値を long 型で返します。失敗した場合は -1 または 0 が返されるため、エラーチェックが必要です。

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

以下のコードは、移動平均線(MA)を描画するカスタムインジケーターの中で、自身のラインの「太さ」をログ出力する例です。

//--- インジケーターの設定
#property indicator_chart_window
#property indicator_plots   1  // プロット数は1つ
#property indicator_buffers 1

// プロット1の設定
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

double BufferMA[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   // 配列をインジケーターバッファに紐付け
   SetIndexBuffer(0, BufferMA, INDICATOR_DATA);

   // プロットインデックス 0(最初のプロット)の「太さ」を取得してみる
   int lineWidth = (int)PlotIndexGetInteger(0, PLOT_LINE_WIDTH);

   // 取得した値をエキスパートログに出力
   Print("現在のプロット0のライン太さ: ", lineWidth);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   // 計算ロジック(簡略化のため中身は省略)
   for(int i = prev_calculated; i < rates_total; i++)
   {
      BufferMA[i] = close[i]; // 単純に終値を代入するだけの例
   }

   return(rates_total);
}

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

  1. インデックスの取り違え:
    PlotIndexGetInteger で指定する plot_index は、SetIndexBuffer で指定するインデックスとは必ずしも一致しません。#property indicator_plots で定義した「描画の順番」であることを忘れないでください。

  2. EA(エキスパートアドバイザー)内での使用制限:
    この関数は、原則としてインジケーター内で使用するように設計されています。EAから他者のインジケーターのプロット情報を直接 PlotIndexGetInteger で抜くことはできません。EAからインジケーターの値を取得したい場合は、iCustomCopyBuffer を使用します。

  3. 型のキャスト:
    戻り値が long 型であるため、色(color型)や太さ(int型)として扱う場合は、サンプルコードのように適切な型キャストを行う必要があります。

  4. 設定反映のタイミング:
    OnInit 内で PlotIndexSetInteger を使って値を設定した直後に PlotIndexGetInteger を呼び出しても、内部的な更新タイミングによっては反映前の値が返ってくるケースがあります。動的な変更を行う場合は、処理の順序に注意しましょう。

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

アルゴリズムのロジックが完璧であっても、実運用において多くの開発者が陥る致命的な罠があります。それが「物理的なネットワーク遅延」です。自宅のPCや一般的な共有レンタルサーバーでMT5を稼働させる場合、証券会社のサーバーとの往復速度(レイテンシ)は数十ミリ秒から数百ミリ秒に達することがあります。秒単位の攻防が繰り広げられるFX市場において、この遅延はスリッページを増大させ、バックテストの結果を根底から覆す損失要因となります。

極限まで約定スピードを高め、期待期待値を確実に利益へと変えるためには、証券会社のデータセンターに近い場所に位置する「専用VPS」の活用が不可欠です。低レイテンシ環境で稼働させることは、単なる「効率化」ではなく、プロのクオンツエンジニアにとっては「必須のインフラ投資」です。ネットワークの壁によってアルゴリズムの優位性を潰さないよう、最適な実行環境を整えることが、自動売買で生き残るための最低条件と言えます。

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

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

コメント

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