带有图形界面的通用趋势(基础篇)
📘

带有图形界面的通用趋势(基础篇)

第 1/3 篇

「把趋势指标装进图形界面」

在 MT5 里做趋势类指标,多数交易者只盯着主图画线,却忽略了把参数和信号收进一个图形面板能省下的操作成本。Dmitry Fedoseev 在 2017 年 5 月 2 日发布的通用趋势示例,至今在客户端内仍有 17708 次调取记录,说明这种带 GUI 的写法并非玩具。 这类指标本质分两层:底层是趋势判定逻辑,上层是用 CGraph 或自定义 OBJ_RECTANGLE 搭出的控件。把外部参数暴露到面板而不是只能去属性框改,回测时调一次参数少点三次鼠标,实盘切换周期也更顺。 外汇与贵金属波动受杠杆和跳空影响,带界面的趋势指标只是辅助判向,信号翻转只代表概率倾斜,不代表行情必然延续。打开 MT5 新建一个自定义指标,先跑通画线、再挂面板,是验证这套结构最快的路。

换个路子搭趋势指标

前面两篇分别讲了怎么在 MT5 里做出带图形界面的通用振荡器,以及如何在它之上扩展出通用通道。现在要做的,是在通用振荡器基础上派生一个通用趋势指标,但为了避免和前文写法雷同,这一节改用另一条路径。 之前的通用振荡器和通道,表单类里所有控件对象都走自动指针,可见性和坐标交给附加类托管。这次我们切到「定制图形控件」那套思路(该系列分三篇铺开),不过只挑本文用得上的方法来实现,不把整套都搬过来。 对读者来说,直接在 MT5 里新建一个基于 CIndicator 的空指标,对照前文振荡器的表单结构,先只挂一个定制控件对象,验证指针和绘制逻辑能跑通,再往下扩。外汇与贵金属行情跳空频繁,这类自定义控件在极端波动下可能渲染滞后,实盘前务必在策略测试器用历史数据过一遍。

◍ 别只认趋势指标,振荡器也能判方向

很多人把移动平均线、RSI 这类依赖价格方向的工具只当入场过滤器,其实它们都能直接读趋势。价格收在均线之上,大概率处在上升段;收在之下则倾向下行,均线本身的坡度也同逻辑——向上翘是上行,向下压是空头。 用一根柱线穿越均线也能抓入场:前一根收盘在均线下方、后一根收上方,这根就是买点信号;反之为卖点。均线坡度转向的那根柱线同理,对应坡度的极小值或极大值。 本文重点在趋势判定,但顺带列出入场柱线是为了对照完整。振荡器一般被拿来做入场,比如 RSI 破 70 向上为买、破 30 向下为卖。 不过振荡器也能判趋势:随机指标主线持续高于信号线,可视为多头段;低于信号线则是空头段。RSI 用级别也一样,实测中 RSI 高于 60 多对应上行延续,低于 40 易走空。外汇与贵金属波动剧烈,上述关系仅为概率倾向,开 MT5 加载均线+RSI 双窗对照便知。

「用双缓冲图标把趋势画进副图」

想让趋势一眼可读,最省事的办法不是画一条变色的线,而是把它拆成两组独立信号。原文拿 RSI 试过两种阈值:60/40 时,RSI 上破 60 才偏多、下破 40 才偏空,中间 40–60 是空白区;反过来把买入门槛降到 40、卖出门槛抬到 60,同一区间内上下箭头会共存,方向就模糊了。 结论很直接:趋势该用两个缓冲区分别承载,一个贴副图顶部、一个贴底部,中间互不连成线。因为断点太多,连线看着乱,直方图或图标更合适。原文选了图标——不同缓冲区用不同颜色和不同符号,图例里副图上下各排一行箭头,多空状态扫一眼就定位。 这套显示法留出扩展口子。你完全可以再加一个不判方向的过滤器,比如 ATR 或 STD(标准差):数值冲破某阈值时,上下两个箭头同时亮,含义是“允许交易但方向由别的条件定”。在 MT5 里新建自定义指标,开两个独立缓冲区塞 DRAW_ARROW,就能把 RSI 趋势和波动率闸门叠在同一副图,外汇与贵金属波动大,实盘前请先用策略测试器验证信号密度。

逐指标筛掉不能用的趋势判据

搭通用趋势指标前,先得把 MT5 自带指标过一遍,挑出能稳定判断方向的那些。不是每个都值得塞进参数集——iAC 和 iAO 没参数,本质就是带固定设置的 OsMA 和 MACD,直接弃用;iAD 值域无界且断线严重,不平滑没法看趋势;iGator 只是鳄鱼的衍生品,信息冗余也砍掉;iBWMFI 性质太特殊,同样不纳入。 剩下能用的也分两类。一类靠「线位关系」:iADX 可用 PDI 与 MDI 交叉(变体1只需 adx_period,变体2加 double level 判 ADX 强度);iAlligator 只取唇>齿>颚的多头排列(六个周期/位移参数加 ma_method 和 applied_price);iIchimoku 看 Tenkan 与 Kijun 谁高(变体1),或 SpanA 是否在 SpanB 之上(变体2)。 另一类是「双均线或坡度」逻辑。iAMA、iDEMA、iFrAMA、iMA 都支持快线慢线两路(末尾 1 是快线、2 是慢线),也都能改用线坡度——坡度版要多一个 int shift2 指定第二取样点位移。以 iMA 变体1 为例,光坡度判定就要 ma_period、ma_shift、ma_method、applied_price 加 shift2 五个输入。 振荡器里很多因线条毛刺重被禁用坡度版。iCCI、iChaikin、iForce 只留级别版(如 CCI 设 double level,上穿为多头);iDeMarker 区间锁死 0~1,卖级用 level 设、买级按 0.5 对称算;iMomentum 中性 100、iMFI 中性 50,同样只做级别对称。iBands 和 iEnvelopes 当通道用:价格破上轨倾向多头,破下轨倾向空头。外汇与贵金属波动剧烈,这些级别阈值在极端行情可能频繁假突破,上 MT5 用历史数据回测各自 level 再实盘验证。

◍ 把指标变体收进一个枚举

前面把 MACD、SAR、RSI、Stochastic 等十几种指标的用法拆成了「按级别 / 看方向 / 双线位置」等变体。真正写 EA 时不该在每个指标调用处散落一堆 if,更稳的做法是先给所有类型建一个统一枚举,后面靠 switch 分发。 以 MACD 为例,iMACD 直方图有三种潜在用法,但相对信号线那套被归为 OsMA 的零轴级别特例,实际只留「高于 level 买、低于 -level 卖」和「直方图上行买、下行卖(需 shift2 取第二点判向)」两条路。RSI 只留按级别,卖出级别单独传、买入级别反推;Stochastic 则给了主线坡度、0–100 级别(中性 50)、主信号线交叉三种变体。 iTriX 有个坑:iTriX() 函数本身没有 ma_shift 参数,指标位移要靠计算的柱线索引实现,所有指标的 shift 统一置 0,别在参数里瞎传。iWPR 因和慢速=1 的 Stochastic 主线等价且尺度相反,直接弃用;iOBV 无界且暴烈,也不进交易逻辑。 落地动作:在 MT5 的 Includes 目录下建 UniTrend 文件夹,新建 UniTrendDefines.mqh,把下面枚举原样贴入,后续指标句柄初始化就能按 EType 分支处理。外汇与贵金属杠杆高,指标变体仅描述概率倾向,实盘前请用策略测试器跑多周期验证。

MQL5 / C++
enum EType{
  Type_ADX_PDIMDI,        class=class="str">"cmt">// ADX 指标 PDI 和 MDI 线的位置
  Type_ADX_Level,         class=class="str">"cmt">// 相对于级别的 ADX 线位置
  Type_ADXW_PDIMDI,       class=class="str">"cmt">// ADX Wilder 指标 PDI 和 MDI 线的位置
  Type_ADXW_Level,        class=class="str">"cmt">// 相对于 ADX Wilder 级别的 ADX 线位置
  Type_Alligator,         class=class="str">"cmt">// 鳄鱼
  Type_AMA_Dir,           class=class="str">"cmt">// АМА 的方向
  Type_AMA_2MA,           class=class="str">"cmt">// 两个 АМА
  Type_ATR_Level,         class=class="str">"cmt">// ATR
  Type_BuBe_Level,        class=class="str">"cmt">// 牛/熊动力及级别
  Type_BuBe_Dir,          class=class="str">"cmt">// 牛/熊动力的方向
  Type_Bands,             class=class="str">"cmt">// 布林带
  Type_CCI_Level,         class=class="str">"cmt">// CCI 和级别
  Type_Chaikin_Level,     class=class="str">"cmt">// Chaikin 振荡器和级别
  Type_DEMA_Dir,          class=class="str">"cmt">// DEMA 的方向
  Type_DEMA_2MA,          class=class="str">"cmt">// 两个 DEMA
  Type_DeMarker_Level,    class=class="str">"cmt">// DeMarker 和级别

常见问题

先用副图双缓冲把趋势画出来,再挂一个简单图形界面做开关,不必重写整套指标逻辑。
可以,把振荡器穿越中轴的动作当成方向判据,但需结合价格行为确认,贵金属波动大属高风险。
小布可加载你的指标变体并跑历史分段统计,直接标出各判据在指定时段的胜率倾向,你只看结论。
逐条回测趋势判据在横盘区的触发频率,删掉那些假信号占比高的,只留概率占优的。
用枚举收拢变体,运行时按选择算一种,避免全量计算,MT4/MT5 以外平台思路也一样。