跟踪止损设置失败

 

大家好,我用MQL5的标准库写的一段跟踪止损程序,在运行时会出现部分订单无法修改止损的情况,但是其它的订单是成功修改止损的,程序显示的问题是invalid stop,错误代码是4756,希望大家能帮我看看程序是哪里写错了,谢谢!

//---类
CSymbolInfo mySymbol;
CPositionInfo myPosition;
CTrade myTrade;
//---参数
   mySymbol.Name(Symbol());
   myTrade.SetDeviationInPoints(50);
   StopLoss=500;
   TrailStopLossStep=200;
//---修改多单
   if(myPosition.Select(mySymbol.Name()))
     {
      if(myPosition.PositionType()==POSITION_TYPE_BUY)
        {
         if(myPosition.Profit()>0 && myPosition.StopLoss()<=(myPosition.PriceCurrent()-StopLoss*mySymbol.Point()-TrailStopLossStep*mySymbol.Point()))
           {
            double sl=mySymbol.NormalizePrice(mySymbol.Bid()-StopLoss*mySymbol.Point());
            myTrade.PositionModify(mySymbol.Name(),sl,0);
            if(myTrade.ResultRetcode()!=10008 && myTrade.ResultRetcode()!=10009 && myTrade.ResultRetcode()!=10010)
              {
               Print("请求结果代码文本:",myTrade.ResultRetcodeDescription());
               Print("Last Error:",GetLastError());
              }
           }
        }
     }
//---修改空单
   if(myPosition.Select(mySymbol.Name()))
     {
      if(myPosition.PositionType()==POSITION_TYPE_SELL)
        {
         if(myPosition.Profit()>0 && myPosition.StopLoss()>=(myPosition.PriceCurrent()+StopLoss*mySymbol.Point()+TrailStopLossStep*mySymbol.Point()))
           {
            double sl=mySymbol.NormalizePrice(mySymbol.Ask()+StopLoss*mySymbol.Point());
            myTrade.PositionModify(mySymbol.Name(),sl,0);
            if(myTrade.ResultRetcode()!=10008 && myTrade.ResultRetcode()!=10009 && myTrade.ResultRetcode()!=10010)
              {
               Print("请求结果代码文本:",myTrade.ResultRetcodeDescription());
               Print("Last Error:",GetLastError());
              }
           }
        }
     }
 

1. 止损止盈价格必须距离市价一定点数之外,这个点数即最小距离STOP_LEVEL,通过 SymbolInfoInteger()可以查询。

2. 空单要注意单子本身的stoploss()=0的情况

3. 不要使用Select(symbol),因为这永远只选中ticket number最小的那个单子,对netting account还行,对hedging account就不适用了。

#property copyright "Copyright 2018,fxMeter"
#property link      "https://www.mql5.com/en/users/fxmeter"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <MoneyManagement.mqh>

//---
CSymbolInfo mySymbol;
CPositionInfo myPosition;
CTrade myTrade;
int   StopLoss=500,TrailStopLossStep=200;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!mySymbol.Name(Symbol()))return(INIT_FAILED);
   myTrade.SetDeviationInPoints(50);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!RefreshRates())return;
   TrailStopFunction(myTrade,myPosition,mySymbol,StopLoss,TrailStopLossStep);

  }
//+------------------------------------------------------------------+
bool RefreshRates(void)
  {
//--- refresh rates
   if(!mySymbol.RefreshRates())
     {
      Print("RefreshRates error");
      return(false);
     }
//--- protection against the return value of "zero"
   if(mySymbol.Ask()==0 || mySymbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
void TrailStopFunction(CTrade &trade,CPositionInfo &pos,CSymbolInfo &sym,int stoploss,int trailstep)
  {
   double point=sym.Point();
   int    stopLevel=sym.StopsLevel();  //the minimum distance  = stop level 
   double sl=0; //new sl
   double stopLevelPrice=0.0; // the minimum distance price from the market price.

   for(int i=PositionsTotal()-1;i>=0;i--)
     {
      if(pos.SelectByIndex(i))
        {
         if(pos.Symbol()==sym.Name())
           {
            if(pos.PositionType()==POSITION_TYPE_BUY)
              {
               if(pos.PriceCurrent()-pos.PriceOpen()>(stoploss+trailstep)*point)
                 {
                  sl=sym.NormalizePrice(pos.PriceCurrent()-stoploss*point);
                  stopLevelPrice=sym.NormalizePrice(sym.Bid()-stopLevel*point);
                  if(pos.StopLoss()<sl && sl<stopLevelPrice)
                    {
                     if(!trade.PositionModify(pos.Symbol(),sl,pos.TakeProfit()))
                       {
                        Print("Modify ",pos.Ticket()," Position -> false. Result Retcode: ",trade.ResultRetcode(),
                              ", description of result: ",trade.ResultRetcodeDescription());
                       }
                    }
                 }
              }
            else if(pos.PositionType()==POSITION_TYPE_SELL)
              {
               if(pos.PriceOpen()-pos.PriceCurrent()>(stoploss+trailstep)*point)
                 {
                  sl=sym.NormalizePrice(pos.PriceCurrent()+stoploss*point);
                  stopLevelPrice=sym.NormalizePrice(sym.Ask()+stopLevel*point);
                  if((pos.StopLoss()>sl || (pos.StopLoss()==0)) && sl>stopLevelPrice)
                    {
                     if(!trade.PositionModify(pos.Symbol(),sl,pos.TakeProfit()))
                       {
                        Print("Modify ",pos.Ticket()," Position -> false. Result Retcode: ",trade.ResultRetcode(),
                              ", description of result: ",trade.ResultRetcodeDescription());
                       }
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
 
谢谢您的帮忙,我会依照您的建议再修改一下我的代码。
原因: