目录

正版MT4下载 - MT4时间过滤条件用TimeHour函数精准控制交易时段

MT4时间过滤条件用TimeHour函数精准控制交易时段
做自动化交易的朋友应该都有过这种经历,明明策略逻辑没问题,可回测结果就是不如人意。后来仔细排查才发现,问题出在交易时段上。比如你写了个突破策略,结果它在凌晨三点突然开仓,那时候点差大、流动性差,成交质量自然好不了。其实解决这个问题很简单,用MQL4自带的TimeHour函数就能给EA加上时间过滤条件,把交易限制在活跃时段内。

TimeHour函数的基本用法与返回规则

TimeHour函数的用法非常直白,它接受一个datetime类型的参数,返回该时间点的小时数值,范围是0到23。比如TimeHour(TimeCurrent())就会返回当前服务器时间的小时数,服务器时间是几点它就返回几。这个函数返回的是整数,所以你可以直接用比较运算符去判断。

实际操作中,你不需要把参数写死成TimeCurrent()。如果你的策略是基于K线收盘价判断的,那应该用TimeHour(Time[i]),其中i代表你正在判断的那根K线的索引。比如i等于1就是上一根K线,i等于0就是当前正在形成的这根K线。这个细节很重要,因为用错索引会导致信号延迟或者提前。

还有一个容易忽略的点,TimeHour返回的小时数完全取决于你MT4服务器设定的时区。如果你的经纪商服务器是GMT+2,那返回的就是GMT+2时间的小时数。所以编写过滤条件之前,最好先搞清楚自己服务器时区和你本地时间的对应关系,否则可能出现你以为过滤了夜间时段,实际上却过滤掉了白天黄金时段的尴尬情况。

编写固定时段过滤条件的具体代码示例

假设你想让EA只在上午9点到下午5点之间开仓,代码写起来其实没几行。
先获取当前小时数,然后判断它是否落在允许的范围内。如果不在范围内就直接return,阻止后续开仓逻辑执行。下面这个例子很典型,你可以直接套用到自己的EA里。

int currentHour = TimeHour(TimeCurrent()); if(currentHour < 9 || currentHour > 17) return; 这两行代码就完成了最基本的过滤。
注意这里的边界值,9和17都是包含在内的,也就是说9点整和17点整都允许交易。如果你希望17点整不开仓,那判断条件就要改成currentHour >= 17。

如果你需要过滤多个不连续的时段,比如只做亚盘和欧盘开盘时段,那就要用逻辑或运算符来组合条件。判断条件可以写成if((currentHour >= 3 && currentHour <= 5) || (currentHour >= 9 && currentHour <= 11)),这样就能精确锁定两个交易窗口。这种写法虽然长了点,但逻辑清晰,以后修改也方便。

用TimeHour实现动态交易时段切换

有些策略比较讲究,需要根据不同的交易时段采用不同的参数。比如亚盘波动小,止损可以设窄一点;欧盘和美盘波动大,止损要放宽。这种需求用TimeHour也能轻松实现。先判断当前小时数落在哪个时段范围内,然后给对应的变量赋值不同的参数。

举个例子,你可以定义三个时段:亚洲时段从凌晨1点到上午9点,欧洲时段从上午9点到下午4点,美洲时段从下午4点到晚上11点。然后用if-else语句判断当前小时数落在哪个区间,再分别设置止损点数和止盈点数。这样EA就能自动适应不同时段的市场特性,不用你手动切换参数。

动态时段切换还有一个好处,就是可以配合不同的开仓条件。比如亚洲时段只做区间震荡策略,欧洲时段才启动突破策略。你可以在开仓逻辑之前先做时段判断,然后根据判断结果调用不同的信号计算函数。这样写出来的EA结构会更清晰,维护起来也更容易。

时间过滤条件与K线开盘时间的配合技巧

很多新手容易忽略一个问题,就是TimeHour(Time[i])和TimeHour(TimeCurrent())在回测中的差异。回测时TimeCurrent()返回的是当前测试K线的时间,而不是你电脑的实时时间。所以如果你用TimeCurrent()做过滤条件,在回测里其实效果等同于用Time[i]判断最后一根K线。但实盘时就不一样了,TimeCurrent()返回的是服务器当前时间。

更稳妥的写法是用Time[i]来做判断,尤其是当你在一根K线内多次运行EA代码时。比如使用tick模式回测,同一根K线内可能会有多次报价触发。如果每次触发都判断TimeCurrent(),结果都一样,但如果你判断的是Time[i]并配合K线序号,就能确保同一根K线内只做一次判断。

还有一种情况需要特别注意,就是当你的EA使用挂单交易时,时间过滤条件不能只放在开仓函数前面,还要检查挂单的触发时间。比如你设置了一个buy stop挂单,价格到了但时间不在允许范围内,这时候下单函数会执行,但因为时间过滤条件已经return了,挂单就不会被创建。这个逻辑要理清楚,否则可能出现价格到了却不挂单的情况。

另外提醒一下,如果你用HistoryOrderSelect函数检查历史订单,想统计某个时段内的交易胜率,也可以用TimeHour配合订单开仓时间来做筛选。这样你就能直观看到哪个时段的策略表现最好,然后针对性地调整过滤条件。这种数据驱动的优化方式,比拍脑袋改参数靠谱得多。

文章目录