Трэлинг

 

Уважаемые господа, вот код трала. Почему-то часто выдаёт ошибку "НЕПРАВИЛЬНЫЕ СТОПЫ". Однако после нескольких ошибок срабатывает (впрочем, может сработать и сразу). Подскажите, в чём причина или где ошибка.

//+------------------------------------------------------------------+
//|                 модификация ордера  (ТРЕЙЛИНГ)                   |
//+------------------------------------------------------------------+
if(Tral_ON)
{
  if(TICKET_SELL != 0) // проверка ордера SELL 
  { 
    OrderSelect(TICKET_SELL, SELECT_BY_TICKET);
    if(OrderCloseTime() == 0)
    {
      if(OrderOpenPrice() - Ask >= Tral && Ask < Last_Tral_SELL) 
      { 
        Last_Tral_SELL = Ask;
        OrderModify(TICKET_SELL,OrderOpenPrice(),NormalizeDouble(Ask,Digits) + Tral,OrderTakeProfit(),0,CLR_NONE);
        ERROR = GetLastError();
        Error("Tral_SELL: ",ERROR);
        if(ERROR == 0 && Tral_Chenge_ON)_Tral = _Tral_New;
      }
    }
  }
  if(TICKET_BUY != 0) // проверка ордера BUY 
  { 
    OrderSelect(TICKET_BUY, SELECT_BY_TICKET);
    if(OrderCloseTime() == 0)
    {
      if(Bid - OrderOpenPrice() >= Tral && Bid > Last_Tral_BUY) 
      { 
        Last_Tral_BUY = Bid;
        OrderModify(TICKET_BUY,OrderOpenPrice(),NormalizeDouble(Bid,Digits) - Tral,OrderTakeProfit(),0,CLR_NONE);
        ERROR = GetLastError();
        Error("Tral_BUY: ",ERROR);
        if(ERROR == 0 && Tral_Chenge_ON)_Tral = _Tral_New;
      }
    }
  }
}
//--------------------------------------------------------------------
 
//+----------------------------------------------------------------------------+
//|  Сопровождение позиции простым тралом                                      |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
void TrailingPositions(string sy="", int op=-1, int mn=-1) {
   int    i, k = OrdersTotal(), er = 0;
   double pBid, pAsk, pp, SL, new_SL, TP, new_TP, current_TrailingStop;
   
   if (sy=="") sy=Symbol();
   
   for (i=0; i<k; i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol()==sy && (op < 0 || OrderType() == op)) {
           if (mn < 0 || OrderMagicNumber() == mn) {
               SL = OrderStopLoss();
               TP = OrderTakeProfit();
               new_SL = SL;
               new_TP = TP;
               current_TrailingStop = MathMax(MarketInfo(Symbol(), MODE_STOPLEVEL), TrailingStop);
               
               if (OrderType()==OP_BUY) {
                  if (!OnlyProfitTrailing || (Bid - OrderOpenPrice()) > current_TrailingStop * Point) {
                     if (OrderStopLoss() < Bid - (current_TrailingStop + TrailingStep - 1) * Point || 
                         OrderStopLoss() == 0) new_SL = Bid - current_TrailingStop * Point;
                  }
                  if (TakeProfit !=0 && UseShiftTP && (OrderTakeProfit() - Bid) < TakeProfit * Point) new_TP = Bid + TakeProfit * Point;
                  
                  if (new_SL != SL || new_TP != TP) {
                     if (ShowDebugInfo) Print("***1 SL=", SL, ", new_SL=", new_SL, ", TP=", TP, ", new_TP=", new_TP, 
                                       ", current_TrailingStop=", current_TrailingStop, ", стоп лвл=", 
                                       MarketInfo(Symbol(), MODE_STOPLEVEL), ", фриз лвл=", MarketInfo(Symbol(), MODE_FREEZELEVEL));
                     
                     OrderModify(OrderTicket(), OrderOpenPrice(), new_SL, new_TP, 0, CLR_NONE);
                     er = GetLastError();
                     if (er != 0) {
                        Print("Ошибка № ", er, ": ''", ErrorDescription(er), "'' при трале BUY ордера. ",
                              "OrderTicket()=", OrderTicket(), ", new_SL=", new_SL, ", new_TP=", new_TP, ", STOPLEVEL=", MarketInfo(Symbol(), MODE_STOPLEVEL), 
                              ", MODE_FREEZELEVEL=", MathRound(MarketInfo(Symbol(), MODE_FREEZELEVEL)));
                     }
                     
                  }
               }
               
               if (OrderType()==OP_SELL) {
                  if (!OnlyProfitTrailing || OrderOpenPrice() - Ask > current_TrailingStop * Point) {
                     if (OrderStopLoss() > Ask + (current_TrailingStop + TrailingStep - 1) * Point || 
                         OrderStopLoss() == 0) new_SL = Ask + current_TrailingStop * Point;
                  }
                  
                  if (TakeProfit !=0 && UseShiftTP && (Ask - OrderTakeProfit()) < TakeProfit * Point) new_TP = Ask - TakeProfit * Point;
                  
                  if (new_SL != SL || new_TP != TP) {
                     if (ShowDebugInfo) Print("***2 SL=", SL, ", new_SL=", new_SL, ", TP=", TP, ", new_TP=", new_TP, 
                                       ", current_TrailingStop=", current_TrailingStop, ", стоп лвл=", 
                                       MarketInfo(Symbol(), MODE_STOPLEVEL), ", фриз лвл=", MarketInfo(Symbol(), MODE_FREEZELEVEL));
                  
                     OrderModify(OrderTicket(), OrderOpenPrice(), new_SL, new_TP, 0, CLR_NONE);
                     er = GetLastError();
                     if (er != 0) {
                        Print("Ошибка № ", er, ": ''", ErrorDescription(er), "'' при трале SELL ордера. ",
                              "OrderTicket()=", OrderTicket(), ", new_SL=", new_SL, ", new_TP=", new_TP, ", STOPLEVEL=", MarketInfo(Symbol(), MODE_STOPLEVEL), 
                              ", MODE_FREEZELEVEL=", MathRound(MarketInfo(Symbol(), MODE_FREEZELEVEL)));
                     }
                  }
               }
            }
         }
      }
   }
}
этот код работает правильно, думаю дело в current_TrailingStop = MathMax(MarketInfo(Symbol(), MODE_STOPLEVEL), TrailingStop);
 
