Arquivo da versão MT. - página 2

 
Сергей Таболин:

A suposição inteligente é que a transferência deve ser feita imediatamente, sem executar o resto do código. Certo?

Mas na verdade o TesterStop() não pára o teste de forma alguma!

Espera-se que, se for necessário interromper a execução do código, basta escrever de volta e não haverá mais execução. TesterStop(), bem como ExpertRemove()

O Expert Advisor não vai parar imediatamente quando ExpertRemove() for chamado, apenas uma bandeira é hasteada para parar o trabalho do Expert Advisor. Ou seja, o Consultor Especialista não tratará de nenhum evento seguinte, chamará OnDeinit() e o descarregará do gráfico.

E a segunda falha observada é que

tester_stop = false;

não está de modo algum no lugar.

 
Alexey Viktorov:

É suposto ser inteligente, se você precisar parar mais a execução do código, basta escrever de volta e não haverá mais execução. TesterStop() bem como ExpertRemove()

E o segundo erro que notamos é que

não está de modo algum no lugar.

O próximo evento é OnTick() ?

Para onde a OnTick() sai?

Por que está fora de lugar? Era esperado que se o TesterStop() fosse acionado, a execução não chegaria a esta linha.

 
Сергей Таболин:

O próximo evento é OnTick() ?

De onde a OnTick() tira a saída?

Por que isso não está em vigor? Era esperado que se o TesterStop() fosse acionado, a execução não chegaria a esta linha.

Onde sair e o que continuar é com o desenvolvedor.

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;

A bandeira tester_stop neste código será falsa, independentemente de TesterStop() ser ou não executada

 
Alexey Viktorov:

Aonde ir e o que continuar depende do desenvolvedor.

Neste código, a bandeira tester_stop_stop levará a falso independentemente de TesterStop() ser ou não executado

Eu já tenho isso))))

A questão é: o que fazer? Como interromper o teste? Para ser específico. Os desenvolvedores quase juram quando usamINIT_PARAMETERS_INCORRECT no OnInit() e isso elimina a genética.

Encontrei uma saída e não tive problemas até recentemente. E agora ... Oh, querido ))))

E ainda assim, onde posso sair da OnTick()?

 
Сергей Таболин:

Eu já entendi isso))))

A questão é: o que fazer? Como faço para parar o teste? Para ser específico. Os desenvolvedores quase juram quando usamINIT_PARAMETERS_INCORRECT no OnInit() e isso elimina a genética.

Encontrei uma saída, mas não tivemos problemas recentemente. E agora ... Oh, querido ))))

Bem, se você entender qual é o problema?

         TesterStop();
      tester_stop = false;
      return;

Todo código, após a execução do TesterStop, não será executado. Ou seja, deixará de funcionar imediatamente. Indo mais longe, podemos ajustar a bandeira tester_stop...

Outra pergunta: Qual é este número? Menos nove é uma tentativa de obter alguma dor adicional? É aí que a coisa fica realmente feia...

 
Alexey Viktorov:

Bem, se você entender qual é o problema que resta?

Todo código, após a execução do TesterStop, não será executado. Em outras palavras, ele parará imediatamente de funcionar. A partir daí, podemos regular usando a bandeira tester_stop...

Outra pergunta: Qual é este número? Menos nove é uma tentativa de obter alguma dor adicional? É aí que a coisa fica realmente feia...

Menos nove é para determinar que a saída foi exatamente por TesterStop(). Uso-o apenas como um substituto paraINIT_PARAMETERS_INCORRECT. É por isso que não preciso de tudo mais depois disso. Mas o que acontece agora é que o código inteiro é executado e o programador recebe a divisão por erro zero. Claro, se um array tiver tamanho 1, o valor do último menos o valor do primeiro será sempre zero! E eu mesmo não tinha feito seguro contra este vírus, ou, oh, com licença, mal-entendido.

Eu tentei inserir retorno... Apenas um pouco errado )))) :

      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
         return;
      }

Acabei por ficar com:

DM      0       15:32:01.518    Core 1  2016.10.01 00:00:00   153128312914612747
PE      0       15:32:01.518    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
IF      0       15:32:01.518    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
RS      3       15:32:01.518    Core 1  TesterStop() called on 0% of testing interval
GK      0       15:32:01.518    Core 1  final balance 10000.00 USD
JM      0       15:32:01.518    Core 1  OnTester result -99999999999.99001

Simplesmente fantástico ))))

Muito OBRIGADO!!!

 
Сергей Таболин:

Menos nove é para determinar que a saída foi exatamente por TesterStop(). Uso-o apenas como um substituto paraINIT_PARAMETERS_INCORRECT. É por isso que não preciso de tudo mais depois disso. Mas o que acontece agora é que o código inteiro é executado e o programador recebe a divisão por erro zero. Claro, se uma matriz tiver tamanho 1, o valor da segunda menos o valor da primeira será sempre zero! E eu mesmo não tinha feito seguro contra este vírus, ou, oh, com licença, mal-entendido.

Eu tentei inserir retorno... Apenas um pouco errado )))) :

Acabei por ficar com:

Simplesmente fantástico ))))

UM IMENSO OBRIGADO!!!

Sergei Tabolin:

Obrigado, eu já entendi isso. Mas isso não resolve o problema. Pode ser resolvido tanto pela constanteMQL_TESTER_STOP, como pela mudança do valor de retorno de vazio para bool.

Uma solução inesperada foi sugerida porAlexey Viktorov: se o retorno for usado após o TesterStop(), tudo parece estar bem. Como e por que isso acontece, eu pessoalmente não consigo descobrir. No entanto...

Portanto, ou acrescente este ponto à documentação ou mude ovazio para bool.

P.S. Eu encontrei este problema na construção 2085. Antes disso, não havia nenhum problema. Isso me diz alguma coisa? )))

Sergey, não há nada de inesperado nisto. Pelo contrário, é lógico e consistente. Há casos diferentes. Às vezes você tem que terminar de processar o evento antes que o Expert Advisor esteja terminado, e às vezes, como no seu caso, você tem que terminá-lo imediatamente. Os desenvolvedores são confrontados com a pergunta, qual é a coisa certa a fazer, parar imediatamente, causando descontentamento daqueles que precisam terminar de processar o evento, ou parar após a conclusão do processamento do evento. Qualquer programador tem um operador de retorno em seu arsenal, enquanto não há nada em caso de rescisão forçada.

E por que você precisa mudar o tipo de vazio no bool, porque novamente, no arsenal do programador há variáveis estáticas que podem ser alteradas antes ou depois do TesterStop (), e em princípio, tudo será como você quiser. E você o deixou de fora do meu exemplo por alguma razão.

 
Alexey Viktorov:

Sergey, não há nada de inesperado nisso. Pelo contrário, tudo é lógico e consistente. Há casos diferentes. Às vezes você tem que terminar de processar o evento antes que o Expert Advisor esteja terminado, e às vezes, como no seu caso, você tem que terminá-lo imediatamente. Os desenvolvedores são confrontados com a pergunta, qual é a coisa certa a fazer, parar imediatamente, causando descontentamento daqueles que precisam terminar de processar o evento, ou parar após a conclusão do processamento do evento. Qualquer programador tem um operador de retorno em seu arsenal, enquanto não há nada em caso de rescisão forçada.

E por que você precisa mudar o tipo de vazio no bool, porque novamente, no arsenal do programador existem variáveis estáticas que podem ser alteradas antes ou depois do TesterStop (), e em princípio, tudo será como você quiser. E você o deixou de fora do meu exemplo por alguma razão.

Alexey, muito obrigado por sua ajuda.

Entendo o problema que os desenvolvedores enfrentam e é por isso que estou sugerindo tal solução. A fim de poder reagir corretamente à situação.

Quanto às variáveis estáticas e seu exemplo, que eu "joguei fora"... Desculpe, mas não entendo bem do que estamos falando. Explique-me isso, se não se importa.

E pedir alguma indulgência e paciência. Tenho uma situação de vida muito ruim que pode me deixar muito irritável (estou ciente disso, mas não posso fazer nada a respeito) e desatento.

Eu simplesmente não estou entendendo nada. Minha cabeça está girando...

Aqui está um exemplo:

Meu código mostra que se o valor da última matriz menos o valor da primeira matriz for zero inicial, o resultado deve ser -999999999999999.88.

Mas durante a otimização eu obtenho este resultado:

2019.06.16 16:27:09.847 Core 1  final balance 9587.10 USD
2019.06.16 16:27:09.847 Core 1  OnTester result -99999999999.88

9587 - 10000 não é de forma alguma igual a zero e o resultado é -99999999999999999.88. Como?!?!? Já estou a ficar pendurado...

 
Сергей Таболин:

Alexey, muito obrigado por sua ajuda.

Entendo o problema que os desenvolvedores enfrentam e é por isso que estou sugerindo tal solução. Ser capaz de reagir corretamente à situação.

Quanto às variáveis estáticas e seu exemplo, que eu "joguei fora"... Desculpe, mas não entendo bem do que estamos falando. Explique-me isso, se não se importa.

E pedir alguma indulgência e paciência. Tenho uma situação de vida muito ruim que pode me deixar muito irritável (estou ciente disso, mas não posso fazer nada a respeito) e desatento.

Eu simplesmente não estou entendendo nada. Minha cabeça está girando...

Aqui está um exemplo:

Meu código mostra que se o último valor da matriz menos o primeiro valor da matriz for zero inicial, o resultado deve ser -999999999999999.88.

Mas durante a otimização eu obtenho este resultado:

9587 - 10000 não é de forma alguma igual a zero e o resultado é -99999999999999999.88. Como?!?!? Estou a ficar pendurado...

Não sei se é bom ou ruim, mas nunca entro no código inteiro, por isso estava falando de uma variável estática. E a julgar pelo fato de que a bandeira tester_stop é usada em diferentes partes do programa, esta bandeira deve ser declarada no nível das variáveis globais.

Confirma que você "jogou fora" injustificadamente mudando o valor da bandeira a partir do meu exemplo.

Este é o uso de

   if(tester_stop) return(-99999999999.99);

E aparentemente esta bandeira ou não muda em nada, ou não muda porque a mudança não é fornecida onde deveria estar.

 
Alexey Viktorov:
s vezes é necessário encerrar o processamento de eventos antes que o assessor termine.

Qualquer programador tem o operador de retorno em seu arsenal, enquanto não há nada na rescisão forçada.


Neste contexto, não podemos fazer uma verificação?

if(IsStopped())
if(!IsStopped())