MQL4 - automated forex trading   /  

Форум

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

К списку тем  | 1 2 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
181
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);
  }


article

Отчет о заседании Жюри 4 ноября 2008 года

На заседании обсуждались вопросы дисквалификации некоторых Участников.


avatar
13989
komposter 30.10.2006 22:26 
Сранение вещественных чисел.
Поиск рулит...

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


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

avatar
13989
komposter 31.10.2006 00:19 
OniNePriletyat писал (а):

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

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

avatar
181
OniNePriletyat 31.10.2006 09:00 
komposter писал (а): ...

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

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

avatar
863
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 знака после запятой.


avatar
13989
komposter 31.10.2006 11:20 
OniNePriletyat писал (а):
Как я понял нельзя сравнивать числа после NormalizeDouble. Вроде все понятно, а точнее ничего не понятно. Если после использования NormalizeDouble, оператор Print выводит два одинаковые числа, то за одним из них скрывается какое-то другое, как такое может быть? Где же собака порылась? В справке говориться что NormalizeDouble округляет числа с плавающей точкой до указанной точности, и ни слова по какие-то подводные камни. Ну не могу я понять как 1.2733>1.2733, подскажите!
Просто все сравнения вставляй в НормализеДабл:
if ( NormalizeDouble( NewOpenOrder - kk, Digits ) < 0.0 )


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

Теперь имею в виду, что индикаторы расчитываются более точно, чем отображаются ;)

avatar
Модератор
3176
Renat 31.10.2006 11:56 
komposter писал (а):
Я вот вчера очередную систему на МА делал, и с удивление обнаружил, что iMA возвращает значение с кто-знает-какой цифрой после запятой.
Ошибку в алгоритме отлавливал долго... =)

Теперь имею в виду, что индикаторы расчитываются более точно, чем отображаются ;)
Отображаются на графике с максимальной точностью (стандартный double), а вот в выводе подсказок точность обычно ограничена 4 знаками.

avatar
181
OniNePriletyat 31.10.2006 12:41 
Добавил NormalizeDouble во всех переменных которые сравниваются в операторе if. Все работает как нужно. Спасибо.

avatar
13989
komposter 31.10.2006 12:46 
Renat писал (а):
Отображаются на графике с максимальной точностью (стандартный double), а вот в выводе подсказок точность обычно ограничена 4 знаками.
Да, я об этом и говорил.
Если чесно, не совсем понятно, зачем так сделано.

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий