Вопросы от "чайника" - страница 69

 
rlx:

Все корректно преобразуется без ошибок 

В разделе "Справочник MQL5 / Основы языка / Типы данных / Приведение типов " говорится о двух вещах:

1) преобразование long=>double может привести к потере точности;

2) вместо типа long допустим тип datetime (занимают по 8 байт).  

Прихожу к выводу, что, по идее, преобразование datetime =>double тоже может привести к потере точности. Но примера привести не могу.

 

rlx:

Почему бы не хранить дату в индикат......орных буфер......ах типа double 

Много точек добавил, а то какая-то ссылка появляется.

 Проще поставить дополнительный пробел между двумя словами: "индикаторных  буферах" (два пробела).

 
Yedelkin:

В разделе "Справочник MQL5 / Основы языка / Типы данных / Приведение типов " говорится о двух вещах:

1) преобразование long=>double может привести к потере точности;

2) вместо типа long допустим тип datetime (занимают по 8 байт).  

Прихожу к выводу, что, по идее, преобразование datetime =>double тоже может привести к потере точности. Но примера привести не могу.

 

 Проще поставить дополнительный пробел между двумя словами: "индикаторных  буферах" (два пробела).

А напишите простенький тест преобразований - все сами и увидите. И всем остальным расскажете потом

 
Vladix:

А напишите простенький тест преобразований - все сами и увидите. И всем остальным расскажете потом

А по существу ответ есть?

"Простенький тест преобразований" уже приведён rlx. Вроде работает корректно. Сомнения на основе справочного материала изложены выше. Если существует пример некорректного преобразования datetime =>double - в студию.

 
Yedelkin:

А по существу ответ есть?

"Простенький тест преобразований" уже приведён rlx. Вроде работает корректно. Сомнения на основе справочного материала изложены выше. Если существует пример некорректного преобразования datetime =>double - в студию.

void OnStart()
  {   
   double vDbl = 1.7976931348623158e+308;
   datetime vTime = (datetime)vDbl;
   
   Print((double)vTime);  
  }

2011.09.25 16:24:38 test (EURUSD,H1) -9.223372036854776e+018

Это пример, когда могут произойти проблемы, но это точно не ваш случай 

 
Vladix:

2011.09.25 16:24:38 test (EURUSD,H1) -9.223372036854776e+018

Это пример, когда могут произойти проблемы, но это точно не ваш случай 

Спс! Век живи - век учись!
 
Vladix:

2011.09.25 16:24:38 test (EURUSD,H1) -9.223372036854776e+018

Это пример, когда могут произойти проблемы, но это точно не ваш случай 

Не очень корректный пример, как гритца дураку стеклянный хрен на 20 минут.(это не о вас а о тех кто так будет использовать)

Текущее значение datetime 1316816136 те 10 разрядов, это за 40 лет набежало, у мантисы double 16 разрядов,

отсюда переполнение мантисы double и последующее некорректное преобразование из datetime в double произойдёт через 6*40=240 лет.

Думаю успеем попользоваться.

 
Yedelkin:
Спс! Век живи - век учись!

Сейчас накидал пример специально для вас. Выкладки следующие:

тип datetime определен до 31.12.3000 23:59:59, это в переводе на целые числа 32535215999

тип double определен до значения 1.7976931348623158e+308

Получается, что при переводе максимально возможного значения datetime в double остается еще допустимый запас по количеству значащих цифр.

Отсюда вывод - это будет работать корректно во всех случаях.

Urain:

Не очень корректный пример, как гритца дураку стеклянный хрен на 20 минут.

Не самая удачная аналогия.

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

 

Предыдущие вычисления я сделал не верно, более точно вот тут: используется 15 разрядов тк при наличии 16-го идёт ошибка преобразования

   long i,l;double d;
   for(i=0;i<999999999999999;i+=365*86400){d=(double)i;l=(long)d;if(i!=l)break;}
   Print("до ",(1970+i/(365*86400))," года datetime в double преобразуется верно");

до 31711762 года datetime в double преобразуется верно

ЗЫ  так что до 31 миллионного года спим спокойно.

 

Вызов импортируемых функций из библиотеки ex5.

Объясните пож. Прочел https://www.mql5.com/ru/docs/runtime/imports

 Системные библиотеки (DLL) загружаются по правилам операционной системы. Если библиотека уже загружена (например, другим экспертом и даже из другого клиентского терминала, запущенного параллельно), то обращение идет к уже загруженной библиотеке.

 Как загружаются библиотеки ex5 ? Если библиотека уже загружена (например, другим экспертом и даже из другого клиентского терминала, запущенного параллельно),

 Для теста создал библиотеку

                                        lib.mq5 

#property library
int      i=0;

int Get(void) export {return(i++);}

Скомпилировал    lib.mq5  в    lib.ex5 

Создал советника

                                 expert.mq5

#import "lib.ex5"
  int Get(void);
#import
void OnTick()
  {
   Print(Get());
  }

Скомпилировал.

Вешаю эксперта на EURUSD.

Печатает

0

1

2

3

4

5

Вешаю эксперта (дополнительно) на GBPUSD

Печатает 

6 --- от   EURUSD советника

0 --- от   GBPUSD советника. 

7 --- от   EURUSD советника

1 --- от   GBPUSD советника. 

8 --- от   EURUSD советника

2 --- от   GBPUSD советника. 

Т.е. на GBPUSD советник загружается еще один экземпляр библиотеки lib.ex5 

 Кто нибудь знает как сделать чтобы печатало  

6 --- от   EURUSD советника

7 --- от   GBPUSD советника. 

8 --- от   EURUSD советника

9 --- от   GBPUSD советника. 

10 --- от   EURUSD советника

11 --- от   GBPUSD советника.  

Только используя возможности MT5 

PS/// Или нужно как то специально подключать библиотеку .

///// Т.е. мне нужно чтобы данная библиотека ex5 загружалась один раз. 

Документация по MQL5: Программы MQL5 / Вызов импортируемых функций
Документация по MQL5: Программы MQL5 / Вызов импортируемых функций
  • www.mql5.com
Программы MQL5 / Вызов импортируемых функций - Документация по MQL5
 

Здравствуйте. Подскажите пожалуйста. Почему у ордеров и сделок есть тикет а у позиций его нет?

И в чем вообще разница между тикетом и  идентификатором?