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

 
Xiaojian Ding #:
我也是遇到楼主的问题,一秒爆仓搞得我怀疑人生!楼主解决没有啊?我在想有没有这种可能,市场变化太快或交易服务器卡顿延时,PositionClose发出后未成功执行,EA会继续发送PositionClose,因为没有写 PositionClose

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

PositionClose

用for循环,不要用while,每次循环都加上对ordersend的返回代码检验
 
Blur Darkness #:
用for循环,不要用while,每次循环都加上对ordersend的返回代码检验

能详细点吗?我看网上的原因是平仓时PositionClose (...)不建议用symbol传参,我的代码改为下面这个,还有什么改进的吗?

for(int i=PositionsTotal()-1; i>=0; i--)
{
   ulong Positionticket = PositionGetTicket(i);
   if(Positionticket>0 && _Symbol==PositionGetString(POSITION_SYMBOL) && PositionGetInteger(POSITION_MAGIC)==magic)
   {
      if(!trade.PositionClose(Positionticket))
      {
         //--- 报错信息
         Print("平仓失败. 代码=",trade.ResultRetcode(),". 错误内容: ",trade.ResultRetcodeDescription());
         Print("magic=",PositionGetInteger(POSITION_MAGIC),". 订单: ",Positionticket);
      }
      else
      {
         Print("平仓成功. 代码=",trade.ResultRetcode()," (",trade.ResultRetcodeDescription(),")");
      }
   }
}
 

如图

 
int GUARD_ACC::listOrders(void)
   {
   hold_orders=PositionsTotal(); // 持仓总数 > 0
   return hold_orders;
   }

获得持仓单总数,再做下一步。

可以控制手头有多少单。

开不开新仓。

 

昨天测试时,也发现了一个逻辑上的 Bug

如果以挂单方式开仓,每次执行都会增加一张挂单,因为挂单不存在执行失败情况,也不检查重复下单。

可能产生几千张挂单。

 

我也是无限平,没有出现这个问题,最好还是放自己代码上来看看

我是不用代码库的,逻辑太混乱,各种类和函数跳来跳去完全没有必要,他们写的类库因为要考虑所有情况所以写的很复杂,自己写一个简单的交易类封装起来就好