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
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.
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.
- www.mql5.com
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.
E mais uma coisa: esse erro aparece, não importa o que aconteça:
'--' - l-value required 1234.mq5 31 57
- www.mql5.com
Boa tarde!
- 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.
- 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!
Boa tarde!
- 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.
- 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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.
Autor: MetaQuotes Software Corp.