Индикаторы: Центр гравитации Элерса - Center of Gravity J. F. Ehlers

 

Центр гравитации Элерса - Center of Gravity J. F. Ehlers:

Центр гравитации является осциллятором, разработанным Джоном Элерсом и представленном в майском выпуске журнала "Stocks & Commodities" (2002г.).

Центр гравитации имеет по существу нулевое отставание и позволяет четко определять поворотные моменты. Этот индикатор является результатом исследования Элерсом адаптивных фильтров. Индикатор "центр гравитации" позволяет идентифицировать главные разворотные точки почти без отставания.

Идея вычисления центра гравитации выросла из наблюдения за тем, каково отставание различных фильтров с конечной импульсной характеристикой (КИХ) в соответствии с относительной амплитудой коэффициентов фильтров. Простая средняя скользящая (SMA) является КИХ-фильтром, где все коэффициенты имеют одно и тоже значение. В результате центром гравитации SMA является точный центр фильтра. Взвешенная средняя скользящая (WMA) представляет собой КИХ-фильтр, где последнее ценовое изменение взвешено по длине фильтра, предпоследнее ценовое изменение взвешено по меньшей длине фильтра и так далее.

Индикатор Center Of Gravity

Автор: Nikolay Kositsin

 
пригодился! ...ещё бы знать критерии изменения окраски
 

Здравствуйте,

Этот осциллятор отличный, но у меня с ним проблемы.

Конец сигнальной линии, который рассчитывается по последней свече, не отображается, поэтому он всегда показывает красный цвет в настоящее время. Когда я перезагружаю осциллятор, он на мгновение показывает хорошие значения с концом сигнальной линии, но затем снова переключается на красный цвет (даже если он должен показывать зеленый).

Что я должен сделать, чтобы устранить эту проблему?

Я пытался отладить его заново, но это не помогло.

Приветствую,

InfiniteDesign

 
Как он считает, этот индикатор , который работает с мехором и символом и таймфреймом.
Какие наилучшие значения для параметров этого индикатора?
 

Большое спасибо за этот замечательный индикатор.

Я нашел предыдущую версию такой же интересной и полезной, как и новую, или даже более того.

Не могли бы вы перенести старую версию и на mq5? Я был бы очень признателен, если бы это было возможно.


Будьте здоровы, и спасибо заранее !!!

 
Этот показатель недетерминирован. Запросите одни и те же точки данных дважды, в разное время, и вы получите разные ответы. Дрейф больше ближе к текущему времени. Несоответствие может достигать 3,7 x 10^-04.
 
InfiniteDesign:

Здравствуйте,

Этот осциллятор отличный, но у меня с ним проблемы.

Конец сигнальной линии, который рассчитывается по последней свече, не отображается, поэтому он всегда показывает красный цвет в настоящее время. Когда я перезагружаю осциллятор, он на мгновение показывает хорошие значения с концом сигнальной линии, но затем снова переключается на красный цвет (даже если он должен показывать зеленый).

Что я должен сделать, чтобы устранить эту проблему?

Я пытался отладить его заново, но это не помогло.

Приветствую,

InfiniteDesign

У меня та же проблема...
 

Я пытался создать Сигнал из этого индикатора, но не смог...

Есть помощь?


//+------------------------------------------------------------------+
//|COG.mqh |
//|Бруно Пио |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Bruno Pio"
#property link      "http://www.mql5.com"
#property version   "1.00"
#include "..\ExpertSignal.mqh"   // CExpertSignal находится в файле ExpertSignal
#property tester_indicator "CenterOfGravity.ex5"
// начало описания мастера
//+------------------------------------------------------------------+
//| Описание класса|
//| Название=Сигналы центра тяжести|
//| Type=SignalAdvanced|
//| Name=My_COG|
//| ShortName=CG|
//| Class=COG|
//| Страница=Не нужна|
//| Параметр=Period_,int,10, Период усреднения индикатора |
//| Параметр=SmoothPeriod, int, 3, Период сглаживания сигнальной линии |
//| Параметр=MA_Method_,ENUM_MA_METHOD,MODE_EMA,Signal Method |
//| Параметр=AppliedPrice, int, 1, константа цены |
//+------------------------------------------------------------------+
// описание мастера end
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class COG : public CExpertSignal
  {
private:
CiCustom             m_COG;               // Индикатор как объект
//--- Настраиваемые параметры модуля
   int               m_Period_;           // Период усреднения индикатора
   int               m_SmoothPeriod;      // Период сглаживания сигнальной линии 
   ENUM_MA_METHOD    m_MA_Method_;        // Метод усреднения сигнальных линий
   int               m_AppliedPrice;      // Постоянная цена
public:
                     COG(void);
                    ~COG(void);
//--- Проверка корректности входных данных
   bool              ValidationSettings();
//--- Создание индикаторов и временных рядов для модуля сигналов
   bool              InitIndicators(CIndicators *indicators);
//--- Доступ к данным индикатора
   double            CG(const int index)                 const { return(m_COG.GetData(0,index)); }
   double            Signal(const int index)             const { return(m_COG.GetData(1,index)); }   
//--- Проверка условий покупки и продажи
   virtual int       LongCondition();
   virtual int       ShortCondition();
//--- Методы для установки
   void              Period_(int value)               { m_Period_=value;        }
   void              SmoothPeriod(int value)          { m_SmoothPeriod=value;   }
   void              MA_Method_(ENUM_MA_METHOD value) { m_MA_Method_=value;     }
   void              AppliedPrice(int value)          { m_AppliedPrice=value;   }
protected:
   //--- Создание индикатора
   bool              CreateCOG(CIndicators *indicators);



  };
//+------------------------------------------------------------------+
//| Конструктор|
//+------------------------------------------------------------------+
COG::COG(void) :           m_Period_(10),                // Период усреднения индикатора
                           m_SmoothPeriod(3),            // Период сглаживания сигнальной линии 
                           m_MA_Method_(MODE_EMA),       // Метод усреднения сигнальных линий
                           m_AppliedPrice(1)             // Постоянная цена
  {
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
COG::~COG()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Проверяет входные параметры и возвращает true, если все в порядке |
//+------------------------------------------------------------------+
bool COG:: ValidationSettings()
  {
   //--- Вызовите метод базового класса
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- Проверяем периоды, количество баров для расчета МА >=1
   if(m_Period_<1)
     {
      PrintFormat("Incorrect value set for one of the period! Period_=%d",
                  m_Period_);
      return false;
     }
//--- Проверяем периоды, количество баров для расчета МА >=1
   if(m_SmoothPeriod<1)
     {
      PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d",
                  m_SmoothPeriod);
      return false;
     }
//--- Тип сглаживания Fast MA должен быть одним из четырех значений перечисления
   if(m_MA_Method_!=MODE_SMA && m_MA_Method_!=MODE_EMA && m_MA_Method_!=MODE_SMMA && m_MA_Method_!=MODE_LWMA)
     {
      PrintFormat("Invalid type of smoothing of the fast MA!");
      return false;
     }
//--- m_AppliedPrice должна быть действительной
   if(m_AppliedPrice<1 || m_AppliedPrice>11) 
     {
      PrintFormat("Invalid type of Price!");
      return false;
     }
//--- Все проверки завершены, все в порядке
   return true;
  }
//+------------------------------------------------------------------+
//| Создает индикаторы|
//| Вход: указатель на коллекцию индикаторов |
//| Выходные данные: true в случае успеха, иначе false |
//+------------------------------------------------------------------+
bool COG::InitIndicators(CIndicators *indicators)
  {
//--- Стандартная проверка коллекции индикаторов на наличие NULL
   if(indicators==NULL) return(false);
//--- Инициализация индикаторов и временных рядов в дополнительных фильтрах
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Создание наших индикаторов
   if(!CreateCOG(indicators))                  return(false);   
//--- Достигли этой части, значит, функция выполнена успешно, возвращаем true
   return(true);
  }
//+------------------------------------------------------------------+
//| Создает индикатор "COG".|
//+------------------------------------------------------------------+
bool COG::CreateCOG(CIndicators *indicators)
  {
//--- Проверка указателя
   if(indicators==NULL) return(false);
//--- Добавление объекта в коллекцию
   if(!indicators.Add(GetPointer(m_COG)))
     {
      printf(__FUNCTION__+": Error adding an object of the COG");
      return(false);
     }
//--- Установка параметров COG
   MqlParam parameters[5];
//---
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="CenterOfGravity.ex5";
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_Period_;                 // Период
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SmoothPeriod;            // Период сглаживания сигнальной линии
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_MA_Method_;              // Метод усреднения сигнальных линий
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=m_AppliedPrice;            // Постоянная цена
//--- Инициализация объекта 
   if(!m_COG.Create(m_symbol.Name(),0,IND_CUSTOM,5,parameters))
     {
      printf(__FUNCTION__+": Error initializing the object of the COG");
      return(false);
     }
//--- Количество буферов
   if(!m_COG.NumBuffers(2)) return(false);
//--- Достигли этой части, значит, функция выполнена успешно, возвращаем true
   return(true);
  }
//+------------------------------------------------------------------+
//| Возвращает силу сигнала покупки.|
//+------------------------------------------------------------------+
int COG::LongCondition()
  {
   int signal=0;
//--- Для работы с тиками idx=0, для работы с сформированными барами idx=1
   int idx=StartIndex();
//--- Значения COGs на последнем сформированном баре
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Значения COG на предпоследнем сформированном баре
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---If CG > Signal && CG-1 < Signal-1
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // Есть сигнал к покупке
     }
//--- Верните значение сигнала
   return(signal);
  }
//+------------------------------------------------------------------+
//| Возвращает силу сигнала продажи.|
//+------------------------------------------------------------------+
int COG::ShortCondition()
  {
   int signal=0;
//--- Для работы с тиками idx=0, для работы с сформированными барами idx=1
   int idx=StartIndex();
//--- Значения COGs на последнем сформированном баре
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Значения COG на предпоследнем сформированном баре
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---If CG < Signal && CG-1 > Signal-1
   if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value))
     {
      signal=100; // Есть сигнал к продаже
     }
//--- Верните значение сигнала
   return(signal);
  }
 
интересная вещь.. нужно определиться с алгоритмом в боевых условиях
 

Индикатор компилируется без ошибок:

и он работает -

------------------

Только нужно использовать исправленный файл smoothalgorithms.mqh - смотрите пост


Indicators: T3Taotra_HTF
Indicators: T3Taotra_HTF
  • 2016.06.30
  • www.mql5.com
T3Taotra_HTF: Author: Nikolay Kositsin...
 
Bruno Pio #:
У меня такая же проблема...
Я получил от сообщества столько ценного, что хочу отплатить чем-то в ответ.

Это блестящий индикатор (если учитывать и более высокие тренды). Я присылаю улучшенную версию, конец которой больше не просто красный, и она корректно обновляется на реальном графике.

При вставке кода используйтекнопку «КОД» (Alt-S).

На этот раз модератор исправил форматирование. В будущем, пожалуйста, форматируйте код правильно; сообщения с неправильно отформатированным кодом могут быть удалены.

/*
 * Файл SmoothAlgorithms.mqh необходимо поместить 
 * в папку terminal_data_folder\MQL5\Include
 */
//+------------------------------------------------------------------+
//|                                            Center of Gravity.mq4 |
//|                      Авторские права © 2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright «Авторские права © 2007, MetaQuotes Software Corp.»
#property link      "http://www.metaquotes.net"
//---- версия индикатора
#property version   "1.00"
//---- рисование индикатора в отдельном окне
#property indicator_separate_window
//---- для расчёта и построения индикатора используются три буфера
#property indicator_buffers 3
//---- используются два графика
#property indicator_plots   2
//+----------------------------------------------+
//|  Параметры рисования индикатора                |
//+----------------------------------------------+
//---- рисование индикатора 1 в виде трёхцветной линии
#property indicator_type1 DRAW_COLOR_LINE
//---- используется для обозначения трёхцветных линий
#property indicator_color1 Gray,Lime,Red
//---- Линия индикатора 1 представляет собой непрерывную кривую
#property indicator_style1  STYLE_SOLID
//---- толщина линии индикатора 1 равна 1
#property indicator_width1  1
//---- отображение надписи индикатора 1
#property indicator_label1  "Center of Gravity"
//+----------------------------------------------+
//|  Параметры рисования индикатора                |
//+----------------------------------------------+
//---- рисование индикатора 2 в виде линии
#property indicator_type2   DRAW_LINE
//---- в качестве цвета линии индикатора используется синий цвет
#property indicator_color2  Blue
//---- Линия индикатора 2 представляет собой непрерывную кривую
#property indicator_style2  STYLE_SOLID
//---- толщина линии индикатора 2 равна 1
#property indicator_width2  1
//---- отображение подписи линии индикатора 2
#property indicator_label2  "Signal Line"
//---- стиль линии — пунктирная кривая
#property indicator_style2 STYLE_DASHDOTDOT
//+-----------------------------------+
//|  Входные параметры индикаторов      |
//+-----------------------------------+
enum Applied_price_ //Тип константы
  {
   PRICE_CLOSE_ = 1,     //PRICE_CLOSE
   PRICE_OPEN_,          //ЦЕНА_ОТКРЫТИЯ
   PRICE_HIGH_,          //PRICE_HIGH
   PRICE_LOW_,           //PRICE_LOW
   PRICE_MEDIAN_,        //СРЕДНЯЯ ЦЕНА
   PRICE_TYPICAL_,       //ТИПИЧНАЯ ЦЕНА
   PRICE_WEIGHTED_,      //ВЗВЕШЕННАЯ ПО ЦЕНЕ
   PRICE_SIMPLE_,//PRICE_SIMPLE_
   PRICE_QUARTER_,       //ЦЕНА_КВАРТАЛА_
   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_
   PRICE_TRENDFOLLOW1_   //PRICE_TRENDFOLLOW1_
  };
input int Period_=10;                          // Период усреднения индикатора
input int SmoothPeriod=3;                      // Период сглаживания сигнальной линии
input ENUM_MA_METHOD MA_Method_=MODE_SMA;      // Метод усреднения сигнальной линии
input Applied_price_ AppliedPrice=PRICE_CLOSE_;// Константа цены
/* , используемые для расчета индикатора (1 — цена закрытия, 2 — цена открытия, 3 — максимальная цена, 4-LOW, 
  5-MEDIAN, 6-TYPICAL, 7-WEIGHTED, 8-SIMPLE, 9-QUARTER, 10-TRENDFOLLOW, 11-0.5 * TRENDFOLLOW.) */
//+-----------------------------------+
//---- объявление динамических массивов, которые далее
//---- будут использоваться в качестве буферов индикаторов
double Ext1Buffer[];
double Ext2Buffer[];
double ColorExt2Buffer[];
//---- Определение целочисленных переменных для начала вычисления данных
int StartBar;
//+------------------------------------------------------------------+
//| Описание функции iPriceSeries                                |
//| Описание класса Moving_Average                                 | 
//+------------------------------------------------------------------+ 
#include <SmoothAlgorithms.mqh> 
//+------------------------------------------------------------------+
//| Функция инициализации пользовательского индикатора                         |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- инициализация констант
   StartBar=Period_;
//---- задать динамический массив MAMABuffer в качестве буфера индикатора
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
//---- создание метки для отображения в DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity");
//---- сдвиг начала рисования индикатора
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar);
//---- преобразование динамического массива в буфер индексов цветов  
   SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX);
//---- сдвиг начала рисования индикатора
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1);

//---- задать динамический массив FAMABuffer в качестве массива индикаторов
   SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA);
//---- создание метки для отображения в DataWindow
   PlotIndexSetString(2,PLOT_LABEL,"Signal Line");
//---- сдвиг начала рисования индикатора
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1);

//---- инициализация переменной для сокращённого названия индикатора
   string shortname;
   StringConcatenate(shortname,"Center of Gravity(",Period_,")");
//---- создание имени для отображения в отдельном подокне и во всплывающей подсказке
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- установить точность отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----
  }
//+------------------------------------------------------------------+
//| Функция итерации пользовательского индикатора                              |
//+------------------------------------------------------------------+
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[])
  {
//---- проверка того, достаточно ли количества баров для расчёта
   if(rates_total<StartBar) return(0);

//---- Объявление переменных с плавающей запятой 
   double price_,sma,lwma;
//---- Объявление целочисленных переменных
   int first1,first2,first3,bar;

//---- Инициализация индикатора в блоке OnCalculate()
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка момента первого запуска расчета индикатора
     {
      first1=0; // начальное число для расчёта всех тактов первого цикла
      first2=Period_+1; // начальное число для расчета всех столбцов сигнальных линий
      first3=Period_+SmoothPeriod+3; // начальное число для расчета всех полос в цикле раскрашивания
     }
   else // начальное число для расчета новых баров
     {
      first1=prev_calculated-1;
      first3=first1;
     }

//---- Исправление (дополнение): при вызове функции MASeries с параметром «jelvonal» (Signal Line) параметр «begin» всегда
//---- должен быть тот же САМЫЙ постоянный порог надежности (Period_+1) — изначально активный
//---- в тикеле ошибочно использовался постоянно меняющийся показатель «first1» (то есть текущий индекс свечи)
//---- Установлено, что при каждом «живом» тике значение совпадало с обработанным значением, что привело к путанице в
//---- логика класса belső simító-osztály «до какого момента данные можно считать достоверными» — именно из-за этого он работал нестабильно/с ошибками
//---- значение на границе, и поэтому оно «исправляется» только после смены TF (полного пересчета).
   first2=Period_+1;

//---- объявление переменных класса Moving_Average
   static CMoving_Average MA,LWMA,SIGN;

//---- Основной цикл расчета оси канала
   for(bar=first1; bar<rates_total; bar++)
     {
      //---- Вызов функции PriceSeries для получения входной ценовой «серии»
      price_=PriceSeries(AppliedPrice,bar,open,low,high,close);

      sma=MA.MASeries(0,prev_calculated,rates_total,Period_,MODE_SMA,price_,bar,false);
      lwma=LWMA.MASeries(0,prev_calculated,rates_total,Period_,MODE_LWMA,price_,bar,false);

      Ext1Buffer[bar]=sma*lwma/_Point;
      Ext2Buffer[bar]=SIGN.MASeries(first2,prev_calculated,rates_total,SmoothPeriod,MA_Method_,Ext1Buffer[bar],bar,false);
     }

//---- Основной цикл раскрашивания сигнальной линии
   for(bar=first3; bar<rates_total; bar++)
     {
      ColorExt2Buffer[bar]=0;
      if(Ext1Buffer[bar]<Ext2Buffer[bar])
         ColorExt2Buffer[bar]=2;
      else ColorExt2Buffer[bar]=1;
     }
//----   
   return(rates_total);
  }
//+------------------------------------------------------------------+