보조지표 게시글

링 버퍼를 이용한 적응 이동 평균(AMA) 계산 클래스 소개

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

설명

CAMAOnRingBuffer 클래스는 적응 이동 평균(Adaptive Moving Average, AMA)을 계산하기 위해 링 버퍼 알고리즘을 사용하는 기술 지표입니다.

선언

class CAMAOnRingBuffer : public CArrayRing

제목

#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>

CAMAOnRingBuffer.mqh 클래스 파일은 MQL5\Include\에 생성해야 하는 IncOnRingBuffer 폴더에 배치되어야 합니다. 이 폴더에서 사용된 예제 파일 두 개가 설명에 첨부되어 있습니다. 링 버퍼와 효율 비율 클래스 파일도 이 폴더에 있어야 합니다.

클래스 메서드

//--- 초기화 메서드:
bool Init(                                  // 오류시 false, 성공시 true 반환
   int            period        = 10,       // AMA의 기간
   int            fast_period   = 2,        // 빠른 EMA의 기간
   int            slow_period   = 30,       // 느린 EMA의 기간
   int            size_buffer   = 256,      // 링 버퍼의 크기, 저장 데이터 수
   bool           as_series     = false     // true: 시간 시계열, false: 일반 입력 데이터 인덱싱
   );
//--- 시간 시계열 또는 지표 버퍼를 기반으로 한 계산 메서드:          
int MainOnArray(                  // 처리된 요소 수 반환  
   const int     rates_total,     // 배열 크기 array[]
   const int     prev_calculated, // 이전 호출에서 처리된 요소
   const double &array[]          // 입력 값 배열
   );
//--- //--- 배열의 개별 시리즈 요소를 기반으로 한 계산 메서드           
double MainOnValue(              // 설정된 요소에 대한 AMA 값 반환
   const int    rates_total,     // 배열의 크기
   const int    prev_calculated, // 배열의 처리된 요소
   const int    begin,           // 배열의 유의미한 데이터 시작 위치
   const double value,           // 배열의 요소 값
   const int    index            // 요소 인덱스
    );
//--- 데이터 접근 메서드:
int    BarsRequired();   // 지표를 그리기 위한 필요한 바 수 반환
string Name();           // 지표 이름 반환
string FastPeriod();       // 빠른 EMA 평활화 기간 반환  
int     SlowPeriod();       // 느린 EMA 평활화 기간 반환
int    Period();           // AMA 기간 반환
int    Size();           // 링 버퍼 크기 반환

링 버퍼에서 지표의 계산 데이터를 얻는 것은 일반 배열에서 얻는 것과 같습니다. 예를 들어:

//--- AMA 지표 계산 메서드를 가진 클래스:
#include <IncOnRingBuffer\CAMAOnRingBuffer.mqh>
CAMAOnRingBuffer ama;

...

//+------------------------------------------------------------------+
//| 사용자 정의 지표 반복 함수                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- 가격 시간 시계열 기반의 지표 계산:
   ama.MainOnArray(rates_total,prev_calculated,price);

...

//--- 링 버퍼에서 데이터 사용: "ama",
//    예를 들어, 지표 버퍼에 데이터 복사:
   for(int i=start;i<rates_total;i++)
      AMA_Buffer[i] = ama[rates_total-1-i];          // 지표 라인

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

참고: 링 버퍼의 인덱싱은 시간 시계열과 동일합니다.

예제

  1. Test_AMA_OnArrayRB.mq5 파일은 가격 시간 시계열을 기반으로 지표를 계산합니다. MainOnArray() 메서드의 사용이 시연됩니다.
  2. Test_AMA_OnValueRB.mq5 파일은 MainOnValue() 메서드의 사용을 보여줍니다. 먼저 AMA 지표가 계산되고 그려집니다. 그런 다음 이 지표의 링 버퍼를 기반으로 또 다른 AMA가 그려집니다.


Test_AMA_OnArrayRB.mq5의 작업 결과, 링 버퍼 크기 256 요소



Test_AMA_OnValueRB.mq5의 작업 결과, 링 버퍼 크기 256 요소

 

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

연관 포스트

댓글 (0)