CopySeries

MqlRates構造体から、指定された銘柄期間と指定された量の同期済み時系列を取得します。データは、指定された配列のセットに受信されます。要素は現在から過去までカウントダウンされます。つまり、開始位置が0の場合は現在足を意味します。

copyseries

複製するデータ量が不明な場合は、受信配列に動的配列を使用することをお勧めします。データ量が配列に格納できる量を超えると、要求されたすべてのデータに適合するように配列を再分配できるからです。

あらかじめ決められた量のデータを複製する必要がある場合は、不必要なメモリの再割り当てを避けるために、静的に割り当てられたバッファを使用することをお勧めします。

受信配列のプロパティ(as_series=true または as_series=false)は無視されます。複製中は、最も古い時系列要素が配列に割り当てられた物理メモリの先頭に複製されます。

int  CopySeries(
  string          symbol_name,      // 銘柄名
  ENUM_TIMEFRAMES  timeframe,        // 期間
  int              start_pos,        // 開始位置
  int              count,            // 複製する量
  ulong           rates_mask,       // 要求されたシリーズを指定するフラグの組み合わせ
  void&           array1[],          // 最初にコピーの時系列のデータを受け取る配列
  void&           array2[]          // 2番目のコピーの時系列のデータを受け取る配列
  ...
  );

パラメータ

symbol_name

[in]  シンボル

timeframe

[in]  期間

start_pos

[in]  最初に複製された要素のインデックス

count

[in]  複製された要素の数

rates_mask

[in] ENUM_COPY_RATES列挙体からのフラグの組み合わせ

array1, array2,...

[out] MqlRates構造体から時系列を受け取る適切な型の配列。関数に渡される配列の順序は、MqlRates構造内のフィールドの順序と一致する必要があります。

戻り値

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

注意事項

要求されたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は-1を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)を越えたデータが要求された場合も、この関数は -1を返します。

指標からデータを要求するとき、要求された時系列がまだ構築されていない場合、またはサーバからダウンロードする必要がある場合、関数はすぐに-1を返します。ただし、これにより、データのダウンロード/構築自体が開始されます。

エキスパートアドバイザーまたはスクリプトからデータを要求するとき、端末が適切なデータをローカルに持っていない場合、またはデータがローカル履歴から構築できるがまだ準備ができていない場合、サーバからのダウンロードが開始されます。 この関数は、タイムアウトの期限が切れるまでに準備ができているデータの量を返しますが、履歴のダウンロードは続行され、関数は次の同様の要求でさらに多くのデータを返します。

CopySeriesとCopyRatesの違い

CopySeries関数を使用すると、1 回の呼び出しで必要な時系列のみを別の指定された配列に取得できますが、時系列データはすべて同期されます。これは、特定のインデックスNで結果として得られる配列のすべての値が、指定された銘柄/時間枠のペアの同じバーに属することを意味します。したがって、プログラマーがバーの開始時間までに受信したすべての時系列の同期を確保する必要はありません。

時系列の完全なセットをMqlRates配列として返すCopyRatesとは異なり、CopySeries関数を使用すると、プログラマーは必要な時系列のみを個別の配列として取得できます。これは、フラグの組み合わせを指定して時系列のタイプを選択することで実行できます。関数に渡される配列の順序は、MqlRates構造内のフィールドの順序と一致する必要があります。

struct MqlRates
 {
  datetime time;         // 期間開始時間
  double   open;         // 始値
  double   high;         // 期間の高値
  double   low;         // 期間の安値
  double   close;       // 終値
  long     tick_volume; // ティックボリューム
  int     spread;       // スプレッド
  long     real_volume; // 取引高
 }

したがって、現在の銘柄/時間枠の最後の100バーのtimeclosereal_volume時系列の値を取得する必要がある場合は、次の呼び出しを使用する必要があります。

datetime time[];
double   close[];
long     volume[];
CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);

timeclosevolume配列の順番に気を付けてください。これは、 MqlRates構造体のフィールドの値と同じでなければいけません。rates_maskの値の順序は重要ではありません。マスクは次のようになります。

COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

例:

//--- 入力パラメータ
input datetime InpDateFrom=D'2022.01.01 00:00:00';
input datetime InpDateTo  =D'2023.01.01 00:00:00';
input uint     InpCount   =20;
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                    |
//+------------------------------------------------------------------+
void OnStart(void)
 {
//--- MqlRates価格構造体から時系列を取得するための配列
  double   open[];
  double   close[];
  float   closef[];
  datetime time1[], time2[];
//--- double 配列に終値を要求する
  ResetLastError();
  int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                      COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
  PrintFormat("1. CopySeries  returns %d values. Error code=%d", res1, GetLastError());
  ArrayPrint(close);
 
//--- 始値も要求する; 終値にはfloat配列を使用
  ResetLastError();
  int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                      COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
  PrintFormat("2. CopySeries  returns %d values. Error code=%d", res2, GetLastError());
  ArrayPrint(closef);
//--- 受信したデータを比較する
  if((res1==res2) && (time1[0]==time2[0]))
    {
    Print("  | Time             |    Open      | Close double | Close float |");
    for(int i=0; i<10; i++)
       {
        PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                    i, TimeToString(time1[i]), open[i], close[i], closef[i]);
       }
    }
//--- 結果
 1. CopySeriesは20の値を戻します。Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
 2. CopySeriesは20の値を戻します。Error code=0
 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
   | Time             |    Open      | Close double | Close float |
 0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
 1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
 2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
 3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
 4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
 5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
 6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
 7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
 8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
 9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
//---
 }

参照

構造体とクラスCopyRates