Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Увеличивай свой рейтинг. Выполняй заказы в сервисе Фриланс!
Igor Kryuchkov
10806
Igor Kryuchkov 2016.09.27 14:27 

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

 

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
9032
Ihor Herasko 2016.09.27 14:38  
Igor Kryuchkov:

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

 

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

Alekseu Fedotov
819
Alekseu Fedotov 2016.09.27 15:42  
Igor Kryuchkov:

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

 

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

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

Вы нормализуюте лот до количесва знаков котировки.
зачем...
Alekseu Fedotov
819
Alekseu Fedotov 2016.09.27 16:19  
Alexander Bereznyak:
зачем...
Это у вас  так 
Igor Kryuchkov
10806
Igor Kryuchkov 2016.09.27 19:06  
Ihor Herasko:

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

Выставляются ордера. Срабатывает какой нибудь отложник и сразу модифицирует его на указанный Стоп Лос. Но потом цена идет но стоп лосс не модифицируется. Ошибок в журнале по модификации ордера нету.
Alexander Bereznyak
21458
Alexander Bereznyak 2016.09.28 02:17  
Alekseu Fedotov:
Это у вас  так 
да у нас так, лоты нормализуем по количеству знаков котировки, а котировки нормализуем по количеству знаков лота
Ihor Herasko
9032
Ihor Herasko 2016.09.28 15:22  
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
10806
Igor Kryuchkov 2016.09.28 16:04  
Ihor Herasko:

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

либо вот так:

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

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

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

Ihor Herasko
9032
Ihor Herasko 2016.09.28 18:43  
Igor Kryuchkov:

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

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

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

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

while (true)
{
...
}

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

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

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

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

Igor Kryuchkov
10806
Igor Kryuchkov 2016.09.28 19:25  
Ihor Herasko:

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

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

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

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

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

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