Перенос Лося в безубыток

 
Всем привет. Целый день бьюсь над функцией о переносе лося в без убыток после достижения уровня в 20 п. зафиксировать его выше входа в сделку на 5 п.  Но что то не хочет она работать. Подскажите что не так буду очень признателен.  
Файлы:
d_2.mq4  3 kb
 
лося в Б/У не перенесу, а стоп-лосс   -  пожалуйста (последний горячий пост https://forum.mql4.com/ru/46268/page3)
 
dimarik0000:
Всем привет. Целый день бьюсь над функцией о переносе лося в без убыток после достижения уровня в 20 п. зафиксировать его выше входа в сделку на 5 п.  Но что то не хочет она работать. Подскажите что не так буду очень признателен.  

Смотря на Ваш код, смею предположить, что Вы воопче не заморачиваетесь с пониманием значимости структуры кода - каждая строчка что-то ВЫПОЛНЯЕТ - ЗАЧЕМ лепить лишний код???

    // функция учёта ордеров для модификации
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;
//------------------------------------------------------------------------------------------------------------------------------- 
        if (OrderSymbol() != Symbol()) continue;
        if (Magic != -1) if (OrderMagicNumber() != Magic) continue;
        if (OrderType() > 1) continue;
        RefreshRates();
        if (OrderType() == OP_BUY) {double Price = Bid; int li_cmd = 1;} else {li_cmd = -1; Price = Ask;}
        // функция модификации ордера в безубыток
        if (li_cmd * (Price - OrderOpenPrice()) >= Point * SignalProfit)
        {
            Tral = NormalizeDouble (OrderOpenPrice() + li_cmd * (Point * PreservedProfit), Digits);
            if (NormalizeDouble (OrderStopLoss() - Tral, Digits) != 0.0)
            {
                if (!OrderModify (OrderTicket(), OrderOpenPrice(), Tral, OrderTakeProfit(), 0, CLR_NONE))
                {Print ("Ошибка модификации ордера ", OrderType(), " - ", GetLastError());}
            }
        }
    }
 
YOUNGA:
В этой оговорке есть глубокий смысл, даже несколько,, я не шучу.
 
dimarik0000:
Всем привет. Целый день бьюсь над функцией о переносе лося в без убыток после достижения уровня в 20 п. зафиксировать его выше входа в сделку на 5 п.  Но что то не хочет она работать. Подскажите что не так буду очень признателен.  


//+------------------------------------------------------------------+
//| set_outloss() установка SL на уровень безубытка
//+------------------------------------------------------------------+
void set_outloss() {  
   string _Function = "set_outloss():";
//-----------------
   double _SL;
   int  _Сommision_Pip,
        _Dist_OutLoss,
        _Profit_for_OutLoss; 
//-----------------
   if(!SET_OUTLOSS)  return;
   for(int _i=OrdersTotal()-1; _i>=0; _i--) {  
      OrderSelect(_i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == Symbol() && check_magic(OrderMagicNumber(),_Function)){
//---- проверка корректности уровней outloss с учётом комиссии -------
         _Dist_OutLoss = check_dist_outloss(OrderTicket());
         _Profit_for_OutLoss = check_profit_for_outloss(_Dist_OutLoss); 
//--------------------------------------------------------------------
         if(OrderType() == OP_BUY){  
            //---- проверка внешних сигналов управляющих OutLoss -----------------
            if(GlobalVariableGet(GV_Ignore_Tral_SL_BUY) == YES)continue;
            //--------------------------------------------------------------------
            if(OrderStopLoss() < OrderOpenPrice()){ // в том числе если OrderStopLoss == 0
               if(Ask - OrderOpenPrice() >= _Profit_for_OutLoss*Point) {  
                  _SL = NormalizeDouble(OrderOpenPrice() + _Dist_OutLoss*Point,Digits);
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),_SL,OrderTakeProfit(),0,CLR_NONE)){
                     int _Dist = (Ask - OrderOpenPrice())/Point;
                     output_mov_string("SL OP_BUY "+OrderTicket()+" в безубытке. Дист.установки= " + _Dist, Clr_Report);
                     output_sound(Name_Sound_OutLoss);
                  }
               }
            }
         }  
         if(OrderType() == OP_SELL){  
            //---- проверка внешних сигналов управляющих OutLoss -----------------
            if(GlobalVariableGet(GV_Ignore_Set_Outloss_SELL) == YES)continue;         
            //--------------------------------------------------------------------
            if(OrderStopLoss() > OrderOpenPrice() || OrderStopLoss() == 0) {  
               if(OrderOpenPrice() - Bid >= _Profit_for_OutLoss*Point){  
                  _SL = NormalizeDouble(OrderOpenPrice() - _Dist_OutLoss*Point,Digits);
                  if(OrderModify(OrderTicket(),OrderOpenPrice(),_SL,OrderTakeProfit(),0,CLR_NONE)){
                     _Dist = (OrderOpenPrice() - Bid)/Point;
                     output_mov_string("SL OP_SELL "+OrderTicket()+" в безубытке. Дист.установки= " + _Dist, Clr_Report);
                     output_sound(Name_Sound_OutLoss);
                  }
               }
            }
         }
      }
   }
//-----------------   
   return;
}
//+------------------------------------------------------------------+
//+-------
Причина обращения: