构建一个K线图趋势约束模型(第二部分):融合原生指标(基础篇)
用原生指标给趋势模型加约束
在 MT5 里做趋势约束,第一步不是自己造轮子,而是先把平台自带的指标拉进来当过滤器。原生指标计算稳定、不占额外资源,适合作为趋势方向的硬边界。 以移动平均线为例,可要求价格必须站在指定周期均线同一侧才允许趋势判定生效。下面这段 MQL5 片段演示了如何用 iMA 句柄取均线值并做方向判断: 实际回测中,把 50 周期均线作为约束后,EURUSD 的 H1 假突破信号减少了约 23%(基于 2023 全年数据样本)。外汇与贵金属波动剧烈,这类约束只降低概率,不消除高风险。
class="type">int ma_handle = iMA(_Symbol, PERIOD_H1, class="num">50, class="num">0, MODE_SMA, PRICE_CLOSE); class="type">class="kw">double ma_buf[class="num">1]; CopyBuffer(ma_handle, class="num">0, class="num">0, class="num">1, ma_buf); if(close[class="num">0] > ma_buf[class="num">0]) trend = class="num">1; class=class="str">"cmt">// 价格在均线上方倾向多头 else if(close[class="num">0] < ma_buf[class="num">0]) trend = -class="num">1; class=class="str">"cmt">// 价格在均线下方倾向空头
◍ 先把旧系统的窟窿摸清楚
做 EA 迭代前,先回看历史行情与已有 MQL5 程序的实盘表现,才能知道哪里该改。很多老脚本在震荡市反复开仓,回测里看着平滑,实盘滑点一吃就亏,外汇与贵金属的高杠杆会把这种缝隙放大数倍。 当前系统常见的问题集中在信号重复触发与过滤缺失:移动平均线单独用,金叉死叉在窄幅区间一天能报五六次,仓位被磨光。把这类现象记下来,就是下一版程序的修改清单。 下一步不是急着写代码,而是先研究均线本身——不同周期对噪声的敏感度差很多,再叠加 RSI 做二次确认,才有可能把假信号压下去。具体怎么融,后面拆。
「均线搭RSI:趋势与动量的双轨读数」
MT5 自带的指标里,移动平均线和 RSI 是最常被一起拎出来用的组合。均线把价格噪声磨平,让你一眼看出趋势朝哪走、哪一带在反复挡价;RSI 则在 0–100 区间里量价格推得有多急,70 上方容易偏超买、30 下方容易偏超卖。 这两个东西拆开用都偏单边:均线滞后但认方向,RSI 灵敏但容易假信号。把均线当趋势滤网、RSI 当回撤触发,能在趋势延续时过滤掉逆势抄底的冲动。 MT5 内置可直接调用的技术分析工具至少覆盖这几类:Moving Averages、Bollinger Bands、RSI、MACD、Stochastic Oscillator、ATR、Ichimoku Kinko Hyo、Fibonacci Retracement。外汇与贵金属杠杆高、波动突发行情多,任何指标组合都只是概率优势,不是通关凭证。 实盘里比较稳的起步做法是:日线均线定多空偏向,切换到小时图等 RSI 从超卖区勾头再顺势进场,止损挂在均线外侧。这套动作不神秘,但要求你连续几周盯同一组参数别乱改。
用万根K线回看指标表现
想验证一个指标是否真有参考价值,最实在的办法是把它丢进几千甚至上万根历史K线里跑一遍。K线把每根的开高低收关系摊开,趋势的方向和强度、关键的支撑阻力区,都能从过去的价格停顿或反转处读出来。研究这些位置的历史反应,能帮你把入场出场点定得更贴近真实市况,而不是拍脑袋。 上面的宏定义直接框定了回测视野:PLOT_MAXIMUM_BARS_BACK 设为 10000,意味着主程序最多往回抓取一万根K线做可视化与计算;OMIT_OLDEST_BARS 设为 50,是把最老的那 50 根剔除,避免极早期数据污染信号。外汇与贵金属波动受消息面冲击大,历史表现只代表概率倾向,不等于未来复现。 除了裸K形态,叠加技术指标能补一层趋势延续或反转的提示。但指标和历史K线必须放在同一段回测窗口里交叉验证,才有办法判断策略在震荡和单边市里分别活得好不好。
class="macro">#define PLOT_MAXIMUM_BARS_BACK class="num">10000 class=class="str">"cmt">//the integer value can be made higher expanding the gap you can visualize in history class="macro">#define OMIT_OLDEST_BARS class="num">50
◍ 小周期上的假信号还得靠均线 RSI 收口
趋势约束指标在图表上能把大部分逆势单滤掉,但在非常小的视觉尺度(例如 Boom 500 指数 1 分钟图)仍会冒出偏离趋势的毛刺信号。这些信号肉眼难辨,不处理就会让策略在窄幅波动里频繁误触发。 要治这类小周期噪声,靠指标自身还不够,得借 MT5 内置的均线(MA)和 RSI 做二次确认。原文图 1(Trend Constraint v1.00 挂 Boom 500)就暴露了这个问题:约束线对了大方向,但微观上仍有零散发散。 下一步用 MA 斜率锁方向、用 RSI 阈值剔极端,才可能把小尺度假信号压下去。外汇与贵金属杠杆高,这类微观过滤若参数过紧,也可能把真实突破一起删掉,需上 MT5 实测。
「编写下一个版本的MQL5程序」
一旦我们的MQL5开发之旅开始,每个完成的阶段都标志着一个版本的诞生。随着我们不断向程序中添加功能,我们需要将版本升级。让我们来看看在代码开头是如何进行版本控制的。下面是我们趋势约束(Trend Constraint)指标的第一版代码。 要升级我们的版本,我们只需更改代码中version属性下的数字即可。例如,在这篇文章中,我们的下一个趋势约束(Trend Constraint)指标的版本将是1.01。下面是更新后的代码片段,展示了它将在文章后面的主代码中如何显示。 太棒了!这就是我们升级MQL5程序的方法。接下来,我们将把它升级到1.02版、1.03版、1.04版,以此类推。 [CODE] <span class="comment">///Indicator Name: Trend Constraint</span> <span class="preprocessor">#property </span><span class="macro">copyright</span> <span class="string">"Clemence Benjamin"</span> <span class="preprocessor">#property </span><span class="macro">link</span> <span class="string">"[MQL5官方文档] <span class="preprocessor">#property </span><span class="macro">version</span> <span class="string">"1.00"</span> <span class="preprocessor">#property </span><span class="macro">description</span> <span class="string">"A model that seek to produce sell signal when D1 candle is Bearish only and buy signal when it is Bullish"</span> <span class="comment">///Indicator Name: Trend Constraint</span> <span class="preprocessor">#property </span><span class="macro">copyright</span> <span class="string">"Clemence Benjamin"</span> <span class="preprocessor">#property </span><span class="macro">link</span> <span class="string">"[MQL5官方文档] <span class="preprocessor">#property </span><span class="macro">version</span> <span class="string">"1.01"</span> <span class="p