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

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

MQL5におけるPlotIndexSetDoubleは、カスタムインジケーターのプロット(描画)に関する「double型」のプロパティを動的に設定するための関数です。

実務レベルの開発において、この関数が最も頻繁に使われるのは「空の値(Empty Value)」の定義です。たとえば、特定の条件を満たさない時にはラインを描画したくない、あるいはヒストグラムを表示させたくないというケースがあります。この際、何も設定しないと「0」の値が描画されてしまい、チャートがゼロ地点まで急降下するような不自然な動きをしてしまいます。

PlotIndexSetDoubleを使って「この値のときは描画を無視する」というルールを正しく定義することで、視認性の高いプロ仕様のインジケーターを作成することが可能になります。初心者の方は「単にグラフの色を変えるためのもの」と思いがちですが、実際にはバックテストの視覚確認や、他のプログラムからその指標を呼び出す際のデータクレンジングとして非常に重要な役割を担っています。

2. 構文と戻り値

PlotIndexSetDouble関数の基本的な構文は以下の通りです。

bool PlotIndexSetDouble(
   int                      plot_index,    // プロットのインデックス(0から始まる)
   ENUM_PLOT_PROPERTY_DOUBLE  prop_id,       // 設定するプロパティのID
   double                   prop_value     // 設定する値
);

パラメーターの解説

  1. plot_index:
    #property indicator_plotsで定義した順番に基づくインデックス番号です。最初のプロットは「0」となります。
  2. prop_id:
    設定したい項目の識別子です。MQL5で用意されているのは主に PLOT_EMPTY_VALUE(空の値として扱う数値)です。
  3. prop_value:
    実際に設定する数値です。一般的には EMPTY_VALUE(初期値)や 0.0 などが指定されます。

戻り値

設定に成功した場合は true、失敗した場合は false を返します。


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

以下は、特定の価格(この例では直近10本の移動平均より下の価格)の時だけドットを表示させ、それ以外の時は「空」として扱うインジケーターの例です。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

// プロットの設定
#property indicator_label1  "Special Dot"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_width1  2

double Buffer1[];

//--- 初期化関数
int OnInit()
{
   // 配列をインジケーターバッファに関連付け
   SetIndexBuffer(0, Buffer1, INDICATOR_DATA);

   // --- PlotIndexSetDoubleの活用例 ---
   // 0.0 の値を「空(描画しない)」として定義する
   // これにより、Buffer1[i] = 0.0 を代入した箇所には何も表示されなくなる
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);

   // 描画するシンボル(矢印など)の設定(今回はドット)
   PlotIndexSetInteger(0, PLOT_ARROW, 159);

   return(INIT_SUCCEEDED);
}

//--- 計算関数
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 &spread[],
                const int &real_volume[])
{
   int start = prev_calculated - 1;
   if(start < 0) start = 0;

   for(int i = start; i < rates_total; i++)
   {
      // 仮のロジック:終値が始値より高い場合のみ表示
      if(close[i] > open[i])
      {
         Buffer1[i] = high[i]; // 高値の位置にドットを表示
      }
      else
      {
         // PlotIndexSetDoubleで0.0をEMPTYとして定義したため、
         // ここで0.0を代入すると何も描画されない
         Buffer1[i] = 0.0;
      }
   }

   return(rates_total);
}

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

① インデックスの勘違い

SetIndexBuffer で使うバッファ番号と、PlotIndexSetDouble で使うプロット番号を混同しないようにしてください。indicator_plots で定義した「描画される図形」の順番を指定する必要があります。

② デフォルト値の罠

MQL5の EMPTY_VALUE は非常に大きな値(1.797…e+308)として定義されています。もし PlotIndexSetDouble0.0 を空の値として再定義した場合、計算式内で誤って EMPTY_VALUE を代入しても、それは「空」とはみなされず、チャートのスケールが破壊される(チャートが縦に潰れる)原因となります。

③ OnInit以外での実行

基本的には OnInit() 内で一度設定すれば十分ですが、ユーザー設定(入力パラメーター)によって「空」の定義を動的に変えたい場合は OnCalculate() 内でも実行可能です。ただし、頻繁な呼び出しは計算負荷につながるため、必要最小限に留めましょう。


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

アルゴリズム取引において、PlotIndexSetDouble を使いこなして完璧なインジケーターを開発したとしても、それを実行する「環境」が貧弱であれば、その努力はすべて水の泡となります。FXの自動売買において、最も致命的な損失原因の一つは、ネットワークの「レイテンシ(遅延)」です。自宅のPCや一般的な共有サーバーでEAを稼働させた場合、証券会社のサーバーとの物理的距離や不安定な家庭用回線により、コンマ数秒のラグが発生します。

このわずかな遅延により、プログラムが意図した価格での約定(エントリー・決済)ができず、「スリッページ」による見えないコストが積み重なります。プロのクオンツエンジニアが極限まで約定スピードを追求するのは、どんなに優れたロジックも、実行速度が遅ければ期待期待値通りのパフォーマンスを発揮できないことを知っているからです。本格的にシステムトレードでの収益化を目指すのであれば、証券会社のデータセンターに物理的に近い、FX専用のVPS(仮想専用サーバー)を利用することは、もはや「選択肢」ではなく「必須条件」といえます。

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

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

コメント

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