Podstawy programowania strategii w języku MQL, cz. 4

Automatyzacja handlu › W dzisiejszym odcinku zajmujemy się funkcjami. Pokazujemy, jak można je budować samemu i jak korzystać z tych już wbudowanych w MQL.

Aktualizacja: 05.08.2016 06:06 Publikacja: 05.08.2016 06:00

Powyższy obrazek pokazuje fragment kodu skryptu do składania zleceń. Widzimy tu zarówno wykorzystani

Powyższy obrazek pokazuje fragment kodu skryptu do składania zleceń. Widzimy tu zarówno wykorzystanie funkcji (m.in. opisywana w tekście OrderSend()), jak i instrukcji warunkowych i pętli. Dla odróżnienia od innych elementów funkcje wbudowane są podświetlane na fioletowo. Inne kolory posiadają też poszczególne parametry funkcji. Aby dowiedzieć się, co kryje się pod tymi nazwami (o ile nie są tworem autora kodu), wystarczy zaznaczyć cały wyraz i kliknąć F1. Wówczas otworzy się okno pomocy z dokładnym wyjaśnieniem.

Foto: GG Parkiet

 

Kontynuujemy cykl poświęcony podstawom języka programowania MQL. Tematem dzisiejszego odcinka będą funkcje, czyli zestawy instrukcji do wykonania, które można wywołać jednym krótkim poleceniem. Funkcje znacznie ułatwiają pracę i skracają długość kodu.

Budowa funkcji

Zanim zajmiemy się funkcjami w MQL, przypomnijmy sobie, jak wyglądała prosta funkcja liniowa w matematyce: f(x)=ax+b, gdzie a i b to stałe, a x to zmienna/parametr. Gdy podajemy funkcji wartość parametru x, ta zwróci nam określoną wartość. Gdyby parametry a i b miały wartości odpowiednio 2 i 0, to dla x=2, funkcja zwróciłaby nam wartość 4. Funkcje w MQL działają podobnie, tzn. dostają pewne parametry wejściowe (x=2), wykonują na nich określone działania (instrukcje) i zwracają wynik. Jeżeli owe działania są bardzo często wykonywane przez nasz algorytm inwestycyjny, to dzięki funkcjom nie musimy za każdym razem wypisywać wszystkich instrukcji w kodzie. Wystarczy wywołać samą nazwę funkcji.

Jak zbudowana jest funkcja? Z dwóch części – nagłówka i ciała. Aby to klarownie wytłumaczyć, załóżmy, że tworzymy funkcję, która będzie zamieniać dolary na złote według stałego kursu 3,5 zł za dolara. Parametrem w takiej funkcji będzie ilość dolarów (ile_dolarow). Przyjmijmy, że nasza funkcja nazywać się będzie „konwerter". Jej nagłówek będzie wyglądał następująco: double konwerter (double ile_dolarow). Czytelnicy, którzy czujnie śledzili poprzednie odcinki cyklu, zauważą podobieństwo do sposobu deklarowania zmiennych. Najpierw bowiem podaliśmy typ zwracanej przez funkcję zmiennej, czyli „double", a potem wpisywaliśmy jej nazwę (zasady nazewnictwa funkcji są takie same jak przy zmiennych). W naszym przykładzie wartość w złotych może być liczbą niecałkowitą, dlatego właśnie użyliśmy tego typu zmiennej. W nawiasach okrągłych z kolei mamy zadeklarowany parametr – jego typ (również double, bo możemy mieć np. 3,5 dolara) oraz jego nazwę. Nagłówek informuje nas więc o typach zmiennych wejściowych i zwracanych oraz o nazwie funkcji. Warto tutaj zauważyć, że o ile nawiasy kwadratowe zarezerwowane są dla zmiennych tablicowych, o tyle okrągłe właśnie dla funkcji (łatwiej będzie je dzięki temu rozpoznawać w kodzie).

Jak można się domyślić, w ciele funkcji umieścimy instrukcje do wykonania. Owe instrukcje muszą się zamykać w nawiasach klamrowych i każda instrukcja kończy się średnikiem. W naszym przykładzie ciało wyglądałoby następująco: { return ile_dolarow*3.5;}. W ciele użyliśmy polecenia „return", które zwróci funkcji „konwerter" wynik obliczeń.

