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

 
Andrey Khatimlianskii:

用错误的参数集调用该指标

是的,该指标有相当多的参数,有什么办法可以确保iCustom能填满内存?填充内存大约需要2个小时,所以测试一个空的iCustom并一次添加一个参数将需要很长的时间。有什么建议吗?
P.S. 我也会直观地浏览所有的参数。

 
Nauris Zukas:

是的,该指标有相当多的参数,但有什么办法能确保iCustom能准确地填满内存?

日志中会有大量的指标创建。
 
TheXpert:
日志中会有很多的指标

是的,我知道你的意思,我在策略测试器中 也看到过这种情况,当测试后出现了很多指标。但在这里的策略测试器中一切正常。而且一切都在日志中正确显示。

 
Nauris Zukas:

是的,该指标有相当多的参数,有什么办法能确保iCustom能填满内存?填充内存大约需要2个小时,所以测试一个空的iCustom并一次添加一个参数将需要很长的时间。有什么建议吗?
P.S. 我也会直观地浏览所有的参数。

不带参数的调用(那么他们将采取默认的方式),并观察。如果泄漏消失了,那么这就是问题所在。

 
Nauris Zukas:

EA吃掉的是一点一点积累起来的内存。

多少是 "一点"?

也许它真的是一个位,而这是推出后出现的报价历史?

 
Andrey Khatimlianskii:

"一点一点地"--有多少?

也许真的只是一点点,而且是自始至终出现的引用历史?

我用几个EA启动MT4,启用内存记录。在箭头显示的地方出现了崩溃,"EX4文件的内存不足"。


 
Andrey Khatimlianskii:

不带参数的调用(那么他们将采取默认的方式),并观察。如果泄漏消失了,那么这就是问题所在。

好吧,我就这样做吧。

 
Nauris Zukas:

我用几个EA启动MT4,启用内存记录。在箭头显示的地方出现了崩溃,"EX4文件的内存不足"。

正在使用多少的40%?

它是线性增长的,看起来像一个弯曲的指标电话,是的。

 
Andrey Khatimlianskii:

40%的使用量是多少?

线性增长,看起来像一个曲线指标的调用,是的。

似乎是参数的问题。谢谢你!

 

在MT4上这种情况是可能的(我们不谈原因)。

  • 有一个职位是开放的。余额等于N。
  • 从某一时刻起,这些位置就消失了。公平和平衡等于N。在交易的历史中,没有关于该位置的信息。
  • 终端重设没有帮助。
  • 几个小时后,这些头寸出现在交易历史中(它们在某一条件下关闭)。余额和权益得到相应的调整。

这是一种非常罕见的情况,是由许多情况汇合在一起造成的。但它可以发生,尽管概率约为零。

我建议所有的战斗机器人必须有一个机制来识别这种情况。

为此,有必要记住未结订单的票据,并在其消失的情况下检查其在交易历史中的存在。如果他们不在交易历史中,Alertim!


这种保护的功能。

#define  TICKET_TYPE int

// Получаем все текущие тикеты.
int GetTickets( TICKET_TYPE &Tickets[] )
{
  int Amount = ArraySize(Tickets);
    
  for (int i = ArrayResize(Tickets, Amount + OrdersTotal()) - Amount - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      Tickets[Amount++] = OrderTicket();
          
  return(ArrayResize(Tickets, Amount));
}

// Проверяет наличие потерянных тикетов.
int CheckTickets( void )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  int Amount = 0;
  
  if (!IsTester)
  {
    static TICKET_TYPE Tickets[];
    TICKET_TYPE BadTickets[];
    
    for (int i = ArrayResize(BadTickets, ArraySize(Tickets)) - 1; i >= 0; i--)
      if (!OrderSelect(Tickets[i], SELECT_BY_TICKET))
      {
        BadTickets[Amount++] = Tickets[i];
        
        Alert("Ticket " + (string)Tickets[i] + " is not found!");
      }
        
    ArrayResize(BadTickets, Amount);    
  
  #ifdef __MQL5__
    ArraySwap(Tickets, BadTickets);
  #else // __MQL5__
    ArrayFree(Tickets);
    
    ArrayCopy(Tickets, BadTickets);  
  #endif // __MQL5__
      
    GetTickets(Tickets);
  }
      
  return(Amount);
}
在OnTick的开头调用CheckTickets()。
原因: