MT4多开 - MT4智能交易系统时间过滤条件编写详解_第三方通知服务提供更多灵活选项

在MT4平台上编写智能交易系统时,时间过滤条件是一个经常被交易者忽略却又相当实用的功能。说实话,很多人刚开始写EA的时候,总想着怎么让交易信号更精准,却忽略了交易时间这个最基本的因素。就拿我自己的经历来说,以前写过一个趋势跟踪EA,回测数据漂亮得不行,结果实盘跑了一个月就亏得一塌糊涂。后来仔细分析才发现,问题出在交易时间上——这个EA在欧美盘开盘前和收盘后的表现完全不一样。其实,通过MQL4语言中的TimeHour函数,我们就能轻松控制EA只在特定时间段内执行交易,这种做法简单有效,能让你的EA运行更加稳定可靠。
TimeHour函数的基本用法与参数说明
TimeHour函数是MQL4中用来获取当前服务器时间小时数的内置函数,它的返回值范围是从0到23的整数。这个函数不需要传入任何参数,直接调用TimeHour()就能返回当前的小时数。比如在下午3点15分的时候调用这个函数,返回的结果就是15。这里有个小细节需要注意,TimeHour获取的是服务器时间,不是你的本地电脑时间。如果你的交易商服务器时间跟你的北京时间有差异,比如有些平台用的是GMT+2或者GMT+3,那你写条件的时候就要做相应调整。
实际编写代码的时候,TimeHour函数通常跟条件判断语句配合使用。最常见的写法就是if(TimeHour() >= 9 && TimeHour() < 17)这样的形式,表示只在上午9点到下午5点之间执行交易。这里用大于等于和小于的组合,是为了避免边界值重复判断。比如你想让EA在8点到20点之间工作,那就写成TimeHour() >= 8 && TimeHour() < 20。这种写法覆盖了从8点整到19点59分59秒的时间段,逻辑上非常清晰。我刚开始学的时候,经常搞混边界条件的写法,后来养成了习惯,每次写完都手动模拟一下边界值,确保逻辑正确。
除了单独使用,TimeHour还可以跟其他时间函数配合实现更精细的控制。比如你想让EA在每天下午3点半之后停止交易,光用TimeHour就不够了,因为半小时这个粒度需要用到TimeMinute函数。这时候可以把两个函数结合起来,写成if(TimeHour() < 15 || (TimeHour() == 15 && TimeMinute() < 30))。这种组合写法虽然看起来复杂一点,但能实现非常精确的时间控制。其实大多数情况下,只需要小时级别的过滤就够了,太精细的控制反而容易让EA变得过于复杂,不利于维护和调试。
在实际使用中,TimeHour函数返回的是整数类型,这意味着你不能直接用浮点数比较。有些新手会犯这样的错误,把TimeHour()跟9.5这种小数比较,结果永远都不会成立。另外,这个函数每次调用都会重新获取当前时间,所以在循环或者频繁触发的代码段里频繁调用不会有什么问题。
但是如果你需要在一个函数里多次用到同一个时间值,最好先把TimeHour()赋值给一个整型变量,这样代码更清晰,执行效率也稍微高一点。我个人习惯在OnTick函数的开头就声明一个int hour = TimeHour(),后面直接用这个变量。
第三方通知服务提供更多灵活选项
如果你觉得邮件转短信的方式不够稳定,或者想要更丰富的提醒内容,比如带上图表截图或者更详细的交易信息,那就可以考虑用第三方通知服务了。市面上比较流行的有Pushbullet、Telegram Bot、还有IFTTT这些。我自己用得比较多的是Telegram Bot,因为它免费、稳定,而且延迟非常低,基本上MT4发出提醒,手机那边瞬间就能收到推送。Telegram本身是一个即时通讯软件,你可以创建一个机器人,然后让MT4通过HTTP请求把消息发给这个机器人,机器人再转发给你。
具体操作起来其实也不难。首先你得在Telegram里搜索“BotFather”,这是官方用来创建机器人的工具。按照它的提示,创建一个新的机器人,它会给你一个API Token,这个Token就是你的机器人身份凭证,一定要保存好。然后,找到你创建的这个机器人,给它发一条消息,比如“/start”,接着访问一个特定的网址,格式是“https://api.telegram.org/bot你的Token/getUpdates”,就能拿到你的Chat ID。有了这两个东西,你就能在MT4里通过MQL4代码或者第三方插件来发送提醒了。
如果你不想写代码,也有更简单的方法。有些MT4的第三方插件或者EA,已经集成了Telegram、Pushbullet这些通知服务。你只需要在插件设置里填上你Telegram Bot的Token和Chat ID,或者Pushbullet的API Key,就能直接使用。这些插件通常还能让你自定义提醒的格式,比如把当前价格、时间、盈亏情况都一起发过来,看起来就直观多了。我试过用Pushbullet,它的延迟比邮件转短信要低很多,基本是实时的,而且支持图文推送,有时候我设的止损触发了,它还能把当时的图表截图一起发过来,非常方便复盘。
当然,第三方服务也有它的局限性。比如Telegram,虽然在国内能用,但需要科学上网,而且网络环境不稳定的时候,推送可能会断断续续。Pushbullet虽然不需要科学上网,但免费版有消息数量限制,而且它的服务器在国外,偶尔也会有连接不上的情况。IFTTT这个工具也不错,它可以把MT4的提醒和你的手机短信、邮件、甚至智能家居设备联动起来,但设置步骤稍微复杂一些,而且同样依赖网络稳定性。说白了,每种方法都有自己的优缺点,关键看你自己的需求和网络环境,选一个最适合自己的就行。
模板和图表配置文件是否被重置
另一个常见的原因是图表模板或配置文件被意外重置了。MT4允许用户保存不同的图表模板,每个模板可以包含独立的设置,比如指标、颜色、以及“显示交易水平”的状态。如果你切换了模板,metatrader4下载或者加载了一个新的默认模板,那么原来的设置就可能被覆盖,导致买卖价位标记消失。
要检查这一点,可以在图表上右键点击,选择“模板”然后查看当前使用的是哪个模板。如果你之前保存过自定义模板,可以尝试重新加载它。如果没有,那就需要手动重新勾选“显示交易水平”,并调整其他你习惯的设置。然后,建议你立即保存一个新的模板,以防下次再出问题。
配置文件也会影响这个设置。MT4的配置文件包含了整个平台的布局和功能状态。如果你在多个配置文件之间切换,比如从“默认”切换到“交易分析”,那么“显示交易水平”的勾选状态可能就不一致。你可以在“文件”菜单下的“打开数据文件夹”里,找到“config”文件夹,但手动修改配置文件比较麻烦,最好还是通过界面操作来调整。
根据我的经验,很多用户在升级MT4版本后,会遇到模板或配置文件被重置的问题。这时,买卖价位消失只是表象,深层原因是软件在更新时丢失了用户自定义设置。所以,定期备份你的模板和配置文件是个好习惯,能省去很多麻烦。
滑点是否真的“正常”还是平台问题
滑点本身是市场机制的一部分,但过度的滑点可能说明平台有问题。正规经纪商通常会把滑点控制在合理范围内,比如1-3个点。如果你经常遇到10个点以上的滑点,那就得怀疑平台是不是在恶意操控了。我有个朋友用过一家小经纪商,每次数据行情滑点都超过20点,后来换到ECN平台才好转。
判断滑点是否正常,可以看几个指标。第一,对比不同平台的执行报告,看看滑点频率和幅度。第二,检查经纪商的监管信息,受FCA或者ASIC监管的平台通常更规范。第三,用模拟账户测试,模拟账户的滑点情况通常和真实账户接近,如果模拟账户滑点很少,真实账户却很多,那就有问题。我自己在测试时,发现模拟账户和真实账户的滑点差异不超过1个点,这才放心。
最后,交易者要调整心态。滑点不是平台的阴谋,而是市场运行的自然结果。接受这个事实后,我反而能更理性地设置止损,不再因为滑点而频繁调整策略。说实话,只要滑点幅度在可接受范围内,比如3-5个点,对整体盈利影响并不大。关键是要控制好仓位,别让一次大滑点毁掉整个账户。