首页 系统交易 帖子

在MT4中检测新K线的技巧与实现

附件
10370.zip (734 bytes, 下载 0次)

大家好,今天我们来聊聊一个很多交易者都关心的话题:

如何在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提供的清晰代码!

相关帖子

评论 (0)