Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Igor Kryuchkov
14643
Igor Kryuchkov  

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

 

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);
}
Ihor Herasko
12009
Ihor Herasko  
Igor Kryuchkov:

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

 

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

Alekseu Fedotov
1034
Alekseu Fedotov  
Igor Kryuchkov:

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

 

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

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

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

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

Выставляются ордера. Срабатывает какой нибудь отложник и сразу модифицирует его на указанный Стоп Лос. Но потом цена идет но стоп лосс не модифицируется. Ошибок в журнале по модификации ордера нету.
Alexander Bereznyak
23226
Alexander Bereznyak  
Alekseu Fedotov:
Это у вас  так 
да у нас так, лоты нормализуем по количеству знаков котировки, а котировки нормализуем по количеству знаков лота
Ihor Herasko
12009
Ihor Herasko  
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 соответственно.

Igor Kryuchkov
14643
Igor Kryuchkov  
Ihor Herasko:

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

либо вот так:

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

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

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

Ihor Herasko
12009
Ihor Herasko  
Igor Kryuchkov:

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

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

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

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

while (true)
{
...
}

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

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

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

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

Igor Kryuchkov
14643
Igor Kryuchkov  
Ihor Herasko:

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

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

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

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

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

Все.Теперь все понятно. Спасибо.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий