MT4没有连接 - MT4周线高低点触达提醒设置与EA代码编写

理解周线高低点的数据来源与周期转换
周线高低点听起来简单,但要在EA里准确获取,首先得搞清楚MT4的数据结构。MT4的图表周期分为分钟、小时、日、周、月等级别,每个周期都有自己的开盘价、收盘价、最高价和最低价。当我们说“周线高低点”时,指的是当周K线的最高价和最低价,这个数据在周线图表上直接可见。但在EA运行中,我们通常需要在更小周期(比如1小时或4小时)的图表上检测价格是否触达了周线级别的这些位置。
实现这个目标的核心思路是跨周期引用数据。EA可以运行在任意周期的图表上,但通过iHigh和iLow函数,我们能指定从周线周期获取数据。比如使用iHigh(Symbol(), PERIOD_W1, 0)就能获取当前周的最高价,iLow(Symbol(), PERIOD_W1, 0)则获取当前周的最低价。这里的PERIOD_W1就是周线周期的枚举值,0代表当前正在形成的周线,1代表上一根完整的周线。这个细节很重要,因为当前周线还在变动,如果你想检测价格突破上一周的高低点,就需要用1作为偏移参数。
实际应用中,我建议将周线高低点的获取放在EA的OnTick函数里,每次新报价到来时更新这些值。但要注意,周线数据在每个交易周开始时才会更新,频繁调用不会产生额外负担。不过有一个坑需要避开:当周线刚切换时,高低点数据会瞬间重置,如果你的EA逻辑没处理好,可能会在这个瞬间产生误报。解决办法是加入一个状态变量,记录上一根周线的收盘时间,只在周线完整切换时才更新参考值。
编写EA代码获取周线高低点核心逻辑
现在我们来写具体的MQL4代码。获取周线高低点的核心代码其实只有几行,但需要配合一些辅助逻辑才能稳定工作。首先定义一个全局变量来存储上周的最高价和最低价,在EA初始化时或者每周开盘时更新一次。代码结构可以这样:在OnTick函数里,检查当前周线是否已经完成,如果完成则更新参考值。判断周线是否完成,可以通过比较当前时间与周线收盘时间来实现,使用iTime函数获取周线收盘时间戳。
举个例子,假设我们想检测价格是否突破了上周的最高点。那么代码逻辑是这样的:在EA启动时,用iHigh(Symbol(), PERIOD_W1, 1)获取上周最高价,存储到变量lastWeekHigh中。然后每次报价到来时,比较当前最新价Bid或Ask与lastWeekHigh。如果最新价大于lastWeekHigh,就触发提醒。提醒方式可以是弹出提示框、发送邮件或者播放声音。我个人比较喜欢用Alert函数配合PlaySound,因为Alert会弹出窗口且不会像邮件那样容易错过,而PlaySound可以设置一个尖锐的提示音,哪怕你不在电脑前也能听到。
这里还有一个优化点:避免重复提醒。如果价格在突破后反复上下穿越,每次穿越都弹窗会非常烦人。解决办法是添加一个标志变量,比如bool alertedHigh = false。当价格突破上周高点时,如果alertedHigh为false就触发提醒并设为true,当价格回落到上周高点以下时,再将alertedHigh重置为false。这样就能保证每次突破只提醒一次,而不是每根K线都提醒。同理,低点突破的逻辑完全对称,只是把大于号换成小于号,并把最高价换成最低价。
设置价格触达提醒的完整EA框架
有了核心逻辑,我们需要把它包装成一个完整的EA框架。一个标准的MT4 EA包含初始化、反初始化和主循环三个部分。在初始化函数OnInit里,我们可以设置一些输入参数,比如选择提醒方式(弹窗、声音、邮件),以及设置检测的是当前周线还是上一周线。输入参数用input关键字定义,这样用户可以在EA属性窗口里调整,非常灵活。我通常会在输入参数里添加一个bool类型,让用户选择是否启用声音提醒,以及一个字符串参数设置声音文件路径。
在OnDeinit函数里,我们需要清理资源,比如删除可能创建的图形对象。虽然这个简单的EA不需要创建对象,但养成清理习惯很重要。主循环OnTick函数里,除了前面说的检测逻辑,还可以添加一个注释,在图表左上角显示当前周线高低点的数值,方便用户实时查看。使用Comment函数可以实现,但记得要定期更新,否则注释会一直显示旧数据。我一般会在每次新K线生成时更新注释,而不是每tick都更新,减少资源消耗。
为了让EA更智能,还可以加入时间过滤功能。有些交易者只希望在特定时间段内收到提醒,比如只在北京时间8点到23点之间工作。这可以通过比较当前时间与设定的时间范围来实现。使用TimeHour和TimeMinute函数提取当前小时和分钟,然后与输入参数中的开始时间和结束时间比较。如果不在范围内,直接跳过检测。这个功能对于夜间交易者特别有用,避免半夜被警报吵醒。另外,也可以加入一个手动开关,允许用户随时启用或禁用提醒,通过一个全局变量来控制,用户可以通过修改外部参数或直接修改代码来实现。
测试与调试确保EA稳定运行
写好的EA不能直接实盘使用,必须经过严格的测试。MT4自带的策略测试器是首选工具。选择你的EA,设置好交易品种和时间周期,比如在EURUSD的1小时图表上测试。测试时间范围最好覆盖至少三个月,如果条件允许,一年以上的数据更可靠。在测试过程中,重点观察两点:一是提醒是否在正确的价位触发,二是是否出现重复提醒或漏报。你可以在测试器的可视化模式下运行,手动观察K线走势和提醒弹出时机是否匹配。
测试时要注意一个常见问题:历史数据测试时,周线数据是完整的,但实盘时当前周线还在形成中,高低点会实时变化。因此测试时最好选择“每个tick”模式,而不是“仅用开盘价”模式,这样才能模拟实盘中的逐笔报价。如果发现提醒触发位置有偏差,检查一下iHigh和iLow函数的偏移参数是否正确。比如你想检测价格突破上一周的高点,但误用了当前周的数据,那么提醒会过早触发,因为当前周的高点可能还在上升。这个错误我刚开始写EA时也犯过,后来加了一个日志输出,把每次检测到的数值打印出来,才发现了问题。
调试时建议在EA代码中加入Print语句,输出关键变量的值。比如每次检测时,输出当前价格、上周高点、上周低点以及触发标志的状态。这样在测试器的日志窗口里就能看到完整的执行过程。如果发现某个条件始终不满足,就可以顺着日志查找是哪个变量出了问题。
另外,一定要在模拟账户上运行几天再转实盘。模拟账户的数据流和实盘完全一样,可以真实检验EA的稳定性。我自己的经验是,至少运行一周,观察每周开盘时EA是否正常工作,因为周线切换时数据会重置,这是最容易出bug的时刻。如果一周内没有出现任何异常,基本就可以放心实盘使用了。