MT4多开 - MQL4编写EA用时间控制避开非交易时段_用时间条件过滤非交易时段的具体写法

时间条件控制交易时段,说白了就是给EA装上“作息表”。你不可能让EA在周五晚上还拼命交易,因为周末休市前市场波动往往很诡异。同样,周一早上开盘瞬间的跳空行情,也不是所有策略都能适应的。MQL4里提供了丰富的时间函数,比如TimeCurrent()、TimeDayOfWeek()、TimeHour(),这些都能帮我们精准限制EA的活跃时间。
其实很多网上流传的EA源码,时间控制部分写得特别粗糙。有些干脆只用个简单的if语句判断小时数,结果周末还照样开单。我见过一个朋友跑EA,忘了加时间过滤,结果周六凌晨系统还在不断尝试下单,最后账户被风控冻结了。所以这块真的不能马虎,得用多重条件组合起来,把各种边界情况都堵死。
理解MetaTrader 4的时间机制
要写好时间控制,首先得搞懂MT4的时间是怎么跑的。MT4的服务器时间默认是GMT+2或者GMT+3,具体看经纪商设置。这个时间跟你的本地时间可能差好几个小时,所以直接用本地时间判断会出问题。我一般习惯用TimeCurrent()获取服务器当前时间,这样写出来的EA换到其他电脑上也能正常跑。
TimeCurrent()返回的是一个datetime类型的数据,包含年月日时分秒。你可以用TimeYear()、TimeMonth()、TimeDay()这些函数拆出具体数值。但更常用的是TimeDayOfWeek()和TimeHour(),前者返回周几(周日是0,周一是1,以此类推),后者返回当前小时数(0到23)。这两个函数组合起来,基本能覆盖大部分交易时段需求。
举个例子,如果你只想让EA在周一至周五的8点到20点工作,代码可以写成:if(TimeDayOfWeek() >= 1 && TimeDayOfWeek() <= 5 && TimeHour() >= 8 && TimeHour() < 20)。注意这里用小于20而不是小于等于19,是为了避免整点边界问题。我曾经犯过用等号的错误,结果EA在20点整还开了一单,后来排查半天才发现是边界条件没处理好。
还有一个容易忽略的点:节假日。有些经纪商在圣诞节、元旦这些日子会休市,但TimeDayOfWeek()返回的依然是周一至周五。我通常的做法是维护一个节假日列表,在EA初始化时加载进来,然后每天检查当前日期是否在列表中。虽然麻烦点,但能避免假期里EA瞎折腾。
在MT4终端手动录入订单
数据准备妥当之后,就可以开始正式的录入操作了。打开MT4平台,切换到你要录入订单的账户,确保底部交易终端窗口是打开状态。如果你看不到交易终端,按Ctrl+T就能调出来。在交易终端的空白区域右键点击,选择“新订单”,这时候会弹出一个订单窗口。
在这个窗口里,你需要依次填写交易品种、手数、订单类型、开仓价格、止损止盈价格等信息。注意,MT4的订单窗口默认是让你开新仓的,但我们要录的是已经完成的订单,所以开仓价格和平仓价格都要手动填进去。这里有个小技巧:开仓价格填好后,先别急着点确定,先把止损止盈也填上,然后选择“立即执行”模式,这样就能生成一个完整的持仓记录。
平仓的操作稍微麻烦一点。持仓记录生成后,你需要再手动平掉这笔订单。在交易终端里找到刚刚创建的持仓,右键点击选择“平仓”,然后在弹出的窗口里填入平仓价格和平仓时间。MT4的平仓窗口默认显示的是当前市场价格,你要手动改成实际的平仓价。平仓完成后,这笔订单就会出现在历史记录里,整个录入流程才算结束。
我刚开始用这个方法的时候,觉得特别繁琐,每笔订单都要重复开仓和平仓两个步骤。但用习惯了之后发现,其实也就几十秒的事情。而且这样录进去的订单数据非常完整,MT4包括开仓时间、平仓时间、盈亏金额、手续费等所有信息都会自动计算出来,比用Excel手动记录方便多了。
用时间条件过滤非交易时段的具体写法
最简单的做法是在开仓函数前面加一个时间判断。比如你想让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日这些固定假日,可以写一个简单的日期范围判断。
批量保存与恢复多个模板的技巧
如果你像我一样,针对不同交易品种或者不同时间周期都有独立的界面设置,那一个一个保存模板就太慢了。其实你可以一次性把当前所有打开的图表都保存成模板,方法是在“文件”菜单里选择“保存为模板”时,勾选“保存所有图表”的选项。这样生成的模板文件会包含所有窗口的独立设置,加载时也会同时恢复所有图表。
另外,MT4还支持通过配置文件来批量管理模板。你可以在“文件”菜单下找到“导出”功能,选择导出整个界面设置,包括指标、模板、工作区甚至自定义指标。导出的文件是压缩包格式,解压后可以看到里面包含了所有.tpl和.wks文件。这个方法特别适合在重装系统前做全盘备份,或者分享给其他交易者使用。
恢复的时候就更简单了。你只需要把导出的压缩包解压到MT4的数据文件夹里,覆盖原来的文件即可。不过我建议你在覆盖之前,先把原来的文件夹重命名备份一下,万一新模板有问题还能退回去。我曾经因为覆盖错了文件夹,导致所有设置都丢了,后来学乖了,每次操作前都会先备份。
还有一个实用技巧,就是利用MT4的“配置文件”功能。在MT4底部状态栏,你会看到“自动交易”按钮旁边有一个配置文件下拉菜单。你可以创建多个配置文件,每个配置文件对应一套完整的界面布局和指标组合。
切换配置文件时,整个MT4界面都会瞬间变成你预设的样子,比手动加载模板快多了。保存配置文件的方法是在“文件”菜单里选择“保存为配置文件”,然后给它起个名字。以后切换时,只需要在底部下拉菜单里选择对应的配置文件就行。