偶然发现一个 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”和本文原始地址。