| / | Форум |
|
OniNePriletyat
30.10.2006 22:15
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); } ![]()
|
|
Отчет о заседании Жюри 4 ноября 2008 года На заседании обсуждались вопросы дисквалификации некоторых Участников. |
|
komposter
30.10.2006 22:26
Сранение вещественных чисел.
Поиск рулит... |
|
OniNePriletyat
30.10.2006 23:47
А кроме "поиск рулит" других вариантов нет? Я не знаю что такое "вещественных", кроме средней школы у меня другого образования нет. В институте я не учился, точнее учился, но вылетел после первой сессии. А после института зарабатывал на жизнь забрасыванием щебенки в бетономешалку. Но даже мои скудные познания в математике подсказывают мне что 1.2733 и 1.2733 это одинаковые числа, или я не прав? На калькуляторе проверил, при вычитании получается ноль. Я простой смертный а не Альберт Энштейн, и 5918 сообщений на форуме еще не написал. Если отвечать не хочется, то лучше промолчать, может кто то сталкивался с этим и подскажет. Я уже неделю ошибку ищу, несколько раз код эксперта переписывал. По поиску "сравнение вещественных чисел" ничего не находит. Если оператор if неправильно сравнивает числа, то я вижу только один выход, исправить ошибку компилятора! |
|
komposter
31.10.2006 00:19
OniNePriletyat писал (а): Не надо обижаться...А кроме "поиск рулит" других вариантов нет? Я не знаю что такое "вещественных", кроме средней школы у меня другого образования нет. В институте я не учился, точнее учился, но вылетел после первой сессии. А после института зарабатывал на жизнь забрасыванием щебенки в бетономешалку. Но даже мои скудные познания в математике подсказывают мне что 1.2733 и 1.2733 это одинаковые числа, или я не прав? На калькуляторе проверил, при вычитании получается ноль. Я простой смертный а не Альберт Энштейн, и 5918 сообщений на форуме еще не написал. Если отвечать не хочется, то лучше промолчать, может кто то сталкивался с этим и подскажет. Я уже неделю ошибку ищу, несколько раз код эксперта переписывал. По поиску "сравнение вещественных чисел" ничего не находит. Если оператор if неправильно сравнивает числа, то я вижу только один выход, исправить ошибку компилятора! Я тоже не Энштейн, и не постил 6000 сообщений - это за статьи и коды =) И, кстати, поиск результат даёт - посмотри Просто я в предыдущем посте допустил ошибку, а ты скопировал оттуда текст и вставил в поиск =))) В итоге - ошибся я, а не ты... |
|
OniNePriletyat
31.10.2006 09:00
Спасибо. Не обижаюсь, нужно было самому внимательнее посмотреть
перед тем как копировать в поиск...
Как я понял нельзя сравнивать числа после . Вроде все понятно, а точнее ничего не понятно. Если после использования NormalizeDouble, оператор Print выводит два одинаковые числа, то за одним из них скрывается какое-то другое, как такое может быть? Где же собака порылась? В справке говориться что NormalizeDouble округляет числа с плавающей точкой до указанной точности, и ни слова по какие-то подводные камни. Ну не могу я понять как 1.2733>1.2733, подскажите! |
|
solandr
31.10.2006 09:13
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 знака после запятой. |
|
komposter
31.10.2006 11:20
OniNePriletyat писал (а): Просто все сравнения вставляй в НормализеДабл:Как я понял нельзя сравнивать числа после NormalizeDouble. Вроде все понятно, а точнее ничего не понятно. Если после использования NormalizeDouble, оператор Print выводит два одинаковые числа, то за одним из них скрывается какое-то другое, как такое может быть? Где же собака порылась? В справке говориться что NormalizeDouble округляет числа с плавающей точкой до указанной точности, и ни слова по какие-то подводные камни. Ну не могу я понять как 1.2733>1.2733, подскажите! if ( NormalizeDouble( NewOpenOrder - kk, Digits ) < 0.0 ) |
|
komposter
31.10.2006 11:35
Я вот вчера очередную систему на МА делал, и с удивление обнаружил,
что iMA возвращает значение с кто-знает-какой цифрой после запятой.
Ошибку в алгоритме отлавливал долго... =) Теперь имею в виду, что индикаторы расчитываются более точно, чем отображаются ;) |
3176 |
Renat
31.10.2006 11:56
komposter писал (а): Отображаются на графике с максимальной точностью (стандартный
double), а вот в выводе подсказок точность обычно ограничена 4 знаками.
Я вот вчера очередную систему на МА делал, и с удивление обнаружил, что iMA возвращает значение с кто-знает-какой цифрой после запятой. Ошибку в алгоритме отлавливал долго... =) Теперь имею в виду, что индикаторы расчитываются более точно, чем отображаются ;) |
|
OniNePriletyat
31.10.2006 12:41
Добавил NormalizeDouble во всех переменных которые сравниваются в операторе if. Все работает
как нужно. Спасибо.
|
|
komposter
31.10.2006 12:46
Renat писал (а): Да, я об этом и говорил.Отображаются на графике с максимальной точностью (стандартный double), а вот в выводе подсказок точность обычно ограничена 4 знаками. Если чесно, не совсем понятно, зачем так сделано. Есть точность - покажи её, нет - тогда обрезай. Хотя, это не до конца обмозгованый вывод ;) |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий