Ваши вопросы по языку MQL4

griz

Активный участник
Как отвалится? Это ведь не ящерица……… Поищи сколько знаков после запятой хранит double число. Просто надо правильно делить. Если ID чарта имеет тип long и делить на целочисленное число 1000000, то конечно получишь целочисленное значение. Но если long делить на 1000000.0 и сунуть это частное в переменную типа double с явным приведением типа, то получишь желаемое. И обратно, умножая на 1000000 явно привести к типу long.
DBL_MAX = 1.7976931348623158e+308

Я в этом плохо разбираюсь. Как я понял, в double влезает 15 значимых цифр после запятой и 16-я цифра округляемая. А мне нужно 18 цифр.

Даже, если вот так проверить:
Код:
long a = 132583223415320869;
double b = a;
b будет равна 1.325832234153209e+17

Ваш вариант:
Код:
long a = 132583223415320869;
double b = 1000000.0;
double d = a / b;
d будет равна 132583223415.3209

В общем такой вариант не подходит
 

AlexeyVik

Программист mql4 mql5
DBL_MAX = 1.7976931348623158e+308

Я в этом плохо разбираюсь. Как я понял, в double влезает 15 значимых цифр после запятой и 16-я цифра округляемая. А мне нужно 18 цифр.

Даже, если вот так проверить:
Код:
long a = 132583223415320869;
double b = a;
b будет равна 1.325832234153209e+17

Ваш вариант:
Код:
long a = 132583223415320869;
double b = 1000000.0;
double d = a / b;
d будет равна 132583223415.3209

В общем такой вариант не подходит
Всё подходит… Вот результат выполнения скрипта прикреплённого в подвале…
00.png
 

Вложения

  • 00.mq4
    1,8 КБ · Просмотры: 13

griz

Активный участник
Всё подходит… Вот результат выполнения скрипта прикреплённого в подвале…
Посмотреть вложение 424892
Если присваивать именно ваш chartID 132287246932275009. То это число у меня тоже нормально присваивается, как 1322872469.32275009

Вы попробуйте присвойте переменной 00 число 132583223415320869. Интересно, у Вас нормально присвоится? Просто пропишите: long chartID = 132583223415320869;

У меня после присвоения 132583223415320869, в глобальную переменную 00 попадает 1325832234.15320873
 

griz

Активный участник
Если присваивать именно ваш chartID 132287246932275009. То это число у меня тоже нормально присваивается, как 1322872469.32275009

Вы попробуйте присвойте переменной 00 число 132583223415320869. Интересно, у Вас нормально присвоится? Просто пропишите: long chartID = 132583223415320869;

У меня после присвоения 132583223415320869, в глобальную переменную 00 попадает 1325832234.15320873
22.png
 

mobidik

-----
Вы попробуйте присвойте переменной 00 число 132583223415320869. Интересно, у Вас нормально присвоится? Просто пропишите: long chartID = 132583223415320869;

У меня после присвоения 132583223415320869, в глобальную переменную 00 попадает 1325832234.15320873
Есть такое, дело в том, что, если после операции деления, в дробной части числа присутствует число 3 или 7, то конечный результат может быть иным. В самой справке есть подобный пример, но где именно - не вспомню. На Вашем месте, я бы перевел значение chartID в string и, уже как текст, разделил его на две части, которые затем преобразовал в double и записал в глобальную переменную. После чтения глобальных - проделать обратную операцию.
 

AlexeyVik

Программист mql4 mql5
Если присваивать именно ваш chartID 132287246932275009. То это число у меня тоже нормально присваивается, как 1322872469.32275009

Вы попробуйте присвойте переменной 00 число 132583223415320869. Интересно, у Вас нормально присвоится? Просто пропишите: long chartID = 132583223415320869;

У меня после присвоения 132583223415320869, в глобальную переменную 00 попадает 1325832234.15320873
Сдаюсь… Это особенности представления вещественных чисел в двоичном формате. Как ни крути, а такое число никак… Видимо твоё решение разбить на два числа будет оптимальным. Или сохранить в имени GV как строку.
 

AlexeyVik

Программист mql4 mql5
Есть такое, дело в том, что, если после операции деления, в дробной части числа присутствует число 3 или 7, то конечный результат может быть иным. В самой справке есть подобный пример, но где именно - не вспомню. На Вашем месте, я бы перевел значение chartID в string и, уже как текст, разделил его на две части, которые затем преобразовал в double и записал в глобальную переменную. После чтения глобальных - проделать обратную операцию.
Не получается. Я взял long(132583223415320869/100000000) и остаток от деления на 100000000
По отдельности получается 1325832234 и 15320869 и 15320869*100000000 получается 0.15320869… А когда складываешь 1325832234+0.15320869 вот тут и не выходит нихрена.
 

griz

Активный участник
Не получается. Я взял long(132583223415320869/100000000) и остаток от деления на 100000000
По отдельности получается 1325832234 и 15320869 и 15320869*100000000 получается 0.15320869… А когда складываешь 1325832234+0.15320869 вот тут и не выходит нихрена.
Я просто сохраняю в глобальные переменные 132583223 и 415320869. А потом при чтении эти переменные как стринговые соединяю.
 

