Discussão do artigo "Sistema de negociação simples com o uso de indicadores semáforo"

 

Novo artigo Sistema de negociação simples com o uso de indicadores semáforo foi publicado:

Se examinarmos por completo qualquer sistema de negócio complexo, veremos que é baseado em um conjunto simples de sinais de negócio. Consequentemente, não há necessidade para que novos desenvolvedores comecem imediatamente a escrever algorítimos complexos. Este artigo fornece um exemplo de um sistema de negócio que utiliza indicadores semáforo para realizar negócios.

Figura 4. Sinal de negociação para realização de um acordo usando o indicador de tendência de semáforo Heiken Ashi Smoothed

Autor: Nikolay Kositsin

 
O artigo é muito claro.
Uma pequena observação: há um erro mecânico de digitação no fragmento de código fornecido no exemplo, que foi copiado e colado:
//---- Declaração de variáveis locais
   double TrendVelue[2];
 

Compilei alguns sinais e reiniciei, como o "Candles_SmoothedSignal.mqh" (..MQL5\Include\Expert\MySignals\Candles_SmoothedSignal.mqh), mas o MetaEditor não consegue visualizá-lo para criar um Expert Advisor no Assistente.

Como posso resolver isso?

 

Obrigado por essa explicação excelente e completa...!


daveM

 

Fiz o download e descompactei tudo conforme indicado nas instruções, mas o testador apresenta um erro em todos os sistemas:

o testador parou porque o OnInit falhou

CExpert::ValidationSettings: erro nos parâmetros de dinheiro

CMoneyFixedLot::ValidationSettings: o valor do lote deve estar no intervalo de 1,000000 a 1000000,000000

Por favor, diga-me o que devo ajustar.

 

Olá!

Estou tentando adicionar o módulo de sinal de negociação ASCtrendSignal (localizado no arquivo compactado mysignals.zip) criado com base no indicador ASCtrend (localizado no arquivo compactado indicators.zip) ao Assistente MQL5, mas nada funciona. Eu coloco o módulo de sinal de negociação ASCtrendSignal em Include\Expert\Signal e coloco o indicador ASCtrend no pacote Indicators, tudo parece estar correto, mas o módulo persistentemente não quer ser exibido no Assistente MQL5. Aqui está o código do módulo de sinal de negociação ASCtrendSignal:

