NormalizeDouble

 
Вопрос наверное глупый... Недавно занялся изучением языка MQL4. Делаю успехи: пишу советники, скрипты, и т.п. Только ни хрена не понимаю, что дает функция "NormalizeDouble"? В учебнике эта функция постоянно упоминается. А у меня и без нее все замечательно. Она нужна вообще? Обьясните пожалуйста, те кто понимает.
 

Alert(NormalizeDouble(0.123456,4));


даст 0.1235


приведение числа с плавающей точкой к формату с определенным количеством знаков после запятой

 
Понадобится когда начнете работать с отложенными ордерами и лоты вычислять советником.
 
Serbov писал(а) >>
Вопрос наверное глупый... Недавно занялся изучением языка MQL4. Делаю успехи: пишу советники, скрипты, и т.п. Только ни хрена не понимаю, что дает функция "NormalizeDouble"? В учебнике эта функция постоянно упоминается. А у меня и без нее все замечательно. Она нужна вообще? Обьясните пожалуйста, те кто понимает.

Например можно округлять при расчете лота. Если он конечно считается по формуле.

 
kernel писал(а) >>

Alert(NormalizeDouble(0.123456,4));

даст 0.1235

приведение числа с плавающей точкой к формату с определенным количеством знаков после запятой

Некорректный пример.
Алерт сам по себе не может вывести более четырех знаков после запятой.
https://docs.mql4.com/ru/common/Alert

 



приведение числа с плавающей точкой к формату с определенным количеством знаков после запятой




Да, я в учебнике по MQL4 это прочитал. Только понять этого не могу.

Вот например

if (NormalizeDouble(Price,Digits) >= NormalizeDouble(Level,Digits))

я это напишу так

if (Price >= Level)


И у меня все отлично вычисляется. О какой плавающей точке речь? У меня инструмент EUR/USD например. Куда от меня моя точка денется? Зачем мне нужна эта функция? Что она дает?

Я понял практически все, но вот эту мелочь понять не могу. Боюсь что косяки в алгоритме будут, если эта непонятная функция важна.

 

Допустим, Вы написали:

if (Price >= Level)

и оба параметра вычисляете через свои формулы и получаете:

Price=1.123456 и Level=1.123457

Если нормализации нет - условие не сработает.

 
Serbov писал(а) >>

Да, я в учебнике по MQL4 это прочитал. Только понять этого не могу.

Вот например

я это напишу так

if (Price >= Level)

И у меня все отлично вычисляется. О какой плавающей точке речь? У меня инструмент EUR/USD например. Куда от меня моя точка денется? Зачем мне нужна эта функция? Что она дает?

Я понял практически все, но вот эту мелочь понять не могу. Боюсь что косяки в алгоритме будут, если эта непонятная функция важна.

Вам уже написали, она нужна в фунукции OrderSend, когда цена или лоты вычисляются по формулам, в этой функции должен быть определенный формат данных.

Если вы не сталкивались с более сложными задачами, то считайте, что вам повезло.

 

Проще объясню:

Вы вычислили по какой-то формуле цену для открытия ордера. Например, по фибе 0.618*(Пик-Впадина). У вас получится на 3 знака после зпт больше, чем есть в котировках. Если послать это значение в качестве цены, то сервер его не примет. Ему нужно ровно столько, сколько есть для данного инструмента. Для этого полученное значение и нужно нормализовать.

 
Svinozavr >>:

Проще объясню:

Вы вычислили по какой-то формуле цену для открытия ордера. Например, по фибе 0.618*(Пик-Впадина). У вас получится на 3 знака после зпт больше, чем есть в котировках. Если послать это значение в качестве цены, то сервер его не примет. Ему нужно ровно столько, сколько есть для данного инструмента. Для этого полученное значение и нужно нормализовать.

Спасибо Svinozavr. На математическом языке понять это было трудно. На человеческом легко.
 

А эта функция везде должна работать? У меня в индикаторе внешняя переменная w типа double.

Для отображения в имени прописываю: IndicatorShortName("SPMA("+NormalizeDouble(w,3)+")");

А результат всё равно такой

Причина обращения: