Вылетает ошибка invalid price

 
Можете посоветовать, в чем может быть проблема? Пытаюсь реализовать пирамидинг. Пишет - invalid price. Но всё по канону же.

if(Buy_opened)
   {
      if(k < 2)
      {
         if(mrate[1].close > stopPrice)
         {
         stloss = NormalizePrice(_Symbol,mysymbol.Bid() - (acc.Balance() * PercentStop));
         double BuyPrice=NormalizeDouble(mysymbol.Ask(),_Digits);
         if(mytrade.Buy(1,_Symbol,BuyPrice,stloss,tprofit)) 
               {
                 Alert("Ордер на покупку был успешно размещен, Ticket#:",mytrade.ResultOrder(),"!!");
                 k++;
               }
                else
                 {
                    Alert("Ордер на покупку объема:",mytrade.RequestVolume(), 
                          ", sl:", mytrade.RequestSL(),
                          ", цена:", mytrade.RequestPrice(), 
                          " не выполнен -ошибка:",mytrade.ResultRetcodeDescription());
                    return;
                 }       
         }
      }
      
   }
 

Перед использованием цен, нужно эти цены обновить вызвав метод RefreshRates класса CSymbolInfo.

Также нужно использовать метод NormalizePrice  класса CSymbolInfo.

 
Vladimir Karputov:

Перед использованием цен, нужно эти цены обновить вызвав метод RefreshRates класса CSymbolInfo.

Также нужно использовать метод NormalizePrice  класса CSymbolInfo.


Спасибо большое, данная ошибка пропала. Но появилась очередная ошибка с invalid_stop

            double Stop = acc.Balance() * PercentStop;
            double SellPrice=mysymbol.NormalizePrice(mysymbol.Bid());
            stloss = mysymbol.NormalizePrice(mysymbol.Ask() + Stop); //--- Stop Loss
            tprofit = mysymbol.NormalizePrice(mysymbol.Ask() - Stop * StTkDiff);
            stopPrice = mysymbol.NormalizePrice(mysymbol.Ask() - Stop);
            if(mytrade.Sell(1,_Symbol,SellPrice,stloss,tprofit)) 
            {
              Alert("Ордер на продажу был успешно размещен, Ticket#:",mytrade.ResultOrder(),"!!");
              openPrice = SellPrice;
              k = 0;
            }
          else
           {
              Alert("Ордер на продажу объема:",mytrade.RequestVolume(), 
                    ", sl:", mytrade.RequestSL(),
                    ", цена:", mytrade.RequestPrice(), 
                    " не выполнен -ошибка:",mytrade.ResultRetcodeDescription());
              return;
           }
 

Так это ж склейка - разве на ней торговля разрешена?

 
Vladimir Karputov:

Так это ж склейка - разве на ней торговля разрешена?


Да, фишка в том, что проходят 4 ордера, а дальше вылетают эти ошибки.

 
Fresto:

Да, фишка в том, что проходят 4 ордера, а дальше вылетают эти ошибки.


А Вы когда объекту класса CSimbolInfo присваиваете имя - Вы после этого вызываете метод Refresh?


Добавлено: хотя внутри метода Name уже есть вызов Refresh:

//+------------------------------------------------------------------+
//| Set name                                                         |
//+------------------------------------------------------------------+
bool CSymbolInfo::Name(const string name)
  {
   m_name=name;
//---
   if(!CheckMarketWatch())
      return(false);
//---
   if(!Refresh())
     {
      m_name="";
      Print(__FUNCTION__+": invalid data of symbol '"+name+"'");
      return(false);
     }
//--- succeed
   return(true);
  }
 
Vladimir Karputov:

А Вы когда объекту класса CSimbolInfo присваиваете имя - Вы после этого вызываете метод Refresh?


Я объект создал. И с каждым новым вызовом функции OnTick() вызываю метод Refresh. Просто самое интересное, что в коде открытия позиции всё присваивается в режиме реального времени и почему тогда первые ордера проходят, а другие нет.. Вначале пишет, что invalid_price, затем это пересекается еще и с invalid_stop. Хотя точно такой же код открытия позиции я уже давно оптимизирую на других советниках и там всё нормально.

P.s. можно ли как-нибудь узнать, почему конкретна эта ошибка вылетает? Не просто - invalid_price, а конкретнее, в чем проблема? 

P.s.2 А, тут про другой рефреш.. Но всё же..

 
Fresto:

Я объект создал. И с каждым новым вызовом функции OnTick() вызываю метод Refresh. Просто самое интересное, что в коде открытия позиции всё присваивается в режиме реального времени и почему тогда первые ордера проходят, а другие нет.. Вначале пишет, что invalid_price, затем это пересекается еще и с invalid_stop. Хотя точно такой же код открытия позиции я уже давно оптимизирую на других советниках и там всё нормально.

P.s. можно ли как-нибудь узнать, почему конкретна эта ошибка вылетает? Не просто - invalid_price, а конкретнее, в чем проблема? 


Я думаю это наложение запрета на торговлю на склейке. Больше мыслей нет.

 
Vladimir Karputov:

Я думаю это наложение запрета на торговлю на склейке. Больше мыслей нет.


Понял.. Просто я уже который раз с этим mql5 сижу и не понимаю, в чем может быть ошибка, если всё логично всегда. Просто в склейке проходят хоть какие-то ордера, значит запрета нету.. Ну, буду думать еще.. Спасибо за мысли)

 

Я в итоге понял, там Минимальное изменение цены 10, а расчет sl или tp не было кратно 10, вот он и ворчал. В итоге NormalizePrice не помогало и я в самом расчете Sl еще добавлял :

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);
 
Fresto:

Я в итоге понял, там Минимальное изменение цены 10, а расчет sl или tp не было кратно 10, вот он и ворчал. В итоге NormalizePrice не помогало и я в самом расчете Sl еще добавлял :


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

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