//+------------------------------------------------------------------+
//|ASCtrendSignal.mqh
//|Direitos autorais © 2011, Nikolay Kositsin | 
//|Khabarovsk, farria@mail.redcom.ru | 
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 2011, Nikolay Kositsin."
#property link      "farria@mail.redcom.ru"
//+------------------------------------------------------------------+
//| Arquivos incluídos|
//+------------------------------------------------------------------+
#property tester_indicator "ASCtrend.ex5"
#include <Expert\ExpertSignal.mqh>
//--- início da descrição do assistente
//+------------------------------------------------------------------+ 
//| Declaração de constantes|
//+------------------------------------------------------------------+ 
#define  OPEN_LONG     80  // A constante para retornar o comando de compra para o Expert Advisor
#define  OPEN_SHORT    80  // A constante para retornar o comando de venda para o Expert Advisor
#define  CLOSE_LONG    40  // A constante para retornar o comando para fechar uma posição longa para o Expert Advisor
#define  CLOSE_SHORT   40  // A constante para retornar o comando para fechar uma posição curta para o Expert Advisor
#define  REVERSE_LONG  100 // A constante para retornar o comando para reverter uma posição longa para o Expert Advisor
#define  REVERSE_SHORT 100 // A constante para retornar o comando para reverter uma posição curta para o Expert Advisor
#define  NO_SIGNAL      0  // A constante para retornar a ausência de um sinal para o Expert Advisor
//+----------------------------------------------------------------------+
//| Descrição da classe|
//| Title=Os sinais baseados no indicador ASCtrend
//| Type=SignalAdvanced.|
//| Name=ASCtrend|
//| Class=CASCtrendSignal|
//| Page=|
//| Parâmetro=BuyPosOpen,bool,true,Permissão para comprar
//| Parâmetro=SellPosOpen,bool,true,Permissão para vender
//| Parâmetro=BuyPosClose,bool,true,Permissão para sair de uma posição longa
//| Parâmetro=SellPosClose,bool,true,Permissão para sair de uma posição vendida
//| Parâmetro=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe
//| Parâmetro=RISK,int,4,Nível de risco|
//| Parâmetro=SignalBar,uint,1,Índice da barra para o sinal de entrada
//+----------------------------------------------------------------------+
//--- descrição do assistente fim
//+----------------------------------------------------------------------+
//| Classe CASCtrendSignal.|
//| Finalidade: Classe de gerador de sinais de negociação com base em
//| ASCtrend indicator values http://www.mql5.com/ru/code/491/.&nbsp;         |
//| É derivado da classe CExpertSignal.
//+----------------------------------------------------------------------+
class CASCtrendSignal : public CExpertSignal
  {
protected:
   CiCustom          m_indicator;      // o objeto para acesso aos valores de ASCtrend

   //--- parâmetros ajustados
   bool              m_BuyPosOpen;       // permissão para comprar
   bool              m_SellPosOpen;      // permissão para vender
   bool              m_BuyPosClose;      // permissão para sair de uma posição longa
   bool              m_SellPosClose;     // permissão para sair de uma posição vendida
   ENUM_TIMEFRAMES   m_Ind_Timeframe;    // Período de tempo do indicador ASCtrend
   uint              m_RISK;             // Nível de risco
   uint              m_SignalBar;        // índice da barra para o sinal de entrada

public:
                     CASCtrendSignal();

   //--- métodos de configuração de parâmetros ajustáveis
   void               BuyPosOpen(bool value)                  { m_BuyPosOpen=value;       }
   void               SellPosOpen(bool value)                 { m_SellPosOpen=value;      }
   void               BuyPosClose(bool value)                 { m_BuyPosClose=value;      }
   void               SellPosClose(bool value)                { m_SellPosClose=value;     }
   void               Ind_Timeframe(ENUM_TIMEFRAMES value)    { m_Ind_Timeframe=value;    }
   void               RISK(uint value)                        { m_RISK=value;             }
   void               SignalBar(uint value)                   { m_SignalBar=value;        }

   //--- método de validação de parâmetros ajustáveis
   virtual bool      ValidationSettings();
   //--- método de validação de parâmetros ajustáveis
   virtual bool      InitIndicators(CIndicators *indicators); // inicialização de indicadores
   //--- método de geração de sinais de entrada no mercado
   virtual int       LongCondition();
   virtual int       ShortCondition();

   bool              InitASCtrend(CIndicators *indicators);   // Método de inicialização do indicador ASCtrend

protected:

  };
//+------------------------------------------------------------------+
//|Construtor CASCtrendSignal.|
//| INPUT: não.|
//| OUTPUT: não.|
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
void CASCtrendSignal::CASCtrendSignal()
  {
//--- configuração de parâmetros padrão
   m_BuyPosOpen=true;
   m_SellPosOpen=true;
   m_BuyPosClose=true;
   m_SellPosClose=true;
   
//--- parâmetros de entrada do indicador
   m_Ind_Timeframe=PERIOD_H4;
   m_RISK=4;
//--- 
   m_SignalBar=1;
   m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE;
  }
//+------------------------------------------------------------------+
//| Verificação de parâmetros ajustáveis.|
//| INPUT: não.|
//| OUTPUT: verdadeiro se as configurações forem válidas, falso - se não forem.
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
bool CASCtrendSignal::ValidationSettings()
  {
//--- verificação de parâmetros
   if(m_RISK<=0)
     {
      printf(__FUNCTION__+": Risk level must be above zero");
      return(false);
     }

//--- conclusão bem-sucedida
   return(true);
  }
//+------------------------------------------------------------------+
//| Inicialização de indicadores e séries temporais.
//| INPUT: indicators - ponteiro para uma coleção de objetos
//| de indicadores e séries temporais.|
//| OUTPUT: true - em caso de sucesso, caso contrário - falso. || OUTPUT: true - em caso de sucesso, caso contrário - falso. ||
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
bool CASCtrendSignal::InitIndicators(CIndicators *indicators)
  {
//--- verificação do ponteiro
   if(indicators==NULL) return(false);

//--- inicialização do indicador 
   if(!InitASCtrend(indicators)) return(false);

//--- conclusão bem-sucedida
   return(true);
  }
//+------------------------------------------------------------------+
//| Inicialização do indicador ASCtrend.|
//| INPUT: indicators - ponteiro para uma coleção de objetos
//| de indicadores e séries temporais.|
//| OUTPUT: true - em caso de sucesso, caso contrário - falso. || OUTPUT: true - em caso de sucesso, caso contrário - falso. ||
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
bool CASCtrendSignal::InitASCtrend(CIndicators *indicators)
  {
//--- verificação do ponteiro
   if(indicators==NULL) return(false);

//--- adicionando um objeto à coleção
   if(!indicators.Add(GetPointer(m_indicator)))
     {
      printf(__FUNCTION__+": error of adding the object");
      return(false);
     }

//--- configuração dos parâmetros do indicador
   MqlParam parameters[2];
   
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="ASCtrend.ex5";
   
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_RISK;

//--- inicialização do objeto 
   if(!m_indicator.Create(m_symbol.Name(),m_Ind_Timeframe,IND_CUSTOM,2,parameters))
     {
      printf(__FUNCTION__+": object initialization error");
      return(false);
     }
     
//--- número de buffers
   if(!m_indicator.NumBuffers(2)) return(false);
   
//--- O indicador ASCtrend foi inicializado com sucesso
   return(true);
  }
//+------------------------------------------------------------------+
//| Verificação das condições para abrir uma posição longa e
//| e fechando uma curta|
//| INPUT:no|
//| OUTPUT: Peso do voto de 0 a 100|
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
int CASCtrendSignal::LongCondition()
  {
//--- o sinal de compra é determinado pelo buffer 1 do indicador ASCtrend
   double Signal=m_indicator.GetData(1,m_SignalBar);

//--- obtendo um sinal de negociação 
   if(Signal && Signal!=EMPTY_VALUE)
     {
      if(m_BuyPosOpen)
        {
         if(m_SellPosClose) return(REVERSE_SHORT);
         else return(OPEN_LONG);
        }
      else
        {
         if(m_SellPosClose) return(CLOSE_SHORT);
        }
     }

//--- procurando por sinais para fechar uma posição vendida
   if(!m_SellPosClose) return(NO_SIGNAL);

   int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe);

   for(int bar=int(m_SignalBar); bar<Bars_; bar++)
     {
      Signal=m_indicator.GetData(0,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL);

      Signal=m_indicator.GetData(1,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_SHORT);
     }

//--- nenhum sinal de negociação
   return(NO_SIGNAL);
  }
//+------------------------------------------------------------------+
//| Verificação das condições para abrir uma posição vendida e
//| fechando um longo|
//| INPUT:no|
//| OUTPUT: Peso do voto de 0 a 100|
//|| OBSERVAÇÃO: não.|
//+------------------------------------------------------------------+
int CASCtrendSignal::ShortCondition()
  {
//--- o sinal de venda é determinado pelo buffer 0 do indicador ASCtrend
   double Signal=m_indicator.GetData(0,m_SignalBar);
   
//--- obtendo um sinal de negociação
   if(Signal && Signal!=EMPTY_VALUE)
     {
      if(m_SellPosOpen)
        {
         if(m_BuyPosClose) return(REVERSE_LONG);
         else return(OPEN_SHORT);
        }
      else
        {
         if(m_BuyPosClose) return(CLOSE_LONG);
        }
     }

//--- procurando por sinais para fechar uma posição longa
   if(!m_BuyPosClose) return(NO_SIGNAL);

   int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe); // Здесь код исправлен с учетом подсказки от Владимира Карпутова: Symbol() заменен на m_symbol.Name()
   for(int bar=int(m_SignalBar); bar<Bars_; bar++)
     {
      Signal=m_indicator.GetData(1,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL);

      Signal=m_indicator.GetData(0,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_LONG);
     }

//--- nenhum sinal de negociação 
   return(NO_SIGNAL);
  }
//+------------------------------------------------------------------+

Você pode me dizer qual é o problema?

Atenciosamente, Vladimir

 
MrBrooklin:

Olá!

Estou tentando adicionar o módulo de sinal de negociação ASCtrendSignal (localizado no arquivo compactado mysignals.zip) criado com base no indicador ASCtrend (localizado no arquivo compactado indicators.zip) ao Assistente MQL5, mas nada funciona. Eu coloco o módulo de sinal de negociação ASCtrendSignal em Include\Expert\Signal e coloco o indicador ASCtrend no pacote Indicators, tudo parece estar correto, mas o módulo persistentemente não quer ser exibido no Assistente MQL5. Aqui está o código do módulo de sinal de negociação ASCtrendSignal:

