利用 Donchian 通道进行交易·综合运用
📉

利用 Donchian 通道进行交易·综合运用

(3/3)· 通道边界被刺穿却反杀账户?这套确认与资金管理框架专治裸信号盲动

偏理论进阶 第 3/3 篇
很多交易者把通道上轨被碰就当成趋势启动,结果在震荡市里被来回扫损。Donchian 通道本身只描述波动包络,脱离趋势确认和仓位规则单独用,胜率会塌方。本篇把前两份铺垫过的元件拼成可跑的系统。

◍ Donchian+MACD 策略的输入参数骨架

这套 EA 把唐奇安通道和 MACD 揉进同一个框架,先用输入变量把仓位、风控和指标周期全部外置,方便在 MT5 里直接调参而不碰内核。 下面的声明里,基本手数锁在 0.01,止损 400 点、止盈 600 点,偏离容差 20 点;魔幻数字 555 用来隔离本 EA 的订单。工作时间帧默认 M30,信息面板开关为 true。 sinput string Inp_EaComment="Donchian Expert"; //EA 注释 input double Inp_Lot=0.01; //基本手数 input MarginMode Inp_MMode=LOT; //资金管理 input int Inp_MagicNum=555; //魔幻数字 input int Inp_StopLoss=400; //止损 (单位: 点数) input int Inp_TakeProfit=600; //止盈 (单位: 点数) input int Inp_Deviation = 20; //偏离 input ENUM_TIMEFRAMES InpInd_Timeframe=PERIOD_M30; //工作时间帧 input bool InfoPanel=true; //显示信息面板 //--- Donchian 通道系统指标参数 input uint DonchianPeriod=10; //通道周期 input Applied_Extrem Extremes=CLOSE_HIGH_LOW; //极值类型 //--- 选择策略 input Strategy CurStrategy=Donchian_MACD; //所选策略 //--- MACD 指标参数 input int InpFastEMA=12; //快速 EMA 周期 input int InpSlowEMA=26; //慢速 EMA 周期 input int InpSignalSMA=9; //信号 SMA 周期 逐行拆解:第 1 行 sinput 的 EA 注释仅作日志标识,不影响逻辑;Inp_Lot 是每单固定手数,配合 Inp_MMode=LOT 走固定仓位而非百分比风控。Inp_StopLoss / Inp_TakeProfit 以点数计,在 XAUUSD 这种点值为 0.01 的品种上,400 点约等于 4 美元/盎司的止损距离。 通道部分 DonchianPeriod=10 取 10 根 K 线的高低极值,Extremes=CLOSE_HIGH_LOW 说明上下轨分别用最高价和最低价计算。策略开关 CurStrategy=Donchian_MACD 表示当前启用通道突破叠加 MACD 过滤;MACD 则沿用 12/26/9 的经典组合。 外汇与贵金属杠杆高、滑点跳空频繁,400 点止损在直盘可能只占净值 2%~4%,但在黄金上遇非农可能瞬间被打穿。开 MT5 把这段贴进 EA 输入区,先跑 M30 欧美或 XAUUSD 的视觉回测,确认面板显示与订单魔法数隔离无误再上模拟盘。

MQL5 / C++
sinput class="type">class="kw">string             Inp_EaComment="Donchian Expert";                 class=class="str">"cmt">//EA 注释
input class="type">class="kw">double            Inp_Lot=class="num">0.01;                                    class=class="str">"cmt">//基本手数
input MarginMode        Inp_MMode=LOT;                                   class=class="str">"cmt">//资金管理
input class="type">int               Inp_MagicNum=class="num">555;                                class=class="str">"cmt">//魔幻数字
input class="type">int               Inp_StopLoss=class="num">400;                                class=class="str">"cmt">//止损 (单位: 点数)
input class="type">int               Inp_TakeProfit=class="num">600;                              class=class="str">"cmt">//止盈 (单位: 点数)
input class="type">int               Inp_Deviation = class="num">20;                              class=class="str">"cmt">//偏离
input ENUM_TIMEFRAMES   InpInd_Timeframe=PERIOD_M30;                     class=class="str">"cmt">//工作时间帧
input class="type">bool              InfoPanel=true;                                  class=class="str">"cmt">//显示信息面板
class=class="str">"cmt">//--- Donchian 通道系统指标参数
input class="type">uint              DonchianPeriod=class="num">10;                               class=class="str">"cmt">//通道周期
input Applied_Extrem    Extremes=CLOSE_HIGH_LOW;                         class=class="str">"cmt">//极值类型
class=class="str">"cmt">//--- 选择策略
input Strategy          CurStrategy=Donchian_MACD;                       class=class="str">"cmt">//所选策略
class=class="str">"cmt">//--- MACD 指标参数
input class="type">int               InpFastEMA=class="num">12;                                   class=class="str">"cmt">//快速 EMA 周期
input class="type">int               InpSlowEMA=class="num">26;                                   class=class="str">"cmt">//慢速 EMA 周期
input class="type">int               InpSignalSMA=class="num">9;                                  class=class="str">"cmt">//信号 SMA 周期

「唐奇安通道EA的输入参数拆解」

下面这段声明定义了基于唐奇安通道的EA可调参数,直接在MT5里挂上就能改。注意默认手数只有0.01,止损400点、止盈600点,属于宽止损宽止盈的波段风格,外汇和贵金属杠杆品种这么设回撤可能偏大,需自测。 [CODE]input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; //应用价格 //+------------------------------------------------------------------+

//专家交易系统输入参数

//+------------------------------------------------------------------+ sinput string Inp_EaComment="Donchian Expert"; //EA 注释 input double Inp_Lot=0.01; //基本手数 input MarginMode Inp_MMode=LOT; //资金管理 input int Inp_MagicNum=555; //魔幻数字 input int Inp_StopLoss=400; //止损 (单位: 点数) input int Inp_TakeProfit=600; //止盈 (单位: 点数) input int Inp_Deviation = 20; //偏离 input ENUM_TIMEFRAMES InpInd_Timeframe=PERIOD_H1; //工作时间帧 input bool InfoPanel=true; //显示信息面板 //--- Donchian 通道系统指标参数 input uint DonchianPeriod=12; //通道周期 input Applied_Extrem Extremes=CLOSE_HIGH_LOW; //极值类型 //--- 选择策略 input Strategy CurStrategy=Donchian_AvrSpeed_RSI; //所选策略 //--- 平均速度指标参数 input int Inp_Bars=1; //柱线数量[/CODE] 逐行看:InpAppliedPrice 用收盘价算信号;Inp_EaComment 只是订单备注字符串。Inp_Lot=0.01 是每单基础仓位,Inp_MMode=LOT 表示按固定手数而非资金比例下单。 Inp_MagicNum=555 用来隔离本EA订单,避免和手动单混淆。Inp_StopLoss 与 Inp_TakeProfit 以点数计,400/600 的比例接近0.67,盈亏比理论约1:1.5。 Inp_Deviation=20 是成交最大滑点容忍,InpInd_Timeframe=PERIOD_H1 锁定小时图。DonchianPeriod=12 即通道回看12根K线,Extremes=CLOSE_HIGH_LOW 取收盘价与高低极值混合。CurStrategy 默认走“唐奇安+平均速度+RSI”组合,Inp_Bars=1 代表用单根K线测速。

MQL5 / C++
input ENUM_APPLIED_PRICE  InpAppliedPrice=PRICE_CLOSE;                     class=class="str">"cmt">//应用价格
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 专家交易系统输入参数                                                  |
class=class="str">"cmt">//+------------------------------------------------------------------+
sinput class="type">class="kw">string            Inp_EaComment="Donchian Expert";                  class=class="str">"cmt">//EA 注释
input class="type">class="kw">double             Inp_Lot=class="num">0.01;                                    class=class="str">"cmt">//基本手数
input MarginMode         Inp_MMode=LOT;                                   class=class="str">"cmt">//资金管理
input class="type">int                Inp_MagicNum=class="num">555;                                class=class="str">"cmt">//魔幻数字
input class="type">int                Inp_StopLoss=class="num">400;                                class=class="str">"cmt">//止损 (单位: 点数)
input class="type">int                Inp_TakeProfit=class="num">600;                              class=class="str">"cmt">//止盈 (单位: 点数)
input class="type">int                Inp_Deviation = class="num">20;                              class=class="str">"cmt">//偏离
input ENUM_TIMEFRAMES    InpInd_Timeframe=PERIOD_H1;                      class=class="str">"cmt">//工作时间帧
input class="type">bool               InfoPanel=true;                                  class=class="str">"cmt">//显示信息面板
class=class="str">"cmt">//--- Donchian 通道系统指标参数
input class="type">uint               DonchianPeriod=class="num">12;                               class=class="str">"cmt">//通道周期
input Applied_Extrem     Extremes=CLOSE_HIGH_LOW;                         class=class="str">"cmt">//极值类型
class=class="str">"cmt">//--- 选择策略
input Strategy           CurStrategy=Donchian_AvrSpeed_RSI;                class=class="str">"cmt">//所选策略
class=class="str">"cmt">//--- 平均速度指标参数
input class="type">int                Inp_Bars=class="num">1;                                      class=class="str">"cmt">//柱线数量

多周期RSI箭头的输入参数拆解

这段声明定义了指标与风控两组的外部输入,直接在 MT5 的 EA 属性面板里就能改,不用动逻辑层。 [CODE]input ENUM_APPLIED_PRICE Price=PRICE_CLOSE; //应用价格 input double Trend_lev=2; //趋势级别 //--- x4period_rsi_arrows 指标参数 input uint RSIperiod1=7; //RSI_1 的周期 input uint RSIperiod2=12; //RSI_2 的周期 input uint RSIperiod3=18; //RSI_3 的周期 input uint RSIperiod4=32; //RSI_4 的周期 input ENUM_APPLIED_PRICE Applied_price=PRICE_WEIGHTED; //应用价格 input uint rsiUpperTrigger=62; //超买级别 input uint rsiLowerTrigger=38; //超卖级别 //--- 尾随停止参数 input bool UseTrailing=false; //使用尾随停止[/CODE] 逐行看:前两行是主图过滤条件,Price 默认取收盘价,Trend_lev 默认 2 级,用来判定大一级趋势方向。 中间 7 行是四周期 RSI 箭头的配置,周期分别设为 7 / 12 / 18 / 32,加权价(PRICE_WEIGHTED)作计算源;超买线 62、超卖线 38,比传统 70/30 更贴近震荡市触发频率。 最后一行 UseTrailing 默认 false,说明这套参数出厂不开启尾随止损,真要跑实盘的外汇或贵金属,建议先在策略测试器里手动打开比对回撤,这类品种杠杆高、滑点大,参数盲用可能放大亏损概率。

MQL5 / C++
input ENUM_APPLIED_PRICE   Price=PRICE_CLOSE;                    class=class="str">"cmt">//应用价格
input class="type">class="kw">double                Trend_lev=class="num">2;                            class=class="str">"cmt">//趋势级别
class=class="str">"cmt">//--- x4period_rsi_arrows 指标参数
input class="type">uint                  RSIperiod1=class="num">7;                           class=class="str">"cmt">//RSI_1 的周期
input class="type">uint                  RSIperiod2=class="num">12;                          class=class="str">"cmt">//RSI_2 的周期
input class="type">uint                  RSIperiod3=class="num">18;                          class=class="str">"cmt">//RSI_3 的周期
input class="type">uint                  RSIperiod4=class="num">32;                          class=class="str">"cmt">//RSI_4 的周期
input ENUM_APPLIED_PRICE    Applied_price=PRICE_WEIGHTED;           class=class="str">"cmt">//应用价格
input class="type">uint                  rsiUpperTrigger=class="num">62;                    class=class="str">"cmt">//超买级别
input class="type">uint                  rsiLowerTrigger=class="num">38;                    class=class="str">"cmt">//超卖级别
class=class="str">"cmt">//--- 尾随停止参数
input class="type">bool                  UseTrailing=false;                     class=class="str">"cmt">//使用尾随停止

