CopyBuffer

특정 지표의 지정된 버퍼 데이터를 필요한 수량으로 가져옵니다.

copyBuffer

시작 위치에서 복사된 데이터 요소(인덱스 buffer_num을 가진 지표 버퍼)의 카운트는 현재에서 과거로 수행됩니다. 즉, 시작 위치가 0이면 현재 막대(현재 막대에 대한 지표 값)를 의미합니다.

아직 알 수 없는 양의 데이터를 복사할 때는 CopyBuffer() 함수가 수신 배열의 크기를 복사된 데이터의 크기에 할당하려고 하므로 동적 배열을 buffer[]로 사용하는 것이 좋습니다. 지표 버퍼(SetIndexBufer() 함수가 지표 값을 저장하기 위해 미리 할당된 배열)를 buffer[] 수신인 배열로 사용하는 경우 부분 복사가 허용됩니다. 예를 들어 표준 터미널 패키지의 Awesome_Oscillator.mql5 커스텀 지표에서 확인할 수 있습니다.

지표 값의 일부를 다른 배열(비-지표 버퍼)에 복사해야 하는 경우 원하는 숫자가 복사되는 중간 어레이를 사용해야 합니다. 그런 다음, 필요한 수의 값을 이 중간 값에서 필요한 수신 배열의 위치로 요소별로 복사합니다.

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

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

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

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[]              // 복사할 대상 배열
   );

Parameters

indicator_handle

[in]  지표 핸들, 해당 지표 함수에 의해 반환됩니다.

buffer_num

[in]  지표 버퍼 번호.

start_pos

[in]  복사할 첫 번째 요소의 포지션.

count

[in]  복사할 데이터 수.

start_time

[in]  첫 번째 요소에 해당하는 막대 시간.

stop_time

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

buffer[]

[out] double 유형의 배열.

반환 값

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

참고

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

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

예:

//+------------------------------------------------------------------+
//|                                              TestCopyBuffer3.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              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
//---- plot 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("SetIndexBuffer()이후의 지표 버퍼는 시계열입니다 = ",
         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);
  }
//+------------------------------------------------------------------+

위의 예에서는 지표 버퍼가 동일한 심볼/주기에 있는 지표의 다른 지표 버퍼 값으로 채워지는 방법을 보여 줍니다.

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

 

더 보기

Properties of Custom Indicators, SetIndexBuffer