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

理解周线高低点在MT4中的数据结构
在动手写代码之前,你得先搞明白MT4里周线数据是怎么存的。MT4的时间框架有M1、M5、H1、H4、D1、W1、MN等等,其中W1就是周线。每个周线蜡烛图都包含开盘价、收盘价、最高价和最低价。说白了,周线的高低点就是这根蜡烛的High和Low。不过,这里有个关键点:周线是从周一开盘到周五收盘,一根完整的周线包含了5个交易日的价格波动。你在EA里要获取的,其实就是当前周线或者历史周线的这些数据。
MT4提供了iHigh()和iLow()这两个函数,专门用来获取指定时间框架的最高价和最低价。比如,你想获取当前周线的最高价,就可以用iHigh(Symbol(), PERIOD_W1, 0)。这里的PERIOD_W1就是周线的时间周期参数,0代表当前正在形成的这根周线。如果你要获取上周的周线高点,就把第三个参数改成1。这个逻辑很简单,但实际用起来有几个坑要注意,比如周线数据在周末收盘后才会最终确定,而交易时间内价格会不断刷新。
另外,很多人会混淆周线高低点和日线高低点的区别。日线每天都有新的高低点,但周线一周只有一根蜡烛,它的高低点覆盖了五天。所以,如果你用EA来触发提醒,一定要明确你是要等价格突破或者触及这根周线的范围。我自己的经验是,周线高低点更适合做中长线策略,因为它的波动范围大,触发提醒后往往有足够的反应时间。千万别把日线级别的频繁波动套到周线上,那样会搞出很多假信号。
还有一点,MT4的图表数据是实时更新的,但周线的高低点并不会因为盘中价格冲高而立刻改变,它只会在每周收盘后固定下来。这意味着,如果你在周三设置了一个基于当前周线高点的提醒,那么周四价格真的涨破了这个高点,你的EA可能已经错过了最佳入场点。所以,我建议在EA里同时监控当前周线和前一周的高低点,用前一周的高低点作为静态参考,用当前周线的高低点作为动态边界,这样会更合理。
编写EA代码获取周线高低点并设置提醒
现在进入实战环节,我们直接在MetaEditor里新建一个EA。首先,你需要用MQL4语言写一个简单的脚本,核心就是调用iHigh()和iLow()函数。假设你要监控当前货币对的周线高点,代码可以这样写:double weeklyHigh = iHigh(Symbol(), PERIOD_W1, 0); double weeklyLow = iLow(Symbol(), PERIOD_W1, 0); 这两行就把当前周线的最高价和最低价拿到了。然后,你需要把当前价格跟这两个值做比较。比如,如果Bid价格大于等于weeklyHigh,就触发一个提醒。
提醒的方式有两种:一种是弹出一个消息框,用Alert()函数;另一种是发送声音提醒,用PlaySound()函数。我个人更喜欢声音提醒,因为做交易时我经常切换窗口,弹窗容易被忽略。你可以准备一个.wav格式的声音文件,放在MT4的Sounds文件夹里,然后在EA里写if (Bid >= weeklyHigh) { PlaySound("alert.wav"); }。当然,你也可以同时使用Alert()和SendNotification(),把提醒推送到手机MT4上,这样就算你离开电脑也不会错过机会。
这里有一个细节很容易出错:价格触及周线高低点,到底是怎么个“触及”法?是价格刚好等于,还是突破多少点?我建议设置一个容忍范围,比如用Point乘以一个数字。举个例子,如果当前价格距离周线高点不到10个点,就触发提醒。代码可以写成if (MathAbs(Bid - weeklyHigh) <= 10 * Point) { ... }。这样能避免因为点差或者报价微小波动导致的误触发。另外,你还需要考虑周线数据的更新频率,最好在EA的OnTick()函数里每根新K线出现时才检查一次,而不是每一笔报价都检查,否则CPU会爆炸。
最后,别忘了把EA挂到图表上。打开MT4,把写好的EA拖到任意一个货币对的图表上,然后在属性里设置好参数,比如提醒的容忍点数。测试时,我建议先用模拟账户跑几天,看看触发时机是否准确。我第一次用的时候,发现价格明明没到高点,却一直报警,后来才发现是忘了过滤已触发的状态。解决办法是加一个布尔变量,比如bool alerted = false; 当价格触及高点时,把alerted设为true,然后价格回落超过一定范围时再重置。这样就不会重复报警了。
优化提醒逻辑避免重复和误报
重复报警是新手最容易遇到的问题。你想想,如果价格在周线高点附近来回震荡,EA每一秒都检查一次,那你的电脑就会一直响。解决这个问题的方法有很多,最简单的就是加一个时间锁。比如,每次触发提醒后,在30分钟内不再触发第二次。代码里可以记录上一次触发的时间,用TimeCurrent()和TimeLocal()来判断间隔。
我通常设成60分钟,因为周线级别的波动不会太频繁,60分钟的冷却期足够过滤掉大部分噪音。
另一种优化方式是结合趋势判断。周线高低点被触及,并不代表一定会反转,也可能是突破。所以,你可以在EA里加入一个简单的趋势过滤器。比如,如果价格从下方接近周线高点,并且周线本身是阳线(收盘价大于开盘价),那就更可能是突破,你可以设置提醒时附带不同的声音。反过来,如果价格从上方接近周线低点,并且周线是阴线,那就可能是支撑有效。这样,提醒就不只是告诉你“价格到了”,还告诉你“可能是什么情况”。
我还在自己的EA里加入了多时间框架确认。比如,价格触及周线高点时,我会同时检查日线是否也在高位,如果日线也显示超买,那么提醒的优先级就更高。这种多时间框架的逻辑虽然代码会复杂一点,但能大幅提高提醒的有效性。你可以用iRSI()或者iStochastic()来辅助判断,但别加太多指标,否则EA跑起来会卡。说实话,周线级别的提醒本来就不需要太高的频率,宁可错过一两次,也不要被假信号搞晕。
最后,提醒触发后的动作也可以自定义。除了声音和弹窗,你还可以让EA自动开单。比如,当价格触及周线低点并反弹时,自动买入。但我不建议新手这样做,因为自动交易的风险太高。我自己的做法是,提醒只作为通知,我手动判断后再操作。毕竟,周线高低点附近经常有假突破,机器很难完全理解市场情绪。把提醒做好,剩下的交给自己的经验,这才是最稳妥的方式。
测试与调试EA时需要注意的关键点
写好了EA,别急着实盘运行。你需要在MT4的策略测试器里跑一遍历史数据,看看周线高低点的获取是否准确。测试时,选择“仅用开盘价”模式,然后设置好时间范围,比如跑过去一年的数据。观察EA的日志输出,检查iHigh()和iLow()返回的值是否和图表上显示的一致。我遇到过一个问题:在回测中,周线数据因为换月或者节假日导致缺失,结果EA一直报错。解决办法是在代码里加一个数据有效性检查,比如if (weeklyHigh == 0) return; 避免除以零或者空值比较。
另外,注意MT4的服务器时间和你的本地时间可能不一致。如果你的EA用的是TimeCurrent(),而服务器是GMT+2,那冷却时间可能会偏差。我建议统一用服务器时间,因为MT4的报价是基于服务器时间的。测试时,你还可以用Print()函数把每次触发的价格和时间打印到专家日志里,这样你可以手动核对是否合理。比如,上周的周线高点明明是1.2000,但EA却打印出1.1995,那可能就是你容忍范围设置得太大了。
还有一个容易忽略的点:点差的影响。在实盘交易中,买价和卖价是分开的,而iHigh()返回的是卖价(Ask)的最高价。如果你的提醒是基于Bid价格,那就要小心了。比如,你想在价格触及周线低点时做多,但周线低点是用Ask计算的,而你的入场价是Bid,两者之间有点差。所以,在EA里最好明确用哪个价格做比较。我一般用Ask来对比周线高点,用Bid来对比周线低点,这样更贴近实际交易环境。测试时,把点差设置为3-5个点,看看提醒是否还能正常触发。
最后,别忘了测试EA的稳定性。连续运行几天,看看有没有内存泄漏或者死循环。我自己的EA曾经因为一个while循环忘记加跳出条件,导致MT4卡死。现在我会在代码里加一个计数器,比如每次OnTick()执行超过100毫秒就强制跳出。另外,如果EA挂载了多个图表,注意变量不要互相干扰,最好用全局变量或者使用ObjectSetText()来显示状态。说实话,调试EA是个磨人的活,但只要把周线高低点的逻辑搞扎实了,后面的提醒功能就水到渠成。