시계열 및 지표 데이터 액세스

이러한 함수는 시계열 및 지표로 작업하기 위한 것입니다. 시계열은 역순으로 일반적인 데이터 배열과 다릅니다. 시계열의 요소는 배열 끝에서 시작(가장 최근의 데이터부터 가장 오래된 데이터까지)까지 색인화됩니다. 복제 함수는 값을 수신하는 배열의 필요한 크기를 할당하도록 설계되었기 때문에 시계열 값과 지시자 데이터를 복사하려면 동적 배열만 사용하는 것이 좋습니다.

이 규칙에는 중요한 예외 가 있습니다: 예를 들어, Expert Advisor에서 OnTick()의 각 호출 또는 지표에서 OnCalculate()의 각 호출 시 시계열 및 지시자 값을 자주 복사해야 하는 경우, 이 때 정적 분산 배열을 더 잘 사용해야 하는데, 메모리 할당 작업은 동적 배열에 대해선 추가 시간이 필요하며, 이는 테스트 및 최적화 중에 영향을 미치기 때문입니다.

시계열 및 지표 값에 액세스하는 함수를 사용할 경우 색인화 방향을 고려해야 합니다. 이 내용은 배열, 버퍼 및 시계열의 인덱싱 방향 섹션에서 설명됩니다.

지표 및 시계열 데이터에 대한 액세스는 요청된 데이터가 준비되었는지 여부에 관계없이 구현됩니다(일명 비동기 액세스). 이는 커스텀 지표 계산에 매우 중요하므로 데이터가 없으면 Copy...() 유형의 함수가 즉시 오류를 반환합니다. 그러나 Expert Advisors 및 스크립트에 액세스할 때 필요한 시계열을 다운로드하거나 지표 값을 계산하는 데 필요한 시간을 제공하기 위해 데이터를 수신하는 몇 번의 시도가 약간씩 일시 중지됩니다.

데이터 액세스 구조화 섹션에서는 MetaTrader 5 클라이언트 터미널에서 가격 데이터의 수신, 저장 및 요청에 대한 세부 정보를 설명합니다.

시계열 및 공통 배열의 인덱싱 방향

배열의 가격 데이터에 대한 액세스는 데이터 끝에서 수행된다는 것은 역사상 인정됩니다. 물리적으로 새 데이터는 항상 어레이 끝에 기록되지만 어레이의 인덱스는 항상 0과 같습니다. 시계열 배열의 0 인덱스는 현재 막대의 데이터, 즉 이 시간대의 미완료 시간 간격에 해당하는 막대를 나타냅니다.

기간(타임프레임)은 단일 가격 막대가 형성되는 기간을 뜻합니다. 21개의 미리 정의된 표준 기간(타임프레임)이 있습니다.

함수

기능

SeriesInfoInteger

내역 데이터의 상태에 대한 정보를 반환합니다

Bars

지정된 심볼 및 기간에 대한 내역의 막대 수를 반환합니다

BarsCalculated

오류 발생 시 지표 버퍼 또는 -1의 계산된 데이터 수를 반환합니다(데이터가 아직 계산되지 않음).

IndicatorCreate

MqlParam 유형 매개 변수 배열에서 생성된 지정된 기술 지표로 핸들을 반환합니다.

IndicatorParameters

지정된 핸들을 기준으로, 지표의 입력 매개 변수 수와 매개 변수의 값 및 유형을 반환합니다.

IndicatorRelease

다른 사용자가 사용하지 않는 경우 지표 핸들을 제거하고 지표의 계산 블록을 해제합니다.

CopyBuffer

지정된 지표에서 배열로 지정된 버퍼의 데이터를 가져옵니다.

CopyRates

지정된 심볼 및 기간에 대한 요율 구조의 내역 데이터를 배열로 가져옵니다

CopySeries

지정된 심볼-기간 및 지정된 양만큼 MqlRates 구조에서 동기화된 시계열을 가져옵니다. 데이터는 지정된 배열 세트로 수신됩니다

CopyTime

지정된 심볼 및 기간에 대한 막대 오프닝 시간의 내역 데이터를 배열로 가져옵니다

CopyOpen

지정된 심볼 및 기간에 대한 막대 시가에 대한 내역 데이터를 배열로 가져옵니다

CopyHigh

지정된 심볼 및 기간에 대한 막대 최대 가격에 대한 내역 데이터를 배열로 가져옵니다

CopyLow

지정된 심볼 및 기간에 대한 막대 최소 가격에 대한 내역 데이터를 배열로 가져옵니다

CopyClose

지정된 심볼 및 기간에 대한 종가 막대에 대한 내역 데이터를 배열로 가져옵니다.

CopyTickVolume

지정된 심볼 및 기간에 대한 틱의 볼륨의 내역 데이터를 배열로 가져옵니다.

CopyRealVolume

지정된 심볼 및 기간의 거래 볼륨에 대한 내역 데이터를 어레이로 가져옵니다.

CopySpread

지정한 심볼 및 기간에 대한 스프레드시트의 내역 데이터를 배열로 가져옵니다.

CopyTicks

MqlTick 형식의 틱을 ticks_array로 가져옵니다

CopyTicksRange

