Скачать MetaTrader 5

Смотри, как бесплатно скачать роботов

Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят

Понравился скрипт?
Оцени его работу в терминале MetaTrader 5

2012.12.26 09:38
Индикаторы

Класс для построения DEMA с использованием кольцевого буфера - индикатор для MetaTrader 5

| Russian English 中文 Español Deutsch 日本語 Português

Просмотров:
1412
Рейтинг:
голосов: 18

Описание

Класс CDEMAOnRingBuffer предназначен для расчета технического индикаторa Двойное Экспоненциальное Скользящее Среднее (Double Exponential Moving Average, DEMA) с использованием алгоритма  кольцевого буфера

Декларация

class CDEMAOnRingBuffer : public CArrayRing

Заголовок

#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>

Файл класса CDEMAOnRingBuffer.mqh нужно поместить в папку IncOnRingBuffer, которую необходимо создать в MQL5\Include\. К описанию прикреплены два файла с примерами, которые используют класс из этой папки. Файлы с классами кольцевого буфера и Moving Average тоже должны быть в этой папке.

Методы класса

//--- метод инициализации:
bool Init(                                // возвращает false при ошибке, при успехе - true
   int            period      = 12,       // период DEMA 
   ENUM_MA_METHOD method      = MODE_EMA, // метод сглаживания
   int            size_buffer = 256,      // размер кольцевого буфера
   bool           as_series   = false     // true, если таймсерия, иначе - false
   );
//--- метод расчета на основе таймсерий или индикаторных буферов:          
int MainOnArray(                  // возвращает количество обработанных элементов  
   const int     rates_total,     // размер массивов
   const int     prev_calculated, // обработано элементов на предыдущем вызове
   const double& price[],         // массив для расчета
   );
//--- метод расчета на основе отдельных последовательных элементов массива           
double MainOnValue(              // возвращает значение DEMA для заданного элемента (бара)
   const int    rates_total,     // размер массива
   const int    prev_calculated, // обработано элементов массива
   const int    begin,           // откуда начинаются значимые данные массивa
   const double value,           // значение элемента (бара)
   const int    index            // индекс элемента (бара)
   );

//--- методы доступа к данным:
int                 BarsRequired(); // Возвращает необходимое количество баров для построения индикатора
string              Name();         // Возвращает имя индикатора
int                 Period();       // Возвращает период
int                 Size();         // Возвращает размер кольцевого буфера
double              MA(int index);  // Возвращает значение Moving Average, индексация как в таймсерии

Получать рассчитанные данные  индикатора из кольцевого буфера можно как из обычного массива. Например:

//--- класс с методами расчета индикатора DEMA:
#include <IncOnRingBuffer\CDEMAOnRingBuffer.mqh>
CDEMAOnRingBuffer dema;

...

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
//--- расчет индикатора на основе таймсерий:
    dema.MainOnArray(rates_total,prev_calculated,price);

...

//--- используем данные из кольцевого буфера "dema",
//    например,скопируем данные в индикаторный буфер:
   for(int i=start;i<rates_total && !IsStopped();i++)
      DEMA_Buffer[i] = dema[rates_total-1-i]; // линия индикатора DEMA

...

//--- return value of prev_calculated for next call:
   return(rates_total);
  }

При расчете DEMA также делается расчет Moving Average с аналогичными параметрами. Получить данные из кольцевого буфера MA можно при помощи метода MA(int index):

//--- используем данные из кольцевого буфера Moving Avarage,
//    например,скопируем данные в индикаторный буфер:
   for(int i=start;i<rates_total && !IsStopped();i++)
      MA_Buffer[i] = dema.MA(rates_total-1-i); // линия индикатора Moving Avarage

Обратите внимание, что индексация в кольцевых буферах как в таймсерии.

Примеры

  1. Файл Test_DEMA_OnArrayRB.mq5 - рассчитывает индикатор на основе ценовой таймсерии. Демонстрируется применение метода MainOnArray()
  2. Файл Test_DEMA_OnValueRB.mq5 демонстрирует использование метода MainOnValue(). Сначала рассчитывается и строится индикатор DEMA. Затем на основе кольцевого буфера этого индикатора строится еще один DEMA. 


Результат работы Test_DEMA_OnArrayRB.mq5 с размером кольцевого буфера в 256 элементов



Результат работы Test_DEMA_OnValueRB.mq5 с размером кольцевого буфера в 256 элементов

 

При написании кода использовались наработки MetaQuotes Software Corp.Integer и GODZILLA

PrevDayAndFloatingPivot PrevDayAndFloatingPivot

Индикатор Prev Day And Floating Pivot

Renko_v1 Renko_v1

Трендовый индикатор, рисующий границы канала

Exp_RD-TrendTrigger Exp_RD-TrendTrigger

Торговая система Exp_RD-TrendTrigger, построеная на основе изменения направления тренда, отображаемого осциллятором RD-TrendTrigger.

StepMA_v6.4 StepMA_v6.4

Простой, трендовый индикатор NRTR типа