Funkcje

Jeśli określone bloki programu mają być wykonywane powtarzalnie to dobrym sposobem na to, aby nie dublować kodu jest zamknięcie danego bloku funkcjonalnego w module wykonywalny, który zwany jest funkcją. Dzięki zastosowaniu funki zmniejszamy ilość linii kodu, wielkość programu wykonywalnego oraz szybkoś wykonywania się programu. Charakterystycznym elementami dla funkcji jest to, że poza wykonaniem instrukcji, operacji zawartych w ciele funkcji (operatorem złożonym) zamkniętej pomiędzy dwoma klamrowymi nawiasami ({}) umożliwia przekazywanie parametrów zdefiniowanych przez programistę oraz zwraca wartość określonego typu. 

Należy zauważyć, że każdy program w MQL4 typu EA, wskaźnik, skrypt jest funkcją, przy czym są to tak zwane funkcje specjalne start(), init(), deinit(). Główną funkcją, a zarazem obligatoryjnie wymaganą jest funkcja start(), bez której żaden program w MQL4 nie może istnieć. Funkcje init() oraz deinit() nie są wymagane w każdym programie.

Wywoływanie funkcji

Wywołanie funkcji, czyli uruchomienie bloku wykonywalnego funkcji jest możliwe wówczas, gdy wcześniej zadeklarujemy oraz zdefiniujemy funkcję. Funkcja jest tak zwanym operatorem złożonym.

Deklaracja funkcji polega na określeniu nazwy funkcji, ilości oraz typu przekazywanych parametrów do funkcji oddzielonych średnikami (,), które zamknięte są w nawiasach zwykłych (()) oraz typu wartości zwracanej przez funkcję. Definicja funkcji polega na umieszczeniu w bloku wykonywalnym funkcji ograniczonym nawiasami klamrowymi ({}) instrukcji, operatorów, obliczeń, które ma wykonać funkcja.

W języku MQL4 tworząc EA, wskaźniki, skrypty możemy jednocześnie deklarować i definiować funkcję, ale istnieje też możliwość rozdzielenia tego poprzez specjalnie do tego opracowane, tak zwane pliki nagłówkowe mające rozszerzenie (mqh) wówczas w plikach nagłówkowych umieszczamy tylko deklaracje funkcji, a w plikach EA, wskaźników, skryptów, bibliotek dokonujemy definicji funkcji.

Parametry mogą być przekazywane do funkcji przez wartość lub przez referencje. Przekazanie przez wartość oznacza, że funkcja nie ma możliwości modyfikacji tych parametrów w bloku wykonywalnym funkcji, w rzeczywistości funkcja pobiera kopie parametrów, natomiast przekazują parametr przez referencje funkcja może zmodyfikować ten parametr inaczej mówiąc funkcja operuje na rzeczywistej zmiennej, a nie na jej kopi. Aby przekazać parametry przez referencje wystarczy poprzedzić je znakiem ampersand (&). Maksymalna ilość parametrów, które mogę być przekazywane do funkcji wynosi 64.

Przykład:

// Deklaracja funkcji pobierającej parametry przez wartość i nie zwracającej żadnej wartości void nazwa_funkcj(int x1, int x2, int x3);

// Deklaracja i definicja funkcji pobierającej parametry przez wartość i nie zwracającej żadnej wartości void nazwa_funkcj(int x1, int x2, int x3)
{
Print(„Jestem funkcją”);
}

// Deklaracja i definicja funkcja zwracającej wartość integer, parametry przekazywane przez wartość

int suma(int x1, int x2, int x3)
{
return(x1+x3+x3);
}

// Deklaracja i definicja funkcja zwracającej wartość void, parametry przekazywane przez wartość oraz parametr x4 przez referencje, w którym będzie wynik sumowania
void suma(int x1, int x2, int x3, int & x4)
{
x4 = x1+x3+x3;
}

// Deklaracja i definicja funkcji parametry przekazywane przez wartość typu double oraz wartość zwracana typu double double mnozenie(double x1, double x2, double x3, double & x4[])
{
x4[1] = x1*x2*x3; // wyniku umieszczamy w pierwszym elemencie tablicy
return( x1*x2*x3 );
}

Funkcje możemy opcjonalnie wywoływać z parametrami domyślnymi, co daje nam możliwość wywoływania funkcji z różną liczbą parametrów, przy czym parametry nieokreślone będą przyjmowały wartości domyślne. Ważne jest, aby parametry funkcji, które mają być domyślne były umieszczone na końcu definicji parametru wywołania funkcji i nie były oddzielone parametrami niedomyślnymi.

Przykład:

// Deklaracja funkcji z parametrami domyślnymi
void funkcjaPI(double init, double s = 0.0001, int level = 10);

// Możliwe kombinacje wywołanie funkcji
funkcjaPI() // błąd, musi być podany parametr init
funkcjaPI(3.14, 10) // błąd, drugi parametr pominięty (uwaga funkcja
zadziała, ale zmienna s przyjmie wartość 10)
funkcjaPI(3.14, 0.0002) // prawidłowe wywołanie z dwoma parametrami
funkcjaPI(3.14, 0.0002, 10); // prawidłowe wywołanie z trzema parametrami
funkcjaPI(3.14, 0.0002, 10); // prawidłowe wywołanie z trzema parametrami

Funkcje specjalne

W języku MQL4 istnieją trzy predefiniowane funkcje specjalne, o których wspomniane było wyżej:

  • init() - jest to funkcja uruchamiana jednorazowo przy inicjalizacji EA, wskaźnika, skryptu, czyli przy umieszczeniu na wykresie, włączeniu strategii lub zmianie parametrów, włączeniu/wyłączeniu EA.
  • start() - jest to najważniejsza i obligatoryjna funkcją każdego EA, wskaźnika, skryptu. Jest uruchomiona dla EA i wskaźników za każdym razem zmiany kwotowań, natomiast w skryptach uruchamiana jest jednorazowo. Jeśli w naszym programie nie umieścimy funkcji start nie zostanie on skompilowany, a programista dostanie komunikat, że brak funkcji start().
  • deinit() - jest to funkcja uruchamiana jednorazowo przy zamykaniu EA, wskaźnika, skryptu, czyli w momencie usuwania EA, wskaźnika, skryptu z wykresu lub w momencie przeładowania parametrów, a także włączenia / wyłączenia EA.

Powyższe predefiniowane funkcje specjalne mogą mieć przekazywane parametry, ale parametry te będą ignorowane podczas uruchamiania w terminalu, ale domyślne wartości można pobierać. Funkcji start(), init() i deinit() można wywołać z dowolnego miejsca programu, tak jak każdą inną funkcję, ale należy być przy tym bardzo uważnym, aby nie spowodować błędnego działania programu lub zapętlenia się wywołania funkcji. Nie jest zalecane wzajemne wywoływanie funkcji specjalnych start() w funkcji init() lub dokonywanie obliczeń danych z wykresów w funkcji init(), w której wykres i zmienne są dopiero inicjowane. Init() i deinit() nie powinny zawierać skomplikowanych obliczeń powinny być zoptymalizowane do jak najszybszego wykonania się.

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