◍ 通道边界用收盘价更抗尖峰

把 Donchian 通道边界从最高/最低价改成 CLOSE_HIGH_LOW(收盘价)后,EURUSD 上的回测表现更好。直接原因很具体:该货币对的价格尖峰常以长影线呈现,用极值算通道会被这些影线拉歪边界,而收盘价序列的倾向更客观,不容易被单根针状 K 线带偏。 时间帧上别迷信日线,实测最佳区间落在 M30 到 H1;周期参数在 10–20 根蜡烛条内有效,再长反而钝化。期货市场同逻辑下结果优于外汇,但外汇/贵金属本身杠杆高、滑点跳空频繁,任何通道突破信号都只是概率倾向,实盘前务必在 MT5 用策略测试器按品种重跑。 想快速验证,把通道算法从 iHigh/iLow 换成收盘价数组再跑一遍 EURUSD 的 M30,重点看尖峰日的边界偏移量,会比纸面结论直观得多。

「把打包文件塞进终端根目录」

随文附带的 MQL5.zip 约 625.3 KB,里面按功能分好了文件夹:专家系统 DonchianExpert.mq5 组合了基于 Donchian 通道的 4 种策略;另有 DonchianUI.mqh、TradeFunctions.mqh、Trailing.mqh 三个类库,以及 average_speed、donchian_channels_system、x4period_rsi_arrows 三个指标。 部署时要把压缩包里的 MQL5 文件夹整体覆盖到 MT5 终端根目录(通常是 Terminal 安装路径下),否则 EA 找不到 EasyAndFastGUI 图形库会直接编译失败。 评论区有人反馈在新版编译器下报 'iLow' - 覆盖系统函数、TrailingStop 返回类型冲突等错,说明这套代码是按旧版 MQL5 写的。若你用当前 MT5 build 跑不起来,优先注释掉 Trailing.mqh 里自写的 iHigh/iLow 改用系统函数,外汇与贵金属波动剧烈,实盘前务必先在策略测试器验证。

GUI 控件资源与编译告警的实锤清单

在 MT5 里做自定义面板时,EasyAndFastGUI 这套控件库会把几十个 bmp 图标编译进 ex5,路径统一挂在 ::Images\EasyAndFastGUI\ 下。上面这段记录里,光 Controls 目录就登记了 40 余个箭头、单选框、复选框、指针与日历图标,另外 Icons 目录补了 8 个 16px 与 64px 的系统风格位图,例如 folder_w10.bmpno_image.bmp。 编译期有 4 处硬告警值得留意:SORT_ASCEND 在 Table.mqh 的 220 行与 1686 行、CanvasTable.mqh 的 309 行与 1633 行被报「不能使用不适当的枚举器」。这说明旧版枚举在新头文件里可能已被重命名或作用域收紧,直接拿老代码编译会卡在这两个文件。 开 MT5 验证时,先把 #resource 声明的 bmp 按上述子目录放稳,再全局搜 SORT_ASCEND 看是否改成了 SORT_TYPE_ASCEND 之类。外汇与贵金属 EA 界面卡死往往源于资源缺失而非逻辑错,这类 GUI 报错在回测中不会暴露,只在实盘加载面板时才爆。

◍ 编译告警里的重载歧义与枚举旧名映射

在 MT5 自定义控件库(EasyAndFastGUI 一类)的编译输出里,Trailing.mqh 从第 278 行起集中报出 iLow / iHigh 的“模糊调用”。编译器提示同一参数签名 double iLow(const string,ENUM_TIMEFRAMES,int) 与项目内自定义的 double iLow(string,ENUM_TIMEFRAMES,int) 撞车,278、287、299–303、317–321 等多行都命中,说明追踪止损模块大量直接用了内置序列函数名,又自己重载了一版,链接阶段只能二选一。 Table.mqh 与 CanvasTable.mqh 里反复出现 ENUM_SORT_MODE::SORT_ASCEND 被隐式转成 SORT_ASCENDINGSORT_DESCEND 转成 SORT_DESCENDING 的告警,涉及 275、975、1070–1073、1081、1703、1711、444 等行。这是老代码用了枚举旧拼写,新编译器自动映射,不影响运行但会刷屏。 MenuItem.mqh 228 行报 method 未声明标识符,ChartCanvas.mqh 129 行有“expression not boolean”,属于控件事件回调里漏了头文件或判断写错类型。开 MT5 把这几行对应库文件搜一遍,优先把 iLow/iHigh 调用显式写成 ::iLow(...) 或改自定义函数名,能直接消掉大部分模糊调用告警。 外汇与贵金属 EA 加载这类 GUI 库时,编译告警虽不阻断加载,但重载歧义可能让止损取价偏向内置实现,实盘前务必在策略测试器用历史数据跑一遍验证取价逻辑。

