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

 

Понял свою ошибку - не увидел "минус"

Теперь новая загвоздка.  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?

 
stringo:

Зачем Вы делаете нормализацию? С какой целью?

В справке читали описание NormalizeDouble?

Для того что бы получаемые значения были с точностью до 4 знаков после запятой (в моем случае) т.е fibo_level_161=0.7575574 и fibo_level_161=0.7576000000000001 быть не должно. Должен получится результат fibo_level_161=0.7576
 

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

Вы так и не прочитали документацию. С чего Вы взяли, что быть не должно?

Нужно иметь в виду, что нормализованное число при выводе в Журнал с помощью 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 и почитайте, вместо того чтобы заявлять о косяках

 
Я знаю это, но тут вопрос неправильное значение формируется на каком этапе ? На этапе вывода сообщения или на этапе вычисления ? Если на этапе вычисления то толку от Print("DoubleToString(a,8)=",DoubleToString(a,8)); ни какого не будет т.к рассчитываться все будет с ошибками.
 
Rafting:
Я знаю это, но тут вопрос неправильное значение формируется на каком этапе ?

Что вы знаете? Вы так ничего и не прочитали в документации.

Тут нет неправильного значения.

 

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.

 
stringo:

Всё не так.

NormalizeDouble изменяет вещественное число, а именно, понижает его точность. При этом не нужно забывать, что вещественные числа имеют ограниченную аппаратно точность представления.

NormalizeDouble предусмотрена исключительно для формирования значения цены в торговой функции. Другого назначения у этой функции нет.

Для вывода значения вещественного числа используйте форматирование вывода, если не устраивает %.16g по умолчанию. Примеров форматирования вывода масса. Можно использовать PrintFormat, StringFormat, DoubleToString.

Вот мой код:

if(time_fractal_min < time_fractal_max)
       {
          fibo_level_0 = NormalizeDouble(min_fractal,Dig);
          fibo_level_100 = NormalizeDouble(max_fractal,Dig); 
          sto_proc = NormalizeDouble((fibo_level_100 - fibo_level_0),Dig);
          fibo_level_23 = NormalizeDouble((fibo_level_0 + (sto_proc*0.236)),Dig);
          fibo_level_61 = NormalizeDouble((fibo_level_0 + (sto_proc*0.618)),Dig);
          fibo_level_161 = NormalizeDouble((fibo_level_0 + (sto_proc*1.618)),Dig);
          OOBid = NormalizeDouble((Bid+(dist*Point)), Dig);
          if(OOBid == fibo_level_23 || OOBid == fibo_level_0 || OOBid == fibo_level_61 || OOBid == fibo_level_100 || OOBid == fibo_level_161)
           {
            if (CountTradesSell(Magic) == 0)
            {
             OrderSend(Symbol(), OP_SELL, Lot, Bid, slippage, Bid+distSL, Bid-distTP, "", Magic);  
             Alert("Восходящий тренд", "    OOBid=",OOBid, "    fibo_level_23=",fibo_level_23, "    fibo_level_0=",fibo_level_0, "    fibo_level_100=",fibo_level_100, "    fibo_level_161=",fibo_level_161, "    fibo_level_61=",fibo_level_61);            
            }
           }        
       }
       if(time_fractal_min > time_fractal_max)
       {
          fibo_level_0 = NormalizeDouble(max_fractal,Dig);
          fibo_level_100 = NormalizeDouble(min_fractal,Dig);
          sto_proc = NormalizeDouble((fibo_level_100 - fibo_level_0),Dig);
          fibo_level_23 = NormalizeDouble((fibo_level_0 + (sto_proc*0.236)),Dig);
          fibo_level_61 = NormalizeDouble((fibo_level_0 + (sto_proc*0.618)),Dig);
          fibo_level_161 = NormalizeDouble((fibo_level_0 + (sto_proc*1.618)),Dig); 
          OOBid = NormalizeDouble((Bid-(dist*Point)),Dig);
          if(OOBid == fibo_level_23 || OOBid == fibo_level_0 || OOBid == fibo_level_61 || OOBid == fibo_level_100 || OOBid == fibo_level_161)
          {
           if (CountTradesBuy(Magic) == 0)
           {
            OrderSend(Symbol(), OP_BUY, Lot, Ask, slippage, Ask-distSL, Ask+distTP,"", Magic);   
            Alert("Нисходящий тренд", "    OOBid=",OOBid, "    fibo_level_23=",fibo_level_23, "    fibo_level_0=",fibo_level_0, "    fibo_level_100=",fibo_level_100, "    fibo_level_161=",fibo_level_161, "    fibo_level_61=",fibo_level_61);
           }
          }  
        }

 Как я Вас понял, Вы предлагаете убрать нормализацию и вместо Alert прописать Print, внутри Print использовать Вами указанные функции для округления до 4 знака?

 

Вы путаете понятия. Не надо ничего округлять. Выводите с нужной Вам точностью. Самый простой вариант - DoubleToString

NormalizeDouble тут вообще ни при чём! Сказано же - NormalizeDouble использовать исключительно для нормализации цены

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