Discussão do artigo "Assistente MQL5: Como criar um módulo de sinais de comércio"

 

Novo artigo Assistente MQL5: Como criar um módulo de sinais de comércio foi publicado:

O artigo discute como escrever sua própria classe de sinais de comércio com a implementação de sinais no cruzamento do preço e da média móvel, e como incluí-lo ao gerador de estratégias de comércio do Assistente MQL5, bem como descreve a estrutura e o formato da descrição da classe gerada para o Assistente MQL5.

Figura 1. A estrutura da classe base CExpert

Autor: MetaQuotes Software Corp.

 
Senhores camaradas! Eu li o artigo! Fiz tudo como está escrito nele, bem, acho que agora vou chegar ao céu. Mas não - o Master MKL 5 não viu meu arquivo com sinais. Verifiquei tudo novamente, fiz tudo de novo, verifiquei novamente, mas o sinal não está visível no assistente de criação de Expert Advisors. Anexei meu arquivo, que criei de acordo com as recomendações do artigo. Ajude-me a entender o que fiz de errado ou, pelo contrário, o autor do artigo não acrescentou algo importante, o que faz com que ele não se encaixe de forma alguma. Em suma, ajude-me da maneira que puder.
Arquivos anexados:
 
Tincup:
Senhores camaradas! Eu li o artigo! Fiz tudo como está escrito nele, bem, acho que agora vou chegar ao céu. Mas não - o Master MKL 5 não viu meu arquivo com sinais. Verifiquei tudo novamente, fiz tudo de novo, verifiquei novamente, mas o sinal não está visível no assistente de criação de Expert Advisors. Anexei meu arquivo, que criei de acordo com as recomendações do artigo. Ajude-me a entender o que fiz de errado ou, ao contrário, o autor do artigo não acrescentou algo importante, o que faz com que ele não se encaixe de forma alguma. Em resumo, ajude-me da maneira que puder.


Odescritor de classe é uma parte importante do texto de origem.

Há dois erros óbvios em seu descritor. Um deles impede que você detecte o sinal porque foi especificado um ENUM inexistente. O segundo causará problemas durante a compilação (nome de parâmetro incorreto).

Mais uma sutileza. Deve haver apenas um espaço antes da palavra-chave, em cada linha do descritor. (Acho que essa restrição será removida no futuro, mas por enquanto é assim).

// wizard description start
//+---------------------------------------------------------------------------+
//| Description of the class                                                |
//| Title=Сигнал пересечению ценой скользящей средней                     |
//| Type=Signal                                                             |
//| Name=Sample                                                             |
//| Class=CSampleSignal                                                     |
//| Page=                                                                   |
//| Parameter=PeriodMA,int,12                                                |
//| Parameter=ShiftMA,int,0                                                  | было SniftMA
//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA                               |
//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE                      | было ENUM_MA_APLLIED_PRICE
//| Parameter=Limit,double,0.0                                               |
//| Parameter=StopLoss,double,50.0                                           |
//| Parameter=TakeProfit,double,50.0                                         |
//| Parameter=Expiration,int,10                                              |
//+---------------------------------------------------------------------------+
// wizard description end


Mais adiante no texto.

Não ter um construtor é ruim. Você deve inicializar os dados dos membros com valores padrão. Afinal, no caso geral, o método de definição de um parâmetro pode não ser chamado.

E, por fim, os métodos estão descritos incorretamente

   void     LimitMA (int value)                    {m_limit=value;}
   void     StopLoss (int value)                   {m_stop_loss=value;}
   void     TakeProfit (int value)                 {m_take_profit=value;}

deve

   void     LimitMA (double value)                    {m_limit=value;}
   void     StopLoss (double value)                   {m_stop_loss=value;}
   void     TakeProfit (double value)                 {m_take_profit=value;}

 

Muito obrigado por sua resposta, é claro. Corrigi tudo e funcionou.

Mas ao compilar o Expert Advisor, ele apresentou um erro que eu não teria encontrado se o compilador o tivesse encontrado. A propósito, quando você estava me respondendo, deve ter corrigido o erro de forma imperceptível para si mesmo, mas ele está lá no texto original do artigo.

No artigo.

  void               Limit(double value)                 { m_limit=value;                  }

em resposta à minha solicitação de ajuda

  void               LimitМА(double value)                 { m_limit=value;}

ausência de MA no arquivo de sinal, ao compilar o próprio Expert Advisor após sua geração bem-sucedida, ele gera o seguinte erro

'Limit' - member function is not defined 123456.mq5 77 11
1 error(s), 0 warning(s) 2 1

No meu caso, pelo menos na linha 77, vemos

signal.Limit(Inp_Signal_Sample_Limit);

inserir MA após a palavra Limit

O erro no texto do Expert Advisor desaparece.

Se eu estiver errado, peço desculpas. Não sou um profissional.

 
Portanto, a descrição não deve ser Limit, mas LimitMA.
 

E mais uma coisa: esse erro aparece, não importa o que aconteça:

'--' - l-value required 1234.mq5 31 57

'--' - l-value required 1234.mq5 31 59
'--' - l-value required 1234.mq5 31 61
'--' - l-value required 1234.mq5 31 63
'--' - l-value required 1234.mq5 31 65
'--' - l-value required 1234.mq5 31 67
'--' - l-value required 1234.mq5 31 69
'--' - l-value required 1234.mq5 31 71
'--' - l-value required 1234.mq5 31 73
'--' - l-value required 1234.mq5 31 75
'--' - l-value required 1234.mq5 31 77
'--' - l-value required 1234.mq5 31 79
'--' - l-value required 1234.mq5 31 81
'--' - l-value required 1234.mq5 31 83
'--' - l-value required 1234.mq5 31 85
'--' - l-value required 1234.mq5 31 87
'--' - l-value required 1234.mq5 31 89
'--' - l-value required 1234.mq5 31 91
'--' - l-value required 1234.mq5 31 93
'--' - l-value required 1234.mq5 31 95
'--' - l-value required 1234.mq5 31 97
'--' - l-value required 1234.mq5 31 99
'--' - l-value required 1234.mq5 31 101
'--' - l-value required 1234.mq5 31 103
'--' - l-value required 1234.mq5 31 105
'--' - l-value required 1234.mq5 31 107
'--' - l-value required 1234.mq5 31 109
'--' - l-value required 1234.mq5 31 111
'--' - l-value required 1234.mq5 31 113
'--' - l-value required 1234.mq5 31 115
'-' - operando esperado 1234.mq5 31 117
'Inp_Signal_Sample_Expiration' - identificador não declarado 1234.mq5 77 22
32 erro(s), 0 aviso(s) 33 1

Vá para a linha 31 do EA para ver o seguinte

input double Inp_Signal_Sample_StopLoss =50.0;
input double Inp_Signal_Sample_TakeProfit=50.0;
input int Inp_Signal_Sample_Expiration=10-------------------------------------------------------------;
//--- entradas para dinheiro
input double Inp_Money_FixLot_Percent =10.0;

input double Inp_Money_FixLot_Lots =0.1;

Remova a cauda na forma de uma linha pontilhada que vem de 10 e todos os erros desaparecerão.

O Expert Advisor está pronto para trabalhar e otimizar.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 
Tincup:
Sim, e, portanto, a descrição não deve ser Limit, mas também LimitMA

Sim, LimitMA, eu pesquisei.

Em geral, para o futuro... Ao criar um descritor de classe, use o copypaste mais ativamente, pois o compilador não verifica os comentários (que compõem o descritor), e a coincidência dos nomes dos métodos e dos nomes dos parâmetros do descritor é importante. Isso "aparece" somente durante a compilação do Expert Advisor e causa emoções negativas. No entanto, como você pode ver, não é nada fatal.

 
Tincup:

E mais uma coisa: esse erro aparece, não importa o que aconteça:

'--' - l-value required 1234.mq5 31 57

Esse erro ocorre devido ao comprimento da cadeia de caracteres do descritor de classe. Depois das festas de fim de ano, resolveremos o problema.
Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Bom material... bem escrito e, sem dúvida, um alerta.
 

Boa tarde!

  1. Há um erro de impressão no arquivo anexo, se não me engano! Na descrição da função CheckOpenLong, nas linhas de cálculo das variáveis sl e tp, os sinais deveriam estar invertidos.
  2. Alterei a função CheckOpenLong da seguinte forma:
    bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
      {
    
       Print("Close(0)=",DoubleToString(Close(0),5)," Close(1)=",DoubleToString(Close(1),5));
       Print("Open(0)=",DoubleToString(Open(0),5)," Open(1)=",DoubleToString(Open(1),5));
       Print("MA(0)=",DoubleToString(MA(0),5)," MA(1)=",DoubleToString(MA(1),5));
    
       return(false);
       
      }
    Ou seja, ela deve simplesmente gerar os valores de Close, Open e MA para a última barra e a anterior. Portanto, se o valor de EveryTick for falso, tudo funcionará como deveria, mas se for verdadeiro, em vez de valores, ele emitirá zeros! Você pode me dizer o que está errado? O que estou fazendo de errado?

Obrigado!

 
lVlaxim:

Boa tarde!

  1. Há um erro de impressão no arquivo anexo, se não me engano! Na descrição da função CheckOpenLong, nas linhas de cálculo das variáveis sl e tp, os sinais devem ser invertidos.
  2. Alterei a função CheckOpenLong da seguinte forma: ou seja, ela deve gerar apenas os valores de Close, Open e MA da última barra e da barra anterior. Portanto, se o valor de EveryTick for falso, tudo funcionará como deveria, mas se for verdadeiro, em vez dos valores, serão exibidos zeros! Você pode me dizer o que está errado? O que estou fazendo de errado?

Obrigado!

Com relação ao ponto 1, obrigado por encontrar o erro. Ele será corrigido.

No item 2, havia uma pequena inconsistência com a MQL5, que foi corrigida. Ela deve aparecer na próxima compilação.