首页 > 博客 > 部分平仓与移动止损并用:容易出错的环节与自查清单

MQL5EA开发

部分平仓与移动止损并用:容易出错的环节与自查清单

发布日: 2026-11-11阅读时间:约 4 分钟
⏱ 本文为发布之日的信息。EA的业绩数值(PF、DD、年化)会随实盘运行与重新验证而变动,最新数值请在各EA页面确认。 查看最新EA业绩 →
目录 (5)
  1. 结论:出问题的往往不是逻辑,而是“状态的传递”
  2. 为什么并用时容易出问题
  3. 剩余仓位不能依赖EA的“记忆”
  4. 手数要“向下取整”,而不是“四舍五入”
  5. SL的写入要在最后统一一次完成
  6. 实现与检查清单
  7. 局限与注意事项
  8. 总结

结论:出问题的往往不是逻辑,而是“状态的传递”

部分平仓和移动止损,单独实现都不难。问题出在把两者同时作用于同一个持仓时。根据我们的开发经验,问题几乎都集中在以下3处:

  1. 剩余仓位管理:EA记不住“是否已经部分平仓过”
  2. 手数步长:平仓手数不符合券商的最小手数或步长
  3. SL重设顺序:部分平仓、保本移动、移动止损三者互相覆盖

这几类问题在回测中很难暴露,往往要到实盘运行时才会发现。

推荐经纪商比较 →

🎁 免费下载EA

📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集

※ 严格保护隐私。可随时取消订阅。

为什么并用时容易出问题

剩余仓位不能依赖EA的“记忆”

在MT5中,部分平仓后持仓的订单号(ticket)不变,只有 POSITION_VOLUME 会减少。如果只用一个 bool 变量记录“已部分平仓”,那么EA重启、VPS重新连接、切换时间周期时,这个值都会丢失。随后的第一个tick,EA就会把剩下的仓位再平掉一半——这是典型的事故。

对此,我们的做法是用 HistorySelectByPosition() 回溯该持仓的成交历史,对比最初的建仓量与当前剩余量,据此判断部分平仓进行到哪一步。内存中的标志位只作为辅助。

手数要“向下取整”,而不是“四舍五入”

0.03手减半是0.015。在步长为0.01的账户上,四舍五入会平掉0.02手,比预期多出手。平仓手数应按 SYMBOL_VOLUME_STEP 向下取整,同时还要确认平仓后的剩余量不低于 SYMBOL_VOLUME_MIN。0.01手本来就无法拆分,必须在设计时明确是“不做部分平仓”还是“全部平仓”,否则EA会不断返回错误。

SL的写入要在最后统一一次完成

PositionModify() 是同时指定SL和TP的函数。如果移动止损处理给TP传入0,TP就会被清除。另外,如果部分平仓后把SL移到保本价的处理,与移动止损上移SL的处理在同一个tick里各自独立运行,后写入的一方会胜出。结果就是,已经上移到保本价的SL可能又被拉低。

我们采用的顺序如下:

  • 发送部分平仓指令 → 重新选中持仓并确认剩余量
  • 同时计算保本SL和移动止损SL两个候选值
  • 只朝“比当前SL更有利的一侧”移动(多单取较高值,空单取较低值)
  • 确认止损水平(Stop Level)和冻结水平(Freeze Level)后,TP重新传入当前值,只修改一次

实现与检查清单

检查项目出问题时的症状确认方法
是否根据成交历史判断部分平仓的阶段重启后重复部分平仓运行中重新挂载EA,观察剩余量变化
平仓手数是否按步长向下取整平仓量超出预期,或出现报错用最小手数建仓并查看日志
是否已决定最小手数时如何处理拆分每个tick都平仓失败用0.01手测试
SL是否不会退回到不利方向保本SL之后仍以亏损平仓在日志中按时间顺序追踪SL的变化
修改SL时是否清除了TP止盈不生效查看修改后持仓的TP栏
部分平仓失败时是否不移动SL剩余量与SL的前提不一致在临近休市等时段下单,制造失败情形
是否没有在净头寸(Netting)账户上运行与其他EA的持仓被合并确认账户类型

站在使用者的角度,最快捷的自查方法是:在模拟账户上用最小手数运行,中途重新挂载EA,看行为是否发生变化。设置的基本方法请参见 EA设置方法。

局限与注意事项

策略测试器中的成交是即时的,订单只成交一部分的情况也几乎不会出现。因此,与部分平仓相关的问题,在回测数据中几乎看不出来。实盘中的成交方式(Filling Mode)差异,以及重新报价时的行为,说实话只能逐个券商去验证。

另外,加入部分平仓并不意味着绩效就会变好。对于胜率较低、靠少数大额盈利支撑整体的趋势跟踪型策略(例如 DONCHIAN ENGINE,回测胜率为34.5%),在利润扩大的阶段减少仓位,可能会拉低期望值。盈亏波动虽然会变小,但代价是什么,必须逐个EA验证才能知道。我们自己也没有验证过所有的组合。

如果要自行给 DONCHIAN ENGINE 这类策略后加部分平仓,请注意原有的验证结果将不再完全适用。

总结

  • 部分平仓与移动止损并用时,容易出问题的不是逻辑,而是“状态的传递”
  • 部分平仓的阶段要根据成交历史和剩余量来判断,而不是内存中的标志位
  • 手数按步长向下取整,并确认剩余量不会低于最小手数
  • SL修改集中在一处完成,只朝有利方向移动,且不要清除TP
  • 回测中很难发现,所以要在模拟账户上做重新挂载测试
  • 部分平仓会让盈亏波动变小,但也可能拉低期望值

其他实现上的注意事项,也整理在 EA・MT5知识库 中。

📧 免费邮件课程(共 8 封)+ 订阅者专享 MT5 指标 13 款合集

※ 严格保护隐私。可随时取消订阅。

对EA或外汇有疑问吗?

可以在Nattzy交易论坛发帖提问(免费注册)。不限于本文内容,EA设置、经纪商选择等问题也欢迎。

在Nattzy提问 ↗

评论与提问