Operacje i wyrażenia

W składni języka programowania MQL4 występują symbole operacji, które w odpowiednim zapisie wykonują określone działania. Poniżej zamieszczono przykłady symboli operacji:

+ - * /% Symbole działań arytmetycznych
& & | | Symbole operacji logicznych
= + = *= Symbole operacji przypisani

Symbole powyższych operacji muszą być używane w odpowiedniej kolejności i odpowiedniej składni, dopiero wówczas możemy mówić o wykonaniu się określonych operacji zgodnie z określoną składnią i warunkami obliczeń. W wyrażeniach możemy stosować znaki interpunkcyjne np. nawiasy klamrowe, przecinek, dwukropek i średnik. Symboli operacji, znaki przestankowe, spacje używamy w celu oddzielenie od siebie elementów składni języka, elementów operacji.

Składnia języka

Składnia języka może być zapisywana w MetaEditorze lub dowolnym innym edytorze tekstów z wykorzystaniem dostępnych operatorów i operandów języka MQL4. Tak jak już wspomiano w poprzednich rozdziałach składnia wzorowana jest na języku wysokiego poziomu, którym jest C. Poniżej pokazano prosty przykład zapisu, składni:

a++; b = 10;
x = (y * z) /
(w + 2) + 127

Operacje arytmetyczne

W języku MQL4 dostępne są standardowe operacje na zmiennych, pokazane w poniższej tabeli:

Suma dwóch liczb i = j + 2;
Różnica dwóch liczb i = j - 3;
Zmiana znaku zmienne x = - x;
Iloczyn dwóch liczb z = 3 * x;
Iloraz dwóch liczb i = j / 5;
Reszta z dzielenia minuty = czas % 60;
Zwiększenie o 1 wartości zmienne i++;
Zmniejszenie o -1 wartości zmienne k--

Operacje dodawania/odejmowania (inkrementacji/dekrementacji) zmiennej nie mogą być używane bezpośrednio w wyrażeniach.

Przykład:

int a=7;
a++; // prawidłowa składnia
int b=(a++)*7; // nieprawidłowa składni

Operacje przypisania

W operacjach przypisania zmienna wynikowa wyjściowa znajduje się po lewej stronie operacji.

Przykład:

y = x; // Przypisanie zmiennej y wartości zmiennej x

Poniższe przykłady obrazują jak można wykorzystywać operacje arytmetyczne i bitowe w połączeniu z operacjami przypisania:

y += x; // Dodawanie y do x i przypisanie do y
y -= x; // odejmowanie y do x i przypisanie do y
y *= x; // Mnożenie y przez x i przypisanie do y
y /= x; // Dzielenie y przez x i przypisanie do y
y %= x; // Reszta z dzielenie y przez x i przypisania do y
y >>= x; // Przesunięcie bitowe y w prawo o x pozycji oraz przypisanie do y
y <<= x; // Przesunięcie bitowe y w lewo o x pozycji oraz przypisanie do y
y &= x; // Operacja logiczna AND na zmiennych y i x oraz przypisanie do y
y |= x; // Operacja logiczna OR na zmiennych y i x oraz przypisanie do y
y ^= x; // Operacja logiczna Exclusive OR na zmiennych y i x oraz przypisanie do y

W operacjach przypisania można przypisywać wartość tylko do jednej zmiennej wyjściowej, którą w przykładach jest y. Operacje bitowe wykonywane są wyłącznie na liczbach całkowitych. Operacje logiczne, przesunięcia bitowe mogą być tylko do 5 pozycji, czyli liczba x z przykładów może przyjmować tylko nie większą niż 5. Znak operacji modulo, dzielenia jest wynikiem operacji zwykłego dzielenia.

Operacje relacji

Operacje logiczne reprezentowane są przez zmienne predefiniowane true (prawda) i false (fałsz). Systemowo reprezentowane są  przez zmienną typu integer, przez co mogą przyjmować zastępczo wartości 1 (prawda) lub 0 (fałsz).

Przykład:

a == b; // Wynika: prawda jeśli a i b są równe
a != b; // Wynika: prawda jeśli a i b są nie równe
a < b; // Wynika: prawda jeśli a jest mniejsze od b
a > b; // Wynika: prawda jeśli a jest większe od b
a <= b; // Wynika: prawda jeśli a jest mniejsye lub równe b
a >= b; // Wynika: prawda jeśli a jest większe lub równe b

