Обсуждение статьи "Возможности Мастера MQL5, которые вам нужно знать (Часть 02): Карты Кохонена"

 

Опубликована статья Возможности Мастера MQL5, которые вам нужно знать (Часть 02): Карты Кохонена:

Современный трейдер почти всегда сознательно или бессознательно находится в поиске новых идей. Он постоянно пробует новые стратегии, модифицирует их и отбрасывает те, что не оправдали себя. Этот исследовательский процесс требует много времени и сопряжен с ошибками. В этой серии статей я постараюсь доказать, что Мастер MQL5 является настоящей опорой трейдера. Благодаря Мастеру, трейдер экономит время при реализации своих идей. Кроме того, снижается вероятность ошибок, возникающих при дублировании кода. Вместо того чтобы тратить время на оформление кода, трейдеры претворяют в жизнь свою торговую философию.

Распространенное заблуждение относительно карт Кохонена заключается в том, что функторные данные обязательно должны представлять собой двухмерное изображение наподобие представленного ниже.

typical_image

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

Автор: Stephen Njuki

 

Остался один вопрос, как можно понять для чего значение IN_RADIUS берется по модулю при нормализации данных:

double _dimension=fabs(IN_RADIUS)*((Low(StartIndex()+w+Index)-Low(StartIndex()+w+Index+1))-(High(StartIndex()+w+Index)-High(StartIndex()+w+Index+1)))/fmax(m_symbol.Point(),fmax(High(StartIndex()+w+Index),High(StartIndex()+w+Index+1))-fmin(Low(StartIndex()+w+Index),Low(StartIndex()+w+Index+1)));

ведь радиус кластера, константа  и имеет положительное значение.

Возможно это ошибка и по модулю нужно брать весь числитель?

 

Собрал эксперта, но два параметра Stop Loss и Take Profit не такие как на скриншоте в статье:

В статье

У меня

В результате ни одной сделки...

Что-то не так делаю?

И как вместо ATR прикрутить другой индикатор, например MACD ?

 
Oleg Pavlenko #:

Собрал эксперта, но два параметра Stop Loss и Take Profit не такие как на скриншоте в статье:

В результате ни одной сделки...

Что-то не так делаю?

И как вместо ATR прикрутить другой индикатор, например MACD ?

Прикрутить, можно так:

bool CSignalMACD::InitMACD(CIndicators *indicators)
  {
//--- add object to collection
   if(!indicators.Add(GetPointer(m_MACD)))
     {
      printf(__FUNCTION__+": error adding object");
      return(false);
     }
//--- initialize object
   if(!m_MACD.Create(m_symbol.Name(),m_period,m_period_fast,m_period_slow,m_period_signal,m_applied))
     {
      printf(__FUNCTION__+": error initializing object");
      return(false);
     }
//--- ok
   return(true);
  }

так же в protected:

protected:
   CiMACD            m_MACD;           // object-oscillator
   //--- adjusted parameters
   int               m_period_fast;    // the "period of fast EMA" parameter of the oscillator
   int               m_period_slow;    // the "period of slow EMA" parameter of the oscillator
   int               m_period_signal;  // the "period of averaging of difference" parameter of the oscillator
   ENUM_APPLIED_PRICE m_applied;       // the "price series" parameter of the oscillator

и еще в public:

 void              PeriodFast(int value)             { m_period_fast=value;           }
 void              PeriodSlow(int value)             { m_period_slow=value;           }
 void              PeriodSignal(int value)           { m_period_signal=value;         }
 void              Applied(ENUM_APPLIED_PRICE value) { m_applied=value;  

и снова в  protected:

protected:
   //--- method of initialization of the oscillator
   bool              InitMACD(CIndicators *indicators);
   //--- methods of getting data
   double            Main(int ind)                     { return(m_MACD.Main(ind));      }
   double            Signal(int ind)                   { return(m_MACD.Signal(ind));    }

и наконец:

bool CSignalKM::OpenLongParams(double &price,double &sl,double &tp,datetime &expiration)
  {
   CExpertSignal *general=(m_general!=-1) ? m_filters.At(m_general) : NULL;
//---
   if(general==NULL)
     {
      m_MACD.Refresh(-1);
      //--- if a base price is not specified explicitly, take the current market price
      double base_price=(m_base_price==0.0) ? m_symbol.Ask() : m_base_price;

      //--- price overload that sets entry price to be based on MACD
      price      =base_price;
      double _range=m_MACD.Main(StartIndex())+((m_symbol.StopsLevel()+m_symbol.FreezeLevel())*m_symbol.Point());
      //

Только в чем смысл?

Причина обращения: