Нет понимания, одни сложности.MT4 TSL

 
void TrailSL()
{
 if(iTrailStart <= 0.0)return; 
 double tp,sl_lev;
 for(int i=OrdersTotal()-1; i>=0; i--)
    {
     if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
       {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
          {
           if(OrderType() == OP_BUY) 
             {
              if(iTrailTakeProfit > 0.0)
                {
                tp=OrderTakeProfit() + NormalizeDouble(iTrailTakeProfit * Point(),_Digits);
                if(NormalizeDouble(((tp - OrderTakeProfit())) < 0.0,Digits))return;
                tp = OrderTakeProfit();
                }else tp = 0.0;
                if (NormalizeDouble(Bid - OrderOpenPrice(),Digits) <= iTrailStart * MarketInfo(Symbol(),MODE_POINT) );//true
                   {
                    if(OrderStopLoss() < OrderOpenPrice() || OrderStopLoss() == 0 && NormalizeDouble(Bid - OrderStopLoss(),Digits) <= iTrailDist * MarketInfo(Symbol(),MODE_POINT));//true
                      {
                      if(iTrailStep > 0.0 && OrderStopLoss() != 0.0 && NormalizeDouble((Bid - OrderStopLoss()) - iTrailDist * MarketInfo(Symbol(),MODE_POINT),Digits) < iTrailStep * MarketInfo(Symbol(),MODE_POINT));//true
                        {
                         sl_lev = Bid - iTrailDist * MarketInfo(Symbol(),MODE_POINT);
                         if(NormalizeDouble(Bid - sl_lev,Digits) < MarketInfo(Symbol(),MODE_STOPLEVEL));//false
                           {
                            if(!OrderModify(Forder,OrderOpenPrice(),sl_lev,tp,0,Red))return;
                            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
                           }
                        }
                      }
                   }
                }
             }

Алгоритм планировался;

Если ордер в + на кол-во пункта тогда должне сработать по логике, старт-дистанция от рынка до тсл далее шаг движения.

 iTrailStart           = 10;  //Кол-во пунктов для включения тралa;

 iTrailDist             = 10;  //Расстояние от стопа до рынка;

 iTrailStep            = 10;  //Шаг трейлинг стопа";

 iTrailTakeProfit    = 10;  //TakeProfit после включения трейлинга";

Если ордер в плюсе на 11п, тогда 11-10=1п без убытка.

Получилось вот так 


Подскажите, что делаю не правильно?

 

Здесь не работают условия:

if (NormalizeDouble(Bid - OrderOpenPrice(),Digits) <= iTrailStart * MarketInfo(Symbol(),MODE_POINT) );//true

...

if(OrderStopLoss() < OrderOpenPrice() || OrderStopLoss() == 0 && NormalizeDouble(Bid - OrderStopLoss(),Digits) <= iTrailDist * MarketInfo(Symbol(),MODE_POINT));//true

...

if(iTrailStep > 0.0 && OrderStopLoss() != 0.0 && NormalizeDouble((Bid - OrderStopLoss()) - iTrailDist * MarketInfo(Symbol(),MODE_POINT),Digits) < iTrailStep * MarketInfo(Symbol(),MODE_POINT));//true

...


if(NormalizeDouble(Bid - sl_lev,Digits) < MarketInfo(Symbol(),MODE_STOPLEVEL));//false

так как после них зачем-то поставлены указанные символы

 

Вот такой код работает:

void TrailSL()
{
   if (iTrailStart <= 0.0 || iTrailStep <= 0.0)
      return; 
      
   double sl_lev;
         
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
         continue;
      
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic)
         continue;  
         
      if(OrderType() == OP_BUY) 
      {
         if (NormalizeDouble(Bid - OrderOpenPrice(),Digits) < iTrailStart * MarketInfo(Symbol(),MODE_POINT) )
            continue;

         if (OrderStopLoss() >= OrderOpenPrice() || NormalizeDouble(Bid - OrderStopLoss(), Digits()) < iTrailDist * MarketInfo(Symbol(),MODE_POINT))
            continue;

         if (OrderStopLoss() == 0.0 || NormalizeDouble((Bid - OrderStopLoss()) - iTrailDist * MarketInfo(Symbol(),MODE_POINT),Digits) < iTrailStep * MarketInfo(Symbol(),MODE_POINT))
            continue;

         sl_lev = Bid - iTrailDist * MarketInfo(Symbol(),MODE_POINT);
         if (NormalizeDouble(Bid - sl_lev,Digits) < MarketInfo(Symbol(),MODE_STOPLEVEL))
            continue;
            
         if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl_lev, OrderTakeProfit(), 0, clrRed))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
      }
   }
}

Убрал из кода лишнее (с Take Profit непонятная возня была) и немного причесал для читабельности.

 
Ihor Herasko #:

Вот такой код работает:

Убрал из кода лишнее (с Take Profit непонятная возня была) и немного причесал для читабельности.

Спасибо, ТП нужен был для переноса если сработал ТСЛ.

 
Ihor Herasko #:

Вот такой код работает:

Убрал из кода лишнее (с Take Profit непонятная возня была) и немного причесал для читабельности.

Подскажите код у вас работал?Включали?

 
Alexander Avksentyev #:

Подскажите код у вас работал?Включали?

Ну как еще сказать? ))

Ihor Herasko #:

Вот такой код работает:

Нет понимания, одни сложности.MT4 TSL
Нет понимания, одни сложности.MT4 TSL
  • 2021.12.15
  • www.mql5.com
Алгоритм планировался; Если ордер в + на кол-во пункта тогда должне сработать по логике, старт-дистанция от рынка до тсл далее шаг движения...