相关性在交易中的实际应用·综合运用
(3/3)·从指标实现到系统测试,用相关系数给趋势强度与持续时间定个量化标尺
◍ 用相关性穿越阈值触发买卖
这套 EA 把相关性数组 corr[] 的相邻两根值当作触发源,而不是传统均线或 MACD。corr[0] 是当前柱、corr[1] 是上一柱,阈值由外部参数 Inp_KeyLevel 控制,默认思路是穿越正负阈值才动手。 策略分两类:Inp_Strategy_type==1 时,要求上一根 corr 已突破 +KeyLevel、当前根回落到阈值下方才买;卖则对称,上一根低于 -KeyLevel、当前根回升过 -KeyLevel 才空。类型 2 反过来,用当前根先穿正阈值、前一根还在下方作为买点。 开仓动作本身很直白:BuySignal() 或 SellSignal() 返回 true,就调 Trade.BuyPositionOpen / SellPositionOpen,把手数、止损、止盈、魔术码、注释全从输入参数接进来。外汇与贵金属杠杆高,这类相关性反转信号在历史样本里胜率有波动,实盘前务必在 MT5 策略测试器跑多品种回测。 下面这段是信号函数的骨架,注意 corr 数组和 KeyLevel 的比较顺序直接决定你吃的是突破还是回踩。
if(BuySignal()) Trade.BuyPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); class=class="str">"cmt">//--- 如果有卖出信号,开启订单 if(SellSignal()) Trade.SellPositionOpen(Symbol(),Inp_Lot,Inp_StopLoss,Inp_TakeProfit,Inp_MagicNum,Inp_EaComment); } } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 买入条件 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool BuySignal() { class="type">bool res=class="kw">false; if(Inp_Strategy_type==class="num">1) res=(corr[class="num">1]>Inp_KeyLevel && corr[class="num">0]<Inp_KeyLevel)?true:class="kw">false; else if(Inp_Strategy_type==class="num">2) res=(corr[class="num">0]>Inp_KeyLevel && corr[class="num">1]<Inp_KeyLevel)?true:class="kw">false; class="kw">return res; } class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| 卖出条件 | class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">bool SellSignal() { class="type">bool res=class="kw">false; if(Inp_Strategy_type==class="num">1) res=(corr[class="num">1]<-Inp_KeyLevel && corr[class="num">0]>-Inp_KeyLevel)?true:class="kw">false; else if(Inp_Strategy_type==class="num">2) res=(corr[class="num">0]<-Inp_KeyLevel && corr[class="num">1]>-Inp_KeyLevel)?true:class="kw">false; class="kw">return res; }
「EURUSD 四年实盘参数的回测设置」
这套 EA 的回测没有走花哨的框架,直接钉死一组可复现的边界:时间窗取 2015.01.01—2018.12.01 的上涨趋势段,品种只跑 EURUSD,初始本金 1000 USD,杠杆 1:500,接入 MetaQuotes-Demo 服务器的 5 位报价。 交易模式标为无延迟。作者原话点明这不是高频策略,延迟扰动极小,所以这种设定对结论干扰可忽略。 K 线用 M1 的 OHLC 撮合。真实分时的预测试显示结果几乎一致,说明用 OHLC 近似不会骗你太多。 优化环节先放开计算方法与策略类型的参数集,跑完再挑最优组合做正式测试。外汇与贵金属杠杆交易风险极高,1000 USD 本金在 1:500 下爆仓可能发生在几个波动点内,回测盈利绝不等于实盘能活。
相关系数策略回测里冒出来的几个反直觉点
把相关系数类振荡指标丢进 MT5 优化器跑一遍,On Decrease 模式(即相关系数下降时触发)给出的净值曲线最好。这只能说明一件事:系数往下掉的时候,这类指标对市场波动的反应比平时快,毕竟基于相关系数的振荡指标——尤其周期拉大以后——滞后性是实打实存在的。 有意思的是,计算最简单的 Fechner 系数没进前 20,它的最佳结果排在第 99 位。如果你图省事想用最轻量的写法,回测会直接教做人。 短周期反而出好结果:前排最优解里盈利和回撤控制都不错,而且周期为 5 的优化下限频繁出现。这进一步坐实了相关性指标在大周期延迟大、表现差的判断。所选期间和关键价位之间,没跑出利润额上的依赖关系,别瞎猜阈值。外汇与贵金属杠杆高,这类信号仅作概率参考,实盘前务必自测。
◍ 别急着下结论
这套相关系数工具包以 Correlation.mq5 为主程序,配套 Trade.mqh 交易类与四个指标(Fechner、Kendall、Pearson、Spearman),压缩包体积 807.75 KB,解压后直接丢进 MT5 终端的 MQL5 目录即可调用。 有用户在 2021 年 8 月反馈编译报 7 个错误,包括未声明标识符和括号不平衡,说明落地前先在本机重编译一遍更稳妥,外汇与贵金属品种叠加相关策略属高风险,实盘前请用策略测试器跑历史数据验证信号逻辑。 工具给出的是相关结构而非方向保证,两段资产价格同向或背离都只是概率现象;把它当观测镜而不是下单指令,才可能少交学费。