Características del lenguaje mql5, sutilezas y técnicas - página 178

 
Andrey Barinov:

Cuando ExpertRemove no funciona, también existe ChartClose(). No entiendo cuál es el problema. ¿Qué ocurre después de cambiar la cuenta? ¿Muestra el gráfico adicional con el Asesor Experto? ¿O sólo cambia el símbolo del gráfico actual? Tal vez, el ChartID ha cambiado, y es por eso que su solución anterior no funciona. Los ticks se manejan de todos modos, significa que tenemos que descargarlos en OnTick, si OnInit no está funcionando.

Digamos que, respondidas todas estas preguntas, ¿entonces qué? Si quieres entrar en materia, no puedes hacerlo sin probarlo en tu máquina.

Llegué a esta solución que funciona.

#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    
  }  
}


ZZY Se requiere para un asesor de combate.

 
fxsaber:

Por favor, muestre aquí el código fuente del EA que se descarga cuando se cambia la cuenta.

El código fuente estará disponible más adelante. Comprueba primero si esta es una característica para ti.

 
Alexey Viktorov:

El código fuente estará disponible más adelante. Compruebe primero si se trata de características especiales para usted.

Está funcionando. No funciona.

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

Al parecer, ya es una tendencia utilizar palabras rusas en la bitácora.

 
fxsaber:

Ya está en marcha. No funciona.

Al parecer, ya es una tendencia el uso de palabras rusas en las bitácoras.

Estos no son registros. No quise ofenderte. Escribo esto para mí, cuando algo no funciona. Y luego me olvidé de borrarlo.

Si eso no es lo que esperabas, entonces discúlpame. Querías eliminar el EA del gráfico cuando cambiaste de cuenta, el EA lo hace. No quiero saber cómo no te funciona.
 
Alexey Viktorov:

Estos no son registros. No quise ofenderte. Este soy yo escribiendo para mí cuando algo no funciona. Y luego me olvidé de borrarlo.

Si encuentras una solución viable que no sea la que he sugerido, será interesante verla.

 
Alexey Viktorov:

Querías eliminar el EA del gráfico cuando cambiaste de cuenta, el EA lo hace.

Por desgracia, no es así.



En general, llamar a ExpertRemove con REASON_ACCOUNT no tiene ningún sentido.

 
fxsaber:

Por desgracia, no lo hace.



En general, llamar a ExpertRemove con REASON_ACCOUNT es una cosa absolutamente sin sentido.

Si no es un principiante, debe saber que el Asesor Experto sólo funciona con un gráfico. Sin un gráfico sólo funciona el servicio. ¿Cómo funciona?

 
Alexey Viktorov:

Si no es un principiante, debe saber que el EA sólo funciona con un gráfico. Sin un gráfico sólo funciona el servicio. ¿Cómo funciona?

Eres totalmente incompetente en este asunto, por desgracia. Las soluciones de trabajo que se ofrecen aquí son la verdadera sutileza del trabajo y la comprensión de cómo funciona realmente.

 
fxsaber:

Eres totalmente incompetente en este asunto, por desgracia. Las soluciones de trabajo sugeridas aquí son la verdadera sutileza de trabajar y entender cómo funcionan las cosas en realidad.

Bueno, sí. Aquí sólo hay una persona competente.

 

Como opción.

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);
}