Typy danych

Każdy program operuje na danych. Dane mogą być różnego rodzaju, w zależności od potrzeb realizacji danego celu obliczeniowego. Na przykład, dane liczb całkowitych są używane do dostępu do elementów tablicy. Ze względu brak specjalnego typu danych do reprezentacji cen, wykorzystywany jest typ zmiennoprzecinkowy podwójnej precyzji (double).

Dobór odpowiedniego typu danych ma ogromne znaczenie dla wydajności obliczeń, dlatego należy odpowiednio dobierać typ do danego celu. Typ danych integer jest znacznie szybszy w obliczeniach od typu double, dlatego jeśli jest to możliwe należy używać typu integer zamiast double. Natomiast dane typu string przetwarzane są jeszcze wolniej, ponieważ reprezentuje je dynamiczny typ tablicowy, dlatego typ string jest przetwarzany znaczenie dłużej niż typ double.

Główne typy danych to:

W MQL4 są trzy główne typy danych dostępne dla użytkowników: int, double i string, pozostałe typy bool, color, datetime są reprezentowane w systemie, jako typ integer.

Przykład:

int (bool,color,datetime);
double;
string

Podczas wykonywania operacji na różnych typach zmiennych np. iloczynu liczby reprezentowanej przez typ integer oraz liczby reprezentowanej przez double kompilator konwertuje liczby do postaci największej liczby, czyli w naszym przykładzie wykonuje operacje na liczbach typu double. W przypadku przypisania wyniku obliczeń reprezentowanego przez typ zmiennoprzecinkowy do typu całkowitego, kompilator dokonuje automatycznego rzutowania typu double do typu integer. W tym przypadku należy umiejętnie zaplanować działanie algorytmu obliczeniowego, ponieważ przy rzutowaniu typu double do typu integer tracimy część dziesiętną naszych obliczeń.

Przykład:

int i = 1 / 2; // rzutowanie nie jest realizowane, wynik wynosi 0
int i = 1 / 2.0; // podczas obliczeń wyrażenie jest rzutowanie do typu
double, a wynik obliczeń do typu int, wynik wynosi 0
double d = 1.0 / 2.0; // rzutowanie nie jest realizowane, wynik wynosi 0.5
double d = 1 / 2.0; // rzutowanie jest realizowane podczas obliczeń do
double, zmienna wynikowa jest tego samego typu, co obliczenia, wynik 0.5
double d = 1 / 2; // obliczenia są rzutowane do typu double, typ wynikowy to też double, wynik 0.5
string s = 1.0 / 8; // obliczenia są rzutowane do typu double, a wynik jest rzutowany z typu double do typu string, wynik to ciąg znaków "0.12500000" (łańcuch zawierający 10 znaków)
string s = NULL; // stałej typu int (NULL jest typem int) jest rzutowana do typu docelowego string, wynik jest "0" (ciąg znaków o długości 1)
string s = "Ticket #" +12345; // zmienna int jest rzutowane do typu string później następuje dodanie dwóch ciągów znakowych, wynik jest typem string, czyli nie występuje już rzutowanie, wynik to "Ticket # 1234

Rzutowanie można stosować zarówno do stałych jak i zmiennych przypisywanych dynamicznie, dostępnych w MQL4.

Typ całkowity 

Typ integer (int) reprezentowany jest przez cyfry: od 0 do 9, na początku liczby nie dodajemy wartości zero.

Przykład:

12, 11, -956, 1007

Typ integer można zapisywać w postaci szesnastkowej, hexadecymalnej: cyfry od 0 do 9, litery od A do F służą do reprezentowania wartości od 10 do 15. Wartości szesnastkowe zapisujemy poczynając od wartości: 0x lub 0X.

Przykład:

0x0A, 0x12, 0x12, 0x2F, 0xA3, 0Xa3, 0X7C7

Typ szesnastkowy jest wewnętrznie reprezentowany przez typ integer czyli liczbę o długości 4 bajtów. Stała integer może przybierać wartości od -2147483648 do 2147483647. Jeśli zmienna przekracza ten zakres, wynik jest nieprzewidywalny.

Typ znakowy 

Typ znakowy to dowolny pojedynczy znak zamknięty w pojedynczym cudzysłowiu lub szesnastkowy kod ASCII znaku, zapisany w następującej postaci '\x10'. Typ znakowy jest wewnętrznie reprezentowany przez typ podstawowy integer. Niektóre znaki specjalne, takie jak pojedynczy cudzysłów ('), podwójny cudzysłów(") znak zapytania (?), odwrócony ukośnik (\) oraz znaki kontrolne można stosować w składni języka MQL, ale konieczne jest zapisanie takiego specjalnego znaku poczynając od odwróconego ukośnika (\), co zostało opisane w poniższej tabeli:

Przykład:

Znak końca linii NL (LF) \n
Tabulator poziomy HT \t
Znak karetki CR \r
Odwrócony ukośnik \ \\
Aapostrof ' \’
Cudzysłów “ \”
Liczba szesnastkowa hh \xh

Poza wyżej wymienionymi znakami specjalnymi reprezentacja i zapis typu znakowego (pojedynczego znaku) wygląda następująco:

*/int a = 'A';
int b = '$';
int c = '©'; // code 0xA9
int d = '\xAE'; // symbol code ®

Wewnętrzna reprezentacja typu char to dobrze nam już znany typ podstawowy integer o długości 4- bajtów. Zmienne znakowe mogą przyjmować wartości od 0 do 255. Jeśli zmienna przekracza tę zakres danych, wynik jest nieprzewidywalny.

Typ logiczny 

Typ logiczny może przyjmować jedną z dwóch wartości prawda (true) lub fałsz (false), co jest reprezentowane wewnętrznie przez znany już nam typ integer w postaci liczbowej przyjmując odpowiednio wartości 1 lub 0.

Przykład:

bool a = true;
bool b = false;
bool c = 1

Wewnętrzna reprezentacja to integer o długości 4-bajtów.

Typ zmiennoprzecinkowy 

Typ double to typ zmiennoprzecinkowy posiadający część całkowitą oraz część ułamkową, które rozdzielone są znakiem dziesiętnym w postaci kropki (.). Część całkowita jak i ułamkowa reprezentowane są przez liczby dziesiętne.

Przykład:

double = 12.111;
double b = -956.1007;
double c = 0.0001;
double d = 16;

Jego wewnętrzna reprezentacja to liczba podwójnej precyzji składająca się z 8 bajtów. Liczba zmiennoprzecinkowa typu double może przyjmować wartości z zakresu od -1,7 * E-308 do 1,7 * E308. Jeśli zmienna przekracza ten zakres, wynik jest nieprzewidywalny.

Typ ciąg znaków 

Ciąg znaków reprezentowany przez znaki ASCII zapisuje się w podwójny cudzysłów np.: "Charakter stały". Zmienna łańcuchowa jest tablicą znaków zawartych w cudzysłowiu. Jeśli konieczne jest wstawienie w ciąg znaków znaku cudzysłowiu (") możemy zastosować do tego celu znak odwróconego ukośnika (\), który należy umieścić przez znakiem cudzysłowiu (\”).

Wszystkie pozostałe znaki specjalne może wstawiać na tej samej zasadzie, czyli poprzedzając je znakiem odwróconego ukośnika (\). Łańcuch znakowy typu string może zawierać od 0 do 255 znaków. Jeżeli ciąg będzie dłuższy, wszystkie znaki ponad 255 zostaną usunięte, a system może nieoczekiwanie wywołać komunikat błędu.

Przykład:

"To jest ciąg znaków"
"Copyright znak \t\xA9"
"ta linia zawiera znak końca linii \n"
"C:\\Program Files\\MetaTrader 4"
"A" "1234567890" "0" "$

Wewnętrzna reprezentacja string jest strukturą 8 bajtów. Pierwszy element struktury to zmienna informująca o wielkości bufora zawierającego zmienne znakowe. Drugim elementem struktury jest 32bitowy adres do bufora przechowującego wartość zmiennej string.

Typ koloru 

Zmienna typu color może być reprezentowana na trzy sposoby: opisowo przez rzutowanie, przez typ całkowity int, przez stałą nazwę określającą kolor (zakres nazw kolorów to standard opisu kolorów web). Typ rzutowany opisany jest za pomocą trzech części, stałej znakowej C (Color) oraz trzech zmiennych RGB: czerwony, zielony, niebieski. Zmienna rozpoczyna się od C i zmiennych RGB umieszczonych w pojedynczym cudzysłowie. Poszczególne wartości liczbowe mogą zawierać się w przedziałach składniowych kolorów, czyli od 0 do 255.

Reprezentacja koloru za pomocą liczby integer, zapisanej w postaci liczby dziesiętnej lub postaci szesnastkowej. Zapis w postaci szesnastkowej wygląda następująco 0x00BBGGRR, gdzie RR to wartość koloru czerwonego, GG koloru zielonego, BB to kolor niebieski. Dziesiętne stałe nie mają bezpośredniego odzwierciedlenia w RGB.

Przykład:

// reprezentacja zmiennych
C'128,128,128' // zielony
C'0x00,0x00,0xFF' // niebieski
// nazwy kolorów
Red
Yellow
Black
// reprezentacja za pomocą integer
0xFFFFFF // biały
16777215 // biały
0x008000 // zielony
32768 // zielony

Wewnętrzna reprezentacja liczby całkowitej to typ integer o długości 4 bajtów. Pierwszy bajt jest ignorowany, a trzy pozostałe to składniki koloru RGB.

Typ daty i czasu 

Zmienna typu datetime może być reprezentowana opisowo w postaci ciągu znaków składającego się z 6 części (rok, miesiąc, dzień, godzina, minuta, sekunda). Budowa zmiennej to stała znakowa D oraz zawarty w cudzysłowach ciąg znaków opisujący datę i czas.

W cudzysłowach można zawrzeć samą datę w postaci (rok, miesiąc, dzień) bez czasu, wówczas czas przyjmie wartości 00:00:00 lub w postaci czasu (godzina, minuta, sekunda), wówczas data przyjmie wartość domyślną (aktualną datę kompilacji). Zakres daty i czasu może zawierać się po między 1 stycznia 1970 - 31 grudnia 2037.

Przykład:

D'2009.01.01 00:00' // Nowy Rok
D'1981.07.19 12:30:27'
D'19.07.1990 12:30:27'
D'19.07.1990 12' // to samo, co D'1990.07.19 12:00:00'
D'01.01.2006' // to samo, co D'01.01.2006 00:00:00'
D'12:30:27' // to samo, co D'[compilation date] 12:30:27'
D'' // to samo, co D'[compilation date] 00:00:00'

Wewnętrzna reprezentacja liczby to zmienna integer o długości 4 bajtów. Wartość datetime reprezentuje liczbę sekund jaka upłynęła od godziny 00:00 1 stycznia 1970.

 

Typy color oraz datetime zostały wprowadzone w celu łatwiejszego operowania tymi danymi, ponieważ wewnętrznie przez MQL4 są traktowane, jako typ integer. Taka reprezentacja typów color oraz datetime znaczenie ułatwia operowanie tymi zmiennymi, jako parametrami, na przykład w karcie parametrów, EA czy Custom Indicator.

 

Niniejszy materiał, przygotowany przez DM BOŚ S.A. ma charakter wyłącznie informacyjny... Dowiedz się więcej
1/1