初学者的问题 MQL5 MT5 MetaTrader 5 - 页 714

 
dimnik:

随着OnTradeTransaction的使用,优化的时间发生了奇怪的变化。15M上的一个系统,非常简单,每年的历史,一次运行发生在0.3-0.4秒。

优化开始后,前200-300次的运行速度不到一秒,接下来的运行速度减慢到15-20秒(50次!)。

没有出现处理器过热或跑偏的情况,一半以上的内存是免费的(从16GB开始)。

在使用OnTradeTransaction处理程序之前,没有这样的情况--即使是小时间段上更复杂的专家顾问系统也以大约相同的速度进行优化。

HistoryDealSelect对速度的影响有这么大吗?我们如何才能消除滞后性?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if( trans.type != TRADE_TRANSACTION_DEAL_ADD) return;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long     deal_type         =0;
   double   deal_volume       =0;
   long     deal_magic        =0;
   if(HistoryDealSelect(trans.deal))
     {
      deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
      deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
      deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
     }
   else
      return;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }


给我看看所有的代码。
 

你好!

谁知道--如何在指标中显示零条右侧的条形,最大有多少条?(价格预测要做)

 
dimnik:

是HistoryDealSelect严重影响了速度吗?如何才能消除减速现象?

开发者建议通过历史缓存,尽量减少调用历史函数(昂贵)。

我在kodobase(MT4Orders)发布了一个工作方案,但它可能不适合你。

使用缓存后,我没有看到任何滞后。

虽然,你的OnTradeTransaction 不应该变慢,即使它不是以最佳方式写入的。

 
Renat Akhtyamov:

你好!

谁知道--如何在指标中显示零条右侧的条形,最大有多少条?(价格预测要做)

将PeriodSeconds()添加到最后一个条形图的开盘时间,并在那里用图形对象画一个蜡烛。最大的金额将显示在右边。但我还没有检查过,如果有一个出口,它将如何显示。也许,它本身就应该被考虑在内。
 
Alexey Viktorov:
将PeriodSeconds()添加到最后一个条形图的开盘时间,并在那里用图形对象画一个蜡烛。最多只能在右边看到。但我还没有检查过,如果有一个出口,它将如何显示。也许人们应该考虑到。
谢谢,我知道了!
 
Alexey Viktorov:
将PeriodSeconds()添加到最后一个条形图的开盘时间,并在那里绘制蜡烛图。最多,你会在右边看到它。但我还没有检查它的外观。也许,有必要考虑到这一点。

在图表上,它画出了一个延续,但不幸的是在指标窗口中没有。

当然,也许我错了...

你怎么看--我可以将指标线在零条之后继续向右延伸吗?

 
谁知道--是否有可能将指标线在零条之后继续向右延伸?
 
Renat Akhtyamov:
谁知道呢--指标线能不能延伸到右边的零条之外?
你可以。可以设置移位,但很可能无法通过不存在的数值来计算,而且指标不使用时间。这就是为什么我在谈论使用图形元素进行条形显示的问题。ObjectCreate() 同时包含了窗口号(子窗口)和时间。在创建图形元素时不应该有任何问题。
 
Alexey Viktorov:
你可以。你可以转移它,但计算可能不会使用不存在的值,而且时间不会用于指示器显示。这就是为什么我在谈论使用图形元素进行条形显示的问题。ObjectCreate()同时包含了窗口号(子窗口)和时间。因此,在创建图形元素时应该不会有问题。

在图表窗口中,使用时间戳,你可以参考未来的预定条。它已经成功了。

然而,我不能在指标窗口中做同样的事情。也就是说,我不能在指标缓冲区中写入索引为-1、-2等的数值。

问题是这样的。

这在原则上是很清楚的。解决办法是通过图形对象创建一个指标。

 
Renat Akhtyamov:

在图表窗口中,使用时间戳,你可以参考未来的预定条。它已经成功了。

然而,我不能在指标窗口中做同样的事情。也就是说,我不能在指标缓冲区中写入索引为-1、-2等的数值。

问题是这样的。

原则上说,这很清楚。解决办法是通过图形对象创建指标。

在它的正常值上计算第二个缓冲区,例如(如果我们想计算10条显示 "未来"),然后在Buff[9] -- Buff[8] -- Buff[n] -- Buff[0]的值上计算这个缓冲区,然后用非零偏移显示这个缓冲区。将缓冲区的偏移量设置为未来所需的条数--本例中为10