MetaTrader 5에서 링 버퍼를 이용한 OBV 지표 그리기

Mike 2013.01.17 00:38 55 0 0
첨부파일

설명

COBVOnRingBuffer 클래스는 링 버퍼 알고리즘을 사용하여 OBV(온 밸런스 볼륨) 지표를 계산하는 데 설계되었습니다. 자세한 내용은 여기에서 확인하세요.

선언

class COBVOnRingBuffer : public CArrayRing

제목

#include <IncOnRingBuffer\COBVnRingBuffer.mqh>

COBVOnRingBuffer.mqh 파일은 MQL5\Include\IncOnRingBuffer 폴더에 있어야 하며, 이 폴더에 사용 예제와 함께 제공됩니다. 링 버퍼 클래스 파일도 동일한 폴더에 위치해야 합니다.

클래스 메소드

//--- 초기화 메소드:
bool Init(                                        // 오류가 발생하면 false를 반환, 성공하면 true
   int                 period      = 0,           // OBV 기간
   int                 size_buffer = 256,         // 링 버퍼의 크기
   bool                as_series   = false        // true이면 시계열, 아니면 false
   );

OBV 기간은 정수와 비슷하게 사용됩니다. 값이 0(기본값)일 경우, 지표는 차트의 모든 바에 대해 계산됩니다. 다른 양수 값을 지정하면, 해당 값으로 지정된 바 수가 사용됩니다(이동 평균 원칙).

//--- 시계열 또는 지표 버퍼를 기반으로 한 계산 메소드:
int MainOnArray(                  // 처리된 요소의 수를 반환합니다.
   const int     rates_total,     // 배열의 크기
   const int     prev_calculated, // 이전 호출에서 처리된 요소
   const double& price[],         // 가격
   const long&   volume[]);       // 거래량
   );
//--- 배열의 개별 요소를 기반으로 한 계산 메소드
double MainOnValue(              // 지정된 요소(바)의 OBV 값을 반환합니다.
   const int    rates_total,     // 배열의 크기
   const int    prev_calculated, // 배열의 처리된 요소
   const int    begin,           // 배열의 중요한 데이터가 시작되는 곳
   const double price,           // 가격
   const long   volume,          // 거래량
   const int    index            // 요소(바) 인덱스
   );
//--- 데이터에 접근하는 메소드:
int                 BarsRequired(); // 지표를 그리기 위해 필요한 바 수를 반환합니다.
string              Name();         // 지표의 이름을 반환합니다.
int                 Period();       // 기간을 반환합니다.
int                 Size();         // 링 버퍼의 크기를 반환합니다.

링 버퍼에서 계산된 지표 데이터를 일반 배열처럼 가져올 수 있습니다. 예를 들어:

//--- OBV 지표 계산 메소드를 가진 클래스:
#include <IncOnRingBuffer\COBVOnRingBuffer.mqh>
COBVOnRingBuffer obv;

...

//+------------------------------------------------------------------+
//| 사용자 정의 지표 반복 함수                              |
//+------------------------------------------------------------------+
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[])
  {
//--- 시계열을 기반으로 한 지표 계산:
      obv.MainOnArray(rates_total,prev_calculated,close,tick_volume);

...

//--- 링 버퍼 "obv"의 데이터를 사용하여,
//    예를 들어, 지표 버퍼에 복사합니다:
   for(int i=start;i<rates_total && !IsStopped();i++)
      OBV_Buffer[i] = obv[rates_total-1-i]; // 지표 라인

...

//--- 다음 호출을 위한 prev_calculated 반환:
   return(rates_total);
  }

링 버퍼의 인덱싱은 시계열와 동일합니다.

예제

  1. Test_OBV_OnArrayRB.mq5 파일은 가격 시계열을 기반으로 지표를 계산합니다. MainOnArray() 메소드 사용 예시를 보여줍니다.
  2. Test_OBV_OnValueRB.mq5 파일은 MainOnValue() 메소드를 사용하는 예시를 보여줍니다. 처음에 OBV 지표가 계산되고 그려집니다. 이후 이 OBV 지표의 링 버퍼를 기반으로 또 다른 OBV가 그려집니다.


링 버퍼 크기가 256인 Test_OBV_OnArrayRB.mq5의 작업 결과



링 버퍼 크기가 256인 Test_OBV_OnValueRB.mq5의 작업 결과

 

코드 작성 시 MetaQuotes Software Corp.Integer 와 GODZILLA의 개발물이 사용되었습니다.

목록
댓글 0