Почему трейлинг стоп опускает стоп лосс

 

Почему в процессе модификации ордера, трейлинг стоп опускает стоп лосс в низ (естественно сначала вверх а потом постепенно вниз)?

Получается нужно сделать чтобы он менял значение стоп лосса только когда цена пройдем к примеру 10 пунктов в нужном направлении с момента последней установки стоплоса (а не так как сейчас с каждым пунктом, хотя почему он его опускает все равно понять не могу)! Код советника:

//+------------------------------------------------------------------+
//|                                                     проверка.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern int TrailingStop = 20;
extern int TrailingStep = 5;
extern int SL           = 30;
extern int TP           = 35;
extern int Lots         = 1;
extern int Slippage     = 5;
double stopl;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 double MA10 = NormalizeDouble (iMA (NULL, 0, 20, 0, MODE_LWMA, PRICE_MEDIAN, 0), Digits);
 double MA101 = NormalizeDouble (iMA (NULL, 0, 20, 0,MODE_LWMA, PRICE_MEDIAN, 1), Digits);
 double MA20 = NormalizeDouble (iMA (NULL, 0, 40, 0, MODE_LWMA, PRICE_MEDIAN, 0), Digits);
 double MA201 = NormalizeDouble (iMA (NULL, 0,40, 0, MODE_LWMA, PRICE_MEDIAN, 1), Digits);
  
 double _ExpertOrdersB=0;
 double _ExpertOrdersS=0;
 int magic;

   for(int z=OrdersTotal()-1; z>=0; z --)
     {
   if(!OrderSelect(z,SELECT_BY_POS))
        {
   Print(". OrderSelect("+IntegerToString(z)+", SELECT_BY_POS ) FAIL!. Error #"+IntegerToString(GetLastError()));
        }
   if((OrderMagicNumber()==magic) && OrderSymbol()==_Symbol)
        {
          switch(OrderType())
           {
            default: break;
            case 0:
               _ExpertOrdersB++;
               break;
            case 1:
               _ExpertOrdersS++;
               break;
           }
        }
     }

    if (_ExpertOrdersB < 1 && MA10==MA20 && MA101<MA201) //если нет покупок, то пытаемся купить, при условии, что:
        OrderSend(NULL,OP_BUY,Lots,Ask,Slippage,Ask-SL*Point, Ask+TP*Point);

    if (_ExpertOrdersS < 1 && MA10==MA20 && MA101>MA201) //если нет продаж, то пытаемся продать, при условии, что:
        OrderSend(NULL,OP_SELL,Lots,Ask,Slippage,Ask+SL*Point, Ask-TP*Point);
    
      Trailing ();

   
  }
  
void Trailing ()

{
    for (int i=0; i<OrdersTotal () ; i++)  
    {
       if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES));
    
    {
        if (OrderSymbol () == OrderSymbol ())
        {
        if (OrderType () == OP_BUY)
        {
        if (Bid - OrderOpenPrice () > TrailingStop*Point)
        {
        if (OrderStopLoss () < Bid - (TrailingStop+TrailingStep)*Point);
        {
        stopl = NormalizeDouble (Bid - TrailingStop*Point, Digits);
        if (OrderStopLoss () != stopl)
             OrderModify (OrderTicket(), OrderOpenPrice(), stopl, 0, 0); 
        
        
        }
        
        
        }
        
        }
        
        if (OrderType () == OP_SELL)
        {
        if (OrderOpenPrice () - Ask > TrailingStop*Point)
        {
        if (OrderStopLoss () > Ask + (TrailingStop+TrailingStep)*Point)
        {
        stopl = NormalizeDouble (Ask + TrailingStop*Point, Digits);
        if (OrderStopLoss () !=stopl)
             OrderModify (OrderTicket(), OrderOpenPrice(), stopl, 0, 0); 
        
        
        
        
        
        
        }
        
        }
        
        }
        
        
        
        }
    
    
    
    }
    }
    

}
//+------------------------------------------------------------------+


 

Вот это условие будет истинным всегда

if (OrderSymbol () == OrderSymbol ())

 Оно говорит, что если символное имя инструмента равно себе самому то... А оно всегд будет равно себе самому, Вы сравниваете величину саму с собой

 

В нижеследующей строке нужно убрать точку с запятой

 if (OrderStopLoss () < Bid - (TrailingStop+TrailingStep)*Point);
 
Вообще, Вам нужно научиться отлаживать свой код - снимать данные в ключевых точках. Если стоп едет не туда куда нужно, значит надо вызвать принтом значение величин, подаваемых на вход функции OrderModyfy() и посмотреть почему они вычисляются именно такими.
 

привет всем ! 

возможно ли использовать трейлинг стоп на МТ4 на iphone ? 

или например скачать советника по трейлинг стоп на iphone ? 

было бы очень удобно, iphone всегда со мной и всегда в сети !

 

Спасибо !  

Причина обращения: