Описание
Класс CEROnRingBuffer предназначен для расчета технического индикатора Коэффициент Эффективности (Efficiency Ratio, ER), который применяется в расчетах Адаптивной Скользящей Средней (Adaptive Moving Average, AMA), с использованием алгоритма кольцевого буфера.
Декларация
class CEROnRingBuffer : public CArrayRing
Заголовок
#include <IncOnRingBuffer\CEROnRingBuffer.mqh>Файл класса CEROnRingBuffer.mqh нужно поместить в папку IncOnRingBuffer, которую необходимо создать в MQL5\Include\. К описанию прикреплены два файла с примерами, которые используют класс из этой папки. Файл с классом кольцевого буфера тоже должен быть в этой папке.
Методы класса
//--- метод инициализации: bool Init( // возвращает false при ошибке, при успехе - true int period = 34, // период расчета ER 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( // возвращает значение ER для заданного элемента const int rates_total, // размер массива const int prev_calculated, // обработано элементов массива const int begin, // откуда начинаются значимые данные массива const double value, // значение элемента массива const int index // индекс элемента );
//--- методы доступа к дынным: int BarsRequired(); // Возвращает необходимое количество баров для построения индикатора string Name() // Возвращает имя индикатора int Period() // Возвращает период расчета ER int Size(); // Возвращает размер кольцевого буфера
Получать рассчитанные данные индикатора из кольцевого буфера можно как из обычного массива. Например:
//--- класс с методами расчета индикатора ER: #include <IncOnRingBuffer\CEROnRingBuffer.mqh> CEROnRingBuffer er; ... //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- расчет индикатора на основе ценовой таймсерии: er.MainOnArray(rates_total,prev_calculated,price); ... //--- используем данные из кольцевого буфера "er", // например, скопируем данные в индикаторные буфера: for(int i=start;i<rates_total;i++) { ER_Buffer[i] = er[rates_total-1-i]; // линия индикатора } //--- return value of prev_calculated for next call: return(rates_total); }
Обратите внимание, что индексация в кольцевом буфере как в таймсерии.
Примеры
Результат работы Test_ER_OnArrayRB.mq5 с размером кольцевого буфера в 256 элементов При написании кода использовались наработки MetaQuotes Software Corp., Integer и GODZILLA

Результат работы Test_ER_OnValueRB.mq5 с размером кольцевого буфера в 256 элементов
MultiTrend_Signal_KVN
Индикатор известного трейдера Корякина
PriceVSwma
Вариация на тему нетривиальной, линейной комбинации из стохастических осцилляторов
WcciPatterns
Индикатор Woodies CCI Paterns
RD-TrendTrigger
Осциллятор с использованием T3 усреднения из журнала Technical Analysis of Stocks and Commodities (Dec. 2004).