Należy pamiętać, że wartości zmiennoprzecinkowe typu double należy normalizować funkcją normalized w celu dopasowania długości  ich wartości. Wykorzystanie operacji relacji dla liczb zmiennoprzecinkowych bez normalizacji spowoduje, że wynik operacji może być nieprawidłowy.

Operacje logiczne

Operacje negacji logicznej mogą być wykonywane tylko na zmiennych typu logicznego przyjmujących wartość true lub false. Wynikiem operacji logicznych jest zawsze true (wartość całkowita 1) lub false (wartość całkowita 0).

Przykład:

if(!a) Print("to nie jest 'a'");

Operator logiczny OR (||) na zmiennych x i y. Wartością wyrażenia jest true (1). Jeśli jedna z operacji po między znakiem OR (||) przyjmuje wartość true (różne od false), w przeciwnym razie przyjmuje false (0).

Przykład:

if(x < 0 || x >= max_bars) Print("po za zakresem");

Operator logiczny AND (&&) na zmiennych x i y. Wartością wyrażenia jest true (1), jeżeli obie wartości z operacji po między znakiem AND (&&) przechowują wartości true (różne od false). W przeciwnym razie wynikiem jest wartość false (0).

Przykład:

if( p != x && p > y ) Print("PRAWDA"

Operacje bitowe

Operacja negowania zmiennej bitowej powoduje odwrócenie wszystkich wartości bitowych (zero-jedynkowych) na wartości przeciwne, czyli jeśli było 1 to po negacji będzie 0, natomiast jeśli było 0 to po negacji będzie 1.

Przykład:

b = ~n;

Bitowa operacja przesunięcia w prawo. Wartość bitowe (zero-jedynkowe) zmiennej x zostaną przesunięte o y pozycji w prawo. Przy operacji przesunięcia wszystkie wartości z prawej strony zostają utracone, a wartości z lewej strony wypełniane są zerami.

Przykład:

x = x >> y;

Bitowa operacja przesunięcia w lewo. Wartość bitowe (zero-jedynkowe) zmiennej x zostaną przesunięte o y pozycji w lewo. Przy przesunięciu wartości z lewej strony zostają utracone, a wartości z prawej są wypełniane zerami.

Przykład:

x = x << y;

Bitowa operacja iloczynu AND na zmiennych x i y. Wartością bitową zwracaną przez wyrażenie jest wartość 1 (true) we wszystkich pozycjach bitowych, w których zarówno x i y wynosiły 1 (true), oraz zawiera 0 (false) we wszystkich pozostałych pozycjach bitowych.

Przykład:

b = ( (x & y) != 0 );

Bitowa operacja sumy logicznej OR na zmiennych x i y. Wartością bitową zwracaną przez wyrażenie jest wartość 1 (true) we wszystkich pozycjach bitowych, w których x lub y były równe 1 (true), oraz zawiera 0 (false) we wszystkich pozostałych pozycjach bitowych.

Przykład:

b = x | y;

Bitowa operacja sumy modulo na zmiennych x i y. Wartością bitową zwracaną przez wyrażenie jest wartość 1 (true) we wszystkich pozycjach bitowych, w których x i y były różne i przyjęły wartości 1 lub 0, oraz zawiera 0 (false) we wszystkich pozostałych pozycjach bitowych.

Przykład:

b = x ^ y

Pozostałe operacje

Indeksowanie tablic

Aby operować na adresie, pozycji danej zmiennej tablicowej należy operować jej indeksem. Wartością wyrażenia, zmiennej tablicowej jest wartości wskazywana przez jej indeks o numerze i.

Przykład:

array[i] = 3; // przypisanie wartości 3 do zmiennej tablicowej o indeksie i

Indeksem tablicy może być tylko typ całkowity. Możliwe jest operowanie za pomocą indeksów na tablicach większych od jednowymiarowych. Indeksowanie tablicy zaczyna się od wartości 0, a kończy na elemencie stanowiącym wielkość tablicy minus 1 np. jeśli zadeklarujemy tablicę 50 elementową to indeksy będą od 0 do 49. Próba uzyskania elementu tablicy spoza zadeklarowanej wielkości, czyli w naszym przypadku od 50 w górę spowoduje wygenerowanie błędu operacji na tablicach ERR_ARRAY_INDEX_OUT_OF_RANGE, dlatego zalecane jest stosowanie funkcji sprawdzającej czy nie wystąpiły błędy GetLastError().

Wywołanie funkcji z argumentami x1, x2 ,..., xn

Każdy z argumentów wywołania funkcji może być stałą, zmienną lub wyrażeniem. Argumenty przekazywane do funkcji muszą być oddzielone przecinkami i muszą znajdować się wewnątrz nawiasów (nawiasu otwierającego się po nazwie wywołanej funkcji). Funkcja posiada właściwość podobną do przypisania zwykłej zmiennej, polegające na tym, że funkcja w wyniku wywołania zwraca wartość, którą można bezpośrednio przypisać do zmiennej. Jeżeli zwracana wartość jest specjalnego typu void, oznacza to, że w wyniku działania funkcji nie będzie zwracana żadna wartość.

Przykład:

double SL = Bid-25*Point;
int ticket = OrderSend(Symbol(),OP_BUY,1,Ask,3,SL,Ask+25*Point,
"mój komentarz",123,0,Green)

Przecinek, jako operator

Wyrażenia oddzielone przecinkami są wykonywane od lewej do prawej. Wszystkie działania, analizowane są przez kompilator od lewej do prawej. Typ zmiennej oraz wartość jest zgodna z typem wyniku obliczeń.

Przykład:

for(i=0,j=99; i<100; i++,j--) Print(array[i][j])

Kolejność wykonywania operacji

W poniższych tabelach pogrupowane zostały operatory. Operatory w tabeli umieszczone są według priorytetu wykonania. Każdy operator z tej samej grupy ma taki sam priorytet. Im wyższe miejsce grupy operatorów w tabeli, tym wyższy priorytet operatorów, inaczej mówiąc priorytet maleją z góry do dołu tabeli. Porządek wykonania działań determinuje grupa, w której znajduje się dany operator. Im wyżej jest grupa, w której się znajduje operator, tym wyższy jest jego priorytet. Operatory z relatywnie wyższym priorytetem są wykonywane przed operatorami z relatywnie niższym priorytetem. Wszystkie binarne operatory, oprócz operatorów przypisania, są wykonywane od lewej do prawej. Operatory przypisania są wykonywane od prawej do lewej strony równania.

Przykład:

() Wywołanie funkcji operacji łączenia od lewej do prawej
[] Odwołanie do elementu tablicy

! Negacja logiczna Operacja łączenia od prawej do lewej
- Zmiana znaku operacji
++ Inkrementacja – zwiększenie o 1
-- Dekrementacja – zmniejszenie o -1

& Bitowy operator AND Operacja łączenia od lewej do prawej
| Bitowy operator OR
^ Bitowy operator Exclusive OR
<< Przesunięcie bitowe w lewo
>> Przesunięcie bitowe w prawo

* Mnożenie Operacja łączenia od lewej do prawej
/ Dzielenie
% Modulo

+ Suma Operacja łączenia od lewej do prawej
- Różnica

< Mniejsze od Operacja łączenia od lewej do prawej
<= Mniejsze lub równe
> Większe od
>= Większe lub równe
== Równe
!= Nierówne
|| Warunek logiczny LUB Operacja łączenia od lewej do prawej
&& Warunek logiczny I Operacja łączenia od lewej do prawej
= Operator przypisania Operacja łączenia od prawej do lewej
+= Operator sumy i przypisania
-= Operator różnicy i przypisania
*= Operator mnożenia i przypisania
/= Operator dzielenia i przypisanai
%= Operator modulo I przypisania
>>= Przesunięcie bitowe w prawo i przypisanie
<<= Przesunięcie bitowe w lewo i przypisanie
&= Operator bitowu AND i przypisanie
|= Operator bitowy LUB i przypisanie
^= Operator bitowy Exclusive OR I przypisanie

, Przecinek Operacja łączenia od lewej do prawe

Nawiasy, które mają wyższy priorytet są stosowane w celu zmiany kolejności wykonywania operacji.

Uwaga! Priorytet wykonywania operacji w MQL4 różni się w pewnym stopniu od konwencjonalnych operatorów stosowanych w języku C.

Niniejszy materiał, przygotowany przez DM BOŚ S.A. ma charakter wyłącznie informacyjny, prezentowany jest w celach edukacyjnych i nie stanowi porady prawnej oraz nie jest rekomendacją osobistą w ramach świadczenia usługi doradztwa inwestycyjnego zgodnie z przepisami prawa. DM BOŚ S.A. nie udziela gwarancji dokładności, aktualności, oraz kompletności niniejszych informacji. Zaleca się przeprowadzenie we własnym zakresie niezależnego przeglądu informacji z niniejszego materiału.

1/1