W ten sposób stworzyliśmy prosty zestaw instrukcji, zamieniający dolary na złote. Jeżeli chcielibyśmy wywołać tę funkcję w jakimś miejscu w kodzie, wystarczy, że wypiszemy tylko: „konwerter(ile_dolarow);". Nasza przykładowa funkcja jest oczywiście bardzo prosta i bazuje na prostym mnożeniu, ale w przypadku bardziej rozbudowanych instrukcji oszczędność kodu i czasu będzie zdecydowanie większa.

Funkcje wbudowane MQL

W języku MQL dostępnych jest wiele przydatnych, wbudowanych funkcji. Możemy z nich korzystać poprzez wywołanie odpowiedniej nazwy. Wspominaliśmy już w jednym z poprzednich odcinków o funkcji pierwiastka kwadratowego. Jest to matematyczna funkcja wbudowana w składnię MQL, która jest zadeklarowana jako: double MathSqrt(double x). Jej wywołanie pozwoli obliczyć pierwiastek z podanego parametru. Wbudowanych funkcji matematycznych jest około 20. Mamy też inne rodzaje funkcji: analizy technicznej, daty i czasu, informacyjne konta itd. Aby poznać je wszystkie, odsyłamy na portal bossafx.pl, do modułu pomocy dostępnego w Meta Editorze albo do serwisu: https://book.mql4.com/functions/index.

Na potrzeby tego odcinka przyjrzymy się bardziej szczegółowo funkcji OrderSend(), której zadaniem jest złożenie zlecenia na rynek. Na ilustracji obok widzimy nagłówek tej funkcji. Wartością zwracaną jest liczba całkowita „int" (jest to numer zlecenia/ticket), a parametrów jest aż 11. Nie ma w tym nic dziwnego – aby „powiedzieć" naszemu robotowi inwestycyjnemu, jaką dyspozycję ma wysłać do terminala brokera, musimy podać mu wszystkie szczegóły transakcji. Zacznijmy od góry i opiszmy kolejne parametry. Najpierw podajemy nazwę symbolu (stąd typ zmiennej „string"), a więc rynku, na którym chcemy otworzyć pozycję. Może to być przykładowo EURUSD, EURPLN itp. albo funkcja Symbol(), która zwraca nazwę instrumentu aktualnie otwartego na wykresie. Następnie mamy „int cmd", czyli typ zlecenia. Jest to zmienna typu całkowitego, w ramach której kupno zdefiniowane jest jako 0, sprzedaż 1, buylimit 2, selllimit 3, buystop 4, a sellstop 5. Wpisując wartość parametru, możemy użyć odpowiedniej liczby albo odpowiedniej etykiety. Na przykład dla kupna będzie to OP_BUY. Korzystanie z etykiet jest bardziej czytelne, chyba że ktoś zapamięta, jaki typ zlecenia kryje się pod każdą z cyfr. Pod zmienną „volume" kryje się wolumen transakcji liczony w lotach, a pod „price" – cena, po której otworzymy pozycję (bid albo ask). Kolejne trzy parametry to wielkości, odpowiednio: dopuszczalengo obsunięcia ceny (jakie odchylenie akceptujemy), stop lossa i take profit. Ostatnie cztery parametry są opcjonalne, więc dla ich poznania odsyłamy do wspomnianych stron.

Jak widać, funkcje mogą być bardzo rozbudowane. Liczba parametrów i ich rodzaje mogą odstraszać początkujących programistów, ale zapewniamy, że z modułem pomocy w Meta Editorze znacznie łatwiej jest operować poszczególnymi narzędziami. Dla lepszego zrozumienia działania funkcji odsyłamy do wspomnianych już w poprzednich odcinkach serwisów: miroslawzelent.pl, fxwatch.eu oraz bossafx.pl.

W języku MQL istnieją trzy funkcje specjalne

Mowa o:

– 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 funkcja 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łącze- nia EA. Źródło: bossafx.pl

Inwestycje
Trzy warstwy regulacji
https://track.adform.net/adfserve/?bn=77855207;1x1inv=1;srctype=3;gdpr=${gdpr};gdpr_consent=${gdpr_consent_50};ord=[timestamp]
Inwestycje
Jak przeprowadzić spółkę przez spór korporacyjny?
Inwestycje
Porozumienia akcjonariuszy w spółkach publicznych
Materiał Promocyjny
Cyfrowe narzędzia to podstawa działań przedsiębiorstwa, które chce być konkurencyjne
Inwestycje
Unikanie sporów potransakcyjnych