MQL4趋势捕捉:获利加仓风控术
用主辅订单与跟踪止损实现低风险趋势获利
策略背景与风险声明
本文介绍的算法由 Eryomin Sergey 在 MQL4 社区发表,核心思想是“获利交易的成交量积累”。作者明确警告:文中信息仅为个人见解,不诱导任何实盘使用,运用不当可能造成亏损。对中文交易者而言,这类策略属于典型的“手数梯度管理”思路,适合已有一定 EA 编写基础、希望理解趋势加仓机制的进阶用户。我们转载其逻辑并补充实操注解,但绝不代表保本承诺。
核心概念:主交易与辅交易
获利成交量积累的本质,是在趋势确认后逐步加大市场暴露,但单笔风险不同步放大。算法规定:第一笔为“主交易”,手数必须大于后续“辅交易”。例如主交易 0.2 手,辅交易统一 0.1 手。所有订单共用一个跟踪止损逻辑,但激活条件不同。主交易需盈利达到一定水平(默认 50 点)才启动追踪;辅交易从挂单成交那一刻起就处于追踪保护之下,且追踪止损位即为其最大容忍回撤。
这种结构让系统在价格回落时,主单已锁定部分浮盈,辅单即使被打损,总体仍可能净赚。作者强调:这里的风险不是本金亏损,而是“未赚到全部趋势利润”的机会成本。对于厌恶裸奔加仓的交易者,这是一种心理上更易接受的半防御型趋势跟随方案。
- 主交易:方向锚点,手数大,盈利后启动追踪
- 辅交易:梯度加仓,手数小,成交即追踪
- 共用终利目标 TP,但各单距离盈利位不同
- 辅单追踪水平同时是其硬止损线
算法工作流程详解
以买入方向为例。假设当前沽盘价(Ask)为主单入场价,TP=400 点,Open_Step=100 点,Lots1=0.2,Lots2=0.1。EA 会在图表上画上下两个箭头,删除其中一个即向剩余方向发信号。比如删向下箭头,EA 立刻以市价买入 0.2 手主单,并就地挂出三个买入止损单:Ask+100、Ask+200、Ask+300,各 0.1 手。所有订单 TP 均设在 Ask+400。
主单浮盈达 50 点后,跟踪止损激活,红线随价格上移;辅单自成交起就受 TrailingStop(默认 50 点)保护。若价格回撤,主单在+50 上方某点平仓,辅单在-50 相对其入场价处平仓。若趋势延续,辅单依次触发,整体仓位随趋势放大,但任意单笔最大回撤受限。主单若关闭,EA 删除剩余挂单,重新画箭头等待下一轮。
EA 实施机制与界面交互
配套 EA take_trend.mq4 脱胎于“方便的剥头皮交易”一文,但剔除了游戏功能。它不自动判断方向,而是把方向选择权交给人工:图表箭头即信号按钮。这种半自动设计利于训练盘感,也避免错向乱加仓。EA 内部通过 MagicNumber 区分主/辅订单,循环扫描 OrdersTotal 确认当前有无主单持仓,从而决定是否重画箭头。
代码中外盘参数 gap 控制箭头相对开盘价的偏移点数;TP、SL 为统一终利与初始止损(文中所算法未用 SL,仅占位);Lots1/Lots2 定义手数梯度;Open_Step 决定辅单密度。注意:原文 MQL4 代码片段在对象删除逻辑中使用 iBarShift 比对 K 线位移与价格,确保箭头只存活一根 K 线,防止信号重复。
extern int gap=20; //level at which arrows are placed extern int TP=400; //Take Profit level extern int SL=0; //Stop Loss level extern double Lots1=0.2; //lot of a main trade extern double Lots2=0.1; //lot of auxiliary trades extern int slippage=2; //level of acceptable requote extern int MagicNumber1=5345; //magic number of the main trade extern int MagicNumber2=4365; //magic number of auxiliary trades extern int Open_Step=100; //step for opening auxiliary trades extern bool UseTrailing = true; //enabling/disabling T-SL extern int TrailingStop = 50; //Trailing Stop Loss level extern int TrailingStep = 1; //Trailing Stop Loss step
参数含义与优化要点
下方列表对应原文对外参的说明,中文交易者调参时应遵循“波动越大、Step 越宽、T-SL 越松”的原则。例如 EURUSD 小时图平均波幅 80 点,Open_Step 设 100、TrailingStop 设 50 较合理;交叉盘如 GBPJPY 波幅大,Step 可升至 200,T-SL 至 100。终极目标 TP 不宜过小,否则加仓空间压缩,梯度优势消失。
- gap:箭头放置偏移点数,仅界面用
- TP:所有订单统一盈利目标(点)
- SL:初始止损,本文算法实际未依赖
- Lots1/Lots2:主/辅手数,须 Lot1> Lot2
- slippage:容许滑点
- MagicNumber1/2:主辅订单识别码
- Open_Step:辅单挂单间距
- UseTrailing:跟踪止损开关
- TrailingStop:追踪止损幅度
- TrailingStep:追踪步长
与其他加仓方案对比
传统马丁格尔在亏损后加倍手数,期望摊平但爆仓风险高;本文反其道而行,只在盈利后以更小手数叠加,属于“反马丁”的安全加仓。与金字塔加仓相比,它不要求人工逐级手动入场,而是由 EA 按步长自动挂单,纪律性更强。缺点在于:若主单未到激活 T-SL 前就反转,辅单虽小但集体挂在那里,占用保证金与潜在回撤仍不可忽视。
常见实施坑与规避
第一,MagicNumber 冲突:若图表同时加载其他 EA,须改主辅魔法数以免订单误判。第二,点值计算:外盘参数以“点”计,但部分券商小数点位不同(如日元对 0.01 为一跳),直接套用 50 点可能过小,应按 Point 常量换算。第三,挂单寿命:原代码箭头仅留一根 K 线,若你改长周期,需同步调整对象删除逻辑。第四,模拟测试必须包含滑点,否则实盘辅单成交价偏离让 T-SL 失效。
最后,作者重申:每个货币对必须独立优化 T-SL、TP 与 Open_Step;辅单打开水平务必大于 T-SL;主单手数建议大于辅单。只有这样,成交量积累才真正转化为“风险受控的利润堆叠”,而非赌博式暴露。
代码片段解析与迁移注意
提供的 MQL4 片段展示了订单扫描与箭头对象管理。start() 函数先遍历 OrdersTotal,用 OrderSelect + MagicNumber 过滤出当前品种主买单/卖单;随后比对“down”“up”对象的时间与价格,若旧 K 线或价移位则删除,保证信号新鲜。虽然原文为 MQL4,但思路可平移 MQL5:用 CTrade 下市价单与挂单,用 CSymbolInfo 取点值,用 OBJ_ARROW 重绘信号。中文用户若想在 MT5 重写,注意 MQL5 订单与持仓分离,需改查 PositionSelect 而非 OrderSelect 交易池。