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[]           // 두 번째 복사된 시계열의 데이터를 수신할 배열
   ...
   );

패러미터

symbol_name

[in]  심볼.

timeframe

[in]  차트 주기

start_pos

[in]  첫번째 복사된 요소 인덱스

count

[in]  복사된 요소의 수

rates_mask

[in] ENUM_COPY_RATES  열거의 플래그 조합

array1, array2,...

MqlRates 구조에서 [out] 시계열을 수신하는 데 적합한 유형의 배열. 함수에 전달된 배열의 순서는 MqlRates 구조의 필드 순서와 일치해야 합니다.

Return Value

복사된 요소의 수, 오류가 발생한 경우는 -1

주의

요청된 데이터의 전체 간격이 서버에서 사용 가능한 데이터를 초과하는 경우에는 함수는 -1을 반환합니다. 요청된 데이터가 TERMINAL_MAXBARS(차트의 최대 바의 수)를 초과하는 경우에도 함수는 -1을 반환합니다.

지표에서 데이터를 요청할 때 요청된 시계열이 아직 구성되지 않았거나 서버에서 다운로드해야 하는 경우 함수는 즉시 -1을 반환합니다. 그러나 이렇게 하면 자체적으로 데이터 다운로드/구성이 시작됩니다.

터미널에 적절한 데이터가 로컬에 없으면 Expert Advisor 또는 스크립트에서 데이터를 요청할 때 서버에서 다운로드가 시작됩니다. 혹은 필요한 로컬 기록에서 데이터를 구성할 수 있지만 아직 준비되지 않은 경우 시계열이 시작됩니다. 함수는 제한 시간이 만료될 때까지 준비된 데이터를 반환하지만 기록 다운로드는 계속되고 함수는 이후의 유사한 요청에 대해 계속 데이터를 반환합니다.

CopySeries와 CopyRates의 차이

CopySeries 기능을 사용하면 한 번의 호출에서 필요한 시계열만을 지정된 배열로 가져올 수 있으며 모든 시계열 데이터는 동기화됩니다. 이는 특정 인덱스 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;  // 교환 볼륨
  }

따라서 현재 Symbol/Timeframe의 마지막 100개 막대에 대한 time, closereal_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);

배열의 순서 주의 "time, close, volume" — 반드시 MqlRates 구조의 필드의 순서와 일치해야 합니다. rates_mask의 값의 순서는 중요하지 않습니다. 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[];
//--- 이중 배열에 종가 요청
   ResetLastError();
   int res1=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSEtime1close);
   PrintFormat("1. CopySeries  returns %d values. Error code=%d"res1GetLastError());
   ArrayPrint(close);
  
//--- 이제 시가도 요청합니다; 종가에 float 배열 사용
   ResetLastError();
   int res2=CopySeries(NULLPERIOD_CURRENT0InpCount,
                       COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPENtime2openclosef);
   PrintFormat("2. CopySeries  returns %d values. Error code=%d"res2GetLastError());
   ArrayPrint(closef);
//--- 수신산 데이터를 비교
   if((res1==res2) && (time1[0]==time2[0]))
     {
      Print("  | Time             |    Open      | Close double | Close float |");
      for(int i=0i<10i++)
        {
         PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                     iTimeToString(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