SetIndexBuffer

この関数は、指定された指標バッファとdouble 型の1次元動的配列を関連付けます。

bool  SetIndexBuffer(
  int                    index,        // バッファインデックス
  double                buffer[],      // 配列
  ENUM_INDEXBUFFER_TYPE  data_type      // 格納されるもの
  );

パラメータ

index

[in] 指標バッファの数番号付けは0から始まります。数は #property indicator_buffers で宣言された数より少なければなりません。

buffer[]

[in]  カスタム指標プログラムで宣言された配列

data_type

[in] 指標配列に格納されたデータの型。デフォルトでは INDICATOR_DATA(カスタム指標値)。値は INDICATOR_COLOR_INDEX でも可能で、その場合、このバッファは前の指標バッファのカラーインデックスを格納します。#property indicator_colorN 行では 64 までのの指定が可能です。 INDICATOR_CALCULATIONS 値はバッファが指標の中間計算に使用されて、描画の意図外であることを示します。

戻り値

成功の場合 true、それ以外の場合は false

注意事項

結合後、buffer[] 動的配列は、結合された配列が時系列式のインデックスを持っていても、通常の配列のように索引付けされます。指標配列の要素アクセスの順序を変えたい場合は、SetIndexBuffer() 関数で配列が結合された後でArraySetAsSeries() 関数を使用します。 指標バッファをして使用されている動的配列のサイズは SetIndexBuffer() 関数では変更出来ないのでご注意下さい。指標バッファサイズ変更の操作は、全て端末の実行サブシステムによって実行されます。

例:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer1.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link     "https://www.mql5.com"
#property version   "1.00"
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- MA をプロットする
#property indicator_label1 "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//--- 入力パラメータ
input bool               AsSeries=true;
input int               period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//--- 指標バッファ
double                   MABuffer[];
int                      ma_handle;
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                            |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- 指標バッファマッピング
  if(AsSeries) ArraySetAsSeries(MABuffer,true);
  Print("Indicator buffer is timeseries = ",ArrayGetAsSeries(MABuffer));
  SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
  Print("Indicator buffer after SetIndexBuffer() is timeseries = ",
        ArrayGetAsSeries(MABuffer));
 
//--- 指標バッファの要素アクセスの順番を変更する
  ArraySetAsSeries(MABuffer,AsSeries);
 
  IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//---
  ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
  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 &volume[],
              const int &spread[])
 {
//--- 移動平均値を MABuffer バッファに複製する
  int copied=CopyBuffer(ma_handle,0,0,rates_total,MABuffer);
 
  Print("MABuffer[0] = ",MABuffer[0]);// AsSeries の値による
                                    // ものすごく古い値を受け取る
                                    // または現在の未完成のバー
 
//--- 次の呼び出しのために prev_calculated の値を返す
  return(rates_total);
 }
//+------------------------------------------------------------------+

参照

カスタム指標プロパティ時系列と指標へのアクセス