20 种经典交易信号函数库
把 20 种技术信号写成可复用函数,任意组合过滤
本文把 20 种主流技术信号封装成 TradeSignal_XX() 函数,统一返回 1(买)/-1(卖)/0(无),塞进 SignalTrade.mqh 供任意程序调用。
一、把信号写成可复用函数
信号只是提示可能点位,不是必须执行;用多个信号组合过滤,比单信号裸跑稳健得多。
二、统一函数原型
- 声明 sig = 0;
- 查/建指标句柄;
- CopyBuffer 复制数据;
- ArraySetAsSeries 倒序;
- 比历史柱 [1][2] 赋值返回;
- 句柄在 OnInit 建一次。
三、信号分类
- 均线相交;
- 区间突破(价格/自适应/唐奇安/银/加拉赫通道);
- 超买超卖离开(随机/RSI/CCI/威廉);
- 通道边界反弹(布林/标准差/价格/包络);
- 趋势改变(NRTR/鳄鱼/AMA/AO/一目均衡)。
四、举几个典型
- 双 MA 交叉:快 MA(8) 上穿慢 MA(16) 买;
- MACD 主线被信号线自上而下穿买;
- RSI 从 30 下升回买、从 70 上跌回卖;
- 布林碰下轨返回买。
五、做成指标或 EA
指标:OnInit 建全部句柄,OnCalculate 调 20 个函数画箭头;EA:扩展版引入可变参数,用 IndicatorRelease 旧副本、重建新副本省内存。
六、把多个信号组合成过滤器
单信号裸跑噪声大,实战常用「与」过滤:例如快 MA 上穿慢 MA 且 RSI 从超卖区回升才给买。组合时给每个信号一个权重或要求 N 个中有 M 个同向,能显著压低假信号,代价是信号变少、可能错过早期启动。
七、统一函数原型设计
把每个信号写成函数,统一原型如 int SignalX(const double &price[], int shift, int period),返回固定语义:1 看多、负1 看空、0 无信号。统一原型后,信号能放进数组被循环调用,也能自由组合。
统一返回值语义比「返回价格」或「返回布尔」灵活:多个信号可加权求和、投票、取多数,策略层不必关心每个信号内部怎么算。这是信号库可扩展的根本。 进阶还能返回「强度」而非仅方向(如用 RSI 偏离度大小映射成浮点信号),策略层按强度加权,比简单的多空投票更细腻。
八、信号分类:趋势/震荡/突破/成交量
二十种经典信号可归四类:趋势类(均线、MACD)、震荡类(RSI、Stochastic)、突破类(通道、布林带)、成交量类(OBV、成交量突变)。分类后你清楚「当前市场该用哪类」,也方便按市况切换。
九、给信号函数写单元测试
信号函数最容易「看起来对、实测错」。拿一段已知历史(如明显顶部)喂进去,确认返回符合预期;再覆盖边界(数据不足、首根)。用历史片段做最小验证,比上线后亏了才发现强。
把这些用例存成注释或脚本,每次改信号逻辑都重跑一遍,能防止「修一个 bug 引入三个」。信号库越积越多,回归测试越重要。 当信号库膨胀到几十个,建议维护一个统一的「信号注册表」:新信号实现后登记名字、类别、默认参数,策略层从表加载,避免到处硬编码调用。