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

Programowanie jest jak tworzenie przepisu na ciasto. Trzeba podać składniki i instrukcje ich wykorzystania. Dziś pokażemy, jak w MQL tworzyć składniki, czyli zmienne.

Publikacja: 15.07.2016 06:23

Prezentujemy przykładowe okno Meta Editora, w którym zadeklarowano dziewięć zmiennych (sześć typu in

Prezentujemy przykładowe okno Meta Editora, w którym zadeklarowano dziewięć zmiennych (sześć typu int, jedną typu double i dwie typu bool). Aby sprawdzić, czy deklaracje zostały wykonane poprawnie, należy na górze okna wcisnąć przycisk kompilacji. Na dole pojawi się wówczas raport o błędach lub ich braku. W powyższym przykładzie mamy jeden błąd – w linii 18. i kolumnie 11. Chodzi o to, że w nazwie zmiennej „Wahen ToTrail” została użyta spacja (alternatywnie można połączyć wyrazy albo użyć podkreślenia). Dzięki precyzyjnej nawigacji błędów można łatwo je odnaleźć i podjąć próbę naprawy. Po prawej stronie ekranu mamy okno pomocy, w którym wyjaśnione jest znaczenie zmiennej typu bool. Aby uzyskać taką podpowiedź, wystarczy zaznaczyć kursorem nazwę typu zmiennej (bool) i wcisnąć na klawiaturze F1. Podręczną pomoc można wykorzystać w każdym przypadku, gdy nie rozpoznajemy jakiejś części składni.

Foto: GG Parkiet

Dwa tygodnie temu pisaliśmy w tym miejscu o programistycznych możliwościach platformy transakcyjnej Meta Trader. W dzisiejszym i kilku następnych artykułach z cyklu „Profesjonalny inwestor" chcemy rozszerzyć tę tematykę. Przybliżymy więc czytelnikom specyfikę programowania w języku MQL. Pokażemy, z jakich elementów składa się ów język i jak można je łączyć, by budować własne wskaźniki, skrypty lub automaty inwestycyjne. Dziś omówimy typy danych, z których korzystają programy pisane w MQL.

Szufladka na dane

Każdy program, bez względu na to, do czego służy, musi przechowywać rozmaite informacje, czyli dane. W tym celu tworzy się zmienną, czyli coś w rodzaju szufladki o określonej wielkości pamięci, w której owe dane są umieszczane. W przypadku narzędzi inwestycyjnych mogą to być dane dotyczące na przykład odległości zlecenia stop loss od ceny otwarcia pozycji.

Aby budowany przez nas program przechował te dane w pamięci, musimy mu podać dwie kluczowe kwestie. Po pierwsze, nazwę (tzw. identyfikator) owej szufladki (zmiennej), a po drugie, rodzaj przechowywanych informacji, czyli typ danych (na przykład liczba całkowita). Trzymając się przykładu z poziomem stop lossa, moglibyśmy nadać zmiennej nazwę (identyfikator) SL albo stop_loss, albo zlecenie_obronne. Mamy tu spore pole do popisu, ale musimy trzymać się pewnych ograniczeń wynikających ze specyfiki języka programowania. Nazwy zmiennych nie mogą zawierać polskich znaków ani spacji (zamiast odstępu używa się podkreślenia). Dozwolone znaki to: (a..z), (A...Z), podkreślenie ( _ ) i cyfry (0...9). Tutaj należy pamiętać, że zmienne o nazwach ABC i abc to dwa zupełnie różne byty. Co istotne – nazwa zmiennej nie może się zaczynać od liczby, a jej długość nie może przekraczać 31 znaków. Ponadto nie można korzystać z słów zastrzeżonych, które są identyfikatorami wbudowanymi już w MQL i mają przypisaną ściśle określoną funkcję (na przykład operator warunkowy „if").

Jeśli już wymyślimy nazwę zmiennej spełniającą wymienione warunki, musimy jeszcze określić jej typ. Zmienne mogą przechowywać liczby całkowite, liczby rzeczywiste, ciągi znaków, pojedyncze znaki, wartość logiczną prawda lub fałsz, kolor lub datę i godzinę. Poniżej wyjaśnimy szczegółowo wszystkie typy, ale w tym miejscu, nawiązując do przykładu ze stop lossem, podpowiemy tylko, że nasza zmienna byłaby po prostu liczbą całkowitą pokazującą ilość pipsów, o jaką zlecenie oddalone jest od kursu otwarcia pozycji. Ten typ danych ma w MQL swoją nazwę zastrzeżoną „int" od angielskiego „integer".

Warto jeszcze dodać, że tworzenie zmiennej w MQL wygląda następująco: najpierw podajemy typ przechowywanych danych, następnie dajemy odstęp (spację) i wpisujemy nazwę zmiennej. Na koniec dajemy średnik (brak średnika jest bardzo częstym błędem, zwłaszcza u początkujących programistów). W przykładzie ze stop lossem utworzona zmienna wyglądałaby następująco: „int stop_loss;". W fachowym języku takie utworzenie zmiennej to deklaracja. Jeśli przypiszemy zmiennej jakąś wartość początkową (na przykład: int stop_loss=50;), to mówimy już o inicjacji zmiennej. Jakiego typu zmienne możemy wykorzystywać podczas programowania w MQL?

Typy danych

W języku MQL dostępnych jest siedem typów danych. Omówimy je tutaj po kolei. Zacznijmy od już wspomnianego, czyli typu całkowitego, który ma zastrzeżoną nazwę „int". Jest to po prostu liczba całkowita, pochodząca z przedziału (-2147483648, 2147483647). Ten typ zmiennych można wykorzystywać chociażby do oznakowania numeru świecy na wykresie czy liczby otwartych pozycji.

W sytuacji, gdy chcemy korzystać z liczb, które posiadają część ułamkową, musimy wykorzystać typ zmiennoprzecinkowy, który ma zastrzeżoną nazwę „double". Są to liczby z przedziału (-1,7 * E-308 do 1,7 * E308 ). Jest to więc typ danych bardziej precyzyjny od „int", ale za to zajmuje więcej miejsca w pamięci komputera (rezerwowany jest szerszy zakres niż w przypadku liczb całkowitych). Warto dodać, że część dziesiętną oddziela się za pomocą kropki, a nie przecinka. Typ double może być w MQL wykorzystywany chociażby wtedy, gdy zmienną tworzymy na bazie aktualnego kursu walutowego EUR/USD, który podawany jest z precyzją pięciu miejsc po przecinku. Jeśli na przykład zadeklarujemy zmienną poziom_wejścia, która jest równa kursowi otwarcia sesji powiększonemu o aktualną wartość wskaźnika ATR dla 10 sesji, to będziemy musieli użyć zapisu: „double poziom_wejscia;" (do zmiennej poziom_wejścia musiałaby być następnie przypisana odpowiednia wartość będąca sumą ceny otwarcia i wartości ATR).

Oprócz liczb w programie można również przechowywać ciągi znaków, czyli na przykład nazwy aktywów „Wheat" czy „EURUSD". Do tego służy zmienna łańcuchowa, która ma zastrzeżoną nazwę „string". Najczęściej wykorzystuje się ten typ danych do wyświetlania użytkownikowi jakichś konkretnych informacji. Ciągi znaków muszą być ujmowane w podwójny cudzysłów, na przykład: „string potwierdzenie_zlecenia = "Złożono zlecenie kupna 1 lot Wheat po 1.23 USD";".

Zdarza się, że program musi przechować w pamięci jakiś pojedynczy znak, np. literę albo symbol pieniądza. Może to być przydatne wtedy, gdy chcemy sprawdzić, czy dany znak występuje w jakimś wcześniej zdefiniowanym ciągu znaków. Aby utworzyć taką zmienną, wykorzystuje się typ znakowy, który ma zastrzeżoną nazwę „char", a wartość zmiennej zapisuje się w pojedynczym cudzysłowie. Na przykład: „char szukana_litera='A';". Warto tutaj dodać, że komputer nie potrafi przechowywać w swojej pamięci jakiejkolwiek litery czy znaku. Są one bowiem przechowywane w postaci liczby całkowitej, stąd też wszystkie litery alfabetu oraz znaki specjalne są po prostu ponumerowane i to właśnie ten numer (kod) jest trzymany w pamięci.

Kolejnym typem zmiennej w MQL jest typ logiczny, który ma zastrzeżoną nazwę „bool". Przyjmować on może tylko dwie wartości – prawda (true) lub fałsz (false), reprezentowane przez wartości całkowite odpowiednio 1 i 0. Ten typ zmiennej często wykorzystywany jest w instrukcji warunkowej „if" (jeżeli), która uzależnia wykonanie dalszej części kodu od spełnienia jakiegoś kryterium. Przyjmijmy na przykład, że mamy zmienną: „bool sygnal_sprzedazy=true;". Jeżeli na wykresie pojawił się sygnał sprzedaży, czyli zmienna faktycznie przyjęła wartość true, będzie można otworzyć pozycję lub sprawdzić kolejne warunki wejścia na rynek.

Często wykorzystywanym typem danych jest kolor, który ma zastrzeżoną nazwę „color". Przechowuje on informacje o barwie dane wskaźnika czy też symbolu na wykresie. Najczęściej przypisuje się kolor za pomocą stałych nazw zapożyczonych z języka angielskiego (Red, Green, Yellow, itd.). Na przykład zmienna kolorująca średnią na czerwono może być zadeklarowana: „color kolor_sredniej=Red;".

Ostatni typ danych to typ daty i czasu, który ma zastrzeżoną nawzę „datetime". Zmienna typu datetime może być reprezentowana opisowo w postaci ciągu znaków składającego się z sześciu części (rok, miesiąc, dzień, godzina, minuta, sekunda). Budowa zmiennej zaczyna się od stałej znakowej D, a dalej jest zawarty w cudzysłowach ciąg znaków opisujący datę i czas. Na przykład: „datetime data1 = D'1980.07.19 12:30:27';". W cudzysłowach można zawrzeć samą datę w postaci (rok, miesiąc, dzień) bez czasu, wówczas czas przyjmie wartości 00:00:00, lub w postaci czasu (godzina, minuta, sekunda), wówczas data przyjmie wartość domyślną (aktualną). Zakres daty i czasu może się zawierać pomiędzy 1 stycznia 1970–31 grudnia 2037. Dzięki zmiennej datetime możliwe jest przykładowo opracowanie wskaźnika poszukującego określonych układów na wykresie tylko w ściśle określone dni.

Już po samym zestawie typów zmiennych widać, że język MQL jest dość rozbudowany. Choć na pierwszy rzut oka ilość informacji może być zniechęcająca, to powinno się raczej patrzeć na tę kwestię w kategoriach możliwości i elastyczności, jakie daje programowanie. Aby lepiej przyswoić sobie tematykę typów danych, warto otworzyć Meta Editora i zadeklarować kilka przykładowych zmiennych. W razie problemów pod ręką jest rozbudowany panel pomocy w Meta Traderze lub szereg witryn i forów internetowych, gdzie można znaleźć wiele cennych informacji. Sama znajomość pojęć i ich znaczeń niewiele da, dopóki nie zaczniemy ich stosować w praktyce. Dlatego zachęcamy, by od samego początku pisać kody w MQL w Meta Editorze lub studiować kody już w nim dostępne.

[email protected]

Inwestycje
Promocja na ETF-y również w Noble Securities
https://track.adform.net/adfserve/?bn=77855207;1x1inv=1;srctype=3;gdpr=${gdpr};gdpr_consent=${gdpr_consent_50};ord=[timestamp]
Inwestycje
Tomasz Bursa, OPTI TFI: WIG ma szanse na rekord, nawet na 100 tys. pkt.
Inwestycje
Emil Łobodziński, BM PKO BP: Nasz rynek pozostaje atrakcyjny, ale...
Inwestycje
GPW i rajd św. Mikołaja. Czy to może się udać?
Materiał Promocyjny
Cyfrowe narzędzia to podstawa działań przedsiębiorstwa, które chce być konkurencyjne
Inwestycje
Co dalej z WIG20? Czy zbliża się moment korekty spadkowej?
Inwestycje
Ropa naftowa szuka pretekstu do ruchu w górę