目录

MT4十字准线 - MQL4编写EA巧用时间条件避开非交易时段

MQL4编写EA巧用时间条件避开非交易时段
用EA做自动交易的朋友应该都遇到过这种尴尬情况:明明策略在行情活跃时表现不错,可一到周末或者凌晨流动性极差的时候,EA还在傻乎乎地开单。结果要么是点差突然拉大造成亏损,要么是遇到跳空直接爆仓。说实话,这种问题其实很好解决,关键就在于怎么在代码里加一个时间过滤器。MQL4里控制交易时段的方法其实挺灵活,而且实现起来并不复杂。

非交易时段对EA的危害到底有多大

很多新手在编写EA时容易忽视一个问题:市场并不是24小时都在正常运转的。就拿外汇来说,虽然表面上每周一到周五全天交易,但不同时间段的市场深度完全不一样。比如北京时间凌晨4点到6点,这正是纽约收盘和亚洲盘交接的时候,流动性会突然变得非常差。这时候如果EA还在按正常参数开单,点差可能从平时的2个点直接跳到8个点,一开仓就亏了6个点。

周末的风险就更大了。从周五晚上收盘到周日晚上开盘这段时间,所有品种都停止交易。如果EA没有判断周末的逻辑,在周五收盘前开的单子就要持仓整整两天。这期间如果出现重大新闻事件,周一开盘直接跳空几百点,止损根本来不及反应。我见过很多EA就是因为没处理好这个细节,导致账户在周末后直接归零。

还有一个容易被忽略的风险是节假日。像圣诞节、元旦这些全球性假期,很多交易所会提前收盘或者干脆休市。有些EA写的是每周五天交易,但遇到假期就失灵了。说实话,这些非交易时段的问题其实完全可以通过时间条件来规避,而且代码量非常少。

MQL4中时间函数的正确打开方式

MQL4里处理时间主要靠三个函数:TimeCurrent()、TimeDayOfWeek()和TimeHour()。TimeCurrent()获取的是服务器当前时间,这个很关键,因为EA是跑在服务器上的,所以用这个函数得到的时间跟交易商服务器的时间是一致的。有些朋友喜欢用LocalTime(),但不同电脑的时间设置不一样,很容易造成混乱,所以最好统一用TimeCurrent()。

TimeDayOfWeek()返回的是数字1到7,分别代表周一到周日。
这个函数在判断周末时特别好用。比如你想让EA只在周一到周五交易,只需要判断TimeDayOfWeek()是否大于5,如果大于5就说明是周末,直接跳过所有开仓逻辑。同样,TimeHour()返回的是0到23的数字,用来控制每天的交易时间段再合适不过了。

实际使用时要注意一个问题:TimeCurrent()返回的是交易商服务器时间,这个时间可能跟你本地时间不一样。比如有些交易商用的是GMT+2,而你在东八区,那就差了6个小时。所以写代码时一定要先确认服务器时间跟你的目标时间之间的时差。我一般会在EA里加一个时差调整参数,这样换交易商时直接改参数就行,不用重新编译代码。

用时间条件过滤非交易时段的具体写法

最简单的做法是在开仓函数前面加一个时间判断。比如你想让EA只在周一到周五的早上8点到晚上12点交易,可以这样写:if(TimeDayOfWeek()>=1 && TimeDayOfWeek()<=5 && TimeHour()>=8 && TimeHour()<24)。这个条件判断的意思是:如果是周一到周五,并且当前小时在8点到23点之间,就允许开仓。注意TimeHour()是0到23,所以TimeHour()<24其实就是到23点为止。

周末的判断更简单。你可以在EA的起始函数里加一个全局判断:if(TimeDayOfWeek()==6 || TimeDayOfWeek()==7) return; 这样当服务器时间是周六或周日时,整个EA都不会执行任何操作。这个方法的好处是省资源,因为连Tick事件都不会处理。不过要注意,有些交易商在周日下午就会开始报价,但这时流动性其实还是很差,所以建议把周日也排除掉。

节假日处理就比较灵活了。你可以定义一个数组,把一年中所有需要休市的日期都放进去。然后在每次开仓前遍历这个数组,看看当前日期是否在列表中。不过说实话,这个方法有点笨重,因为每年节假日都不同。更聪明的做法是结合TimeDayOfWeek()和TimeMonth()来判断。比如每年12月24日到26日,1月1日这些固定假日,可以写一个简单的日期范围判断。

时间控制在实际EA中的最佳实践

光有开仓时间控制还不够,平仓逻辑也要考虑时间因素。比如有些朋友喜欢在周五收盘前把所有仓位都平掉,避免周末持仓风险。这个逻辑可以这样写:if(TimeDayOfWeek()==5 && TimeHour()>=21) 强制平仓。这里的时间点要根据具体品种的收盘时间来定,外汇通常是在周五晚上22点收盘,但不同交易商可能有差异,最好在代码里留一个可调参数。

还有一种情况是挂单交易。比如你想在非交易时段挂一个突破单,等市场开盘后自动成交。这时候时间过滤要反过来:只在非交易时段挂单,交易时段反而不要挂单。其实这个逻辑也不难,就是把上面的条件取反,然后加上挂单代码就行。但要注意,挂单的有效期要设置成GoodTillCancel,不然周MT4恢复默认设置重置参数完整步骤末一过单子就自动失效了。

最后提醒一点:时间控制代码一定要放在EA主循环的最前面,也就是在开仓平仓逻辑之前执行。这样做的好处是效率高,一旦时间不符合条件,后面的所有代码都不需要执行。我见过有些人的代码把时间判断放在开仓函数里面,结果每次Tick都要跑一遍完整的逻辑,白白浪费CPU资源。说实话,EA的优化往往就是这些细节堆出来的,时间判断这种简单的操作,放在前面能省不少事。

文章目录