文章 "在 EA 交易代码中实现指标的计算"

 

新文章 在 EA 交易代码中实现指标的计算已发布:

把指标代码移动到 EA 交易中可能有多种原因,怎样评估这种方法的优缺点呢?本文描述了在 EA 交易中实现指标代码,还进行了几个实验来评估 EA 交易运行的速度。

下面是我们为了把指标计算迁移到 EA 交易中所需要做的事。

  1. 准备指标缓冲区的操作,为此,创建 CArrayBuffer 类,带有用于数据存储和方便访问的方法。随后,根据指标中缓冲区的数量来创建这样的类的数组。
  2. 把来自 OnCalculate 函数中指标的计算部分迁移到我们类的 Calculate 函数中。
  3. 指标可以从 OnCalculate 函数参数中访问时间序列 (和 EA 的函数不同),所以,我们要在 LoadHistory 函数中处理所需时间序列的下载。
  4. 为了统一访问重新计算的指标数据,让我们在 CIndicator 类中使用所有必须的参数来创建 CopyBuffer 函数。 

所有的工作都可以可视化地总结如下。

作者:Dmitriy Gizlyk

 

谢谢,做得好。

bool CIndicator::LoadHistory(void)
  {
   datetime cur_date=(datetime)SeriesInfoInteger(m_Symbol,m_Timeframe,SERIES_LASTBAR_DATE);
   if(m_last_load>=cur_date && ArraySize(m_source_data)>=m_history_len)
      return true;

从这段代码可以看出,刻度线不会重新计算。只有在出现新的条形图 时才会重新计算。还是我没有理解清楚?

 
fxsaber:

谢谢,干得好。

从这段代码可以看出,刻度线不会重新计算。只有在出现新的条形图 时才会重新计算。还是我没有很好地理解执行过程?

是的,文章直接指出计算是在收盘烛台上进行的。要计算每个刻度线,我们需要从代码中删除打开新条形图的检查,并从 "0 "条形图复制历史记录,而不是像现在这样从 "1 "条形图复制历史记录。
 
Dmitriy Gizlyk:
是的,文章直接指出计算是基于收盘烛台的。要按每个刻度线进行计算,就必须从代码中删除新的开仓检查,并从 "0 "刻度线复制历史记录,而不是像现在这样从 "1 "刻度线复制历史记录。

可惜他们没有在 tick 模式下进行比较。

另外,在这种模式下,为了使 "指标 "正常工作,我们不能不执行 CopyTicks。

 
fxsaber:

可惜他们没有用 potic 进行比较。

另外,在这种模式下,要使 "指标 "正常工作,就不能不执行 CopyTicks。

我不知道我们说的是哪个指标。但指标通常是按条形图价格工作的,并重新绘制最后一个条形图。在这种情况下,可以不加载 CopyTicks,而是使用相同的历史数据加载 方式。不过,在这种情况下,您需要在类中添加最后值的重新计算。

 
Dmitriy Gizlyk:

我不知道我们说的是哪个指标。不过,指标通常是根据柱状图价格工作的,并重新绘制最后一个柱状图。在这种情况下,您可以不加载 CopyTicks,而是使用相同的历史数据加载 方式。不过,在这种情况下,您需要在类中添加最后值的重新计算。

Expert Advisor 内置的指标会跳过刻度。为防止这种情况发生,我们需要 CopyTicks 来获取相邻调用 OnTick、OnTimer 等之间的刻度。

否则,会严重丢失信息

交易订单(每分钟数次)的实战型 EA,在标准操作模式下 100 ms ping 会损失 ~5% 的刻度。

 
fxsaber:

EA 内置的指标会跳过刻度。为了防止这种情况发生,我们需要 CopyTicks 来获取相邻调用 OnTick、OnTimer 等之间的刻度。

否则会严重丢失信息

是的,丢失刻度线信息的风险很大。但问题的关键在于这些信息对策略的价值。毕竟,通常的指标(如文章中介绍的指标)计算的是柱状图,而不是刻度线。最后,只使用最终的蜡烛图数据,中间的刻度只是被 "覆盖"。另一个问题是,您是否在您的指标中保存并使用刻度线信息,即不是按柱状图,而是按刻度线构建指标。

 

您好!感谢您的文章。

您写道:"在指标代码的开头,声明了用于与其他程序交换数据的数组缓冲区。这些数组是时间序列,其元素与价格条相连。终端直接支持这种连接。指标将计算结果保存在这些数组中,当出现新的蜡烛线时,指标不会改变数组的大小,也不会传输数据。Expert Advisor 中没有此类数组,这意味着在将指标代码传输到 Expert Advisor 时,必须创建此类数组。除了计算部分本身,还需要组织数组元素 与图表上的条形图之间的连接"。

遗憾的是,在测试示例中,数组元素与图表上条形图之间的连接组织 并不清楚,也不可见,其他一切都很清楚。究竟如何在图表上安排和显示必要的点(或符号)?我想弄清楚这一点。再次感谢

 
我一直在找这样的东西。非常感谢。优秀文章。
 
IuriiPrugov:

您好,感谢您的文章。

您写道:"在指标代码的开头,声明了用于与其他程序交换数据的数组缓冲区。这些数组是时间序列,其元素与价格条相连。终端直接支持这种连接。指标将计算结果保存在这些数组中,当出现新的蜡烛线时,指标不会改变数组的大小,也不会传输数据。Expert Advisor 中没有此类数组,这意味着在将指标代码传输到 Expert Advisor 时,必须创建此类数组。除了计算部分本身,还需要组织数组元素 与图表上的条形图之间的连接

遗憾的是,在测试示例中,数组元素与图表上条形图之间的连接组织 并不清楚,也不可见,其他一切都很清楚。究竟如何在图表上安排和显示必要的点(或符号)?我想弄清楚这一点。再次感谢您

日安,尤里。
首先,我对延迟回复表示歉意。在 MQL 中,当访问时间序列时,习惯上认为当前条的索引为 "0",而历史数据则随着索引的增加而增加。您可以在链接的文档 中阅读更多相关信息。在访问指标的计算数据时,也采用了类似的方法。也就是说,在访问最后一根封闭蜡烛的数据时,您可以指定指数为 "1"。

 

你好,首先祝贺你的文章。

我有一个简单的问题。

在一篇文章中,使用了一个只有一个缓冲区的指标。如何处理具有多个缓冲区的指标?我们需要为每个指标创建一个CArrayBuffer 类吗?

您有任何示例吗?

谢谢。