5. Funkcje własne.

5.14. Biblioteki funkcji: część 2

W pliku biblioteki MojaBiblioteka.mq4, który w poprzednim rozdziale utworzyliśmy w folderze Libraries, zapiszmy funkcję do obliczenia objętości walca (kod 1).

Kod 1
#property library
#property strict

//--- Biblioteka
//--- funkcja do obliczenia objętości walca
double CylinderVolume(double radius, double height) export
  {
   double volume = M_PI * radius * radius * height;
   Print("Funkcja z pliku Libraries\\MojaBiblioteka.ex4");
   return(volume);
  }

Widzimy, że na początku muszą być zapisane co najmniej dwie ważne dyrektywy preprocesora #property. Jedna ze słowem kluczowym library, która zdefiniuje program jako bibliotekę. Druga dyrektywa ze słowem kluczowym strict świadczy o zastosowaniu nowego kompilatora MQL4.

Opis funkcji należy przygotować tak samo jak omawialiśmy to w poprzednich rozdziałach z jednym ważnym wyjątkiem. Po nagłówku funkcji i przed { należy zapisać modyfikator export, inaczej ta funkcja nie będzie dostępna dla innych programów. W powyższym kodzie w ciele funkcji celowo dopisałem Print("Funkcja z pliku Libraries\\MojaBiblioteka.ex4"), po to żebyśmy mogli potem prześledzić z jakiej biblioteki została zastosowana funkcja.

W poniższym kodzie skryptu pokazano jak należy importować funkcje z biblioteki (kod 2).

Kod 2
#property strict

//--- Blok importu funkcji z biblioteki
#import "MojaBiblioteka.ex4"
   double CylinderVolume(double radius, double height);
#import

void OnStart()
  {
   double r = 1.0;
   double h = 2.5;
   double v = CylinderVolume(r, h);
   Print("Objętość walca = ", DoubleToString(v));
  }

Blok importu funkcji z biblioteki zaczyna się od dyrektywy #import, po której między cudzysłowami "" idzie nazwa pliku z rozszerzeniem *.ex4. Funkcje są importowane ze skompilowanych bibliotek, które mają takie rozszerzenie, dlatego zapisujemy *.ex4 a nie *.mq4 (rys. 1).

Rys. 1. Import biblioteki.


Następnie należy zapisać typ i nazwę funkcji, a w nawiasach typy i nazwy parametrów tak samo jak nagłówek funkcji jest opisany w bibliotece. Na końcu nie zapomnij zapisać myślnik (zaznaczono na żółto). Druga dyrektywa #import zamyka blok importowanych funkcji (kod 3).

Kod 3
//--- Blok importu funkcji z biblioteki
#import "MojaBiblioteka.ex4"
   double CylinderVolume(double radius, double height);
#import

Parametry nie muszą mieć takie same nazwy jak w bibliotece. Z drugiej strony jeśli pracujęmy na skompilowanym pliku biblioteki bez możliwości zajrzenia do kodu źródłowego, to i nie ma możliwości zobaczyć co tam jest. Tutaj w importowym bloku zamiast radius i height możemy zapisać jakiekolwiek inne nazwy, np. a i b (kod 4).

Kod 4
   double CylinderVolume(double a, double b);

Można po prostu zostawić tylko typy parametrów bez nazw i to też będzie działać (kod 5).

Kod 5
   double CylinderVolume(double, double);

Jeśli z biblioteki chcemy zaimportować wiele funkcji, to każdą z nich należy zapisać zgodnie z poniższym schematem (kod 6).

Kod 6
//--- Blok importu funkcji z biblioteki
#import "nazwa_pliku.ex4"
    typ_funkcji NazwaFunkcji_1(...);
    typ_funkcji NazwaFunkcji_2(...);
    ...
    typ_funkcji NazwaFunkcji_N(...);
#import

Teraz w katalogu MQL4 mamy dwa pliki do pracy. W folderze Scripts jest plik skryptu o nazwie Test, w którym znajduje się kod 2. W folderze Libraries jest plik biblioteki o nazwie MojaBiblioteka, w którym znajduje się kod 1 (rys 2).

Rys. 2. Łączenie biblioteki ze skryptem.


Skompiluj teraz bibliotekę, a potem skrypt. Uruchom skrypt w MetaTrader 4 i sprawdź logi w dzienniku terminala (rys 3).

Rys. 3. Wynik działania skryptu.


W logach (rys. 3) widzimy, że skrypt poprawnie obliczył objętość walca, a funkcja wyświetliła informację jaką zapisaliśmy w Print("Funkcja z pliku Libraries\\MojaBiblioteka.ex4") (rys. 2, linijka kodu 9).