1. MQL4 dla początkujących. Część I.

1.6. Funkcje

Funkcja - to określony zestaw instrukcji lub mówiąc inaczej zestaw zadań do wykonania. W nagłówku funkcji, tj. między ( ) należy zapisać wartości, mówiąc fachowo zapisać argumenty, i zgodnie ze swoim przeznaczeniem wykona ona określone działanie.

Aby wywołać funkcję najpierw trzeba napisać jej nazwę. Nie zapomnij o wielkości liter! MetaEditor 4 posiada bardzo przydatny mechanizm podpowiedzi nazw funkcji oraz innych kluczowych słów po napisaniu pierwszych 3 liter (przy domyślnym ustawieniu edytora). Między innymi dlatego zachęcam do pisania programów na MQL4 właśnie w tym edytorze. W celu wyświetlenia tekstu na monitorze użyjemy teraz funkcji Alert().

Rys. 1. Funkcja Alert.


Widzisz, po napisaniu 3 pierwszych liter pojawiło okienko z podpowiedzią pełnej nazwy tej funkcji. Wystarczy teraz kliknąć na niej, aby pełna nazwa wskoczyła w kod źródłowy. Takie podpowiedzi są bardzo pomocne w przypadku długich nazw, sięgających niekiedy kilkunastu liter.

Po nazwie funkcji wpisz teraz tylko lewy okrągły nawias ( . W tym momencie pojawi się kolejna podpowiedź dotycząca typu tej funkcji i argumentów, które ona może przyjąć.

Rys. 2. Funkcja Alert.


Jak widać z tej podpowiedzi Alert() ma typ void (typ pusty). Wcześniej już poznaliśmy inną funkcję OnStart() typu void. Różnica między nimi jest taka, że OnStart() to główna funkcja skryptu i bez niej skrypt w ogóle nie ruszy. W kodzie źródłowym przed każdą funkcją główną zawsze trzeba pisać jej typ.

Alert() to funkcja standardowa, która wyświetla komunikat w osobnym okienku. Istnieją też inne typy funkcji, np. matematyczne, funkcje do pracy z tekstem itd., można nawet tworzyć własne funkcje. Jednak w kodzie źródłowym przed nimi nie trzeba pisać ich typu. Po prostu trzeba to zapamiętać.


W MQL4 każda funkcja ma określony typ.

Na rysunku 2 w okienku podpowiedzi między nawiasami widzimy wielokropek ... . Co to znaczy? Na klawiaturze naciśnij teraz Esc żeby okienko podpowiedzi zniknęło. Następnie, przesuń kursor gdzieś do środka słowa Alert i naciśnij F1. Pojawi się Pomoc edytora z opisem właściwości tej funkcji (rys. 3).

Rys. 3. Pomoc MetaEditor 4.


Z tego opisu można wywnioskować, że po nawiasie otwierającym należy zapisać argumenty rozdzielone przecinkami, a po nawiasie zamykającym średnik. Widzimy, też że dla funkcji Alert() ilość argumentów nie powinna przekraczać 64. Taką pomocną informację możesz znaleźć dla każdego zarezerwowanego słowa MQL4. Innym źródłem informacji nt tej funkcji oraz wszystkich innych ważnych elementów tego języka programowania jest oficjalna strona MQL4.


Wariant 1

W nagłówku funkcji Alert(), tj. między nawiasami, wpisz jeden argument - tekst "Mam 25 lat".

Kod 1
// wariant 1
#property strict

void OnStart()
  {
//---
   Alert("Mam 25 lat");
  }

Skompiluj ten kod, przejdź do MetaTrader 4, w okienku Nawigator dwa razy kliknij na nazwę skryptu lub przeciągnij go do okna notowań i puść. Pojawi się okienko komunikatu (rys. 4).

Rys. 4. Okno Alert w MetaTrader 4.


Świetnie! Twój pierwszy program napisany na MQL4 działa! Niżej pokażę jeszcze kilka przykładów jak można uzyskać ten sam wynik.


Wariant 2

Do nagłówka funkcji Alert() przekazano 3 argumenty: pierwszy - tekstowy "Mam ", po przecinku drugi - liczbę 25, po przecinku trzeci argument tekstowy " lat".

Kod 2
// wariant 2
#property strict

void OnStart()
  {
//---
   Alert("Mam " , 25 , " lat");
  }

Wariant 3

Drugi argument to działanie matematyczne 2015 - 1990. W MQL4 jest to dopuszczalne.

Kod 3
// wariant 3
#property strict

void OnStart()
  {
//---
   Alert("Mam " , 2015 - 1990 , " lat");
  }

Wariant 4

Przed funkcją główną zadeklarowano 3 zmienne: YearOfBirth, YearNow oraz Age. Pierwszym dwóm od razu przypisano wartości, odpowiednio 1990 i 2015. Następnie, w ciele funkcji głównej najpierw zmiennej Age przypisano różnicę pierwszych dwóch zmiennych (Age = YearNow - YearOfBirth), a potem Age przekazano w nagłówek funkcji Alert() na miejsce drugiego argumentu.

Kod 4
// wariant 4
#property strict

int YearOfBirth = 1990;
int YearNow     = 2015;
int Age;

void OnStart()
  {
//---
   Age = YearNow - YearOfBirth;
   Alert("Mam " , Age , " lat");
  }

Wariant 5

Przed funkcją główną OnStart() w jednej instrukcji zadeklarowano 2 zmienne YearOfBirth i YearNow. W ciele tej funkcji tym zmiennym przypisano wartości, odpowiednio 1990 i 2015. Dalej na miejscu drugiego argumentu w nagłówku Alert() zapisano działanie matematyczne: YearNow - YearOfBirth. Zwróć też uwagę, że argumenty w nagłówku Alert() nie są zapisane w jednej linijce i nie ma w tym błędu, ponieważ MQL4 jest językiem o tak zwanym wolnym formacie.

Kod 5
// wariant 5
#property strict

int YearOfBirth, YearNow;

void OnStart()
  {
//---
   YearOfBirth = 1990;
   YearNow     = 2015;

   Alert("Mam " ,
         YearNow - YearOfBirth ,
         " lat");
  }

Za pomocą tych przykładów chciałem pokazać różnorodność języka MQL4. Jak widać każdy program można napisać na wiele sposobów. Tutaj mieliśmy do czynienia z bardzo prostym skryptem, dlatego wystarczylo by zastosować tylko jego pierwszy wariant i w razie zmiany treści komunikatu można łatwo znaleźć miejsce do poprawki. W przypadku gdybyśmy pracowali z kodem, który liczył by kilka tysięcy linijek lub więcej, gdzie istniało by wiele zmiennych, każda z których była by używana wiele razy, wtedy lepiej jest stworzyć zmienną na samym początku, przypisać jej wartość i w przypadku jakichkolwiek zmian wystarczy w jednym miejscu przypisać jej nową wartość, niż w całym kodzie szukać wszystkie miejsca gdzie ta wartość występuje. Przy takim podejściu dobry jest wariant 4 lub 5.