「编译告警里的枚举旧名该这么清」

在 CanvasTable.mqh 的 1050、1360、1361、1363、1650、1658、2204 行,编译器反复提示同一类问题:旧的 SORT_ASCEND / SORT_DESCEND 写法会被自动替换为 SORT_ASCENDING / SORT_DESCENDING,同时伴随 ENUM_SORT_MODE 的隐式转换告警。整段编译结果落在 28 个错误、25 个警告,说明头文件里枚举常量命名已过时需要手动对齐。 直接把代码里所有 ENUM_SORT_MODE::SORT_ASCEND 改成 ENUM_SORT_MODE::SORT_ASCENDINGSORT_DESCEND 改成 SORT_DESCENDING,可消掉大部分隐式转换提示;若仍报错,检查是否有人把枚举重命名为 ENUM_SORT_MODE_ 后未同步引用点。 下面这段被注释的低价高价取数写法,虽不在告警列表里,但能帮你绕开重复 Copy 调用的开销,开 MT5 后取消注释即可测: //double iLow(string symbol,ENUM_TIMEFRAMES tf,int index) // 若 index<0 直接返 -1;用 CopyLow 取 1 根 K 线低价入 Arr,成功返 Arr[0] 否则 -1 //double iHigh(string symbol,ENUM_TIMEFRAMES tf,int index) // 逻辑同 iLow,只是换成 CopyHigh 取高价

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//||
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//class="type">class="kw">double iLow(class="type">class="kw">string symbol,ENUM_TIMEFRAMES tf,class="type">int index)
class=class="str">"cmt">// {
class=class="str">"cmt">// if(index < class="num">0) class="kw">return(-class="num">1);
class=class="str">"cmt">// class="type">class="kw">double Arr[];
class=class="str">"cmt">// if(CopyLow(symbol,tf, index, class="num">1, Arr)>class="num">0) class="kw">return(Arr[class="num">0]);
class=class="str">"cmt">// else class="kw">return(-class="num">1);
class=class="str">"cmt">// }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//||
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//class="type">class="kw">double iHigh(class="type">class="kw">string symbol,ENUM_TIMEFRAMES tf,class="type">int index)
class=class="str">"cmt">// {
class=class="str">"cmt">// if(index < class="num">0) class="kw">return(-class="num">1);
class=class="str">"cmt">// class="type">class="kw">double Arr[];
class=class="str">"cmt">// if(CopyHigh(symbol,tf, index, class="num">1, Arr)>class="num">0) class="kw">return(Arr[class="num">0]);
class=class="str">"cmt">// else class="kw">return(-class="num">1);
class=class="str">"cmt">// }
把回测巡检交给小布盯盘
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到通道突破与趋势指标背离的实时标注,你只管判断该不该跟。

常见问题

在慢速趋势里用收盘价参与上边界平均,能削掉部分影线毛刺,假突破概率倾向降低,但信号会稍滞后。
可以,小布盯盘品种页已内置通道突破叠加趋势过滤的视图,不需自己写指标即可观察信号质量。
通道只反映 N 根 K 线的高低区间,无方向偏好;趋势指标提供惯性参照,两者结合可过滤红色区域里的回撤假动作。
贵金属高波动时段滑点可能侵蚀边界单收益,可把极值类型换为含开盘价平均,或把通道位移调为正值缓冲。外汇贵金属属高风险,参数须自己压测。