折腾了一下午,总算把多周期信号确认的逻辑理清楚了。以前写EA都是单周期判断,回测漂亮得一塌糊涂,一上实盘就拉胯,后来才琢磨明白,大周期定方向、小周期找入场这个道理不落地到代码里,策略就是个摆设。今天把我踩过的坑和最终实现方案贴出来,给还在纠结的朋友省点时间。
先说思路,我这边用H4定趋势,M15做入场触发。核心逻辑其实不复杂:H4的MA和MACD方向一致时,才允许M15的RSI超卖/超买信号开单。但这里有个关键坑——不同周期的K线数据必须用iBarShift对齐时间戳,不能直接用iClose(Symbol(), PERIOD_H4, shift)去取,因为M15的shift索引和H4的shift索引对应的时间点完全对不上,我一开始就是栽在这,信号乱跳,后来改成先取M15当前K线时间,再用iBarShift换算H4对应索引,问题立刻解决。
具体实现步骤我整理了下:
另外一个容易忽略的点是历史数据加载量。如果你用iBarShift去回溯H4的K线,但图表上只加载了1000根M15K线,那H4可能只有不到30根,方向判断在数据不足时会返回空值或错误信号。我直接在init()里用iBarShift(Symbol(), PERIOD_H4, Time[0])测试了一下,发现至少得加载5000根M15数据才够H4跑出20根的均线参考。回测时记得在EA属性里把“最大K线数量”调大,不然结果会失真。
还有个细节,跨周期指标值在回测和实盘中的表现可能有偏差,因为MT4的测试模型对历史tick模拟不完整,尤其M15级别的入场信号,回测里看着很准,实盘可能延迟一两根K线。我现在的做法是回测用“每个tick基于真实tick”模式,实盘再加一个信号确认延迟——M15收盘后等5秒再执行开单,避免K线未走完时的假突破。
最后说下我测试的品种,主要跑欧美和镑美,H4+M15组合在欧美上胜率还行,镑美波动大,止损得放宽到1.5倍ATR。你们有没有试过其他周期组合?比如H1+M5或者D1+H4?我最近想试试D1定方向、H1做入场,但担心D1信号更新太慢,碰上震荡行情会连续止损,有经验的汇友给点建议?
先说思路,我这边用H4定趋势,M15做入场触发。核心逻辑其实不复杂:H4的MA和MACD方向一致时,才允许M15的RSI超卖/超买信号开单。但这里有个关键坑——不同周期的K线数据必须用iBarShift对齐时间戳,不能直接用iClose(Symbol(), PERIOD_H4, shift)去取,因为M15的shift索引和H4的shift索引对应的时间点完全对不上,我一开始就是栽在这,信号乱跳,后来改成先取M15当前K线时间,再用iBarShift换算H4对应索引,问题立刻解决。
具体实现步骤我整理了下:
- 第一步,定义周期句柄,用[iCustom]或者直接调MA、MACD指标,注意MT4里跨周期取数必须用iMA/Symbol()/PERIOD_H4这种写法,不能直接引用当前周期变量。
- 第二步,写一个函数判断大周期方向,比如H4的MA5>MA20且MACD柱状图为正,返回1;反之返回-1。这个函数每次tick都调用,所以一定要控制计算频率,我习惯用Volume[0]!=Volume[1]来过滤,只在K线收盘时刷新方向判断。
- 第三步,小周期入场条件加上方向过滤,比如M15的RSI<30且H4方向为1,才开多单。止损止盈我直接挂ATR动态值,ATR周期设成跟入场周期一致,别混用。
另外一个容易忽略的点是历史数据加载量。如果你用iBarShift去回溯H4的K线,但图表上只加载了1000根M15K线,那H4可能只有不到30根,方向判断在数据不足时会返回空值或错误信号。我直接在init()里用iBarShift(Symbol(), PERIOD_H4, Time[0])测试了一下,发现至少得加载5000根M15数据才够H4跑出20根的均线参考。回测时记得在EA属性里把“最大K线数量”调大,不然结果会失真。
还有个细节,跨周期指标值在回测和实盘中的表现可能有偏差,因为MT4的测试模型对历史tick模拟不完整,尤其M15级别的入场信号,回测里看着很准,实盘可能延迟一两根K线。我现在的做法是回测用“每个tick基于真实tick”模式,实盘再加一个信号确认延迟——M15收盘后等5秒再执行开单,避免K线未走完时的假突破。
最后说下我测试的品种,主要跑欧美和镑美,H4+M15组合在欧美上胜率还行,镑美波动大,止损得放宽到1.5倍ATR。你们有没有试过其他周期组合?比如H1+M5或者D1+H4?我最近想试试D1定方向、H1做入场,但担心D1信号更新太慢,碰上震荡行情会连续止损,有经验的汇友给点建议?
