Я писал о ней несколько раз, но ответа не получил.
Возможно, так как мы проверили достаточно много различных совместных конфигураций.
1. Улучшена подкачка данных;
2. Улучшена работа через Data Center;
3. Исправлено отображение последних данных некоторых индикаторов в окне "Data Window";
4. Улучшена работа системы получения новостей;
5. Улучшена работа внутренней почты;
6. Внесены изменения в Словарь редактора MetaEditor;
7. Исправлены ошибки по крешлогам.
Выпущена обновленная версия MetaTrader Data Center 4 build 166.
8. Исправлена ошибка в порядке выполнения операций
Ранее (билд 167) в выражении shadow12*100/n1*(100+percent), сначала производилось умножение n1*(100+percent), а затем деление shadow12*100/n1*(100+percent) - что не правильно, теперь все на своих местах и указанные вычисления будут выдавать результат 12*100*(100+percent) / n1
Ранее (билд 167) в выражении shadow12*100/n1*(100+percent), сначала производилось умножение n1*(100+percent), а затем деление shadow12*100/n1*(100+percent) - что не правильно, теперь все на своих местах и указанные вычисления будут выдавать результат 12*100*(100+percent) / n1
Странно, но про такую ошибку мы вообще не в курсе. Похоже наведенный глюк был.
Спасибо что указали.
Странно это.
Такую ошибку заметили бы все.
Синтаксический разбор арифметики один для всех выражений.
Вот такой скрипт
int start() { int n1 = 11; int percent = 20; double shadow12 = 10.0; double r1 = shadow12*100/n1*(100+percent); double r2 = shadow12*100*(100+percent)/n1; MessageBox("r1 = "+r1+"\nr2 = "+r2); }
Дает правильный результат.
Дома у меня 165 билд, после праздников могу и на работе на 167 проверить.
Но ИМХО, результат будет тот же.
int start() { int n1 = 11; int percent = 20; int shadow12 = 10.0; double r1 = shadow12*100/n1*(100+percent); double r2 = shadow12*100*(100+percent)/n1; MessageBox("r1 = "+r1+"\nr2 = "+r2); }
Дает разный результат.
И это правильно, так и должно быть.
Этот дает совпадающие значения
int shadow12 = 10.0; double r1 = shadow12*100./n1*(100+percent); double r2 = shadow12*100.*(100+percent)/n1;
А вот этот разные
int shadow12 = 10.0; double r1 = shadow12*100/n1*(100.+percent); double r2 = shadow12*100*(100.+percent)/n1;
Насколько это правильно и логично - не знаю.
В общем-то ставя вещественную константу или переменную справа, юзер будет ожидать вычислений этого выражения с правающей точкой. И докопаться до такой своей ошибки потом будет сложно.
Этот дает совпадающие значения
int shadow12 = 10.0; double r1 = shadow12*100./n1*(100+percent); double r2 = shadow12*100.*(100+percent)/n1;
А вот этот разные
int shadow12 = 10.0; double r1 = shadow12*100/n1*(100.+percent); double r2 = shadow12*100*(100.+percent)/n1;
Насколько это правильно и логично - не знаю.
В общем-то ставя вещественную константу или переменную справа, юзер будет ожидать вычислений этого выражения с правающей точкой. И докопаться до такой своей ошибки потом будет сложно.
Все работает правильно. Это все от приведения типов. Хотите получить double - надо бы следить чтобы операнды(хотя бы один из них) были double. Как минимум, надо константы правильно изначально описывать. Проводя операции между INT и INT, не стоит ожидать, что третья-четвертая операция, проведенная уже с вещественным числом, покажет ожидаемый результат.
Этот дает совпадающие значения
int shadow12 = 10.0; double r1 = shadow12*100./n1*(100+percent); double r2 = shadow12*100.*(100+percent)/n1;
А вот этот разные
int shadow12 = 10.0; double r1 = shadow12*100/n1*(100.+percent); double r2 = shadow12*100*(100.+percent)/n1;
Насколько это правильно и логично - не знаю.
В общем-то ставя вещественную константу или переменную справа, юзер будет ожидать вычислений этого выражения с правающей точкой. И докопаться до такой своей ошибки потом будет сложно.
Все работает правильно. Это все от приведения типов. Хотите получить double - надо бы следить чтобы операнды(хотя бы один из них) были double. Как минимум, надо константы правильно изначально описывать. Проводя операции между INT и INT, не стоит ожидать, что третья-четвертая операция, проведенная уже с вещественным числом, покажет ожидаемый результат.
код(частичный) индикатора в 167 билде
... double BuySlBuffer[]; ... int start() { //объявление переменных с плавающей точкой double ampl1,ampl2,shadow11,shadow12,shadow21,shadow22,maxamp1,maxamp2, maxsh11,maxsh12,maxsh21,maxsh22; //обявление целочисленных переменных int i,j,n1,n2; ... BuySlBuffer[i]=Close[i+1]-NormalizeDouble(shadow12*100/n1*(100+percent),4);
выводился ожидаемый результат, хотя в написании ошибка, а вот после установки 168 билда, эта ошибка проявилась (линии индикатора разлетелсь), потому что правильно для моего случая было бы
BuySlBuffer[i]=Close[i+1]-NormalizeDouble(shadow12*100/(n1*(100+percent)),4);
2Renat
сам индикатор(StopLossLevel.mq4) я высылал на stringo... еще до выявления ошибки и результаты вывода в лог тоже, правда по другому поводу.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
1. Улучшена подкачка данных;
2. Улучшена работа через Data Center;
3. Исправлено отображение последних данных некоторых индикаторов в окне "Data Window";
4. Улучшена работа системы получения новостей;
5. Улучшена работа внутренней почты;
6. Внесены изменения в Словарь редактора MetaEditor;
7. Исправлены ошибки по крешлогам.
Выпущена обновленная версия MetaTrader Data Center 4 build 166.