Вопрос по трейлингу (MQL4).

 

Накидал, скопировал, собрал скрипт. Суть: скрипт выставляет две отложки на бай и селл и при срабатывании одной из отложек, должен тралить ее. Но почему то не тралит. Подскажите пожалуйста что не так.

 

int start()
{

int buy=OrderSend(NULL,OP_BUYSTOP,NormalizeDouble(lot,MarketInfo(Symbol(),MODE_DIGITS)),Ask+ras*Point,
3,0,0,NULL,0,0,0);





int sell=OrderSend(NULL,OP_SELLSTOP,NormalizeDouble(lot,MarketInfo(Symbol(),MODE_DIGITS)),Bid-ras*Point,
3,0,0,NULL,0,0,0); 




while(true)
{



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(Bid-OrderOpenPrice()>Trailing*Point|| OrderStopLoss()==0)
           {
           
           if(OrderStopLoss()<Bid-(Trailing+TrailingStep)*Point||OrderStopLoss()==0)
              {
              
              OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing*Point, Digits),0 ,0);
              
              }
           
           }
        
        }
       
     if(OrderType()== OP_SELL) 
        {
        if(OrderOpenPrice()-Ask>Trailing*Point||OrderStopLoss()==0)
           {
           
           if(OrderStopLoss()>Ask+(TrailingStep+Trailing)*Point||OrderStopLoss()==0)
             {
             
             OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing*Point, Digits), 0, 0);
             
             }
           
           }
        
        } 
       
       
       
      
     }   
   
   
   } 


}


}

   
return(0);
}
 
Igor Kryuchkov:

Накидал, скопировал, собрал скрипт. Суть: скрипт выставляет две отложки на бай и селл и при срабатывании одной из отложек, должен тралить ее. Но почему то не тралит. Подскажите пожалуйста что не так.

 

При установке ордеров нужно указать Magic Number. Или же при трейлинге уберите проверку на равенство заданному Magic Number.

 
Igor Kryuchkov:

Накидал, скопировал, собрал скрипт. Суть: скрипт выставляет две отложки на бай и селл и при срабатывании одной из отложек, должен тралить ее. Но почему то не тралит. Подскажите пожалуйста что не так.

 

А отложки выставляются?

Вы нормализуюте лот до количесва знаков котировки.
 
Alekseu Fedotov:

Вы нормализуюте лот до количесва знаков котировки.
зачем...
 
Alexander Bereznyak:
зачем...
Это у вас  так 
 
Ihor Herasko:

При установке ордеров нужно указать Magic Number. Или же при трейлинге уберите проверку на равенство заданному Magic Number.

Выставляются ордера. Срабатывает какой нибудь отложник и сразу модифицирует его на указанный Стоп Лос. Но потом цена идет но стоп лосс не модифицируется. Ошибок в журнале по модификации ордера нету.
 
Alekseu Fedotov:
Это у вас  так 
да у нас так, лоты нормализуем по количеству знаков котировки, а котировки нормализуем по количеству знаков лота
 
Igor Kryuchkov:
Выставляются ордера. Срабатывает какой нибудь отложник и сразу модифицирует его на указанный Стоп Лос. Но потом цена идет но стоп лосс не модифицируется. Ошибок в журнале по модификации ордера нету.

Еще раз: код трейлинга рабочий (специально проверил). Проблема в отсутствии MagicNumber при установке ордеров. То есть нужно  сделать либо так:

   int buy = OrderSend(NULL,OP_BUYSTOP, lot, Ask+ras*Point, 3,0,0,NULL, Magic,0,0);
   int sell = OrderSend(NULL,OP_SELLSTOP, lot, Bid-ras*Point, 3,0,0,NULL, Magic,0,0); 

либо вот так:

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
      if(OrderSymbol()== Symbol())
        {
        if(OrderType()== OP_BUY)
           {
           if(Bid-OrderOpenPrice()>Trailing*Point|| OrderStopLoss()==0)
              {
              if(OrderStopLoss()<Bid-(Trailing+TrailingStep)*Point||OrderStopLoss()==0)
                 bool isMod = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-Trailing*Point, Digits),0 ,0);
              }
           }
          
        if(OrderType()== OP_SELL) 
           {
           if(OrderOpenPrice()-Ask>Trailing*Point||OrderStopLoss()==0)
              {
              if(OrderStopLoss()>Ask+(TrailingStep+Trailing)*Point||OrderStopLoss()==0)
                bool isMod = OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+Trailing*Point, Digits), 0, 0);
              }
           } 
        }   
      } 
   }

 Возможно, еще проблема в величине значений Trailing и TrailigStep. В сових экспериментах я поставил их равными 300 и 5 соответственно.

 
Ihor Herasko:

Еще раз: код трейлинга рабочий (специально проверил). Проблема в отсутствии MagicNumber при установке ордеров. То есть нужно  сделать либо так:

либо вот так:

 Возможно, еще проблема в величине значений Trailing и TrailigStep. В сових экспериментах я поставил их равными 300 и 5 соответственно.

спасибо большое. проблема была в велечине значений.

Добавленно: Вру. Проблема не знаю в чем. Перенес код из скрипта и все заработало.  

 
Igor Kryuchkov:

спасибо большое. проблема была в велечине значений.

Добавленно: Вру. Проблема не знаю в чем. Перенес код из скрипта и все заработало.  

Скрипт у Вас зацикленный, но неправильно зациклен.

Во-первых, нельзя делать так:

while (true)
{
...
}

 Правильно так:

while (!IsStopped())
{
...
}

 Во-вторых, следует делать хотя бы минимальную паузу между итерациями (хотя бы 1 мсек).

В-третьих, с появлением в MQL4 таймера необходимость использования зацикленных программ отпала. Теперь достаточно садить подобные события (если нужно обрабатывать события, происходящие на других символах) на таймер в советнике. Для контроля текущего символа обычно достаточно события OnTick().

 
Ihor Herasko:

Скрипт у Вас зацикленный, но неправильно зациклен.

Во-первых, нельзя делать так:

 Правильно так:

 Во-вторых, следует делать хотя бы минимальную паузу между итерациями (хотя бы 1 мсек).

В-третьих, с появлением в MQL4 таймера необходимость использования зацикленных программ отпала. Теперь достаточно садить подобные события (если нужно обрабатывать события, происходящие на других символах) на таймер в советнике. Для контроля текущего символа обычно достаточно события OnTick().

Все.Теперь все понятно. Спасибо.