Помогите правильно записать логику для трелинга

 

Добрый день!  Что-то не правильно работает при тестировании, закрывается позиция по стопу там где и цены не было.  Явно что-то туплю. Помогите разобраться.

Логика: что-бы первое движение стопа выполнилось когда от последнего ордера цена прошла TrailingStopStart, и потом двигался вблизи цены на возможные

TrailingStopNext


input double TrailingStopStart=40;
input double TrailingStopNext=20;



//+------------------------------------------------------------------+
bool trallMe1(MqlRates &rates,string symbol,double TrailingStopStart,double TrailingStopNext,int fileHandle)
  {

   if(PositionSelect(symbol)==false)
     {
      //нет позиций нечего делать
      return(false);
     }

   double profit = PositionGetDouble(POSITION_PROFIT);
   long   type   = PositionGetInteger(POSITION_TYPE);
   double vol    = PositionGetDouble(POSITION_VOLUME);

   if(profit<=0)
     {
      //полюбому должен быть профит
      return(false);
     }

   double H,L,O,C;
   H=rates.high; L=rates.low; O=rates.open; C=rates.close;
   datetime t=rates.time;

   double priseLastOrder = PositionGetDouble(POSITION_PRICE_OPEN);
   double priseLastSL    = PositionGetDouble(POSITION_SL);
   double priseLastTP    = PositionGetDouble(POSITION_TP);
   
   double point          = SymbolInfoDouble(symbol,SYMBOL_POINT);
   double tss            = TrailingStopStart*point;
   double tsn            = TrailingStopNext*point;
   double MinOtstupTrall = SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL)*point;
   double ts             = MathMax(MinOtstupTrall,tsn);//большее между нужным и возможным

   if(type==POSITION_TYPE_SELL)
     {

      double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
      double prise=PositionGetDouble(POSITION_PRICE_CURRENT);
      
      //отбиваем не подходящие условия sel-stop
      if(ask+tss+ts>=priseLastOrder)
        {
         //цена последней сделки полюбому должна быть выше текущй 
         return(false);
        }
       
        
       if(ask+ts>=priseLastSL)
        {
         //новый стоп может быть только ниже текущего
         return(false);
        }


      MqlTradeRequest MtRequest={0};
      MqlTradeResult MtResult={0};

      MtRequest.action= TRADE_ACTION_SLTP;
      MtRequest.symbol= symbol;
      MtRequest.sl = ask+ts;
      MtRequest.tp = priseLastTP;
      if(!OrderSend(MtRequest,MtResult))
        {
         Print("Ошибка трала SEL "+MtResult.retcode);
         return(false);
        }
       return(true);
     }



return(true);

}
//+------------------------------------------------------------------+
 
Выясните минимальные расстояния стопов своего брокера (функция SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL)). Если ваши значения меньше, либо очень близки к возвращаемому значению функции, то дело, скорее всего, в проскальзывании. Тут 3 рецепта: увеличить значения, увеличить допустимое проскальзывание в пунктах, либо чуток изменить алгоритм в рассчёте на увеличения стопов без потери прибыльности (если 2 первых рецепта результата не дали). Удачи!
Причина обращения: