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

后来我仔细排查才发现,问题出在交易时间上——凌晨三点的行情波动跟下午三点的完全不是一个量级,可策略却一视同仁地开仓。MT4自带的MQL4语言里有个TimeHour函数,专门用来提取K线的小时值,配合条件判断就能精准控制交易时段。今天我就把这个函数的用法掰开揉碎了讲清楚,让你也能写出带时间过滤的智能交易系统。
TimeHour函数的基本语法与返回规则
TimeHour函数在MQL4里的调用方式特别简单,就一行代码:TimeHour(datetime time),它接收一个datetime类型的参数,返回0到23之间的整数。这个返回值就是该时间点对应的小时数,比如TimeHour(D'2024.01.15 14:30')返回14。有些新手容易搞混,以为这个函数能直接获取当前时间的小时,其实它只是个转换工具,你得先有具体的时间值才能用。
实际编程中我们最常用的场景是配合当前K线开盘时间,也就是Time[0]这个内置数组。如果你写TimeHour(Time[0]),拿到的就是当前正在形成的这根K线的小时值。对于H1周期来说,TimeHour(Time[0])等于14就意味着现在处于14点到15点这个小时段内。这里有个细节需要注意,TiMT4交易品种规格查看路径与关键信息解读_从导航器窗口快速定位EA运行痕迹me[0]是当前K线的开盘时间,而不是实时时间,所以哪怕现在是14点59分,只要这根小时K线还没走完,TimeHour(Time[0])依然是14。
如果你用的是M15或者M5这种小周期,TimeHour(Time[0])返回的就是该K线开盘时刻的小时值。比如M15周期上午10点30分开盘的那根K线,TimeHour(Time[0])就等于10。这种特性在编写时间过滤条件时特别有用,因为我们可以直接拿这个返回值跟预设的交易时段做比较,不用自己去拼装时间字符串。
另外提一句,TimeHour函数返回的是服务器时间的小时数,而不是你本机电脑的时间。如果你的VPS或者服务器时区跟MT4平台不一致,判断结果可能会跟你预期有偏差,这个在编写策略时一定要先确认清楚。
用TimeHour实现日内交易时段限制
假设你想让EA只在伦敦盘和纽约盘重叠时段,也就是北京时间下午3点到晚上11点之间开仓,其他时间一律不动作。这时候代码逻辑就很直观了:先获取当前K线的小时值,然后判断是否落在允许的范围内。伪代码大致是这样:int currentHour = TimeHour(Time[0]); if(currentHour >= 15 && currentHour < 23) { 允许开仓 } else { 禁止开仓 }。
有朋友可能会问,为什么用currentHour < 23而不是<= 22?因为TimeHour返回的是整点小时数,如果你写<= 22,那22点整到22点59分之间的K线也会被算进去,但23点整的K线就被排除了。我个人的习惯是写区间下闭上开,这样逻辑更严谨。你还可以把允许交易的开始小时和结束小时定义成外部输入参数,这样不同品种、不同市场环境下可以灵活调整,不用每次都改代码重新编译。
这里有个容易踩的坑,就是跨天交易时段的问题。假如你想让EA在晚上11点到次日凌晨1点之间交易,如果直接写currentHour >= 23 && currentHour <= 1,这个表达式永远不成立,因为一个变量不可能同时大于等于23又小于等于1。正确做法是拆成两个区间判断,或者用逻辑或连接:if(currentHour >= 23 || currentHour < 1)。这种看似简单的小细节,真能在实盘中坑掉不少人。
还有一点值得注意,时间过滤条件最好放在开仓函数调用之前,而且要放在其他所有入场信号判断之前。因为时间过滤是最基础的筛选,如果当前时段不允许交易,后面的技术指标判断根本不需要执行,这样能节省不少CPU资源。特别是跑EA的VPS配置不高时,这种优化能让回测速度明显提升。
结合周期与特殊时段的进阶过滤技巧
有时候光限制小时还不够,你可能还希望区分周内交易日。比如不想让EA在周五晚上开仓,因为隔周末跳空风险太大。这时候可以配合DayOfWeek函数一起使用,DayOfWeek(Time[0])返回0到6的整数,0代表周日,5代表周五。把小时判断和星期判断组合起来,就能实现更精细的过滤规则。举个例子,你可以在周五只允许上午交易,下午和晚上全部禁止开仓。
另一种常见需求是避开新闻发布时段。虽然MQL4里没有内置的新闻日历函数,但你可以提前把重大新闻时间点写进代码里,用TimeHour判断当前小时是否落在新闻时段前后30分钟内。比如某个数据在14点公布,你就判断TimeHour(Time[0])是否等于13或者14,如果是就跳过开仓。这种方法虽然笨一点,但胜在稳定可靠,不用依赖外部API接口。
我还见过有人用TimeHour做非对称过滤,比如做多单时限制在上午交易,做空单时限制在下午交易。这种思路其实挺有意思,因为某些品种的日内走势确实存在明显的时段特征,比如镑系货币对在伦敦盘和纽约盘的表现就完全不同。通过分别设置多单和空单的交易时段,能让策略更贴合品种的波动规律。
最后提醒一下,过滤条件写多了之后,建议在EA里加上日志输出功能,用Print函数把每次被过滤掉的开仓信号记录下来。
这样你在优化参数时能直观看到是哪个条件把交易挡在了门外,是时间不对还是星期不对,一目了然。别小看这个习惯,它能帮你省下大量复盘排查的时间。
实战案例与参数优化的注意事项
我拿自己跑过的黄金EA举个例子。最开始没加时间过滤,回测下来年化收益看着挺高,但仔细一看交易记录,凌晨1点到4点之间开了将近四成的单子,而这些单子的胜率只有可怜的三成。后来我加上TimeHour过滤,只允许北京时间早上8点到晚上24点之间开仓,其他时段一律关闭。改完之后整体胜率从48%提升到了57%,最大回撤也缩小了将近三分之一。
在优化时间参数时,建议先用历史数据做参数扫描,把开始小时和结束小时分别从0到23遍历一遍,看看哪组参数的表现最稳定。这里说的稳定不是指收益最高,而是指不同年份的回测结果差异不大。我见过有人把时间参数调到某个特定小时段后,某一年收益暴增,但换到另一年就大幅亏损,这种参数就是典型的过拟合,实盘根本不敢用。
还需要留意的是,不同交易品种的活跃时段差别很大。黄金和白银的活跃时段在欧美盘重叠期,而日元系货币对在亚洲盘和欧洲盘初期波动较大。所以别指望一套时间参数通吃所有品种,最好每个品种单独优化。我自己的习惯是跑完参数扫描后,把收益曲线和交易次数都导出来,看看哪个时段组合的交易频率适中、资金曲线最平滑。
写EA时别忘了考虑夏令时和冬令时的问题。MT4服务器时间在每年3月和10月会切换夏令时,如果你的交易时段参数是写死的,切换之后可能整体偏移一小时。解决办法是把开始小时和结束小时做成外部输入参数,每次换季时手动调整一下,或者干脆用代码判断当前是夏令时还是冬令时,自动切换两套参数。虽然麻烦点,但总比半夜爬起来改参数强。