MT5净持仓账户与锁仓账户的操作差异,交流

一般17.5
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
lily922
lily922 楼主 昨天 11:14 浏览 115 回复 3 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 4 帖数 14 积分 1030 汇币 533
1楼
之前一直以为MT5的净持仓和锁仓只是叫法不同,直到上个月帮一个做欧美和黄金的朋友排查EA报错,才发现这两个账户模式在底层逻辑上根本是两套东西。他的EA在净持仓账户上跑得好好的,换到锁仓账户直接乱套,同一时间下了两单欧美多单,结果合并成一单不说,止盈止损全乱位了。折腾了整整两天才搞明白问题出在哪。今天就把这个坑掰开揉碎讲清楚,尤其是EA开发者,这块不搞明白,回测和实盘能差出十万八千里。
先抛核心问题:为什么同一个EA代码,在净持仓账户和锁仓账户上跑出来的结果完全不同?根子在于两种模式对“持仓”的定义完全不一样。净持仓模式(Netting)下,同一个交易品种只能有一个持仓方向,你下第二单同方向的欧美多单,系统不会新开一单,而是把两单合并,加权计算开仓均价,手数累加。而锁仓模式(Hedging)下,同一个品种可以同时持有多单和空单,每一单都是独立的,有各自的Ticket号、开仓价、止盈止损。这个差异直接导致EA在读取持仓数据、计算盈亏、执行平仓时逻辑完全不同。
我第一次踩坑是在写一个黄金的网格EA时。当时在净持仓账户上测试,代码里用OrdersTotal()判断持仓数量,逻辑是“没有持仓就开新单”。跑得挺顺,但换到锁仓账户后,EA疯狂开单,因为OrdersTotal()返回的是订单总数,而锁仓模式下每一单都独立计数。更坑的是,我用OrderClose()平仓时只传了Ticket号,在净持仓模式下没问题,但在锁仓模式下如果Ticket号传错,平掉的是另一单,止盈止损全乱。后来改成用PositionSelect()和PositionGetInteger()来读取持仓,再用PositionClose()平仓,才把逻辑理顺。这里提醒一下,MT5的Position和Order是两个概念,净持仓模式下Position是合并后的结果,锁仓模式下Position和Order基本一一对应,写EA时千万别混用。
具体到操作层面,如果你是从MT4转过来的,或者要同时维护两种账户的EA,我的建议是分三步走:
  • 第一步,先判断账户模式。用AccountInfoInteger(ACCOUNT_MARGIN_MODE)读取,返回ACCOUNT_MARGIN_MODE_RETAIL_NETTING就是净持仓,返回ACCOUNT_MARGIN_MODE_RETAIL_HEDGING就是锁仓。这个判断一定要写在EA初始化里,后面所有持仓逻辑都根据这个分支走。

  • 第二步,统一持仓读取接口。净持仓模式下用PositionsTotal()遍历,锁仓模式下用OrdersTotal()遍历,但更稳妥的做法是封装一个函数,根据账户模式返回持仓列表。我自己的EA里写了一个GetPositions(),内部自动判断,这样上层逻辑不用改。

  • 第三步,平仓逻辑要区分。净持仓模式下,平仓用PositionClose(),传Ticket号即可;锁仓模式下,如果要对冲,需要单独开反向单,平仓时用OrderClose()或者PositionClose()都可以,但要注意锁仓模式下平掉多单不会自动平空单,得手动处理。

还有一个容易被忽略的坑:锁仓账户的保证金计算方式不同。净持仓模式下,同品种多空合并后只占用一份保证金;锁仓模式下,多空两单分别占用保证金,如果杠杆比是1:100,锁仓后保证金直接翻倍。我之前跑一个欧美对冲策略,在净持仓账户上保证金充足,换到锁仓账户后直接爆仓,就是因为没算这个。所以如果你要做对冲,锁仓账户的可用保证金要按双倍预留,不然行情波动大一点就扛不住。
最后说下VPS部署时的注意事项。如果你同时跑多个EA,净持仓账户下不同EA操作同一品种会互相干扰,因为持仓是共享的;锁仓账户下各EA的持仓相对独立,但订单数量会暴涨,对VPS的CPU和内存要求更高。我现在的做法是,净持仓账户只跑一个主EA,锁仓账户可以跑多个策略,但每个策略用MagicNumber区分,避免误平。另外,MT5的锁仓账户在部分经纪商那里有持仓数量上限,比如最多200单,超过就开不了新仓,这个在EA里要加个判断,不然跑到一半突然开不了单,排查起来很头疼。
你们在净持仓和锁仓账户上还遇到过哪些奇葩问题?尤其是EA报错或者回测结果对不上的,回帖交流,我看看能不能一起排查。

补充个小细节:MT5里净持仓账户其实还能手动切换成锁仓模式,但反过来不行,开户前一定先问清楚,不然EA逻辑得重写。
0 回复 众裁0 复制
#1
MeadowSage
MeadowSage #4· 昨天 14:00
4楼
PositionClose和OrderClose混用这点确实容易翻车,我后来统一封装了个平仓函数,先PositionSelect确认持仓再走PositionClose。另外锁仓账户里对冲单的止盈止损得分开挂,不然容易互相触发。
赞 回复 众裁0 复制
昨天 14:00 #4
晚风拾光
晚风拾光 #3· 昨天 14:00
3楼
净持仓合并同向单这点确实关键,我写欧美EA也改过PositionSelect。锁仓下的Ticket独立计数,回测得手动切模式。
赞 回复 众裁0 复制
昨天 14:00 #3
FreshAirb
FreshAirb #2· 昨天 11:45
2楼
净持仓和锁仓这块我也栽过,写黄金网格EA时用OrdersTotal()判断开仓,换锁仓账户直接爆单。后来改用PositionSelect读持仓才理清。顺便说下平仓最好用PositionClose,别混OrderClose,Ticket号一错就平错单,止损全乱。
赞 回复 众裁0 复制
昨天 11:45 #2
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 第三方EA的安全性检查方法,我踩过的坑和解决方案 下一帖 → VPS晚高峰延迟波动正常吗,有人遇到过吗?