Discussão do artigo "Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 02): Mapas de Kohonen"

 

Novo artigo Funcionalidades do assistente MQL5 que você precisa conhecer (Parte 02): Mapas de Kohonen foi publicado:

Esta série de artigos propõe que o Assistente MQL5 deve ser um pilar para os traders. Por quê? Porque o trader não economiza apenas o tempo desenvolvendo suas novas ideias com o Assistente MQL5, mas reduz bastante os erros de desenvolvimento de código duplicado; ele está finalmente preparado para canalizar sua energia nas poucas áreas críticas de sua filosofia de negociação.

Um equívoco comum sobre os mapas de Kohonen é que os dados functor devem ser uma imagem 2D como é exibido abaixo. As imagens como as que se encontram abaixo são frequentemente compartilhadas como representativas do que são os Mapas de Kohonen.

typical_image

Embora não esteja errado, eu quero destacar que o functor pode e talvez deva (para traders) ter uma única dimensão. Então, em vez de reduzir os nossos dados de alta dimensão a um mapa 2D, vamos mapeá-los em uma única linha.Os mapas de Kohonen, por definição, destinam-se a reduzir a dimensionalidade, então quero que levemos isso para o próximo nível neste artigo.O mapa de kohonen é diferente das redes neurais regulares tanto no número de camadas quanto no algoritmo subjacente.

Ele é uma camada única (geralmente uma grade 2D linear, como mencionado anteriormente) de um conjunto de neurônios, em vez de múltiplas camadas. Todos os neurônios nesta camada que nós estamos nos referindo como functor se conectam aos dados de alimentação, mas não para si significando que os neurônios não são influenciados pelos pesos dos outros de maneira direta, e eles são atualizados apenas em relação aos dados de alimentação. A camada de dados do functor é frequentemente um mapa" que se organiza a cada iteração de treinamento dependendo dos dados de alimentação. Como tal, após o treinamento, cada neurônio tem dimensão ajustada ao peso na camada functor e isso permite calcular a distância euclidiana entre dois desses neurônios.

Autor: Stephen Njuki

 

Resta uma pergunta: como podemos entender por que o valor IN_RADIUS é considerado o módulo para normalizar os dados?

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))));

porque o raio do cluster é uma constante e tem um valor positivo.

Talvez isso seja um erro e o numerador inteiro deva ser considerado o módulo?

 

Montei o Expert Advisor, mas dois parâmetros, Stop Loss e Take Profit, não são os mesmos da captura de tela do artigo:

No artigo.

Eu tenho

Como resultado, não há uma única negociação...

Estou fazendo algo errado?

E como usar outro indicador em vez do ATR, por exemplo, MACD?

 
Oleg Pavlenko #:

Criei o Expert Advisor, mas os dois parâmetros Stop Loss e Take Profit não são os mesmos da captura de tela do artigo:

Como resultado, nem uma única negociação...

Estou fazendo algo errado?

E como usar outro indicador em vez do ATR, por exemplo, MACD?

Você pode fazer isso dessa forma:

bool CSignalMACD::InitMACD(CIndicators *indicators)
  {
//--- adicionar objeto à coleção
   if(!indicators.Add(GetPointer(m_MACD)))
     {
      printf(__FUNCTION__+": error adding object");
      return(false);
     }
//--- inicializar o objeto
   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);
  }

também em protegido:

protected:
   CiMACD            m_MACD;           // objeto-oscilador
   //--- parâmetros ajustados
   int               m_period_fast;    // o parâmetro "período de EMA rápida" do oscilador
   int               m_period_slow;    // o parâmetro "período de EMA lento" do oscilador
   int               m_period_signal;  // o parâmetro "período de cálculo da média da diferença" do oscilador
   ENUM_APPLIED_PRICE m_applied;       // o parâmetro "série de preços" do oscilador

e em público:

 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;  

e novamente em protected:

protected:
   //--- método de inicialização do oscilador
   bool              InitMACD(CIndicators *indicators);
   //--- métodos de obtenção de dados
   double            Main(int ind)                     { return(m_MACD.Main(ind));      }
   double            Signal(int ind)                   { return(m_MACD.Signal(ind));    }

e finalmente:

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);
      //--- se um preço base não for especificado explicitamente, será usado o preço de mercado atual
      double base_price=(m_base_price==0.0) ? m_symbol.Ask() : m_base_price;

      //--- sobrecarga de preço que define o preço de entrada para ser baseado no MACD
      price      =base_price;
      double _range=m_MACD.Main(StartIndex())+((m_symbol.StopsLevel()+m_symbol.FreezeLevel())*m_symbol.Point());
      //

Mas qual é o objetivo?