Как последовательно перебрать перечисление? - страница 4

 
fxsaber:
Почти в четыре раза быстрее стандартной NormalizeDouble (build 1395)... это костыль разработчиков.

Что почти в 4-ре раза быстрее? Код в студию! 
 
Меня тож насчёт 4-х раз удивляет чё-то...
Да и не очень понятно, каким боком там упали массивы или switch.  Там же чисто математика.
 
Dmitry Fedoseev:
Что почти в 4-ре раза быстрее? Код в студию! 
В кодобазе на проверке незнамо сколько дней. Проверяющий в отпуске, наверное.
 
fxsaber:
В кодобазе на проверке незнамо сколько дней. Проверяющий в отпуске, наверное.
Вроде бы, начали сегодня выкладывать. Может и до нас дойдут )))
 
Ihor Herasko:
Вроде бы, начали сегодня выкладывать. Может и до нас дойдут )))
До Вас дошли. До меня - нет.
 
Dmitry Fedoseev:
Что почти в 4-ре раза быстрее? Код в студию! 

https://www.mql5.com/ru/code/16169

// Почти в четыре раза быстрее соответствующей стандартной функции (build 1395)
#define NormalizeDouble PRICE_COMPARE::MyNormalizeDouble
Price_Compare
Price_Compare
  • голосов: 1
  • 2016.08.25
  • fxsaber
  • www.mql5.com
Изящное и шустрое сравнение double-значений "цены".
 

Будьте осторожны используя данную функцию, она будет работать корректно на меньшем диапазоне значений чем NormalizeDouble.

Почему, объяснять не буду - догадайтесь сами.

Работа функции NormalizeDouble:

  1. Выделяется целая часть     - I
  2. Выделяется дробная часть - F
  3. F = F * 10^digits
  4. F = F (+ или - в зависимости от знака) 0.5
  5. F = (целая часть из F) / 10^digits
  6. результат = I + F
 
В общем, сенсации не случилось.
 
Ilyas:

Будьте осторожны используя данную функцию, она будет работать корректно на меньшем диапазоне значений чем NormalizeDouble.

Почему, объяснять не буду - догадайтесь сами.

Работа функции NormalizeDouble:

  1. Выделяется целая часть     - I
  2. Выделяется дробная часть - F
  3. F = F * 10^digits
  4. F = F (+ или - в зависимости от знака) 0.5
  5. F = (целая часть из F) / 10^digits
  6. результат = I + F

В описании функции есть такое примечание

Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров, должны быть нормализованы с точностью, значение которой можно получить функцией Digits().

Это верно только для символов, которые имеют минимальный шаг цены 10^N, где N - целое и не положительное. Если минимальный шаг цены имеет другое значение, то нормализация ценовых уровней перед OrderSend является бессмысленной операцией, которая в большинстве случаев будет приводить к возврату false OrderSend.


Хорошо бы исправить устаревшие представления в справке.

NormalizeDouble полностью дискредитирована. Мало того, что тормозная реализация, так еще и бессмысленная на множестве биржевых символов (например, RTS, MIX и т.д.).

 

Что же касается представленной альтернативной реализации, то она ничем не уступает оригиналу в точности и для положительных и для отрицательных. И так же делает округление. Только работает в 4 раза быстрее.

 
fxsaber:

Это верно только для символов, которые имеют минимальный шаг цены 10^N, где N - целое и не положительное. Если минимальный шаг цены имеет другое значение, то нормализация ценовых уровней перед OrderSend является бессмысленной операцией, которая в большинстве случаев будет приводить к возврату false OrderSend.

 С чего вдруг?
Причина обращения: