보조지표 게시글

MetaTrader 5에서 링 버퍼를 이용한 ATR 지표 구현하기

첨부파일
1344.zip (8.86 KB, 다운로드 0회)

설명

CATROnRingBuffer 클래스는 링 버퍼 알고리즘을 사용하여 평균 진폭 지표(Average True Range, ATR)의 계산을 위해 설계되었습니다.

클래스 선언

class CATROnRingBuffer

파일 포함

#include <IncOnRingBuffer\CATROnRingBuffer.mqh>

CATROnRingBuffer.mqh 파일은 MQL5\Include\IncOnRingBuffer 폴더에 위치해야 합니다. 이 폴더에는 클래스에서 사용되는 예시 파일 두 개가 첨부되어 있습니다. 링 버퍼 클래스(링 버퍼)와 이동 평균 클래스(Moving Average)도 이 폴더에 있어야 합니다.

클래스 메서드

//--- 초기화 메서드:
bool Init( // 오류가 발생하면 false, 성공하면 true 반환
    int ma_period = 14, // 이동 평균 스무딩 기간
    ENUM_MA_METHOD ma_method = MODE_SMA, // 이동 평균 스무딩 방법
    int size_buffer = 256, // 링 버퍼 크기, 저장되는 데이터 수
    bool as_series = false // true면 시계열, false면 일반 입력 데이터 인덱싱
) {
//--- 시계열 또는 지표 버퍼를 기반으로 한 계산 메서드:
int MainOnArray( // 처리된 요소 수 반환
    const int rates_total, // 배열 크기
    const int prev_calculated, // 이전 호출에서 처리된 요소 수
    const double &high[], // 최대값 배열
    const double &low[], // 최소값 배열
    const double &close[] // 종가 배열
);
//--- 배열의 개별 시리즈 요소를 기반으로 한 계산 메서드:
double MainOnValue( // 설정된 요소의 ATR 값 반환
    const int rates_total, // 배열 크기
    const int prev_calculated, // 처리된 배열 요소 수
    const int begin, // 배열의 유의미한 값 시작 위치
    const double high, // 최대값
    const double low, // 최소값
    const double close, // 종가
    const int index // 요소 인덱스
);
//--- 데이터 접근 메서드:
int BarsRequired(); // 지표를 그리기 위해 필요한 바 수 반환
string Name(); // 지표 이름 반환
string MAMethod(); // 스무딩 방법 반환
int MAPeriod(); // 스무딩 기간 반환
int Size(); // 링 버퍼 크기 반환

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

#include <IncOnRingBuffer\CATROnRingBuffer.mqh>
CATROnRingBuffer atr;

...

//+------------------------------------------------------------------+
//| 사용자 정의 지표 반복 함수                              |
//+------------------------------------------------------------------+
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[])
{
//--- 지표 계산: atr.MainOnArray(rates_total, prev_calculated, high, low, close);
//--- "atr" 링 버퍼에서 지표로 데이터 복사: for(int i=start; i<rates_total; i++) { ATR_Buffer[i] = atr[rates_total - 1 - i]; } return(rates_total); }

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

예시

  1. Test_ATR_OnArrayRB.mq5 파일은 가격 시계열을 기반으로 지표를 계산합니다. MainOnArray() 메서드의 사용이 설명됩니다.
  2. Test_ATR_OnValueRB.mq5 파일은 MainOnValue() 메서드의 사용을 보여줍니다. 먼저 ATR 지표가 계산되고 그려진 후, 이 지표의 링 버퍼를 기반으로 추가적으로 한 줄의 ATR 지표가 계산됩니다.


Test_ATR_OnArrayRB.mq5의 결과, 링 버퍼 크기 256 요소



Test_ATR_OnValueRB.mq5의 결과, 링 버퍼 크기 256 요소


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

연관 포스트

댓글 (0)