Você pode me dizer qual é o problema?

Atenciosamente, Vladimir

Gostaria de acrescentar que esse mesmo problema ocorre com outros módulos de sinais de negociação escritos com base em indicadores. Aparentemente, eles têm o mesmo problema. Por favor, ajude a resolver esses problemas.

Atenciosamente, Vladimir.

P.S. Alguns indicadores que descompactei do arquivo compactado indicators.zip estão instalados no terminal e funcionam normalmente.

 

O que conta é a ordem:

// início da descrição do assistente
//+----------------------------------------------------------------------+
//| Descrição da classe|
//| Title=Os sinais baseados no indicador ASCtrend
//| Type=SignalAdvanced.|
//| Name=ASCtrend|
//| Class=CASCtrendSignal|
//| Page=|
//| Parâmetro=BuyPosOpen,bool,true,Permissão para comprar
//| Parâmetro=SellPosOpen,bool,true,Permissão para vender
//| Parâmetro=BuyPosClose,bool,true,Permissão para sair de uma posição longa
//| Parâmetro=SellPosClose,bool,true,Permissão para sair de uma posição vendida
//| Parâmetro=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe
//| Parâmetro=RISK,int,4,Nível de risco|
//| Parâmetro=SignalBar,uint,1,Índice da barra para o sinal de entrada
//+----------------------------------------------------------------------+
// descrição do assistente fim

não

//--- wizard description start
//--- wizard description end

e entre o início e o fim apenas um bloco de serviço - sem variáveis ou substituições de macros.


É assim que o módulo deve começar:

