ChartGetDouble() 等图表操作函数在 MT4 平台中的 Bug

偶然发现一个 MT4 平台的 Bug,我在编写我的 MT4 自定义指标 Bary Scale 的时候,在 OnInit() 函数中使用了ChartGetDouble() 函数初始化 MT4 指标,由于这两个函数的调用限定在某些特殊条件里,所以一直没有发现问题。

后来我新写的其他指标在 OnInit() 函数中无条件调用了 ChartGetDouble() 和 ChartGetInteger() 进行初始化,发现问题如下:

图表操作函数在 MT4 平台中的 Bug

1. 当在图表中插入自定义指标时,指标初始化没有任何问题。

2. 当切换图表周期、重新编译指标、修改参数等时间触发指标重新初始化的时候,ChartGetDouble() 和 ChartGetInteger() 函数没有任何问题。

3. 问题来了,当关闭 MT4 平台,再重新打开 MT4 平台的时候,OnInit() 中的 ChartGetDouble() 和 ChartGetInteger() 可以正常调用,但无法取得正确的图表属性值。

比如:

// MT4 平台自定义指标初始化函数
int OnInit(){
  printf((string)ChartGetDouble(0, CHART_PRICE_MAX, 0));
}

当关闭 MT4 再重新打开的时候,会输出“0”。其他情况都可以正确输出当前图表的价格刻度最大值。

MQL4 和 MQL5 官方文档的解释

之后我去查了 MQL5 的文档(MT4 平台升级兼容 MQL5 语法后没有更新官方在线的 MQL4 文档中文版),图表操作函数给出的解释是:“这些是工作图表函数。只在 EA 交易和脚本中允许操作所有图表。”

再去看英文文档,明显多了好多解释,不过大意就是图表操作类函数如果调用成功,会将操作命令加入列队等待执行,不能保证立刻执行,跟我要的解释没什么关系。

在 MT4 平台自定义指标中调用 OnStart() 函数

既然图表操作函数是为 EA 和脚本准备的,我尝试了在自定义指标中添加 OnStart() 函数:

// 在 MT4 平台自定义指标中添加脚本启动函数
int OnStart(){
  printf((string)ChartGetDouble(0, CHART_PRICE_MAX, 0));
}

结果也不理想,似乎 OnStart() 函数会在初始化的时候反复调用若干遍,多次输出价格最大值。

不太清楚为何图表操作函数“只在 EA 交易和脚本中允许操作所有图表”。总之这个 Bug 目前存在于 MT4 build 840 中。MT5 平台还没有测试。如有读者知道解决办法或详细原因,请留言,十分感谢。


自定义指标编程、ChartGetDouble()、MT4 平台、OnInit()、MT4 软件 Bug。

版权声明:本站所有原创文章,作者保留版权。转载必须包含本声明,不得修改任何内容(包括文章标题),并以超链接的形式注明作者“Bary”和本文原始地址。

发表评论

电子邮件地址不会被公开。 必填项已用*标注