Ошибка компилятора

 
1.2733 и 1.2733 это одинаковые числа, или разные? Либо ошибка компилятора, либо оператор if неправильно работает. (198 билд)
Уже третий месяц издеваюсь над брокером своим корявым кодом, вот решил найти причину.

int start()
  {
   // объявляем переменные
   
   // ...
   // ...
   
   SL=50;
   TP=15;
   sltp=MarketInfo(Symbol(),MODE_STOPLEVEL)+2;
   
   // ...
   // ...
   
   OrderSelect // выбираем ордер BUY
   NewOpenOrder=NormalizeDouble(OrderTakeProfit(),Digits);
   
   // ...
   // ...
   
   // нужно переместить ордер selllimit на уровень TakeProfit по ордеру BUY
   OrderSelect // выбираем ордер selllimit
   k=OrderOpenPrice();                  
   kk=Bid+(sltp*Point);                
   if(NewOpenOrder<kk) NewOpenOrder=NormalizeDouble(kk,Digits); 
   if(k>NewOpenOrder)        // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     {
      Print(k," больше ",NewOpenOrder);    // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      Sl=NormalizeDouble(NewOpenOrder+SL*Point,Digits);
      Tp=NormalizeDouble(NewOpenOrder-TP*Point,Digits);
      if(!OrderModify(OrderTicket(),NewOpenOrder,Sl,Tp,0,CLR_NONE))
        {
         Print("Ошибка - ",GetLastError());
        }
     }
     
   // ...
   // ...
   
   return(0);
  }


 
Сранение вещественных чисел.
Поиск рулит...
 
komposter писал (а):
Сранение вещественных чисел.
Поиск рулит...


А кроме "поиск рулит" других вариантов нет? Я не знаю что такое "вещественных", кроме средней школы у меня другого образования нет. В институте я не учился, точнее учился, но вылетел после первой сессии. А после института зарабатывал на жизнь забрасыванием щебенки в бетономешалку. Но даже мои скудные познания в математике подсказывают мне что 1.2733 и 1.2733 это одинаковые числа, или я не прав? На калькуляторе проверил, при вычитании получается ноль. Я простой смертный а не Альберт Энштейн, и 5918 сообщений на форуме еще не написал. Если отвечать не хочется, то лучше промолчать, может кто то сталкивался с этим и подскажет. Я уже неделю ошибку ищу, несколько раз код эксперта переписывал. По поиску "сравнение вещественных чисел" ничего не находит. Если оператор if неправильно сравнивает числа, то я вижу только один выход, исправить ошибку компилятора!
 
OniNePriletyat:

А кроме "поиск рулит" других вариантов нет? Я не знаю что такое "вещественных", кроме средней школы у меня другого образования нет. В институте я не учился, точнее учился, но вылетел после первой сессии. А после института зарабатывал на жизнь забрасыванием щебенки в бетономешалку. Но даже мои скудные познания в математике подсказывают мне что 1.2733 и 1.2733 это одинаковые числа, или я не прав? На калькуляторе проверил, при вычитании получается ноль. Я простой смертный а не Альберт Энштейн, и 5918 сообщений на форуме еще не написал. Если отвечать не хочется, то лучше промолчать, может кто то сталкивался с этим и подскажет. Я уже неделю ошибку ищу, несколько раз код эксперта переписывал. По поиску "сравнение вещественных чисел" ничего не находит. Если оператор if неправильно сравнивает числа, то я вижу только один выход, исправить ошибку компилятора!
Не надо обижаться...
Я тоже не Энштейн, и не постил 6000 сообщений - это за статьи и коды =)

И, кстати, поиск результат даёт - посмотри
Просто я в предыдущем посте допустил ошибку, а ты скопировал оттуда текст и вставил в поиск =)))
В итоге - ошибся я, а не ты...
 
komposter писал (а): ...

Спасибо. Не обижаюсь, нужно было самому внимательнее посмотреть перед тем как копировать в поиск...

Как я понял нельзя сравнивать числа после . Вроде все понятно, а точнее ничего не понятно. Если после использования NormalizeDouble, оператор Print выводит два одинаковые числа, то за одним из них скрывается какое-то другое, как такое может быть? Где же собака порылась? В справке говориться что NormalizeDouble округляет числа с плавающей точкой до указанной точности, и ни слова по какие-то подводные камни. Ну не могу я понять как 1.2733>1.2733, подскажите!
 
OniNePriletyat писал (а):
Если после использования NormalizeDouble, оператор Print выводит два одинаковые числа, то за одним из них скрывается какое-то другое, как такое может быть? Где же собака порылась? В справке говориться что NormalizeDouble округляет числа с плавающей точкой до указанной точности, и ни слова по какие-то подводные камни. Ну не могу я понять как 1.2733>1.2733, подскажите!

Вот здесь в вашем коде

kk=Bid+(sltp*Point);
if(NewOpenOrder<kk)

вы производите перемножение 2х чисел sltp*Point, одно из которых точно double (Point) и далее нормализации не проводите!
А как эти числа перемножаются в компьютере - кто его знает? Вот здесь у вас и проявляется какая-то лишняя единичка в 31 знаке после запятой ;o)!
И поэтому NewOpenOrder<kk может выполняться совсем не так как вы думаете, глядя лишь на первые 4 знака после запятой.
 
OniNePriletyat:
Как я понял нельзя сравнивать числа после NormalizeDouble. Вроде все понятно, а точнее ничего не понятно. Если после использования NormalizeDouble, оператор Print выводит два одинаковые числа, то за одним из них скрывается какое-то другое, как такое может быть? Где же собака порылась? В справке говориться что NormalizeDouble округляет числа с плавающей точкой до указанной точности, и ни слова по какие-то подводные камни. Ну не могу я понять как 1.2733>1.2733, подскажите!
Просто все сравнения вставляй в НормализеДабл:
if ( NormalizeDouble( NewOpenOrder - kk, Digits ) < 0.0 )
 
Я вот вчера очередную систему на МА делал, и с удивление обнаружил, что iMA возвращает значение с кто-знает-какой цифрой после запятой.
Ошибку в алгоритме отлавливал долго... =)

Теперь имею в виду, что индикаторы расчитываются более точно, чем отображаются ;)
 
komposter:
Я вот вчера очередную систему на МА делал, и с удивление обнаружил, что iMA возвращает значение с кто-знает-какой цифрой после запятой.
Ошибку в алгоритме отлавливал долго... =)

Теперь имею в виду, что индикаторы расчитываются более точно, чем отображаются ;)
Отображаются на графике с максимальной точностью (стандартный double), а вот в выводе подсказок точность обычно ограничена 4 знаками.
 
Добавил NormalizeDouble во всех переменных которые сравниваются в операторе if. Все работает как нужно. Спасибо.
 
Renat:
Отображаются на графике с максимальной точностью (стандартный double), а вот в выводе подсказок точность обычно ограничена 4 знаками.
Да, я об этом и говорил.
Если чесно, не совсем понятно, зачем так сделано.

Есть точность - покажи её, нет - тогда обрезай.
Хотя, это не до конца обмозгованый вывод ;)
Причина обращения: