MQL5代码问题:刚学代码,整了好几天不知道为什么运行不正常,请老师指点。 到达激活点开始追踪止损,回撤触及止损平仓。 多单方向没有问题,为什么空单方向不能追踪止损?求指点。

 

 到达激活点开始追踪止损,回撤触及止损平仓。 多单方向没有问题,为什么空单方向不能追踪止损?求指点。

方向不同而已,怎么空单方向无效?


//跟踪止损--修改止盈止损
void 跟踪止损(double sl)
{  
   for(int i=PositionsTotal()-1; i>=0; i--)
   {
      if(PositionGetTicket(i)>0 || PositionGetSymbol(i)!="")//如果有订单
      {  
         //如果多单。
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            MqlTradeRequest request={};
            MqlTradeResult  result={};
            double 初始化止损 = PositionGetDouble(POSITION_SL);
            request.action=TRADE_ACTION_SLTP;//用于修改订单
            request.position=PositionGetInteger(POSITION_TICKET);
            request.symbol=PositionGetString(POSITION_SYMBOL);
            request.price=SymbolInfoDouble(m_symbol.Name(),SYMBOL_BID); 
            if(request.price>初始化止损+sl)
            {   
               request.sl= request.price - sl;
            }
            else
            {
               request.sl= 初始化止损;
            }
            //request.type=ORDER_TYPE_BUY;
            bool X=OrderSend(request,result);
            if(X==false)
            {
               Print("修改多单止损返回代码:" + IntegerToString(result.retcode));
            }
         }
         //如果空单。
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            MqlTradeRequest request={};
            MqlTradeResult  result={};
            double 初始化止损 = PositionGetDouble(POSITION_SL);
            request.action=TRADE_ACTION_SLTP;//用于修改订单
            request.position=PositionGetInteger(POSITION_TICKET);
            request.symbol=PositionGetString(POSITION_SYMBOL);
            request.price=SymbolInfoDouble(m_symbol.Name(),SYMBOL_BID); 
            if(request.price<初始化止损-sl)
            {   
               request.sl=request.price + sl;
            }
            else
            {
               request.sl=初始化止损;
            }
            //request.type=ORDER_TYPE_SELL;
            bool X=OrderSend(request,result);
            if(X==false)
            {
               Print("修改空单止损返回代码:" + IntegerToString(result.retcode));
            }
         }         
      }
   }
}
 

例行提醒一下。


【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
https://www.mql5.com/zh/forum/448896

【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
  • 2023.06.13
  • Sky All
  • www.mql5.com
大家好,我是官网版主。 官网内部有机器人辅助管理,目的是自动下架一些有误导性的内容。 内容过长,或同一个IP多次注册,容易导致机器人误判,而被无辜删帖。 如果您被无故删帖,我们对这种体验感到万分抱歉。 为了防止机器人误判,请在讨论代码的时候使用代码表述功能...
 

request.price=SymbolInfoDouble(m_symbol.Name(),SYMBOL_BID);

改成 request.price=PositionGetDouble(POSITION_PRICE_OPEN); 試看看

原因: