5W USD账户一秒爆仓的原因-请问MQL5中标准函数库CTrade::PositionClose有一定几率不能正常平仓反而开启了大量的反向头寸

 

我使用PositionClose去关闭某一产品的头寸

经纪商并不支持反向头寸平仓

大部分时候工作是正常的,但是极少数情况下会开启反向头寸 

因为我是在无限循环中进行平仓

所以导致开启了上千个正向反向头寸 从而5W USD账户被commssion爆仓

这究竟是什么原因导致的

如何解决?

 
however98:

我使用PositionClose去关闭某一产品的头寸

经纪商并不支持反向头寸平仓(Exness)

大部分时候工作是正常的,但是极少数情况下会开启反向头寸 

因为我是在无限循环中进行平仓

所以导致开启了上千个正向反向头寸 从而5W USD账户被commssion爆仓

这究竟是什么原因导致的

如何解决?

这个不是标准库Ctrade的问题,应该是编程逻辑问题,建议代码由专业人员有经验的人编写,不然前期会出现很多漏洞和问题,这种损失太不值得~

 
Tiecheng Fu:

这个不是标准库Ctrade的问题,应该是编程逻辑问题,建议代码由专业人员有经验的人编写,不然前期会出现很多漏洞和问题,这种损失太不值得~

谢谢回复 但是代码很简单 只是平仓所有头寸 是不是用OrderSend能解决这个问题


CTrade是否完成了更多操作 比如平仓失败就会用反向头寸来平仓?

 
however98:

我使用PositionClose去关闭某一产品的头寸

经纪商并不支持反向头寸平仓(Exness)

大部分时候工作是正常的,但是极少数情况下会开启反向头寸 

因为我是在无限循环中进行平仓

所以导致开启了上千个正向反向头寸 从而5W USD账户被commssion爆仓

这究竟是什么原因导致的

如何解决?

不可能的。positionClose不背这个锅。
 
你这个教训有点大啊,经验不足!

MT5的平仓机制是开一个反向单来平仓,这个反向单子有时候会以一闪而过的速度呈现在你的持仓列表中,大多数时候看不见但不代表它不存在,EA肯定能抓到它。

而你恰好又用了while死循环来平仓,想想执行过程:平多单时则开了个空单,然后这个空单被EA统计到了,于是平该空单则又开了个多单,然后又要平这个多单于是再开个空单......

结果就是while循环无法结束,一直反复多空开仓平仓,直到账号资金耗尽。

尽量不要在平仓模块使用while死循环,除非你有能力处理好订单。
 
however98:

我使用PositionClose去关闭某一产品的头寸

经纪商并不支持反向头寸平仓(Exness)

大部分时候工作是正常的,但是极少数情况下会开启反向头寸 

因为我是在无限循环中进行平仓

所以导致开启了上千个正向反向头寸 从而5W USD账户被commssion爆仓

这究竟是什么原因导致的

如何解决?

加一个校验,本机EA跟服务器通讯,如果服务器不能及时处理指令,会产生积累,所以在EA中,每发出一个开仓,或者平仓指令,要检测仓位是否发生了变化,如果仓位没有变化,要延时等待,直到该指令被服务器响应。

在流动性不足的情况下,极易产生你所描述的情况。
 
however98:

我使用PositionClose去关闭某一产品的头寸

经纪商并不支持反向头寸平仓(Exness)

大部分时候工作是正常的,但是极少数情况下会开启反向头寸 

因为我是在无限循环中进行平仓

所以导致开启了上千个正向反向头寸 从而5W USD账户被commssion爆仓

这究竟是什么原因导致的

如何解决?

这种情况我也遇见过,不论是MT4还是MT5都发生过!幸好我每次开仓都停顿几秒钟并检测服务器返回代码,用苹果手机(这是唯一的可以在全球网络无障碍接收)ID瞬时接收代码,如果手机响个不停,那肯定是出错了!!!立马登陆远程服务器进行手动干预从而防止了爆仓!!!现在已经改进EA了,每个新柱只检测一次开仓条件!!!如果开仓条件满足就发送开仓指令并且每次都必须检测服务器返回代码,如果服务器不是返回成功代码,那就停顿几秒后再循环重试!记住这里的循环也必须只是一个新柱条件里的一次重试循环!如果重试几次都没有成功比如No Price!那就开挂单!!!这样新柱就不会无限开仓!但是这样每次就只会开一个仓位:市价单或者挂单!这样虽然每次只会开一个仓位,但是还可以在仓位大小上进行风险计算管理,同样也可以在仓位单一的情况下达到多仓位的效果!这是开仓情况,至于平仓就好办多了!祝你好运!
 
hbsbill:
这种情况我也遇见过,不论是MT4还是MT5都发生过!幸好我每次开仓都停顿几秒钟并检测服务器返回代码,用苹果手机(这是唯一的可以在全球网络无障碍接收)ID瞬时接收代码,如果手机响个不停,那肯定是出错了!!!立马登陆远程服务器进行手动干预从而防止了爆仓!!!现在已经改进EA了,每个新柱只检测一次开仓条件!!!如果开仓条件满足就发送开仓指令并且每次都必须检测服务器返回代码,如果服务器不是返回成功代码,那就停顿几秒后再循环重试!记住这里的循环也必须只是一个新柱条件里的一次重试循环!如果重试几次都没有成功比如No Price!那就开挂单!!!这样新柱就不会无限开仓!但是这样每次就只会开一个仓位:市价单或者挂单!这样虽然每次只会开一个仓位,但是还可以在仓位大小上进行风险计算管理,同样也可以在仓位单一的情况下达到多仓位的效果!这是开仓情况,至于平仓就好办多了!祝你好运!

学习编程初期容易犯这种控单问题,大多数情况都是经验不足,考虑不周,有逻辑漏洞,没有经过demo检验测试而直接上真实账户交易导致~。

 

我觉得  平仓最好指定单号 POSITION_TICKET

参考文档中关于也有提示:PositionClose(...) 方法并不意味着总是成功执行交易操作。有必要检查交易请求的结果 (交易服务器返回码), 使用 ResultRetcode() 获取。

论坛中有一帖子也可参阅  https://www.mql5.com/zh/forum/375919

征得高手付费给予的MT5交易函数分享出来,还有需要完善的地方么?敬请指点,谢谢!
征得高手付费给予的MT5交易函数分享出来,还有需要完善的地方么?敬请指点,谢谢!
  • 2021.08.19
  • www.mql5.com
EA和自动交易: 征得高手付费给予的MT5交易函数分享出来,还有需要完善的地方么?敬请指点,谢谢!
 
MT5 平仓会有一个瞬间产生的反向单,那个瞬间反向单用 PositionSelectByTicket 是可以判断排除的,因为那个瞬间反向单不是一个 position。如果还是有顾虑,可以在平仓前把要平仓订单的 ticket # 累积做一个数组,然后只针对那个数组的订单号作平仓,应该就不会有任何 side effect 了。
 
我也是遇到楼主的问题,一秒爆仓搞得我怀疑人生!楼主解决没有啊?我在想有没有这种可能,市场变化太快或交易服务器卡顿延时,PositionClose发出后未成功执行,EA会继续发送PositionClose,因为没有写 PositionClose

检查交易请求的结果的代码,并根据结果处理订单,导致每个tick都发送 PositionClose直到账户可用余额不足,市场方向不对加上累积的手续费就会符合强制平仓条件,最终爆仓!希望有大神来指点迷津,怎么写这个代码,谢谢。

PositionClose