IgorM:
этот код работает правильно, думаю дело в current_TrailingStop = MathMax(MarketInfo(Symbol(), MODE_STOPLEVEL), TrailingStop);

Думаю что дело не в этом, поскольку в начале кода я делаю проверку

//+------------------------------------------------------------------+
//|                   ПРОВЕРКА УСТАНОВОК ПОЛЬЗОВАТЕЛЯ                |
//+------------------------------------------------------------------+
//если меньше min значения, утанавливаем min допустимые
double StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
  if(_Loss   < StopLevel && _Loss   !=0) _Loss   = StopLevel + slippage;
  if(_Profit < StopLevel && _Profit !=0) _Profit = StopLevel + slippage;
  if(_Tral   < StopLevel && _Tral   !=0) _Tral   = StopLevel + slippage;
  if( _Tral_New   < StopLevel &&  _Tral_New   !=0)  _Tral_New   = StopLevel + slippage;
  if( _Lot   < Min_Lot)  _Lot   = Min_Lot;
  if( _Lot   > Max_Lot)  _Lot   = Max_Lot;
//+------------------------------------------------------------------+
 

Дело в движении цены и в тиках. Если у Вас хороший интернет, а на рынке штиль. Вариантов море:

1.Стоп уровень трала у Вас впритык на минимальный уровень(+проскальзывание, наверно 1 или 2 по стандарту) Првоерка - приказ серверу - получение ответа. это занимает порой больше минуты, а цена в это время изменилась. поэтому вылазиит 130 ошибка.

2.

Tral 

он у Вас на Поинт не умножается, по крайней мере я не нашел где он умножается на Point,стало быть он в целом числе?


3. Сложный у Вас трал какой-то, это специальный трал для двух тикетов?

 
valenok2003:

Думаю что дело не в этом, поскольку в начале кода я делаю проверку

 


у некоторых ДЦ, во время сильных движений цены увеличивают минимальный стоп, выводите в лог информацию об ошибках и уровне допустимых стопов
 
Vladon:

Дело в движении цены и в тиках. Если у Вас хороший интернет, а на рынке штиль. Вариантов море:

1.Стоп уровень трала у Вас впритык на минимальный уровень(+проскальзывание, наверно 1 или 2 по стандарту) Првоерка - приказ серверу - получение ответа. это занимает порой больше минуты, а цена в это время изменилась. поэтому вылазиит 130 ошибка.

2.

он у Вас на Поинт не умножается, по крайней мере я не нашел где он умножается на Point,стало быть он в целом числе?


3. Сложный у Вас трал какой-то, это специальный трал для двух тикетов?




1. Да, интернет не очень. Но я в значение трала закладываю ещё Slipp


2. У меня вначале, вместо Point,  стоит проверка

   switch(Digits)
  {
    case 2: k = 0.01; break;
    case 4: k = 0.0001; break;
    case 5: k = 0.00001; break;
    default: break;
  }
  Profit = _Profit * k;
  Loss = _Loss * k;
  Tral = _Tral * k; 
  Lot = _Lot; 
3. Да, конкретно для одного из двух тикетов, который в данный момент активен.
 

Условие неверное: 

if(OrderOpenPrice() - Ask >= Tral && Ask < Last_Tral_SELL)

сравнивать нужно нормализованную цену будущего стопа с текущим стопом ордера 


Параметр неверный:
NormalizeDouble(Ask,Digits) + Tral

здесь должна быть нормализованная цена будущего стопа

 
gip:
Спасибо.
Причина обращения: