Dmitriy Skub 类对象)有什么新意呢?
文章中只是介绍了一种很好的实现方法,并无新意,只是不失为一种解决问题的好办法。
您的文章写得非常好 😁 ...但正如您所提到的,性能问题涉及到一个小问题。大多数情况下,它不会影响任何事情,你可以毫无问题地接受它。但在波动较大时,由于 OnCalculate 可能会收到大量调用,系统可能会崩溃或变得非常慢。但问题不在于函数,而在于函数内部的交互。因为每次调用时,MetaTrader 都会被迫读取指标的缓冲区,如果数量很大,就会出现问题。解决这个问题的方法之一是调用 OnTime,这样可以稍微减轻负担,因为调用不是在每次计算事件中执行,而是在预定义的时间段内执行。如果是手动或半自动操作,这不是问题,因为每次计算可以在 200 毫秒内完成。但在指标中使用 OnTime 事件就不太合适了,因为它们可能会影响计算线程,尤其是在市场波动很大的时候。一种方法是在 OnCalculate 本身中强制计算,这样就不需要调用 CopyBuffer。另一个可以减少几个机器周期的方法是修改OnCalculate 函数 中的以下一行:
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit = MathMax(0, prev_calculated-1);
这一行:
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit = (prev_calculated <= 0 ? 0 : prev_calculated - 1);
看似不起眼,但在这种情况下使用三元运算符比调用函数更有效。这些小细节在剧烈波动时会产生很大影响 ...😁👍
新文章 利用对象轻松制作复杂指标已发布:
本文提供了一种创建复杂指标的方法,同时还避免了在处置多个作图板、缓冲区、和/或组合来自多个来源的数据时出现的问题。
指标的最终结果如下所示:
作者:Manuel Alejandro Cercos Perez