Вылетает ошибка invalid price - страница 2

 
Vladimir Karputov:

А какое значение возвращает метод TickSize по данному символу? 10 или 1?


10. У инструмента RTS цены кратны 10.

 
Fresto:

10. У инструмента RTS цены кратны 10.


Нет, Вы проверьте по склейке, а не по RTS.

 
Vladimir Karputov:

Нет, Вы проверьте по склейке, а не по RTS.


Да, там тоже написано 10.

 
Fresto:

Да, там тоже написано 10.


А какое значение возвращает метод TickSize по данному символу? 10 или 1?

 

Не понимаю, как Вы при использовании метода NormalizePrice  класса CSymbolInfo получаете на данном символе в SL и TP цены оканчивающиеся не "0"? У Вас там и "1" и "9".

Второе: поставьте такие принты:

//+------------------------------------------------------------------+
//| Open Buy position                                                |
//+------------------------------------------------------------------+
void OpenBuy(double lot,double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

   double volume=LotCheck(lot);
   if(volume==0.0)
      return;
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
   double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),volume,m_symbol.Ask(),ORDER_TYPE_BUY);

   if(check_volume_lot!=0.0)
      if(check_volume_lot>=volume)
        {
         if(m_trade.Buy(volume,NULL,m_symbol.Ask(),sl,tp))
           {
            if(m_trade.ResultDeal()==0)
              {
               Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription(),
                     ", Bid: ",DoubleToString(m_symbol.Bid(),m_symbol.Digits()),
                     ", Ask: ",DoubleToString(m_symbol.Ask(),m_symbol.Digits()),
                     ", Last: ",DoubleToString(m_symbol.Last(),m_symbol.Digits()));
              }
            else
              {
               Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription(),
                     ", Bid: ",DoubleToString(m_symbol.Bid(),m_symbol.Digits()),
                     ", Ask: ",DoubleToString(m_symbol.Ask(),m_symbol.Digits()),
                     ", Last: ",DoubleToString(m_symbol.Last(),m_symbol.Digits()));
              }
           }
         else
           {
            Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                  ", description of result: ",m_trade.ResultRetcodeDescription(),
                  ", Bid: ",DoubleToString(m_symbol.Bid(),m_symbol.Digits()),
                  ", Ask: ",DoubleToString(m_symbol.Ask(),m_symbol.Digits()),
                  ", Last: ",DoubleToString(m_symbol.Last(),m_symbol.Digits()));
           }
        }
//---
  }
//+------------------------------------------------------------------+
//| Open Sell position                                               |
//+------------------------------------------------------------------+
void OpenSell(double lot,double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

   double volume=LotCheck(lot);
   if(volume==0.0)
      return;
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
   double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),volume,m_symbol.Bid(),ORDER_TYPE_SELL);

   if(check_volume_lot!=0.0)
      if(check_volume_lot>=volume)
        {
         if(m_trade.Sell(volume,NULL,m_symbol.Bid(),sl,tp))
           {
            if(m_trade.ResultDeal()==0)
              {
               Print("Sell -> false. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription(),
                     ", Bid: ",DoubleToString(m_symbol.Bid(),m_symbol.Digits()),
                     ", Ask: ",DoubleToString(m_symbol.Ask(),m_symbol.Digits()),
                     ", Last: ",DoubleToString(m_symbol.Last(),m_symbol.Digits()));
              }
            else
              {
               Print("Sell -> true. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription(),
                     ", Bid: ",DoubleToString(m_symbol.Bid(),m_symbol.Digits()),
                     ", Ask: ",DoubleToString(m_symbol.Ask(),m_symbol.Digits()),
                     ", Last: ",DoubleToString(m_symbol.Last(),m_symbol.Digits()));
              }
           }
         else
           {
            Print("Sell -> false. Result Retcode: ",m_trade.ResultRetcode(),
                  ", description of result: ",m_trade.ResultRetcodeDescription(),
                  ", Bid: ",DoubleToString(m_symbol.Bid(),m_symbol.Digits()),
                  ", Ask: ",DoubleToString(m_symbol.Ask(),m_symbol.Digits()),
                  ", Last: ",DoubleToString(m_symbol.Last(),m_symbol.Digits()));
           }
        }
//---
  }

Ошибки возникают, когда: цена открытия позиция не совпадает в ценой Last и при этом Last равен стопу (SL или TP).

 

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

mysymbol.Name("RTS Splice");
double tickSize = mysymbol.TickSize();

stloss = mysymbol.NormalizePrice(mysymbol.Ask() + (int)(Stop/tickSize)*tickSize); //--- Stop Loss
tprofit = mysymbol.NormalizePrice(mysymbol.Ask() - (int)(Stop * StTkDiff/tickSize)*tickSize);
stopPrice = mysymbol.NormalizePrice(mysymbol.Ask() - (int)(Stop/tickSize)*tickSize);
P.s. две функции добавлю, спасибо, если будут ошибки, я сюда еще отпишу. Но все ошибки полностью прошли с помощью данной манипуляции.
 

Так должен или нет советник в тестере работать на склейках?

 
Aleksey Vyazmikin:

Так должен или нет советник в тестере работать на склейках?


Должен, всё нормально) Просто для RTS почему-то получение цены покупки, sl и tp высчитывается, лично у меня, по-другому)

 
Fresto:

Должен, всё нормально) Просто для RTS почему-то получение цены покупки, sl и tp высчитывается, лично у меня, по-другому)

 

Это как, по-другому?
 
Aleksey Vyazmikin:

 

Это как, по-другому?

stloss = mysymbol.NormalizePrice(mysymbol.Ask() + (int)(Stop/tickSize)*tickSize); //--- Stop Loss

Stop = оптимизируемое число. Такая штука нормализует стоп по цене. Я слишком намучился со всем, что после данного костыля у меня всё заработало и я ничего просто не трогаю больше)

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