3. MQL4 dla początkujących. Część III.

3.3. Typy zmiennych: typ daty i czasu

datetime

Ten typ służy do przechowywania daty i czasu w postaci ilości sekund od 1 stycznia 1970 roku od godziny 00:00:00. Zmienne tego typu mogą być reprezentowane ciągiem znaków składające się z 6 części: rok, miesiąc, dzień, godzina, minuta, sekunda. Najpierw należy zapisać symbol D, potem w pojedynczych cudzysłowach zapisać ciąg znaków opisujących datę i czas (kod 1).

Kod 1
#property strict

datetime NY     = D'2016.01.01 00:00';    // data nowego roku 2016
datetime date_1 = D'2015.08.20 15:10:53'; // rok.miesiąc.dzień godzina:minuta:sekunda
datetime date_2 = D'20.08.2015 15:10:53'; // tożsame z D'2015.08.20 15:10:53';
datetime date_3 = D'21.09.2015 15';       // tożsame z D'2015.09.21 15:00:00'
datetime date_4 = D'22.10.2015';          // tożsame z D'2015.10.22 00:00:00'

void OnStart()
  {
   Print("NY = " , NY);
   Print("date_1 = " , date_1);
   Print("date_2 = " , date_2);
   Print("date_3 = " , date_3);
   Print("date_4 = " , date_4);
  }

Po uruchomieniu tego skryptu w logach terminala zobaczymy informacje jak na poniższym obrazku.

Rys. 1. Przykład stosowania typu datetime.


W pamięci komputera datetime zajmuje 8 bajtów (64 bitów) i może przechowywać wartość czasu od 1 stycznia 1970 do 31 grudnia 3000.

Czas w MQL4 można także określić za pomocą ilości sekund, które minęły od 01-01-1970, 00:00:00. Zademonstruję to na poniższym przykładzie.

Kod 2
#property strict

ulong    seconds_1 = 15;
ulong    seconds_2 = 1000000000;
datetime date_1;
datetime date_2;

void OnStart()
  {
   date_1 = (datetime)seconds_1;  // konwersja ulong do datetime
   date_2 = (datetime)seconds_2;  // konwersja ulong do datetime

   Print(seconds_1 , " sekund po 1970.01.01 00:00:00 to będzie " , date_1);
   Print(seconds_2 , " sekund po 1970.01.01 00:00:00 to będzie " , date_2);
  }

Tu jak zwykle na samym początku zapisano dyrektywę #property z komendą strict, dzięki czemu będziemy pracować na nowym kompilatorze. Utworzono dwie zmienne typu ulong, każdej z nich przypisano wartości liczbowe, i dwie zmienne typu datetime. Następnie, w ciele głównej funkcji skryptu OnStart() dokonano konwersji wartości typu ulong do typu datetime (kod 3).

Kod 3
   date_1 = (datetime)seconds_1;  // konwersja ulong do datetime
   date_2 = (datetime)seconds_2;  // konwersja ulong do datetime

W pierwszej instrukcji widzimy, że zanim zmiennej date_1 mającej typ datetime zostanie przypisana liczba 15 typu ulong (seconds_1) ta liczba najpierw ulegnie konwersji do typu datetime, a dopiero potem przypisana date_1. W drugiej instrukcji zachodzi ten sam proces konwersji liczby 1000000000 z ulong do datetime.

Na poniższym rysunku widać wynik działania tego skryptu.

Rys. 2. Przykład konwersji ulong do datetime.


Z ciekawości obliczmy ilość sekund jaka się mieści między 1970.01.01 00:00:00 a 3000.12.31 00:00:00.

Kod 4
#property strict

datetime Begin = D'1970.01.01';
datetime End   = D'3000.12.31';
ulong    Between;

void OnStart()
  {
   Between = ulong(End - Begin);  // konwersja datetime do ulong
   Print("Między ", Begin, " a ", End, " mieści się ", Between, " sekund.");
  }

W tym kodzie na odwrót, typ datetime konwertujemy na ulong. W ciele OnStart() najpierw obliczamy różnicę zmiennych End i Begin, które mają typ datetime. Następnie wartość tej różnicy konwertujemy na typ ulong i przypisujemy ją zmiennej Between.

Rys. 3. Przykład konwersji datetime do ulong.