Características da linguagem mql5, subtilezas e técnicas - página 178

 
Andrey Barinov:

Onde o ExpertRemove não funciona - há também ChartClose(). Não compreendo qual é o problema. O que acontece depois de a conta ser alterada? Mostra o gráfico adicional com o Consultor Especialista? Ou é apenas o símbolo do gráfico actual que muda? Talvez, o ChartID tenha mudado, e é por isso que a sua solução anterior não funciona. Os bilhetes são manuseados de qualquer forma, significa que precisamos de os descarregar no OnTick, se o OnInit não estiver a funcionar.

Digamos, respondemos a todas estas perguntas, e depois? Se quiser entrar no assunto, não o pode fazer sem o experimentar na sua máquina.

Chegámos a esta solução de trabalho.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

// Выгружает себя, если после смены счета отсутствует символ.
void OnDeinit( const int Reason )
{
  if (Reason == REASON_ACCOUNT)
  {
    MqlTick Tick;
    
    if (!SymbolInfoInteger(_Symbol, SYMBOL_CUSTOM) && !SymbolInfoTick(_Symbol, Tick))
    {
      Alert("Account is changed!");
      
      if (EXPERT::Remove())
        Alert("Expert is removed!");
      
      // ExpertRemove(); // Не поможет.
      // ChartClose();   // Не лучшее решение.
    }
//  else
      // Для кастомных и других случаев дополнить код следущим решением.
      // https://www.mql5.com/ru/forum/170952/page175#comment_16365819    
  }  
}


SZY Requerido para um conselheiro de combate.

 
fxsaber:

Mostrar aqui o código fonte da EA que se descarrega a si própria quando a conta é alterada.

O código fonte estará disponível mais tarde. Verifique primeiro se esta é uma característica para si.

 
Alexey Viktorov:

O código fonte estará disponível mais tarde. Verifique primeiro se estas são características especiais para si.

Está a funcionar. Não funciona.

2020.05.21 10:49:58.028 00 (EURUSD,M1)  Идиот
2020.05.21 10:49:58.028 00 (EURUSD,M1)  ExpertRemove() function called

Aparentemente, já é uma tendência a utilização de palavras russas no diário de bordo.

 
fxsaber:

Está em funcionamento. Não está a funcionar.

Aparentemente, já é uma tendência a utilização de palavras russas nos registos.

Estes não são registos. Não queria ofendê-lo. Escrevo isto por mim mesmo, quando algo não funciona. E depois esqueci-me de o apagar.

Se não era isso que estava à espera, então por favor desculpe-me. Pretendia-se retirar a EA do gráfico quando se mudava de conta, a EA faz isso. Como não funciona para si, não quero saber.
 
Alexey Viktorov:

Estes não são registos. Não queria ofendê-lo. Isto sou eu a escrever por mim próprio quando algo não funciona. E depois esqueci-me de o apagar.

Se encontrar uma solução exequível que não seja a que sugeri, será interessante ver.

 
Alexey Viktorov:

Queria retirar a EA do gráfico quando mudou de contas, a EA faz isto.

Infelizmente, não o faz.



Em geral, chamar ExpertRemove com REASON_ACCOUNT é uma coisa completamente desprovida de sentido.

 
fxsaber:

Infelizmente, não o faz.



Em geral, chamar ExpertRemove com REASON_ACCOUNT é uma coisa absolutamente inútil.

Se não for um principiante, deve saber que o Expert Advisor apenas trabalha com um gráfico. Sem um gráfico apenas o serviço funciona. Como é que funciona ???

 
Alexey Viktorov:

Se não for um principiante, deve saber que a EA só funciona com um gráfico. Sem um gráfico apenas o serviço funciona. Como é que funciona?

Infelizmente, é totalmente incompetente nesta matéria. As soluções de trabalho aqui oferecidas são a verdadeira subtileza de trabalhar e compreender como funciona realmente.

 
fxsaber:

Infelizmente, é totalmente incompetente nesta matéria. As soluções de trabalho aqui sugeridas são a verdadeira subtileza do trabalho e a compreensão de como as coisas funcionam realmente.

Bem, sim. Só há aqui uma pessoa competente.

 

Como opção.

int OnInit(void)
{
     string name_global = "exp_account";
     if( GlobalVariableCheck(name_global) )
     {
          if( AccountInfoInteger(ACCOUNT_LOGIN) !=  GlobalVariableGet(name_global) )
               if( GlobalVariableDel(name_global) )
                    ExpertRemove();
     }
     else
          GlobalVariableSet( name_global, AccountInfoInteger(ACCOUNT_LOGIN) );

     return(INIT_SUCCEEDED);
}