MT4斐波那契线 - MT4自动突破交易EA编写核心要素

核心逻辑:定义突破与关键水平
写突破EA的第一步,不是急着敲代码,而是先想清楚什么是“突破”。在我看来,突破不是价格随便碰一下某个水平就算数,那样太容易触发假信号了。我一般会要求价格在突破后,收盘价稳稳站上或者跌破关键水平,并且至少超过一个最小变动单位的距离。比如说,你设定1.2000是阻力位,那价格必须收盘在1.2001以上才算有效突破,这样能过滤掉很多毛刺。
关键水平的设定也很讲究。很多人喜欢用前高前低、斐波那契回撤位或者均线,但我觉得最靠谱的还是用“区间震荡”的上下轨。你可以让EA自动识别过去N根K线的最高价和最低价,比如过去20根小时K线的最高点作为阻力,最低点作为支撑。这样EA就能动态更新关键水平,不用你手动去改参数。
还有一个细节容易被忽略:时间框架的选择。突破交易在15分钟图和4小时图上的表现完全不同。我个人经验是,1小时图或4小时图的突破信号更可靠,但触发频率低;小周期图信号多,但假突破也多。所以我会在EA里加一个参数,让用户自己选周期,这样更灵活。
最后别忘了,突破方向要明确。你是只做向上突破做多,还是向下突破做空,或者双向都做?我建议初学者先只做一个方向,比如只做向上突破做多,等跑顺了再加空头逻辑。EA里用个布尔变量来控制,比如“OnlyLong = true”就只做多。
代码实现:监控价格与开仓条件
好了,逻辑理清了,咱们开始写代码。MT4的EA主要靠OnTick()函数运行,每来一个新报价,这个函数就会被触发一次。在OnTick()里,第一件事就是获取当前价格和关键水平。用iHigh(NULL, 0, 1)和iLow(NULL, 0, 1)可以拿到上一根K线的最高最低价,但我们要的是过去N根K线的极值,所以得用循环或者直接用iHighest()和iLowest()函数。
举个例子,假设你想监控过去20根K线的最高点作为突破水平。代码可以这样写:double resistance = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, 20, 1)); 这个iHighest函数会返回过去20根K线中最高价所在的K线序号,然后iHigh再取那个K线的最高价。支撑位同理,用iLowest取最低点。这样关键水平就动态算出来了。
接下来是开仓条件。当最新买入价Ask大于阻力位加上一个滑点偏移量时,就触发开多单。但记住,不能每次满足条件都开仓,那会开一大堆订单。所以得加一个“是否已有持仓”的判断。用OrdersTotal()遍历所有订单,检查当前货币对是否有未平仓的多单。如果没有,才执行开仓。开仓用OrderSend()函数,设置好手数、止损、止盈,比如止损设在支撑位下方10个点。
这里有个坑:OrderSend()失败的原因很多,比如账户资金不足、经纪商拒绝开仓。所以我习惯在开仓前先检查账户余额和保证金,用AccountFreeMargin()确保足够。还可以加个打印语句,把开仓条件是否满足、关键水平是多少都输出到“专家”选项卡,方便调试。
风险控制:避免假突破与过度交易
突破交易最大的敌人就是假突破。价格刚冲过关键水平就掉头,如果你EA傻乎乎地开仓,后面可能直接止损。所以得加一些过滤条件。我最常用的是“成交量确认”或者“K线实体大小”。比如,突破那根K线的实体长度必须大于前5根K线的平均实体长度,说明有真动力。用iClose(NULL, 0, 1) - iOpen(NULL, 0, 1)算实体,再对比一下。
还有一个办法是“时间过滤”。
某些时段流动性低,比如周五下午或者重大数据公布前,假突破特别多。我一般会在EA里加个TimeHour()函数,限制只在活跃时段交易,比如北京时间下午3点到凌晨1点。这样能避开很多无聊的震荡。当然,这个时段参数要让用户能自己改,因为每个人的交易习惯不同。
过度交易也是个大问题。如果价格在关键水平附近反复穿越,EA可能会频繁开仓止损,把账户磨死。我的解决方案是加一个“冷却时间”。
比如,每笔平仓后,至少等待30分钟才能再次开仓。用全局变量记录上次平仓时间,然后在开仓条件里加个判断:if (TimeCurrent() - lastCloseTime > 1800) 才允许开仓。1800秒就是30分钟。
最后,止损止盈的设置不能太死板。我建议用“追踪止损”功能,随着价格有利波动,逐步移动止损线。比如,价格每上涨10个点,止损就上移5个点。这样既能保护利润,又不会过早被扫掉。MT4里可以用OrderModify()函数修改止损,在OnTick()里持续检查价格变化。
实战优化:参数调整与回测验证
写好EA后,千万别直接挂实盘。先跑回测,用MT4自带的策略测试器。选一个你熟悉的品种,比如EURUSD,时间周期用1小时,回测过去6个月的数据。关键要观察几个指标:总盈亏、胜率、最大回撤。如果胜率低于40%或者最大回撤超过20%,说明EA逻辑有问题,得回去改参数。
参数调整时,别一次改太多。先调“突破确认所需的K线根数”,比如从1根改成2根,看看胜率是否提升。再调“冷却时间”,从30分钟改成45分钟,看是否减少交易次数。我习惯用“参数优化”功能,让MT4自动跑几百种参数组合,然后选夏普比率最高的那组。但注意,优化过度容易过拟合,所以最后要用未参与优化时段的数据再验证一次。
实盘运行前,还要考虑点差和滑点。突破交易往往在价格快速变动时触发,这时候点差可能扩大,滑点也可能导致成交价不理想。我的办法是在开仓条件里加一个“滑点容忍度”,比如允许滑点3个点。如果实际滑点超过这个值,EA就放弃这次开仓。用MarketInfo(Symbol(), MODE_SPREAD)实时监控点差,如果大于正常值,就跳过。
还有一点,记得把EA的“允许实时自动交易”打勾,并且把“允许DLL导入”关掉,除非你确定需要外部库。很多新手因为忘记开启自动交易,导致EA挂了一整天一动不动。另外,日志里如果出现“OrderSend error 4108”,说明市场关闭或者经纪商拒绝,别慌,检查一下经纪商的交易时间。