//+------------------------------------------------------------------+
//|ASCtrendSignal.mqh
//|Direitos autorais © 2011, Nikolay Kositsin |
//|Khabarovsk, farria@mail.redcom.ru |
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 2011, Nikolay Kositsin."
#property link      "farria@mail.redcom.ru"
//+------------------------------------------------------------------+
//| Arquivos incluídos|
//+------------------------------------------------------------------+
//#property tester_indicator "ASCtrend.ex5"
#include <Expert\ExpertSignal.mqh>
// início da descrição do assistente
//+----------------------------------------------------------------------+
//| Descrição da classe|
//| Title=Os sinais baseados no indicador ASCtrend
//| Type=SignalAdvanced.|
//| Name=ASCtrend|
//| Class=CASCtrendSignal|
//| Page=|
//| Parâmetro=BuyPosOpen,bool,true,Permissão para comprar
//| Parâmetro=SellPosOpen,bool,true,Permissão para vender
//| Parâmetro=BuyPosClose,bool,true,Permissão para sair de uma posição longa
//| Parâmetro=SellPosClose,bool,true,Permissão para sair de uma posição vendida
//| Parâmetro=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe
//| Parâmetro=RISK,int,4,Nível de risco|
//| Parâmetro=SignalBar,uint,1,Índice da barra para o sinal de entrada
//+----------------------------------------------------------------------+
// descrição do assistente fim
//+------------------------------------------------------------------+
//| Declaração de constantes|
//+------------------------------------------------------------------+
#define  OPEN_LONG     80  // A constante para retornar o comando de compra para o Expert Advisor
#define  OPEN_SHORT    80  // A constante para retornar o comando de venda para o Expert Advisor
#define  CLOSE_LONG    40  // A constante para retornar o comando para fechar uma posição longa para o Expert Advisor
#define  CLOSE_SHORT   40  // A constante para retornar o comando para fechar uma posição curta para o Expert Advisor
#define  REVERSE_LONG  100 // A constante para retornar o comando para reverter uma posição longa para o Expert Advisor
#define  REVERSE_SHORT 100 // A constante para retornar o comando para reverter uma posição curta para o Expert Advisor
#define  NO_SIGNAL      0  // A constante para retornar a ausência de um sinal para o Expert Advisor
//+----------------------------------------------------------------------+
//| Classe CASCtrendSignal.|
//| Finalidade: Classe de gerador de sinais de negociação com base em
//| ASCtrend indicator values http://www.mql5.com/ru/code/491/.&nbsp;         |
//| É derivado da classe CExpertSignal.
//+----------------------------------------------------------------------+
class CASCtrendSignal : public CExpertSignal
  {

recarregar o MetaEditor depois de fazer as edições

 
Vladimir Karputov:

O que conta é a ordem:

não

e entre o início e o fim apenas um bloco de serviço - sem variáveis ou substituições de macros.


É assim que um módulo deve começar:

recarregar o MetaEditor depois de fazer as edições

Obrigado, Vladimir!

Tudo funcionou.

Saudações, Vladimir.

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "Sistemas de negociação simples usando indicadores semafóricos"

Vladimir Karputov, 2019.10.30 08:50

A ordem é importante:

 // início da descrição do assistente
//+----------------------------------------------------------------------+
//| Descrição da classe|
//| Title=Os sinais baseados no indicador ASCtrend
//| Type=SignalAdvanced|
//| Name=ASCtrend|
//| Class=CASCtrendSignal|
//| Page=|
//| Parâmetro=BuyPosOpen,bool,true,Permissão para comprar
//| Parâmetro=SellPosOpen,bool,true,Permissão para vender
//| Parâmetro=BuyPosClose,bool,true,Permissão para sair de uma posição longa
//| Parâmetro=SellPosClose,bool,true,Permissão para sair de uma posição vendida
//| Parâmetro=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe
//| Parâmetro=RISK,int,4,Nível de risco|
//| Parâmetro=SignalBar,uint,1,Índice da barra para o sinal de entrada
//+----------------------------------------------------------------------+
// descrição do assistente fim 

mas não

 //--- wizard description start
//--- wizard description end 

e entre o início e o fim apenas o bloco de serviço - sem variáveis e substituições de macro.


Esse é o início que o módulo deve ter:

 //+------------------------------------------------------------------+
//|ASCtrendSignal.mqh
//|Direitos autorais © 2011, Nikolay Kositsin |
//|Khabarovsk, farria@mail.redcom.ru |
//+------------------------------------------------------------------+
#property  copyright "Direitos autorais © 2011, Nikolay Kositsin"
#property  link        "farria@mail.redcom.ru"
//+------------------------------------------------------------------+
//| Arquivos incluídos|
//+------------------------------------------------------------------+
//#property tester_indicator "ASCtrend.ex5"
#include  <Expert\ExpertSignal.mqh>
// início da descrição do assistente
//+----------------------------------------------------------------------+
//| Descrição da classe|
//| Title=Os sinais baseados no indicador ASCtrend
//| Type=SignalAdvanced|
//| Name=ASCtrend|
//| Class=CASCtrendSignal|
//| Page=|
//| Parâmetro=BuyPosOpen,bool,true,Permissão para comprar
//| Parâmetro=SellPosOpen,bool,true,Permissão para vender
//| Parâmetro=BuyPosClose,bool,true,Permissão para sair de uma posição longa
//| Parâmetro=SellPosClose,bool,true,Permissão para sair de uma posição vendida
//| Parâmetro=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe
//| Parâmetro=RISK,int,4,Nível de risco|
//| Parâmetro=SignalBar,uint,1,Índice da barra para o sinal de entrada
//+----------------------------------------------------------------------+
// descrição do assistente fim
//+------------------------------------------------------------------+
//| Declaração de constantes|
//+------------------------------------------------------------------+
#define  OPEN_LONG     80    // A constante para retornar o comando de compra para o Expert Advisor
#define  OPEN_SHORT     80    // A constante para retornar o comando de venda para o Expert Advisor
#define  CLOSE_LONG     40    // A constante para retornar o comando para fechar uma posição longa para o Expert Advisor
#define  CLOSE_SHORT   40    // A constante para retornar o comando para fechar uma posição curta para o Expert Advisor
#define  REVERSE_LONG   100 // A constante para retornar o comando para reverter uma posição longa para o Expert Advisor
#define  REVERSE_SHORT 100 // A constante para retornar o comando para reverter uma posição curta para o Expert Advisor
#define  NO_SIGNAL       0    // A constante para retornar a ausência de um sinal para o Expert Advisor
//+----------------------------------------------------------------------+
//| Classe CASCtrendSignal.|
//| Finalidade: Classe de gerador de sinais de negociação com base em
//| ASCtrend indicator values http://www.mql5.com/ru/code/491/.&nbsp;         |
//| É derivado da classe CExpertSignal.|
//+----------------------------------------------------------------------+
class CASCtrendSignal : public CExpertSignal
  {

reinicie o MetaEditor depois de fazer alterações