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

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

Acredito que TesterStop() eExpertRemove() devem retornar verdadeiros se não puderem passar imediatamente o controle para OnTester(). Ela permitirá reagir de alguma forma, por exemplo, como esta:

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

Neste caso, podemos obter exatamente o resultado que é logicamente esperado, em vez de dançar ao redor e prever todos os erros que teoricamente podem ocorrer como resultado da interrupção do teste.

E esta é a opção que você queria ver.

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);
 
Roman:

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

E como podemos evitar/cancelar a rescisão forçada se ela já está em funcionamento? Seus exemplos são um pouco diferentes.
 
Alexey Viktorov:
E como evitar/cancelar a rescisão forçada se ela já está em funcionamento? Seus exemplos são um pouco diferentes.

Não acione uma rescisão forçada. Então, não há necessidade de cancelá-lo.

Provavelmente, forçando a conclusão que já está em execução, cancelá-la não faz sentido por causa de possíveis falhas de software.
Por este motivo, é provável que não exista tal possibilidade. Não posso dizer com certeza.
Isto significa que devemos logicamente organizar nosso código de tal forma que não precisemos voltar ao código em execução novamente após forçar a rescisão.
Se desistirmos, desistimos explicitamente.

 
Roman:

É improvável que uma rescisão forçada que já tenha sido acionada faria sentido cancelar devido a possíveis falhas de software.
Portanto, provavelmente não existe tal opção. Não posso dizer com certeza.
Isto significa que devemos logicamente organizar nosso código de tal forma que não precisemos voltar ao código em execução novamente após forçar a rescisão.
Se desistirmos, desistimos explicitamente.

De alguma forma, tenho a impressão de que você não leu tudo no tópico. Algo não coincide exatamente com sua opinião sobre o problema em questão.

ps; Embora não. Em seu primeiro post deste tópico, você pareceu citar minhas palavras exatas, mas não completamente. Talvez por causa disso, toda a idéia do problema tenha mudado.
 
Sejam quais forem as perguntas, são essas as respostas. Fale com você mesmo, então. Você tenta entrar no problema e as pessoas ainda não gostam dele. Boa sorte para encontrar o problema.
 
Alexey Viktorov:

E esta é a versão que você queria ver.

É isso mesmo.

Mas não é

if(недопустимый параметр)          tester_stop = TesterStop();

mais simples e mais claro do que...

if(недопустимый параметр)
       {
        TesterStop();
        tester_stop = true;
        return;
       }

?

Mas agora eu fiz exatamente como você aconselhou.

 
Roman:
Tais perguntas e tais respostas. Vocês podem discutir isso com vocês mesmos. Você tenta se meter em um problema e as pessoas ainda não gostam dele. Boa sorte para encontrar o problema.

Você não deve se ofender. Era preciso ler a frase inteira para entendê-la.

Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste

Arquivo da versão MT.

Alexey Viktorov, 2019.06.16 15:25

Sergey, não há nada de inesperado. Pelo contrário, tudo é lógico e consistente. Há casos diferentes. Às vezes você tem que concluir o processamento do evento antes que o Expert Advisor termine seu trabalho, às vezes, como no seu caso, você tem que terminá-lo urgentemente. 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. Mas você omitiu isso do meu exemplo por alguma razão.

e você só tirou a segunda parte do contexto sem prestar atenção à primeira parte.
 
Сергей Таболин:

Isso mesmo.

Mas não é

mais simples e mais claro do que...

?

Mas agora eu fiz exatamente como você aconselhou.

Pode ser mais simples e claro, mas exigir dos desenvolvedores algo que possa ser facilmente escrito por você mesmo está errado. Por alguma razão, não acredito que qualquer adição ao idioma seja escrita sobre C++ e exigida. E as observações, tenho certeza, são suficientes para muitos.

 
Alexey Viktorov:

Pode ser mais simples e claro, mas é errado exigir dos desenvolvedores algo que possa ser facilmente escrito por eles mesmos. Por alguma razão, não acredito que qualquer adição ao idioma seja escrita sobre C++ e exigida. E as observações, tenho certeza, são suficientes para muitos.

Aqui está uma verificação da sua opção. Acabou com uma mensagem como esta:

2019.06.16 18:49:25.464 Core 1  TesterStop() called on 0% of testing interval

É um beco sem saída...

 
Alexey Viktorov:

Você não deve se ofender. Era preciso ter a frase completa para entendê-la.

e você só tirou a segunda parte do contexto sem prestar atenção à primeira parte.

Ao dar-lhe um exemplo com IsStopped(), eu estava tentando responder à primeira parte.
Às vezes é necessário concluir o processamento do evento antes de concluir uma EA, às vezes é urgente como no seu caso.
Leia a descrição desta função IsStopped() na documentação, talvez ela leve a algumas idéias.
Mas parece que é de outra direção. Se for o caso, desculpe por um possível palpite.
Mas como dizem em possíveis sugestões, e resolve o problema.
A solução definitiva não dirá a ninguém, porque ninguém conhece toda a lógica de seu código, e provavelmente não se aprofundará nela.