AlexeyVik

Программист mql4 mql5
Я просто сохраняю в глобальные переменные 132583223 и 415320869. А потом при чтении эти переменные как стринговые соединяю.
На мой взгляд проще сохранить GV с именем IntegerToString(ChartID()) записав туда или 0 или ещё какую полезную информацию и потом взять это имя и перевести в long
 

mobidik

-----
На мой взгляд проще сохранить GV с именем IntegerToString(ChartID()) записав туда или 0 или ещё какую полезную информацию и потом взять это имя и перевести в long
Согласен, так будет проще, нет необходимости разбивки. Задать имя, например, "GV_abc"+какой-то разделитель, например "|" и затем все соединить в StringConcatenate(). При чтении/переборе глобальных задать поиск в имени глобальной переменной на знак "|". Если разделителя нет - глобальная переменная не наша. Делается с помощью StringFind(), узнав позицию разделителя, получаем оставшийся текст с помощью StringSubstr(), который преобразуем в тип long.
 

AlexeyVik

Программист mql4 mql5
Согласен, так будет проще, нет необходимости разбивки. Задать имя, например, "GV_abc"+какой-то разделитель, например "|" и затем все соединить в StringConcatenate(). При чтении/переборе глобальных задать поиск в имени глобальной переменной на знак "|". Если разделителя нет - глобальная переменная не наша. Делается с помощью StringFind(), узнав позицию разделителя, получаем оставшийся текст с помощью StringSubstr(), который преобразуем в тип long.
Зачем такие трудности? GV отлично сохраняется и так.00.png
 

mobidik

-----
Зачем такие трудности? GV отлично сохраняется и так.Посмотреть вложение 424927
Я и не спорю, что не сохранится. А если в терминале сейчас работает какой-то код использующий глобальные переменные или ранее работал, не позже 4х недель, какой результат будет у данного кода? Все ж таки, следует разделять на свой/чужой.

На счет 3 и 7: нашел в справке только это:
"Например, числа 0.3 и 0.7 представлены в компьютере бесконечными дробями..."
C-подобный:
   b=7.0/a; // ожидается, что b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - но это не так
//--- выведем вновь вычисленное значение b
   Print("----- после арифметических операций");
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"
// Print(b)=200.0
// Print(DoubleToString(b,16))=199.9999999999999716 (видим, что на самом деле b уже не равно 200.0)

mql5.com/ru/docs/basis/types/double
mql5.com/ru/docs/common/print
 
Последнее редактирование модератором:

st2050

Гуру форума
Здравствуйте, уважаемые мощные коллеги!
Я, как Вам известно, программист не мощный и навыков иногда не хватает.

Прошу помощи в исправлении косяка.
Подпиливаю индикатор PinBar_1440. Добавил стрелки и возможность включать/выключать стрелки и гисто-бары. Потому что эти бары засоряют график.

Косяк на скрине.
Бывает редко. Евробакс Н4, время сервера - Альпари/Робо.

В любом случае благодарю за уделённое время.
 

Вложения

  • EURUSDH4.png
    EURUSDH4.png
    36,4 КБ · Просмотры: 58
  • PinBar_1440_mtf st2050 v2.mq4
    34,9 КБ · Просмотры: 17

st2050

Гуру форума
Со второй попытки разобрался.

Оказалось, что в коде использовались одни и те же переменные для вычисления верхних и нижних сигнальных баров. Мой квадратно-гнездовой способ мышления с первого подхода не смог справится с такой экстравагантностью.

Подпиленный индикатор выложен в теме Архив индикаторов, -тынц-.
 
Последнее редактирование:

griz

Активный участник
Здравствуйте. После разрыва связи не хватает свечей. Как восстановить свечи?

11.png
 

st2050

Гуру форума
Здравствуйте. После разрыва связи не хватает свечей. Как восстановить свечи?

1. Меню Файл>Открыть каталог данных.
2. Закрыть терминал.
3. В открытой по п.1 папке перейти в папку с историей котировок. Если ничего не меняли, названием может быть Default или название сервера вашего ДЦ.
4. Удалить файл истории, который Вас интересует.
5. Запустить терминал. История будет загружена заново.
 

griz

Активный участник
1. Меню Файл>Открыть каталог данных.
2. Закрыть терминал.
3. В открытой по п.1 папке перейти в папку с историей котировок. Если ничего не меняли, названием может быть Default или название сервера вашего ДЦ.
4. Удалить файл истории, который Вас интересует.
5. Запустить терминал. История будет загружена заново.
Я удаляю файл GBPUSD5.hst, после запуска терминала файл восстанавливается, но свечи все равно не восстанавливаются.

П.с Интересно, кто торгует в f4y, у вас тоже по фунту на m5 разрыв есть?
 
Последнее редактирование:

vladradon

Программист
Я удаляю файл GBPUSD5.hst, после запуска терминала файл восстанавливается, но свечи все равно не восстанавливаются.
Может закачать историю с другого брокера и попытаться заменить? А в чем проблема в плане отсутствия свечей? Может как-то код нужно подрехтовать и не заморачиваться?
 
Верх