Erro de validação ao liberar o robô comercial para o mercado. - página 6

 
Andrey Kaunov:

Você acha que eu não verifico. O tamanho do lote é verificado em uma função separada

Os limites não são necessários aqui, porque Stop Loss e Take Profit são iguais a zero na abertura comercial.RefreshRates() atualiza os dados ao calcular o tamanho do lote. É claro que não há verificação de conexão, etc. antes de cada entrada, mas não é essa a questão. Se a OrderSend enviasse um pedido, haveria um erro específico: 130, 131, etc. Mas o que eu tenho é.

Não tentar enviar uma ordem de abertura de forma alguma. Mesmo no último teste, quando defino uma posição de verificação na função OnInit().


Isso é possível. Mas eu já verifiquei tudo duas vezes. Não sei para onde ir em seguida.

Na função de normalização do lote, você arredonda o lote para cima após verificá-lo no valor máximo/minuto.
 
Artyom Trishkin:
Na função de normalização do lote, você arredonda o lote para cima após verificá-lo no valor máximo/minuto.

Bem, sim, eu sei.

MathRound();
P.S. Eu acho que você tem que cavar a partir dos parâmetros de entrada, porque acontece que ele passa. Fazer uma verificação "infalível" em cada parâmetro.
 
Não estou falando dos registros de teste do validador. Mas pelo menos os parâmetros que NÃO são validados podem ser possíveis de serem enviados. Não há nada a se pegar para consertar o código. Entendo que a variabilidade da seleção dos parâmetros de teste pode ser infinita. Você pode definir uma variável do tipo int para +50000 ou -45000. Mas não posso simplesmente limitar alguns parâmetros de entrada a alguma faixa de valores. Será diferente para diferentes ferramentas.
 
Andrey Kaunov:
Não estou nem mesmo falando dos registros de teste do validador. Mas pelo menos os parâmetros que NÃO são validados podem ser possíveis de serem enviados. Não há nada para pegar para consertar o código. Entendo que a variabilidade na escolha dos parâmetros de teste pode ser infinita. Você pode definir uma variável do tipo int para +50000 ou -45000. Mas não posso simplesmente limitar alguns parâmetros de entrada a alguma faixa de valores porque será diferente para instrumentos diferentes.

É preciso ter certeza de que o lote comercial é válido em todos os casos. Não é à toa que apontei que você muda o lote em seu código após ter sido verificado para uma faixa de tamanho válida.

E é a verificação de parâmetros de entrada absolutamente estúpidos que deve ser feita.

 

Não há nenhum problema com o lote. É verificado para max/min. Antes de ser arredondado é dividido por etapas, então o inteiro arredondado é novamente multiplicado por etapas. Obtemos um lote perfeitamente correto.

//+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots(string symbol, double lot, bool is_margin=true) {
   if(lot<=0) return(0.0);
   RefreshRates();
   double min=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   double max=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   double step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); 
   double free = AccountFreeMargin()*0.95;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot=MathRound(_lot/step)*step;
   if(is_margin && _lot*margin>free)  _lot=0.0; //MathFloor(free/margin/step)*step;
   return(_lot);
}

_lot(0.568)/step(0.01)=56.8

Ronda Matemática(56,8)=57

57*passo(0.01)=0.57

Em seguida, ele verifica se há margem livre suficiente para abrir. O validador não pragueja nada. Não vê funções comerciais, aparentemente, por causa de parâmetros de entrada incorretos. O Expert Advisor simplesmente não faz negócios com uma certa combinação deles! Não é como se eu tivesse um martin sem condições, ou um engarrafador que se abre em cada candelabro. Como explicar ao validador que a EA logicamente não faz negócios com certos parâmetros?

 
Andrey Kaunov:

Não há nenhum problema com o lote. É verificado para max/min. Antes de ser arredondado é dividido por etapas, então o inteiro arredondado é novamente multiplicado por etapas. Obtemos um lote perfeitamente correto.

_lot(0.568)/step(0.01)=56.8

Ronda Matemática(56,8)=57

57*passo(0.01)=0.57

A seguir, é verificado se há margem livre suficiente para abrir. O validador não pragueja nada. Não vê funções comerciais, aparentemente, por causa de parâmetros de entrada incorretos. O Expert Advisor simplesmente não faz negócios com uma certa combinação deles! Não é como se eu tivesse um martin sem condições, ou um engarrafador que se abre em cada candelabro. Como posso explicar ao validador que a EA logicamente não faz negócios usando certos parâmetros?

Não explique, mas faça com que o EA corrija os parâmetros de entrada errados. De preferência com uma mensagem para o diário sobre seu valor inválido e a correção para o valor válido.

E, se por algum motivo você quiser tornar o usuário responsável pela inserção de parâmetros incorretos no mundo real, o usuário deve ser notificado sobre os parâmetros incorretos.
Mas para o testador, eles também precisam ser corrigidos - para que a EA comercialize.

 

Portanto, como podem ser ajustados se existem alguns parâmetros para EURUSD e outros para Ouro, por exemplo. Neste momento as configurações padrão são mais ou menos toleráveis para os pares principais, mas para o Ouro eles não funcionarão em absoluto. Lá não haverá negócios. É por isso que os parâmetros existem (como eu entendo), para adaptá-los a cada instrumento. Se tudo fosse tão fácil, eu teria incorporado todos os parâmetros no Expert Advisor e não teria enviado nada para o exterior.

Outro erro do validador é que ele não vê outros períodos de tempo de forma alguma. Eu o contornei, mas em detrimento do algoritmo em certa medida. O Assessor de Peritos obtém dados de outros prazos, desde semanais, D1, H4, etc. até M1. Mas os dados são nulos, como eu descobri através de inúmeras experiências. Não há nada que possamos fazer a respeito disso, só podemos trabalhar em torno dele. Por que temos que modificar o Expert Advisor em detrimento do algoritmo? Não é o contrário? O validador deve ser adaptado aos testes. Caso contrário, testar um EA em perfeito funcionamento está se tornando uma espécie de trabalho duro!

 
Andrey Kaunov:
Portanto, como podem ser ajustados se existem alguns parâmetros para EURUSD e outros para Ouro, por exemplo. Neste momento as configurações padrão são mais ou menos toleráveis para os pares principais, mas para o Ouro eles não funcionarão em absoluto. Lá não haverá negócios. É por isso que os parâmetros existem (como eu entendo), para adaptá-los a cada instrumento. Se tudo fosse assim tão simples, eu teria incorporado todos os parâmetros no Expert Advisor e não teria enviado nada para o exterior.
Você colocou uma divisão por 0 mesmo antes da OrderSend - e houve um tal erro. Assim, ela chega à OrderSend, mas não abre. Ou seja, lotes/margem/limites/preço, algo deles não está contabilizado.
 
Maxim Kuznetsov:
Você já colocou divisão por 0 pouco antes da OrderSend - e houve tal erro. Assim, ele chega a OrderSend, mas não abre. Portanto, lotes/margem/limites/preço, alguns deles não são contabilizados

Maxim, se alguma destas coisas não for contabilizada, o validador dará um erro muito definido : 130, 131, 134, 145 etc. Esse não é o caso aqui!

P.S. Acredite, eu enviei mais de cem validações em 4 dias, e tentei muitas opções.

 

Sim, atinge a divisão por 0 (daí OrderSend) imediatamente. E isso gera um erro.

Mas se eu enviar para verificar o Expert Advisor sem divisão por 0 no código, ele, de alguma forma, define magicamente parâmetros que não abrem negócios durante o período especificado e retorna um erro. Esta é a minha versão do que está acontecendo, mas aparentemente não está longe da verdade.