MQL5自动化交易策略(第十八部分):基于包络线趋势反弹的剥头皮交易核心架构与信号生成(1)(基础篇)
「包络线剥头皮的信号骨架怎么搭」
在 MT5 里做包络线(Envelopes)趋势反弹剥头皮,第一件事是把指标层和信号层拆开。包络线本质是在移动平均线上下各画一个固定百分比通道,价格触碰上轨或下轨时,视为短期偏离均值,倾向回归。
原文给出的基础架构里,信号生成依赖对 iEnvelopes 句柄的取值和边界判断。以 20 日 MA、偏差 0.2% 为例,价格刺穿上轨后收线回到通道内,才记为一次潜在做空触发;下轨反之。这种过滤能砍掉一部分假突破噪音。
在 2026 年 2 月发布的示例工程中,作者标注该裸信号逻辑在 EURUSD M5 上回测 864 根样本棒线,未加风控时信号次数偏多但胜率未给绝对值——你开 MT5 用策略测试器跑同一周期,能直接复现这个样本量级的触发密度。外汇与贵金属杠杆高,信号仅作概率参考,实盘须自加止损。
◍ 从网格马丁切到包络线反弹
上一阶段我们已经把网格马丁剥头皮策略跑通了自动化,还接了动态看板做实时监控。这一节起手换赛道:在 MQL5 里搭一套包络线趋势反弹剥头皮 EA 的骨架,先把信号怎么来这件事说清楚。 本篇覆盖四块:策略逻辑本身、MQL5 里的具体落地、回测怎么跑、以及阶段性结论。做完这一步,你能在 MT5 里加载一个只吐信号不下单的 EA,为后面接交易执行留好接口。外汇与贵金属剥头皮本身杠杆高、滑点敏感,信号再漂亮也只代表概率倾向,不等于稳。
包络线轨道如何给出剥头皮信号
包络线指标在一条移动平均线上下各偏移固定百分比,常见偏差区间 0.1%–1.4%,上下轨构成价格反转的参考边界。它的逻辑很直接:上升趋势里价格回踩下轨,视为买入触发;下降趋势里价格反抽上轨,视为卖出触发。 信号不能裸用,需用趋势过滤器二次确认。实战中常用 200 周期指数移动平均线(EMA200)判定大方向,或用 8 周期 RSI 过滤逆势单。外汇与贵金属属高杠杆品种,震荡市中这类触轨信号假突破概率明显偏高,必须配合风控。 我们打算把这套逻辑写成 MT5 程序:先初始化包络线与趋势指标,再检测价格与轨道的交互,最后做信号验证与下单筛选。模块化函数负责计算触碰关系,限制最大交易频率、要求多重确认,才能在高频剥头皮里保持执行的稳定性。
「MT5 里把剥头皮框架的骨架搭起来」
开 MetaEditor,在导航器 Experts 目录下新建 EA 文件,第一步不是写逻辑,而是把贯穿全程的全局变量和输入参数先声明好。引入 Trade.mqh 处理下单,输入参数里 MagicNumber 默认 123456789、MaxDeviationSlippage 默认 10、UnitsOneLot 默认 100000、PipPoint 默认 0.0001,这几个值直接决定后续手数换算和滑点容差,开 MT5 后建议先手动改 MagicNumber 避免和别的 EA 撞车。 为让订单处理和数据获取更干净,程序定义了 OP_BUY=0、OP_SELL=1 以及 MODE_BID=9、MODE_ASK=10 等常量,配合 CharToString、DoubleToString 宏做类型转换;枚举上用了 ORDER_GROUP_TYPE(Single=1、SymbolOrderType=2)、ORDER_PROFIT_CALCULATION_TYPE(Pips=1、Money=2)和 CRUD(Created=1、Updated=2)来规范订单分类与状态。这套定义看着啰嗦,但能让信号模块后期直接复用,不用来回改硬代码。 数据获取层写了几个实用函数:CopyBufferOneValue 按句柄+缓冲区索引+偏移取单值,失败返 EMPTY_VALUE;Ask_LibFunc / Bid_LibFunc 用 MqlTick 和 SymbolInfoTick 拿实时报价;AccountEquity_LibFunc / AccountFreeMargin_LibFunc 走 AccountInfoDouble 取净值和闲余保证金;MarketInfo_LibFunc 用 switch 接 MODE_ 常量返点差、合约规模或隔夜息,不支持的类型返 0。想验证就随便挂个指标句柄调 CopyBufferOneValue,看返值是不是和指标窗口数值对得上。 架构上用 IFunction 接口定 GetValue / Evaluate / Init 标准,DoubleFunction 管循环缓冲区 _values 和 _zeroIndex,AskFunction / BidFunction 继承后各自返卖买价;全局指针 AskFunc、BidFunc 供全局调。订单侧 Order 类封装 Ticket、Type、Lots、OpenPrice、StopLoss、TakeProfit 等,CalculateProfitPips 靠 PipPoint 和 UnitsOneLot 算点值盈利,SplitOrder 管部分平仓,Paint 画 TP/SL 线。OrderRepository 用 CTrade 发 MqlTradeRequest 下单,GetOpenOrders 按 MagicNumber、Type、SymbolCode 过滤持仓和挂单——外汇和贵金属波动剧烈、杠杆高风险大,这类自动下单逻辑在真仓前务必用策略测试器跑历史数据确认。 订单分组用 OrderGroupHashMap 哈希表,私有 _hashSlots 存分类数、_resizeThreshold 控扩容、_buckets 装 OrderGroupHashEntry 链表;公共 Put / Get / DeleteKeysExcept 等能按 key 增删查分组,DeleteKeysExcept 可保留指定组清掉其余,对多符号剥头皮的订单归类很实用。到此交易状态还缺个专门管理的类,骨架才算齐。
◍ 用 Wallet 与 EA 基类搭出剥头皮订单骨架
管理剥头皮策略的订单状态,核心是先有一个能记住已开、挂单与平仓结果的容器。这里用 Wallet 类承接这件事:全局数组 LastOrderResults 以 1 代表盈利、0 代表亏损,私有变量跟踪买卖开仓数、平仓数与上一根 K 线时间,并持有 OrderCollection 与 OrderGroupHashMap 指针做符号分组。 构造函数把计数器清零、集合实例化,析构函数释放动态对象;HandleTick 借 iTime 识别新 K 线来刷新近期平仓集合,AreOrdersBeingOpened 与 AreOrdersBeingClosed 则用来判断有无待执行单。LoadOrdersFromBroker 通过 OrderRepository 拉取经纪商端订单,是回测与实盘对齐的基础。 EA 类继承 ITrader 接口,私有成员 _firstTick 与 _wallet 分别控制首 tick 与订单容器。Init 里用 MQLInfoInteger 判定.demo/实盘/可视化模式,并调用 _wallet.LoadOrdersFromBroker;HandleTick 的顺序是同步订单、可选同步手动 TP/SL、刷新 Ask/Bid、更新订单、执行待平与待开,最后清 _firstTick。 初始化阶段 OnInit 顺手把图表刷成白底红绿蜡烛,并挂了三条均线(M30 的 SMA14、M30 的 SMA9、M1 的 EMA200)与 RSI8(M1)、Envelopes 两通道(M1 周期95偏差1.4%、M1 周期150偏差0.1%)。任一指标句柄失败就返回 -1,避免空跑。 外汇与贵金属剥头皮属高风险玩法,这套架构只是把订单生命周期管清楚,并不预示任何收益;下一步应在 MT5 策略测试器里回放,确认 OnInit 后 Wallet 已加载经纪商订单且图表指标句柄非零。
class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Envelopes Trend Bounce Scalping Strategy EA | class=class="str">"cmt">//| Copyright class="num">2025, Allan Munene Mutiiria. | class=class="str">"cmt">//| https://t.me/Forex_Algo_Trader | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#class="kw">property copyright "Copyright class="num">2025, Allan Munene Mutiiria." class="macro">#class="kw">property link "https:class=class="str">"cmt">//t.me/Forex_Algo_Trader" class="macro">#class="kw">property version "class="num">1.00"
把交易参数先钉死再谈逻辑
EA 跑起来之前,先把编译与交易基础设施的开关定清楚,比急着写信号函数更重要。下面这段头文件级别的声明,决定了订单怎么发、出错怎么通知、点值怎么算。 #property strict 强制开启严格编译,能提前暴露类型不匹配和未声明变量,少踩 MQL5 的隐式转换坑。#include <Trade\Trade.mqh> 把官方交易库挂进来,后续下单、改仓、查持仓都靠它。 input 字段是你在 MT5 属性框里能直接改的:MagicNumber=123456789 给本 EA 订单打唯一标签,避免和手动单或其他 EA 单混淆;MaxDeviationSlippage=10 限定最大滑点 10 点,外汇与贵金属波动剧烈时滑点可能突破此值导致拒单,属高风险环节。 PipPoint 默认 0.0001 对应 4 位报价品种,若做 XAUUSD 这类 2 位报价,PipPointOverride 留 0 让程序自动识别更稳。OrderFillingType 和 AccountMarginMode 初始为 -1,运行时再按经纪商返回 FOK/IOC 或净仓/对冲模式,写死反而容易在跨账户时出错。 EmailOnError=true 而 AlertOnError=false 是个实用取舍:后台跑黄金 EA 时,邮件比弹窗更不容易漏,但你要先去 MT5 选项里配好 SMTP,否则报错只会静默消失。
class="macro">#class="kw">property strict class=class="str">"cmt">//--- Enable strict compilation for MQL5 compatibility class=class="str">"cmt">//--- Include trade operations library class="macro">#include <Trade\Trade.mqh> class=class="str">"cmt">//--- Import MQL5 trade functions for order execution class=class="str">"cmt">//--- Input parameters for user configuration class="kw">input class="type">class="kw">string OrderComment = __FILE__; class=class="str">"cmt">// Comment to orders class="kw">input class="type">int MagicNumber = class="num">123456789; class=class="str">"cmt">// Unique identifier for EA orders class="type">class="kw">double PipPointOverride = class="num">0; class=class="str">"cmt">//--- Override pip point value manually(class="num">0 for auto-detection) class="kw">input class="type">int MaxDeviationSlippage = class="num">10; class=class="str">"cmt">//--- Set maximum slippage in points for trades class="type">bool AllowManualTPSLChanges = true; class=class="str">"cmt">//--- Permit manual adjustment of TP and SL lines on chart class="type">bool OneQuotePerBar = false; class=class="str">"cmt">//--- Process only first tick per bar if true to limit trades class="type">bool AlertOnError = false; class=class="str">"cmt">//--- Trigger MetaTrader alerts for errors class="type">bool NotificationOnError = false; class=class="str">"cmt">//--- Send push notifications for errors class="type">bool EmailOnError = true; class=class="str">"cmt">//--- Send email notifications for errors class="type">bool DisplayOnChartError = true; class=class="str">"cmt">//--- Show error messages on chart class="type">bool DisplayOrderInfo = false; class=class="str">"cmt">//--- Show order details on chart if enabled ENUM_TIMEFRAMES DisplayOrderDuringTimeframe = PERIOD_M1; class=class="str">"cmt">//--- Set timeframe for order info display(class="kw">default: M1) class="kw">input class="type">class="kw">string CComment = __FILE__; class=class="str">"cmt">//--- Add secondary comment(class="kw">default: file name) class=class="str">"cmt">//--- Global variables for EA functionality class="type">class="kw">double PipPoint = class="num">0.0001; class=class="str">"cmt">//--- Initialize pip point(class="kw">default for class="num">4-digit symbols) class="type">uint OrderFillingType = -class="num">1; class=class="str">"cmt">//--- Store order filling type(FOK, IOC, or Return) class="type">uint AccountMarginMode = -class="num">1; class=class="str">"cmt">//--- Store account margin mode(Netting or Hedging)