Как реализовать работу буфера типа datetime ?

 

Столкнулся я недавно с невозможностью создать буфера типа datetime. Сразу забил, думал реализую задачу иначе, но всё-таки иначе выходит ещё более не вариантово.

Как это можно реализовать вообще? Я понимаю, что можно как-то создать тип double, и  присваивать в данный будет значение datetime, но это не совсем корректно, т.к. нет уверенности, что не будет потери данных.

Например, вот сделал простой пример:

//+-------------------------------------------------------------------------------------+
//| Проверка приведения типов datitime к double                                          |
//+-------------------------------------------------------------------------------------+
void DatetimeToDouble()
{
   double d;
   
   for (int i = 0; i < 10; i++)
   {
      d = Time[i];
//      Print ("d = ", d);
   }
}

 При компиляции вижу в журнале:

possible loss of data due to type conversion    Q.mq4   62      9

 Получается, что не вариант так писал. Какие другие варианты имеются?

 
double(Time[i])
Ничего не теряется
 
shanty:

 Я понимаю, что можно как-то создать тип double, и  присваивать в данный будет значение datetime, но это не совсем корректно, т.к. нет уверенности, что не будет потери данных. 

Потери данных не будет. У double диапазон значений намного больше, чем у datetime. Вот при обратном преобразовании (doubel -> datetime) могут быть проблемы.
 
Scriptong:
Потери данных не будет. У double диапазон значений намного больше, чем у datetime. Вот при обратном преобразовании (doubel -> datetime) могут быть проблемы.

Да тоже никаких проблем не может возникать. Ведь тип double не обязательно должен содержать дробную часть больше нуля, а тип datetime "равнозначен" типу int. Потом, если в массив или переменную типа double засунули тип datetime, то обратно это значение ну никак не должно быть больше допустимого для типа datetime.

Вот и получается, что если написать

double _datetime = Time[0];

а потом перевести обратно, или даже в другой тип

double _double = (double)_datetime;

int _int = (int)_datetime;

и не будет никаких предупреждений.

 

Теоретически потери точности нет. Я это понимаю, судя по количеству байт в типе. Но тем не менее, значение выводится после приведени, да и без приведения какое то "левое".

Вот например код:

//+-------------------------------------------------------------------------------------+
//| Проверка равенства типов datitime и double                                          |
//+-------------------------------------------------------------------------------------+
void DatetimeToDouble()
{
   double d[10];
   datetime dt[10];
   
   for (int i = 0; i < 10; i++)
   {
      d[i] = (double) Time[i];
      Print ("d[", i, "] = ", d[i]);
   }
   for (int i = 0; i < 10; i++)
   {
      dt[i] = Time[i];
      Print ("dt[", i, "] = ", dt[i]);
   }
}

 В журнале вижу:

2016.02.20 21:17:37.645 2016.01.27 00:01  Tester: stop button pressed
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[9] = 2016.01.26 23:51:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[8] = 2016.01.26 23:52:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[7] = 2016.01.26 23:53:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[6] = 2016.01.26 23:54:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[5] = 2016.01.26 23:55:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[4] = 2016.01.26 23:56:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[3] = 2016.01.26 23:57:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[2] = 2016.01.26 23:58:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[1] = 2016.01.26 23:59:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: dt[0] = 2016.01.27 00:00:00
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[9] = 1453852260.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[8] = 1453852320.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[7] = 1453852380.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[6] = 1453852440.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[5] = 1453852500.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[4] = 1453852560.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[3] = 1453852620.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[2] = 1453852680.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[1] = 1453852740.0
2016.02.20 21:17:35.994 2016.01.27 00:00  Q EURUSD,M1: d[0] = 1453852800.0
2016.02.20 21:17:35.987 2016.01.27 00:00  Q test started

 Очевидно, что значения на каждом баре типов datetime и double различны. Почему ?

 
shanty:

Теоретически потери точности нет. Я это понимаю, судя по количеству байт в типе. Но тем не менее, значение выводится после приведени, да и без приведения какое то "левое".

Вот например код:

 В журнале вижу:

 Очевидно, что значения на каждом баре типов datetime и double различны. Почему ?

Виктор, когда-же ты научишься читать документацию? Там чётко сказано что дата представлена в виде секунд прошедших с 01.01.1970 и соответственно имеет целочисленное значение которое ты и видишь во втором цикле. А в первом это заморочки mql позволяющие переводить эти секунды в вид строки. Если уберёшь #property strict то и в первом цикле получишь не то что сейчас видишь. Для алертов и принтов рекомендуется использовать перевод double и datetime в строковый вид.
 
shanty:

Столкнулся я недавно с невозможностью создать буфера типа datetime. Сразу забил, думал реализую задачу иначе, но всё-таки иначе выходит ещё более не вариантово.

Как это можно реализовать вообще? Я понимаю, что можно как-то создать тип double, и  присваивать в данный будет значение datetime, но это не совсем корректно, т.к. нет уверенности, что не будет потери данных.

Например, вот сделал простой пример:

 При компиляции вижу в журнале:

 Получается, что не вариант так писал. Какие другие варианты имеются?

 

Да создайте Вы хоть какой-нибудь буфер и воспользуйтесь им. По секрету скажу, что datetime реализуется легко. 
 
tara:
Да создайте Вы хоть какой-нибудь буфер и воспользуйтесь им. По секрету скажу, что datetime реализуется легко. 
Всмысле легко? Если как double, то легко, а если напрямую то никак. А Вы что имеет ввиду?
 
AlexeyVik:

Да тоже никаких проблем не может возникать. Ведь тип double не обязательно должен содержать дробную часть больше нуля, а тип datetime "равнозначен" типу int. Потом, если в массив или переменную типа double засунули тип datetime, то обратно это значение ну никак не должно быть больше допустимого для типа datetime.

Вот и получается, что если написать

а потом перевести обратно, или даже в другой тип

и не будет никаких предупреждений.

Поправочка. Тип int имеет размер 4 байта. Тип datetime 8 байт.
 
RickD:
Поправочка. Тип int имеет размер 4 байта. Тип datetime 8 байт.

Да я не задумываясь написал об этом потому, что не так давно компилятор вообще не реагировал на замену типа datetime на int.

А если из моего текста выкинуть всё что связано с типом int то будет вообще без проблем. Как datetime 8 байт так и double те-же 8 байт и ничего нигде не потеряется.