Работа с большим количеством знаков после запятой - MQL4

 

Добрый день!

Возникла проблема, поиск на форуме ничем не помог.

Проблема в следующем:

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

Если я где-то ошибаюсь поправьте меня.

Я попробовал сделать расчеты вручную, чтобы проверить правильность работы советника, но у меня не получилось.

Коэффициент должен быть получен из этого:

К = 0,0042/460800;

Калькулятор выдает следующее: 9,114583333333333е-9

Попробовал сделать расчет средствами MQL4 и получил такой ответ: 1е-08    (как я понимаю это 1х10^-8)

Мне кажется советник не может выполнить расчет правильно из-за большого кол-ва знаков после запятой ИЛИ проблема в чем-то другом ???

 

Чтобы тут  поняли что и как вы получаете и в чём проблема, желательно опубликовать код с расчётами и выводом числа пользователю (перевод в строку вывода).

Программно можно работать с числами до 1.7976931348623158e+308, но некоторые расчётные значения могут представлять недействительное число. Подробности можно вычитать в справке по запросу "double".

На практике редко нужна точность уровней больше 6 знаков после запятой, котировки-то с точностью максимум 5 знаков.

 

а как можно рисовать уровни по таким маленьким коэффициентам?
оно жеж не видно разницы )

объекты с такой точностью не нарисуешь

 
Попробуйте смотреть результат, переводя число в строку функцией DoubleToString с числом знаков после десятичного разделителя 16. Как уже сказали, 1E-8 верное представление с меньшим числом знаков после разделителя, нежели было в 9,114583333333333е-9. В MQL очень часто применяются ограничения разрядности по умолчанию в операциях, связанных с показом чисел на экране.
 
Dmitriy Demidov:

К = 0,0042/460800;

Калькулятор выдает следующее: 9,114583333333333е-9

Попробовал сделать расчет средствами MQL4 и получил такой ответ: 1е-08    (как я понимаю это 1х10^-8)

void OnStart()
{
  double K = 0.0042 / 460800;
  Print(K);

  K *= 460800;
  Print(K);
}
 
Vitalie Postolache:

На практике редко нужна точность уровней больше 6 знаков после запятой, котировки-то с точностью максимум 5 знаков.

Taras Slobodyanik:

а как можно рисовать уровни по таким маленьким коэффициентам?
оно жеж не видно разницы )

объекты с такой точностью не нарисуешь

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

Vladimir:
Попробуйте смотреть результат, переводя число в строку функцией DoubleToString с числом знаков после десятичного разделителя 16. Как уже сказали, 1E-8 верное представление с меньшим числом знаков после разделителя, нежели было в 9,114583333333333е-9. В MQL очень часто применяются ограничения разрядности по умолчанию в операциях, связанных с показом чисел на экране.


 
Можно не считать коэффициент, вместо одного коэффициента таскать за собой эти два числа и их подставлять в формулу, в которой нужен этот коэффициент
 
Dmitry Fedoseev:
Можно не считать коэффициент, вместо одного коэффициента таскать за собой эти два числа и их подставлять в формулу, в которой нужен этот коэффициент
В том то и дело, что коэффициент для каждого уровня свой.
 
Dmitriy Demidov:
В том то и дело, что коэффициент для каждого уровня свой.
Выше был предоставлен код, который доказывает, что никакой потери точности не происходит.
 
Dmitriy Demidov:

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

(Алерт)

Насколько я понял, в справку вы так и заглянули.

DoubleToString(0.0042 / 460800,-16)
 
Vitalie Postolache:

Насколько я понял, в справку вы так и заглянули.

Да уже не нужно, я нашел в чем проблема.

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

А мои формулы рассчитаны на стандартную плоскость координат.

Вот такие дела.

Кстати если  кто знает как решить данную проблему, от помощи не откажусь.

В смысле как "растянуть" график, чтобы каждая минута учитывалась визуально?

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