大家好,今天我们来聊聊一个很多交易者都关心的话题:
如何在MT4中检测新K线的生成。
其实这个过程非常简单,特别是当你想要在当前时间框架内检测新K线时,方法如下:
void start(){ static datetime tmp; if (tmp != Time[0]) { tmp = Time[0]; // 在这里执行你的代码 } }
不过,如果你想要检测其他时间框架的K线生成事件,虽然并不复杂,但存在一些限制。
MT4并不支持onBar事件,但你可以将时间存入数组,并在每次tick时检查这些时间。如果达到了合适的时间,就执行新K线事件。
这意味着如果你在M5时间框架下进行回测,你可以捕捉到M6、M7,甚至是D1的事件。
为什么只能检测上升趋势呢?这就要问一个问题:如何通过MetaTrader生成tick数据?
直到D1时间框架,情况会更复杂,因为一周的开始时间(例如:周日20:45,具体取决于经纪商)和月初的时间可能会在一周的中间开始等等。
我觉得这些信息并不太相关,所以没有详细发布。
关于这个问题,有一个讨论帖,但我认为很多人并没有阅读那些文章和论坛,所以我决定把这个代码分享出来。
一些说明:
在初始化函数中,你需要填充时间数组,设置开始时间:
curIndex = utils.periodToPeriodIndex(Period()); times[curIndex] = Time[0]; for(int i=curIndex+1; i<MAX; i++) times[i] = times[curIndex] - MathMod(times[curIndex], utils.periodIndexToPeriod(i) * 60);
在start函数中,你需要检查是否经过了足够的时间,然后执行事件:
if (times[curIndex] != Time[0]) { times[curIndex] = Time[0]; onBar(Period()); for(int i=curIndex+1; i<MAX; i++) { int period = utils.periodIndexToPeriod(i), seconds = period * 60, time0 = times[curIndex] - MathMod(times[curIndex], seconds); if (times[i] != time0) { times[i] = time0; onBar(period); } } }
在这里,你可以编写自己的代码:
void onTick() {
}
以及
void onBar(int period) { }
就这样,大家加油!
更新 1.1: 感谢WHRoeder提供的清晰代码!