W celu zademonstrowania jak się stosuje funkcję przygotujmy dwa skrypty, które obliczą objętość walca (rys. 1). Pierwszy - bez funkcji własnej (kod 1), drugi - z zastosowaniem owej (kod 2).
Rys. 1. Formuła obliczenia objętości walca.
Bez funkcji własnej.
// --- Wariant 1.
#property strict
void OnStart()
{
double r = 1.0; // promień podstawy walca
double h = 2.5; // wysokość walca
double v = M_PI * r * r * h; // objętość walca
Print("Obiętość walca = ", DoubleToString(v));
}
W tym skrypcie zmienna r będzie określać wartość promienia podstawy walca, a zmienna h jego wysokość. Utworzymy zmienną v, której od razu przypiszemy wynik obliczenia objętości zgodnie z formułą M_PI * r * r * h. Tutaj M_PI to stała π (Pi), która w MQL4 zdefiniowana liczbą 3.14159265358979323846. Dalej za pomocą funkcji standardowej Print() wyświetlimy wynik w dzienniku logów terminala.
A teraz zrealizujmy to samo zadanie z użyciem funkcji własnej.
// --- Wariant 2.
#property strict
void OnStart()
{
double r = 1.0; // promień podstawy walca
double h = 2.5; // wysokość walca
double v = CylinderVolume(r,h); // objętość walca
Print("Obiętość walca = ", DoubleToString(v));
}
//--- funkcja własna do obliczenia objętości walca
double CylinderVolume(double radius, double height)
{
double volume = M_PI * radius * radius * height;
return(volume);
}
W tym wariancie widzimy, że v obliczana jest za pomocą zapisu CylinderVolume(r,h). Ten zapis oznacza wywołanie funkcji własnej o nazwie CylinderVolume. Dalej już poza granicami OnStart() opisaliśmy tę funkcję, gdzie obliczana jest objętość walca.
Rys. 2. Skrypt z funkcją własną.
Korzystanie z funkcji własnej składa się z dwóch etapów: jej opisu i wywołania. Jeśli funkcja zostanie opisana, ale nie wywołana w kodzie, to nie zostanie ona uruchomiona. Jeśli spróbujemy wywołać funkcję, której nie opisano, wtedy kompilator wygeneruje błąd.