и все же, как избавиться от 5го знака в мт4?

 
Хочу чтобы советник автоматически определял явные уровни. Для этого мне нужно, чтобы анализ цен проходил без 5го знака. Например, 0.70797, 0.70798, 0.70794, 0.70799 - по сути это одна цена 0.7079. На данный момент решил при помощи StringSubstr. Но может есть другой, более логичный и правильный способ?
 
Michael-80:
Хочу чтобы советник автоматически определял явные уровни. Для этого мне нужно, чтобы анализ цен проходил без 5го знака. Например, 0.70797, 0.70798, 0.70794, 0.70799 - по сути это одна цена 0.7079. На данный момент решил при помощи StringSubstr. Но может есть другой, более логичный и правильный способ?

MathRound(), MathCeil(), MathFloor(). В какую сторону нужно, в такую и округляете.

 
NormalizeDouble(x,4)
 
Michael-80:
Хочу чтобы советник автоматически определял явные уровни. Для этого мне нужно, чтобы анализ цен проходил без 5го знака. Например, 0.70797, 0.70798, 0.70794, 0.70799 - по сути это одна цена 0.7079. На данный момент решил при помощи StringSubstr. Но может есть другой, более логичный и правильный способ?

Как сделать, чтобы советник работал с частотой поступления 4-х разрядных котировок, когда на входе его 5-разрядные котировки.

 

MathRound(), MathCeil(), MathFloor() NormalizeDouble сюда вообще не подходят, так как они округляют. Например  0.70798 округляется до 0.708, а это уже другая цена. Должна быть 0,7079.

 
Michael-80:

MathRound(), MathCeil(), MathFloor() NormalizeDouble сюда вообще не подходят, так как они округляют. Например  0.70798 округляется до 0.708, а это уже другая цена. Должна быть 0,7079.

Вы просто не умеете их готовить)) :

#define MATH_ROUND(anyValue, nPrecision) floor(double(anyValue) * double(pow(10.0, nPrecision)) + double(.51)) / double(pow(10.0, nPrecision))
#define FLOOR_ROUND(anyValue, nPrecision) floor(double(anyValue) * double(pow(10.0, nPrecision))) / double(pow(10.0, nPrecision))

void OnStart()
{
   double fPrice = 0.79798;
   Alert("4-digits price to floor: ", FLOOR_ROUND(fPrice, Digits() - 1)); 
   Alert("4-digits price to near value: ", MATH_ROUND(fPrice, Digits() - 1)); 
}

На выходе:

Alert: 4-digits price to near value: 0.798
Alert: 4-digits price to floor: 0.7979
 
Пока разбираюсь, но зачем вы используете скобки в Digits()? Я всегда делаю так например, Digits-1. Т. е. без скобок
 
...или я опять что то не так пожарил?))
 

Скопировал ваш пример, запустил и ничего не получилось. Вот что на выходе у меня:

4-digits price to near value: 0.8

4-digits price to floor: 0.79

Рассмотрел поэтапно и понял, что сначала значение умножается на возведение в степень, затем делится и это приводит к одному и тому же числу и затем мат функция действует как обычно. Может с возведением в степень что то не правильно?

 
Michael-80:

Скопировал ваш пример, запустил и ничего не получилось. Вот что на выходе у меня:

4-digits price to near value: 0.8

4-digits price to floor: 0.79

Рассмотрел поэтапно и понял, что сначала значение умножается на возведение в степень, затем делится и это приводит к одному и тому же числу и затем мат функция действует как обычно. Может с возведением в степень что то не правильно?

Наверное, запускали на валюте с тремя знаками после запятой. Например, на USDJPY. Запустите на той валюте, у которой 5 знаков после запятой: USDCHF, EURUSD и т. п.

Или же вместо жесткого задания значения fPrice возьмите цену той валюты, на которой запустили. Например, Bid или Ask.
 
Michael-80:
Пока разбираюсь, но зачем вы используете скобки в Digits()? Я всегда делаю так например, Digits-1. Т. е. без скобок

В принципе без разницы. Хотя как-то Ренат говорил о том, что лучше все-таки использовать вызов функции. Не помню уже, почему.

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