CopySpread

이 함수는 지정된 수량의 선택한 심볼-주기에 대한 확산 값의 기록 데이터를 spread_array에 가져옵니다. 요소 순서는 현재에서 과거까지입니다. 즉, 0의 시작 포지션은 현재 막대를 의미합니다.

CopySpread

아직 알 수 없는 양의 데이터를 복사할 때, 권장하는 것은 동적 배열을 타겟 배열로 사용하는 것이며, 이는 요청된 데이터 수가 대상 어레이의 길이보다 작거나 많을 경우 요청된 데이터가 완전히 맞도록 메모리를 재할당하려고 시도하기 때문입니다.

복사해야 하는 데이터의 양을 알고 있다면, 과도한 메모리를 할당하지 않도록 정적으로 할당된 버퍼에 복사하는 것이 좋습니다.

대상 어레이의 속성(as_series=true 또는 as_series=false)에 관계 없음 가장 오래된 요소가 어레이에 할당된 물리적 메모리의 시작 부분에 위치하도록 데이터가 복사됩니다. 함수 호출에는 세 가지 종류가 있습니다.

첫 번째 포지션과 필요한 요소 수에 따라 호출

int  CopySpread(
   string           symbol_name,      // 심볼명
   ENUM_TIMEFRAMES  timeframe,        // 주기
   int              start_pos,        // 포지션 시작
   int              count,            // 복제할 데이터 수
   int              spread_array[]    // 스프레드 값에 대한 대상 배열
   );

시작 날짜 및 필요한 요소 수에 따라 호출

int  CopySpread(
   string           symbol_name,      // 심볼명
   ENUM_TIMEFRAMES  timeframe,        // 주기
   datetime         start_time,       // 시작 일시
   int              count,            // 복제할 데이터 수
   int              spread_array[]    // 스프레드 값에 대한 대상 배열
   );

필요한 시간 간격의 시작 및 종료 날짜로 호출

int  CopySpread(
   string           symbol_name,      // 심볼명
   ENUM_TIMEFRAMES  timeframe,        // 주기
   datetime         start_time,       // 시작 일시
   datetime         stop_time,        // 정지 일시
   int              spread_array[]    // 스프레드 값에 대한 대상 배열
   );

Parameters

symbol_name

[in]  심볼명.

timeframe

[in]  주기.

start_pos

[in]  복사할 첫 번째 요소의 시작 위치.

count

[in]  복사할 데이터 수.

start_time

[in]  복사할 첫 번째 요소의 시작 시간.

stop_time

[in]  마지막 복사 요소에 해당하는 막대 시간.

spread_array[]

[out]  Array of int type.

반환 값

오류 발생 시 복사된 데이터 개수 또는 -1을 반환합니다.

참고

요청된 데이터의 전체 간격이 서버의 사용 가능한 데이터 범위를 벗어나면 함수는 -1을 반환합니다. TERMINAL_MAXBARS 외부의 데이터(차트의 최대 막대 수)를 요청하면 함수도 -1을 반환합니다.

지표에서 데이터를 요청할 때, 아직 구축되지 않았거나 서버에서 다운받아야 할 경우, 함수는 즉시 -1을 반환하지만 다운로드/구축 과정이 시작됩니다.

Expert Advisor 또는 스크립트에서 데이터를 요청할 때 터미널에 이러한 데이터가 로컬에 없으면 서버에서 다운로드가 시작되거나 로컬 기록에서 데이터를 빌드할 수 있지만 아직 준비되지 않은 경우 필수 시계열의 구축이 시작됩니다. 이 함수는 시간 초과 만료 순간까지 준비될 데이터 양을 반환하지만 기록 다운로드가 계속되며, 다음 유사한 요청에 따라 기능이 더 많은 데이터를 반환합니다.

시작 날짜와 필수 요소 수까지 데이터를 요청할 경우, 날짜가 지정된 날짜보다 작거나 같은 데이터만 반환됩니다. 즉, 값이 반환되는 막대의 오픈 시간(거래량, 스프레드, 지표 버퍼의 값, 시가, 고가, 저가, 종가 또는 오픈 시간)은 항상 지정된 막대의 오픈 시간보다 작거나 같습니다.

지정된 날짜 범위 내에서 데이터를 요청하면 이 간격의 데이터만 반환됩니다. 간격이 설정되고 초까지 계산됩니다. 즉, 값이 반환되는 바의 오픈 시간(거래량, 스프레드, 지표 버퍼의 값, 시가, 고가, 저가, 종가 또는 오픈 시간)은 항상 요청된 간격 내에 있습니다.

따라서, 현재 날짜가 토요일인 경우, start_time=Last_Tuesdaystop_time=Last_Friday를 지정하는 주 타임프레임에 데이터를 복사하려고 할 때, 주 타임프레임의 오픈 시간은 항상 일요일이지만, 주 막대는 지정된 간격에 속하지 않기 때문에 함수는 0을 반환합니다.

완료되지 않은 현재 막대에 해당하는 값을 반환해야 하는 경우 start_pos=0 및 count=1를 지정하는 첫번째 호출 형식을 사용할 수 있습니다.

예:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Spread
#property indicator_label1  "Spread"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- 입력 매개 변수
input int      bars=3000;
//--- 지표 버퍼
double         SpreadBuffer[];
//+------------------------------------------------------------------+
//| 커스텀 지표 초기화 기능                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- 지표 버퍼 연결
   SetIndexBuffer(0,SpreadBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
  }
//+------------------------------------------------------------------+
//| 커스텀 지표 반복 함수                              |
//+------------------------------------------------------------------+
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(prev_calculated==0)
     {
      int spread_int[];
      ArraySetAsSeries(spread_int,true);
      int spreads=CopySpread(Symbol(),0,0,bars,spread_int);
      Print("다음과 같은 수의 스프레드 값을 받았습니다: ",spreads);
      for (int i=0;i<spreads;i++) 
      {
      SpreadBuffer[rates_total-1-i]=spread_int[i];
      if(i<=30) Print("spread["+i+"] = ",spread_int[i]);
      }
     }
   else
     {
      double Ask,Bid;
      Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
      Comment("Ask = ",Ask,"  Bid = ",Bid);
      SpreadBuffer[rates_total-1]=(Ask-Bid)/Point();
     }
//--- 다음 호출을 위한 prev_calculated의 반환 값
   return(rates_total);
  }

개체 바인딩 방법 섹션에서 요청 기록 데이터의 예를 참조하십시오.. 이 섹션에서 사용할 수 있는 스크립트에서는 마지막 1000개의 막대에서 지표 iFractals의 값을 가져오는 방법과 마지막 10개의 위쪽 및 아래쪽 프랙탈을 차트에 표시하는 방법을 보여 줍니다. 누락 데이터가 있으며 일반적으로 다음 스타일을 사용하여 그려진 모든 지표에도 유사한 기법을 사용할 수 있습니다: