CopyBuffer

指標の指定されたバッファデータを取得します。

copyBuffer

複製されたデータの要素は、開始位置から現在から過去に向かって数えられます(インデックス buffer_num を持つ指標バッファ)。すなわち、0 の開始位置は現在足(の指標値)を意味します。

CopyBuffer() 関数は受け取り側の配列のサイズの複製されたデータへの割り当てを試みるので、複製するデータ量が不明の場合、受け取り側の buffer[] 配列としての動的配列の使用が推奨されます。指標バッファ(SetIndexBufer() 関数で指標値を格納するために事前に割り当てられる配列)が受け取り側の buffer[] 配列として使用された場合、部分的な複製が許可されています。例は標準端末パッケージの Awesome_Oscillator.MQL5 カスタム指標に見られます。

別の配列(非指標バッファ)に指示値の部分的なコピーを作成する必要がある場合は、所望の数が複製される中間配列を使用する必要があります。その後、この中間配列から受け取り側の配列の必要な場所に必要な数の値の要素ごとのコピーを行います。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyBuffer(
  int      indicator_handle,    // 指標ハンドル
  int      buffer_num,          // 指標バッファ番号
  int      start_pos,            // 開始位置
  int      count,                // 複製する量
  double    buffer[]              // 受け取り側の配列
  );

開始日と必要な要素数によっての呼び出し

int  CopyBuffer(
  int      indicator_handle,    // 指標ハンドル
  int      buffer_num,          // 指標バッファ番号
  datetime  start_time,          // 開始日と時刻
  int      count,                // 複製する量
  double    buffer[]             // 受け取り側の配列
  );

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyBuffer(
  int      indicator_handle,    // 指標ハンドル
  int      buffer_num,          // 指標バッファ番号
  datetime  start_time,          // 開始日と時刻
  datetime  stop_time,            // 終了日と時刻
  double   buffer[]             // 受け取り側の配列
  );

パラメータ

indicator_handle

[in]  対応する指標関数によって戻された指標ハンドル

buffer_num

[in]  指標バッファの番号

start_pos

[in]  1 番目の複製される要素の位置

count

[in]  複製する日数

start_time

[in]  最初の要素に対応するバーの時刻

stop_time

[in]  最後の要素に対応するバーの時刻

buffer[]

[out] double 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。

例:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer3.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()
 {
//--- 指標バッファマッピング
  SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
  Print("Parameter AsSeries = ",AsSeries);
  Print("Indicator buffer after SetIndexBuffer() is a timeseries = ",
        ArrayGetAsSeries(MABuffer));
//--- 指標短縮名を設定する
  IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//--- AsSeries を設定する(入力パラメータによる)
  ArraySetAsSeries(MABuffer,AsSeries);
  Print("Indicator buffer after ArraySetAsSeries(MABuffer,true); is a timeseries = ",
        ArrayGetAsSeries(MABuffer));
//---
  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[])
 {
//--- データが全て計算されたかをチェックする
  if(BarsCalculated(ma_handle)<rates_total) return(0);
//--- 全てのデータのコピーは出来ない
  int to_copy;
  if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
  else
    {
     to_copy=rates_total-prev_calculated;
    //--- 最終値は常に複製される
     to_copy++;
    }
//--- コピーを試みる
  if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//--- 次の呼び出しのために prev_calculated の値を返す
  return(rates_total);
 }
//+------------------------------------------------------------------+

上記の例は、指標バッファが同じ銘柄/期間の指標から作られた別の指標バッファの値で記入される方法を示しています。

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

 

参照

カスタム指標のプロパティSetIndexBuffer