文章 "利用对象轻松制作复杂指标"

 

新文章 利用对象轻松制作复杂指标已发布:

本文提供了一种创建复杂指标的方法,同时还避免了在处置多个作图板、缓冲区、和/或组合来自多个来源的数据时出现的问题。

指标的最终结果如下所示:


作者:Manuel Alejandro Cercos Perez

 
我以为它指的是图形对象--我很惊讶,于是开始查看。结果发现是类对象)这有什么新奇的?
 
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);

看似不起眼,但在这种情况下使用三元运算符比调用函数更有效。这些小细节在剧烈波动时会产生很大影响 ...😁👍