지정된 날짜 범위 내의 MqlTick 형식의 틱을 ticks_array로 가져옵니다

iBars

내역에서 사용할 수 있는 해당 심볼 및 마침표의 막대 수를 반환합니다.

iBarShift

지정된 시간에 해당하는 막대의 인덱스를 반환합니다

iClose

해당 차트에서 막대의 종가('shift' 매개 변수로 표시됨)를 반환합니다

iHigh

해당 차트에서 막대의 고가('Shift' 매개 변수로 표시됨)를 반환합니다

iHighest

해당 차트에 있는 가장 높은 값의 인덱스를 반환합니다(현재 막대에 상대적인 이동)

iLow

해당 차트에서 바의 저가('Shift' 매개 변수로 표시됨)를 반환합니다

iLowest

해당 차트에 있는 최소 값의 인덱스를 반환합니다(현재 막대에 상대적인 이동)

iOpen

해당 차트에서 막대의 시가('Shift' 매개 변수로 표시됨)를 반환합니다

iTime

해당 차트에서 막대의 시작 시간('Shift' 파라미터로 표시됨)을 반환합니다

iTickVolume

해당 차트에서 막대의 틱 볼륨('Shift' 파라미터로 표시됨)을 반환합니다

iRealVolume

해당 차트에서 막대의 실제 볼륨('Shift' 파라미터로 표시됨)을 반환합니다

iVolume

해당 차트에서 막대의 틱 볼륨('Shift' 파라미터로 표시됨)을 반환합니다

iSpread

해당 차트에서 막대의 스프레드 값('Shift' 매개 변수로 표시됨)을 반환합니다

ArraySetAsSeries() 함수를 사용하면 시계열에서와 같은 요소에 대한 배열 액세스를 설정할 수 있지만, 어레이 요소는 동일한 순서로 물리적으로 저장되어 인덱싱 방향만 변경됩니다. 이 사실을 입증하기 위해 예를 들어 보겠습니다:

   datetime TimeAsSeries[];
//--- 시계열처럼 배열에 대한 액세스를 설정합니다
   ArraySetAsSeries(TimeAsSeries,true);
   ResetLastError();
   int copied=CopyTime(NULL,0,0,10,TimeAsSeries);
   if(copied<=0)
     {
      Print("최근 10개의 막대에 대한 시가의 값의 복제 작업이 실패했습니다.");
      return;
     }
   Print("TimeCurrent =",TimeCurrent());
   Print("ArraySize(Time) =",ArraySize(TimeAsSeries));
   int size=ArraySize(TimeAsSeries);
   for(int i=0;i<size;i++)
     {
      Print("TimeAsSeries["+i+"] =",TimeAsSeries[i]);
     }
 
   datetime ArrayNotSeries[];
   ArraySetAsSeries(ArrayNotSeries,false);
   ResetLastError();
   copied=CopyTime(NULL,0,0,10,ArrayNotSeries);
   if(copied<=0)
     {
      Print("최근 10개의 막대에 대한 시가의 값의 복제 작업이 실패했습니다.");
      return;
     }   
   size=ArraySize(ArrayNotSeries);
   for(int i=size-1;i>=0;i--)
     {
      Print("ArrayNotSeries["+i+"] =",ArrayNotSeries[i]);
     }

그 결과 다음과 같은 결과를 얻을 것입니다:

TimeCurrent = 2009.06.11 14:16:23
ArraySize(Time) = 10
TimeAsSeries[0] = 2009.06.11 14:00:00
TimeAsSeries[1] = 2009.06.11 13:00:00
TimeAsSeries[2] = 2009.06.11 12:00:00
TimeAsSeries[3] = 2009.06.11 11:00:00
TimeAsSeries[4] = 2009.06.11 10:00:00
TimeAsSeries[5] = 2009.06.11 09:00:00
TimeAsSeries[6] = 2009.06.11 08:00:00
TimeAsSeries[7] = 2009.06.11 07:00:00
TimeAsSeries[8] = 2009.06.11 06:00:00
TimeAsSeries[9] = 2009.06.11 05:00:00
 
ArrayNotSeries[9] = 2009.06.11 14:00:00
ArrayNotSeries[8] = 2009.06.11 13:00:00
ArrayNotSeries[7] = 2009.06.11 12:00:00
ArrayNotSeries[6] = 2009.06.11 11:00:00
ArrayNotSeries[5] = 2009.06.11 10:00:00
ArrayNotSeries[4] = 2009.06.11 09:00:00
ArrayNotSeries[3] = 2009.06.11 08:00:00
ArrayNotSeries[2] = 2009.06.11 07:00:00
ArrayNotSeries[1] = 2009.06.11 06:00:00
ArrayNotSeries[0] = 2009.06.11 05:00:00

출력에서 볼 수 있듯이 TimeAsSeries 배열의 인덱스가 증가함에 따라 인덱스의 시간 값이 감소하는데, 즉, 현재에서 과거로 이동합니다. ArrayNotSeries의 경우 결과가 다른데, 인덱스가 증가함에 따라 과거에서 현재로 이동합니다.

See Also

ArrayIsDynamic, ArrayGetAsSeries, ArraySetAsSeries, ArrayIsSeries