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).
#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).
#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).
//--- 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).
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).
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).
//--- 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).