Проблема с модификацией позиции!!! Требуется помощь спецов и может быть разработчиков mql!

 
Всем доброго!

Товарищи нужна Ваша квалифицированная помощь и совет. Ниже представлена функция модификации стопов позиции, вызов завершается ошибкой в некоторых случаях, что как сами понимаете не хорошо и засоряет лог.

Ткните пальцем где моя ошибка!!! 

bool ModifyPosition(double iSl = 0,double iTp = 0){
   bool ret =false;
   double sl = NormalizeDouble(iSl,m_symbol.Digits());
   double tp = NormalizeDouble(iTp,m_symbol.Digits());
   if(m_debug)
      Print(__FUNCTION__,", sl = ",sl,", tp = ",tp,", Ask() = ",m_symbol.Ask(),", Bid() = ",m_symbol.Bid());
   //--- modify position
   if(m_trade.PositionModify(m_symbol.Name(),sl,tp)){
      if(m_debug){
         printf("Short position by %s to be modified",m_symbol.Name());
         ret = true;
      } 
     }else
      if(m_debug)
      {
         printf("Error modifying position by %s : '%s'",m_symbol.Name(),m_trade.ResultComment());
         printf("Modify parameters : SL=%f,TP=%f",sl,tp);
      }
   return(ret);
}

Результат лога ниже, не понимаю что происходит и где проблема, ткните пальцем в мою ошибку. В логе пример ошибки при модификации позиции SELL на стоплос .

Заранее всем спасибо! 


2012.09.11 21:58:27     2012.01.04 17:50:01   Modify parameters : SL=1.294050,TP=1.281480
2012.09.11 21:58:27     2012.01.04 17:50:01   Error modifying position by EURUSD : 'Invalid stops'
2012.09.11 21:58:27     2012.01.04 17:50:01   CTrade::OrderSend: modify EURUSD (sl: 1.29405, tp: 1.28148) [invalid stops]
2012.09.11 21:58:27     2012.01.04 17:50:01   failed modify sell 2.00 EURUSD sl: 1.29405, tp: 1.28148 -> sl: 1.29405, tp: 1.28148 [Invalid stops]
2012.09.11 21:58:27     2012.01.04 17:50:01   ModifyPosition, sl = 1.29405, tp = 1.28148, Ask() = 1.29322, Bid() = 1.29304

 
Логично выдавать ошибку, если все цены модифицированной позиции и открытой позиции совпадают.
 
hrenfx:
Логично выдавать ошибку, если все цены модифицированной позиции и открытой позиции совпадают.

Не понял, объясните!!! 

Вот скрин по примеру, красная верхняя это не состоявшийся стоп:

 

 
2012.09.11 21:58:27 2012.01.04 17:50:01 failed modify sell 2.00 EURUSD sl: 1.29405, tp: 1.28148 (было) -> (хотите) sl: 1.29405, tp: 1.28148 [Invalid stops]

 
hrenfx:

Понял. Странно, вроде я проверяю эту ситуацию, сейчас поправим.

Ну как я и говорил, данную проверку выполнял:

bool Modify(double iSl = 0,double iTp = 0){

   if(!m_symbol.RefreshRates()) return(false);
   
   double sl = m_position.StopLoss();
   double tp = m_position.TakeProfit();

   if(iSl < sl || (sl == 0 && iSl != 0)){
     if(iSl - m_symbol.StopsLevel() * m_symbol.Point() > m_symbol.Ask() && iSl <= m_position.PriceOpen())
       if(ModifyPosition(iSl,tp))ret = true;
   }
...

 Ничего не понимаю....

 

Поизучайте вопрос корректного сравнения вещественных чисел.

Проще всего перед любыми сравнениями перейти к целым числам:

int PriceINT = PriceDOUBLE / Point + 0.1;

 

 
hrenfx:

Поизучайте вопрос корректного сравнения вещественных чисел.

Проще всего перед любыми сравнениями перейти к целым числам:

 

Жестоко однако, на счет правил то я понимаю, просто надоело чесать правой рукой левое ухо!!!

Когда наконец прекратиться проблема с вещественными  переменными.

 
В любом случае  hrenfx, Вам спасибо!
 
gfm73:

Жестоко однако, на счет правил то я понимаю, просто надоело чесать правой рукой левое ухо!!!

Когда наконец прекратиться проблема с вещественными  переменными.

Хватит это терпеть! (с) известный политик.
 
Если тема сравнения цен интересна, то тут кое-что писал:

https://www.mql5.com/ru/forum/3872#comment_208855 . Имхо. Я не продвигаю именно эту функцию, обратите внимание на идею.

P.S: это может не столько про Ваш случай, т.к. мне кажется, что можно обойтись нормализацией NormalizeDouble().

 
gfm73:

Понял. Странно, вроде я проверяю эту ситуацию, сейчас поправим.

Ну как я и говорил, данную проверку выполнял:

 Ничего не понимаю....

Хорошей практикой считается перемещать стоп не по каждому тику, а с некоторым шагом.