Как получить значения уровней фибоначи ? - страница 3

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Понял свою ошибку - не увидел "минус"
Теперь новая загвоздка. fibo_level_161 = NormalizeDouble((fibo_level_0 + (sto_proc*1.618)), Digits); Alert дает такой результат fibo_level_161=0.7576000000000001. Как устранить данный косяк, нормализацию же делаю ?
Если убрать нормализацию fibo_level_161 = fibo_level_0 + (sto_proc*1.618);, результат получается такой fibo_level_161=0.7575574
Зачем Вы делаете нормализацию? С какой целью?
В справке читали описание NormalizeDouble?
Зачем Вы делаете нормализацию? С какой целью?
В справке читали описание NormalizeDouble?
Вы собираетесь использовать нормализованное значение в качестве цены для выставляемого ордера? Зачем Вы делаете нормализацию, ведь это действие понижает точность числа.
Вы так и не прочитали документацию. С чего Вы взяли, что быть не должно?
Нужно иметь в виду, что нормализованное число при выводе в Журнал с помощью Print() может содержать большее количество знаков после запятой, чем вы ожидаете. Например,
double a=76.671; // нормализованное число с 3 знаками после запятой
Print("Print(76.671)=",a); // выведем его как есть
Print("DoubleToString(a,8)=",DoubleToString(a,8)); // выведем с заданной точностью
выдаст в терминале:
DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001
Сходите дальше по ссылкам https://docs.mql4.com/ru/basis/types/double и почитайте, вместо того чтобы заявлять о косяках
Я знаю это, но тут вопрос неправильное значение формируется на каком этапе ?
Что вы знаете? Вы так ничего и не прочитали в документации.
Тут нет неправильного значения.
int Digits(); - Возвращает количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика.
Соответственно fibo_level_161 = NormalizeDouble((fibo_level_0 + (sto_proc*1.618)), Digits); должен округлять до 4 знака после запятой а мне выдает ответ fibo_level_161=0.7576000000000001 - это неправильно.
Если не делать нормализацию то ответ fibo_level_161=0.7575574 - это то же неправильно т.к у меня 4 знака после запятой. И потом данные значения я планирую использовать для открытия ордеров, соответственно по таким значениям позиция никогда не откроется потому что ни когда такой рыночной цены не будет. Вы так и не ответили эти значения формируются при расчете или при выводе информации ?
Касательно функции NormalizeDouble
Примечание Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров, должны быть нормализованы с точностью, значение которой можно получить функцией Digits().
Я так понимаю это касается любой цены или только SL, TP, и цены отложенных ордеров ?
Для эксперимента сделал так Alert("Восходящий тренд", " OOBid=",NormalizeDouble(OOBid,Digits), " fibo_level_23=",NormalizeDouble(fibo_level_23,Digits), " fibo_level_0=",NormalizeDouble(fibo_level_0,Digits), " fibo_level_100=",NormalizeDouble(fibo_level_100,Digits), " fibo_level_161=",NormalizeDouble(fibo_level_161,Digits), " fibo_level_61=",NormalizeDouble(fibo_level_61,Digits)); и убрал нормализацию в расчетах в результате Alert перестал выходить, делаю вывод что те значения которые получаются при расчетах не соответствуют рыночным ценам, скорее всего из-за того что расчет показывает значения с цифрами более 4 символов после запятой.
Что не так ?
Всё не так.
NormalizeDouble изменяет вещественное число, а именно, понижает его точность. При этом не нужно забывать, что вещественные числа имеют ограниченную аппаратно точность представления.
NormalizeDouble предусмотрена исключительно для формирования значения цены в торговой функции. Другого назначения у этой функции нет.
Для вывода значения вещественного числа используйте форматирование вывода, если не устраивает %.16g по умолчанию. Примеров форматирования вывода масса. Можно использовать PrintFormat, StringFormat, DoubleToString.
Всё не так.
NormalizeDouble изменяет вещественное число, а именно, понижает его точность. При этом не нужно забывать, что вещественные числа имеют ограниченную аппаратно точность представления.
NormalizeDouble предусмотрена исключительно для формирования значения цены в торговой функции. Другого назначения у этой функции нет.
Для вывода значения вещественного числа используйте форматирование вывода, если не устраивает %.16g по умолчанию. Примеров форматирования вывода масса. Можно использовать PrintFormat, StringFormat, DoubleToString.
Вот мой код:
Как я Вас понял, Вы предлагаете убрать нормализацию и вместо Alert прописать Print, внутри Print использовать Вами указанные функции для округления до 4 знака?
Вы путаете понятия. Не надо ничего округлять. Выводите с нужной Вам точностью. Самый простой вариант - DoubleToString
NormalizeDouble тут вообще ни при чём! Сказано же - NormalizeDouble использовать исключительно для нормализации цены