MT4 EA离线图表收盘价更新异常:定时脚本仅首次读取到Close值
问题原因
- MT4的离线图表默认不会自动刷新
Close[]、Open[]这类系统内置价格序列数组,仅在线实时图表会根据服务器推送的数据自动更新序列缓存 - 现有代码每次OnTimer触发时直接读取的
Close[0]是离线图表首次加载时的缓存值,没有主动刷新操作的话会一直返回旧数据,所以不会更新
修复方案
核心是在每次读取价格序列前,主动调用
RefreshRates()方法强制刷新当前图表的最新序列数据
修正后完整可运行代码如下:
int OnInit() { // 初始化时创建1秒定时器,创建失败直接返回错误 if(!EventSetTimer(1)) { Comment("定时器创建失败,请重新挂载脚本"); return INIT_FAILED; } return INIT_SUCCEEDED; } void OnTimer() { // 离线图表必须加这行,强制刷新当前图表的价格序列数据 RefreshRates(); int m=TimeSeconds(TimeLocal()); double CloseValue = Close[0]; string CloseValueString = DoubleToString(CloseValue,5); Comment( "当前收盘价 :",CloseValueString,"\n", "当前秒数 :",m ); } void OnDeinit(const int reason) { // 脚本卸载时销毁定时器,避免资源占用 EventKillTimer(); }
注意事项
- 如果你是通过第三方逻辑更新离线图表的K线数据,需要先确保K线更新逻辑正常运行,
RefreshRates()仅会读取当前图表已经加载的最新K线数据 - 修正后重新将脚本挂载到离线图表,即可实现每秒刷新收盘价的效果
内容的提问来源于stack exchange,提问作者YUSUF KIPROP
相关产品推荐
相关产品推荐

