mql5语言的特点、微妙之处以及技巧 - 页 178

 
Andrey Barinov:

在ExpertRemove不起作用的地方--也有ChartClose()。我不明白问题出在哪里。账户变更后会发生什么?它是否显示了专家顾问的额外图表?还是只改变当前的图表符号?也许,ChartID已经改变了,这就是为什么你之前的解决方案不起作用。 无论如何,Ticks已经被处理了,这意味着如果OnInit不起作用,我们需要将它们卸载到OnTick中。

比方说,回答了所有这些问题,然后呢?如果你想进入这个主题,不在你的机器上试一下是不行的。

到了这个工作方案。

#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 战斗顾问的要求。

 
fxsaber:

请在此展示当账户改变时自动卸载的EA的源代码。

源代码将在以后提供。先检查一下这是否是你的一项功能。

 
Alexey Viktorov:

源代码将在以后提供。首先检查一下,看看这些是否是对你的特殊功能。

它正在运行。不起作用。

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

显然,在日志中使用俄语词汇已经成为一种趋势。

 
fxsaber:

它已经启动并运行。这是不可行的。

显然,在日志中使用俄语词汇已经成为一种趋势。

这些并不是日志。我不是故意要冒犯你。我是为自己写的,当一些事情不成功的时候。然后我忘了删除它。

如果这不是你所期望的,那么请原谅我。你想在更换账户时将EA 从图表中删除,EA会这样做。它如何对你不起作用,我不想知道。
 
Alexey Viktorov:

这些都不是日志。我不是故意要冒犯你。这是我为自己写的,当一些事情没有成功的时候。然后我忘了删除它。

如果你找到了我建议之外的可行的解决方案,那将是很有趣的事情。

 
Alexey Viktorov:

你想在更换账户时将EA从图表中删除,EA会这样做。

不幸的是,它并没有。



一般来说,用REASON_ACCOUNT调用ExpertRemove 是一件完全没有意义的事情。

 
fxsaber:

不幸的是,它并没有。



一般来说,用REASON_ACCOUNT调用ExpertRemove 是一件绝对没有意义的事情。

如果你不是初学者,你应该知道,专家顾问只在图表上工作。没有图表,只有服务的工作。它是如何工作的呢?

 
Alexey Viktorov:

如果你不是初学者,你应该知道,该EA只在图表上工作。没有图表,只有服务的工作。它是如何工作的?

不幸的是,你在这件事上完全无能为力。这里提供的工作方案是工作的真正奥妙,了解它的实际运作。

 
fxsaber:

不幸的是,你在这件事上完全无能为力。这里提出的工作方案是工作的真正精妙之处,也是了解事情的实际运作方式。

嗯,是的,这里只有一个合格的人。

 

作为一种选择。

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