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

 
Igor Makanu:

是不同的

有所谓的控制和管理任务

EA - 管理,服务 - 控制

控制不应该是多余的--如果你消耗了系统的所有资源,你会得到一个不稳定的系统而不是控制。

那么,节省的是什么呢?该服务将做同样的订单列举,同样的比较。

如果这个想法是让一个服务通过向多个顾问发送 "事情有变 "的信号来 "服务 "他们,那么这个解决方案是值得怀疑的。
首先,等待来自外部的决策所需的关键数据是愚蠢的。其次,如果有节省的话,也只是在一个终端上有许多专家顾问的情况下。

这更像是一个理论上的技巧,在实践中,我们在EA中的订单查询没有问题。

 
MT5中的某种故障抓住了这种情况。
ACCOUNT_TRADE_EXPERT = true
ACCOUNT_TRADE_ALLOWED = false
TERMINAL_TRADE_ALLOWED = true
请记住,这种禁令可能是终端(bug)的结果,而不是经纪人的结果。
 
fxsaber:
某种MT5的故障抓住了这种情况。 请记住,这个禁令可能是终端(bug)的结果,而不是经纪人。

这和Robo的情况不一样,前2分钟的交易被关闭,报价就走了?

只是我不记得是每天都禁止交易,还是只在周一禁止这2分钟的交易。

 
Alexey Viktorov:

这和Robo的情况不一样,前2分钟交易被关闭,报价就会?

只是我不记得是每天还是只在周一这2分钟不允许交易。

不,这是在一天中。MT5故障,经纪人不参与。

 
Alexey Viktorov:

只是我不记得是每天都禁止交易,还是只在周一的那两分钟禁止。

只有在开市时
 
MessageBox 不显示日志中的所有信息。在阅读日志时,有时会出现一些问题。解决办法如下。
// Терминал при MessageBox не выводит в лог имя MQL-программы, текст заголовка окна, флаги и результат нажатия.
int MessageBox2( const string Text, const string Caption = NULL, const int Flags = 0 )
{
  const int Res = MessageBox(Text, Caption, Flags);
  
#define  TOSTRING(A) " " + #A + " = " + (string)(A)
  Print("MessageBox:" + TOSTRING(Caption) + TOSTRING(Flags) + TOSTRING(Res));
#undef  TOSTRING
  
  return(Res);
}

#define MessageBox MessageBox2
 

关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

fxsaber, 2020.04.30 08:49

MT5的一些小故障抓住了这种情况。
ACCOUNT_TRADE_EXPERT = true
ACCOUNT_TRADE_ALLOWED = false
TERMINAL_TRADE_ALLOWED = true
请记住,这种禁令可能是终端(bug)的结果,而不是经纪人的结果。

我又得到了它。我认为这可能发生在重新登录的罕见情况下。

解决方法 - 如果是假的,在短暂停顿后再试。

bool IsTradeAllowed( const int Attempts = 0 )
{        
  // https://www.mql5.com/ru/forum/170952/page174#comment_16363677
  bool Res = false;
  int Count = 0;
  
  // https://www.mql5.com/ru/forum/170952/page174#comment_16363677
  while (!(Res = ::MQLInfoInteger(MQL_TRADE_ALLOWED) &&
                 ::AccountInfoInteger(ACCOUNT_TRADE_EXPERT) &&
                 ::AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) &&
                 ::TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) &&
         (Count++ < Attempts) && !::IsStopped())
    ::Sleep(100);
    
  return(Res);
}
 
当你想在赋值时抓住一个变量的变化。
if (Value != (Value = NewValue()))
  Print("Value is changed.");
 
fxsaber:
当你需要捕捉一个变量在赋值中的变化时。

你这里有UB,你不能用它。

 
Vict:

你这里有UB,你不能用它。

它是有效的,但你可以建议一个适当的宏。