Języki MetaQuotes Language 4 i 5 to środki opracowania aplikacji pod MetaTrader Client Terminal na podstawie platform rodziny MetaTrader, odpowiednio czwartej i piątej generacji. Dostarczają użytkownikom instrumenty do opracowywania automatycznych strategii handlowych klientów.

Artykuł obejmuje następujące tematy:


Przygotowałem dla Was szczegółowy przewodnik po programowaniu MetaTrader w językach MQL4 vs MQL5. Po przeczytaniu tego materiału zrozumiecie, czym jest MQL, jakie są różnice między dwoma ostatnimi wersjami języków i w jaki sposób z nimi pracować. Znajdziecie tu szczegółową instrukcję w obrazkach napisania doradcy handlowego. Zaczynamy w takim razie!

Czym jest MQL4 i MQL5

W wielu kwestiach języki MQL4 i MQL5 są bardzo podobne. Dlatego o różnicach porozmawiamy oddzielnie, a na razie umówimy się, że będziemy oba nazywać „ MQL”, w liczbie pojedynczej i bez wskazywania wersji.

MQL to wbudowany w platformę  MetaTrader język programowania. W celu napisania własnych robotów handlowych, wskaźników czy innych aplikacji na MQL, a także ich kompilacji i debugowania wykorzystuje się środowisko programisty MetaQuotes Language Editor, które razem ze swoją dodatkową informacją dostarczane jest razem z instalacją MetaTrader Client Terminal.

LiteForex: Czym jest MQL4 i MQL5

Jeśli choć raz inwestowaliście w te czy inne aktywa, może po prostu kupowaliście dolary, aby przechowywać je w banku, to rozumiecie, że inwestycja wymaga nieustannej kontroli. Mogę się założyć, że nie raz zadawaliście sobie pytania, podobne do tych:

  • Czy nie czas wyjść z transakcji póki cena jest na szczycie?
  • Jak określić, czy cena aktywu będzie rosnąć i potem rynek się odwróci?
  • Może tym razem sygnał jest fałszywy i nie należy ryzykować oraz spieszyć się z otwieraniem pozycji?

Trzeba nadążać za śledzeniem rynku, w odpowiednim czasie podejmować decyzje handlowe. Dobrze byłoby robić to przez całą dobę podczas najaktywniejszych sesji. Kiedy pracuje się z kilkoma aktywami jednocześnie, sytuacja jeszcze bardziej się komplikuje.

MQL pozwala na realizację dowolnej strategii handlowej lub algorytmu w postaci programu komputerowego. Następnie program ten uruchamia się i działa na stacji roboczej w MetaTrader Client Terminal bez przerwy. Oprócz tego w komplecie dostawy znajduje się szereg robotów handlowych, wskaźników i skryptów od projektanta platformy w postaci kodów wyjściowych, co znacznie ułatwia oswojenie języka i charakterystycznych dla niego technik. MQL jest także zaopatrzony w szczegółowe informacje dodatkowe online i offline. Język łączy ogromną ilość społeczności.

Załóżmy, że wymyśliliście jakiś świetny wskaźnik lub chytry algorytm handlowy, który chcecie wykorzystać w pracy. A może chceicie przeanalizować rynek przy pomocy sieci neuronowych? Nie ma żadnych ograniczeń. Przy pomocy MQL możecie realizować każdy pomysł, sprawdzić na danych historycznych w testerze strategii, bez ryzyka finansowego i wykorzystywać w tradingu.

LiteForex: Czym jest MQL4 i MQL5

Streszczamy! MQL rozwiązuje problem napisania narzędzia do kontroli stanu konta handlowego, obliczeń wskaźników i poziomów, uzyskania sygnałów handlowych i określania punktów wejścia oraz wyjścia z rynku. Środki językowe pozwalają na zorganizowanie przez robota handlowego lub wskaźnika wymiany informacji z oddalonym serwerem wg protokołu TCP, łącznie z szyfrowaniem TLS, czy w oparciu o protokół HTTP. Możliwe jest wysyłanie powiadomień push do mobilnych klientów MetaTrader czyli na e-mail użytkownika, czy danych  FTP. Pewnego razu dobrze napisany i debugowany program będzie działać do tej pory, aż nie postanowicie wprowadzić zmian lub całkiem zamienić go na inny. W rękach tradera, tzn. W Waszych rękach pozostaje jedynie ogólna kontrola.

Historia powstania języków MQL4 oraz MQL5

MQL pojawił się jako ewolucyjny rozwój platformy, jako narzędzie do automatycznego zarządzania kontami handlowymi w MetaTrader. Nie będę wdawać się w szczegóły, opiszę ogólnie.

  • MetaQuotes wydano przez MetaQuotes Language razem z platformą MetaTrader, która do tego czasu była aplikacją FXCharts. MQL zaktualizował się do drugiej wersji razem z aktualizacją MetaTrader 3. Tu MetaQuotes wdrożyła API, które oferowane jest dla klientów jako dodatkowa warstwa między MetaTrader Client a MetaTrader Server.
  • Wydanie czwartej generacji platformy miało miejsce 1 lipca 2005 roku. Razem z nią świat ujrzał MQL4. Odwrotną kompatybilność z poprzednią wersją języka utracono. Również MetaQuotes zaprzestało wsparcia API terminalu klienta, ale rozszerzono możliwości samego języka oraz pokazano sposoby integracji bibliotek dll użytkowników do aplikacji na MQL. API pozostały dostępne dla brokerów na poziomie serwera, administracji i managementu.

W czerwcu 2010 r. Po wielokrotnych komunikatach uruchomiono MetaTrader 5. MetaQuotes zmieniła logikę handlu, zdjęła większość ograniczeń, uwarunkowanych wewnętrzną strukturą platformy. Ale do tej pory MT5 wg popularności nie stanowi konkurencji dla czwartej generacji.

W lutym 2014 r. MQL4 zaktualizował się razem z 600 wersją produktu terminala klienta MT4.  MetaQuotes dorobiła język, wniosła większość właściwości z  MQL5 i tym samym przyspieszyła do poziomu następcy.

Możliwości języków MQL4 i MQL5

MQL jest wykorzystywany w celu stworzenia automatycznych strategii handlowych. Kod na MQL wstępnie interpretowany jest w kod C++, który następnie kompiluje się w kod wykonalny, który działa wewnątrz terminalu jako włączana biblioteka dynamiczna. Jeśli porównać z poprzednikiem, to będzie to odpowiadało włączeniu biblioteki ddl w kod wykonalny podstawowego programu. Takie podejście sprzyja prostocie opracowania i niskiemu progowi wchodzenia w sferę automatycznego tradingu. Język jest popularny w środowisku, mimo jego wąskiej specjalizacji i zależności języka od platformy.

MetaQuotes zatroszczyła się o swoich użytkowników i wyposażyli wszystkie swoje aplikacje w podobną informację dodatkową. Poradniki do MQL4 i MQL5 w postaci plików htm dostarczane są razem z MetaEditor w kilku językach. Dlatego zawsze pod ręką macie szczegółowy podręcznik z przykładami kodu realizacji należytego postępowania.

MQL zgromadziło wokół siebie społeczność traderów i programistów. Istnieją środki, mające na celu ułatwienie komunikacji między programistami a traderami. Już powstał szereg gotowych aplikacji, ułatwiających proces handlu. Na stronie https://mql5.com znajdziecie market, służący wymianie aplikacjami w formie płatnej lub darmowej. Z terminalem handlowym zintegrowane są: sklep aplikacji, baza kodów, artykuły i sygnały innych traderów. Sklep aplikacji oferuje setki zarówno płatnych, jak i bezpłatnych rozwiązań: wskaźniki, doradcy, skrypty i wszelkie możliwe narzędzia. Czasem prościej nabyć już gotowy program, niż „wymyślać swój rower”.

Ale jeśli mimo to postanowiliście samodzielnie przyswoić MQL i zagłębić się w świecie tworzenia własnych aplikacji, w tym artykule postaram się ujawnić podstawowe niuanse, z którymi maja do czynienia początkujący, stawiający pierwsze kroki w tym kierunku. Zaawansowany czytelnik raczej nie dowie się niczego nowego z poniższego materiału.

Projektanci wspierają społeczność MQL, jeśli chodzi o informacje, regularnie wypuszczając tutoriale w postaci artykułów na różnorodne tematy ze świata tradingu. Autorzy artykułów rozpatrują nowe techniki programowania, na przykład tworzenie sieci neuronowych, analiza i rozwiązywanie problemów oraz ograniczeń języka, analiza i testowanie startegii handlowych, poszukiwanie oraz realizacja nowych algorytmów.

Mistrz tworzenia plików oferuje 8 wariantów dla MQL4 i 10 wariantów dla  MQL5. Poniżej przedstawiam zrzuty mistrza obu wersji języka.

LiteForex: Możliwości języków MQL4 i MQL5

LiteForex: Możliwości języków MQL4 i MQL5

Rozpatrzymy najpopularniejsze z nich:

  • robot handlowy;
  • wskaźnik;
  • skrypt;
  • włączana biblioteka mqh.

Po kompilacji te aplikacje w postaci kodu wykonalnego znajdują się w odpowiednim folderze MetaTrader Client Terminal (Plik → Otwórz katalog danych) (File → Open Data Folder): Experts, Indicators, Scripts i t. d. Następnie, po uruchomieniu na wykresie uruchamiają się w odpowiedzi na wydarzenia, generowane MetaTrader Client Terminal w procesie pracy. Wydarzenia są zapalnikiem do uruchomienia programów użytkowników i pozwalają na śledzenie inicjalizacji i deinicjalizacji, otrzymanie nowego notowania, wydarzenie użytkownika na wykresie i tak dalej.

Oprócz tego teraz pojawiła się możliwość tworzenia aplikacji na Python, odpowiednio, środki Python stały się dostępne w terminalu handlowym.

W poradniku MQL4 opisane są kolejne programy obsługi zdarzeń.

LiteForex: Możliwości języków MQL4 i MQL5

W MQL5 liczba programów została zwiększona w stosunku do poprzedniego pokolenia. Lista teraz wygląda następująco:

LiteForex: Możliwości języków MQL4 i MQL5

W dalszej kolejności lista wydarzeń została rozszerzona. I teraz prezentuje się następująco:

LiteForex: Możliwości języków MQL4 i MQL5

Robot handlowy czy doradca

W społeczności traderów również często nazywa się ekspertem. Doradcę umocowuje się na wykresie MetaTrader Client Terminal i działa ciągle, póki pracuje terminal handlowy i dostępne jest podłączenie do serwera handlowego. Doradców wykorzystuje się w celu realizacji absolutnie dowolnych strategii handlowych, kontrolując stan konta, przeprowadzanie operacji handlowych przy określonych warunkach, zarządzanie obiektami graficznymi. Robot handlowy uruchamia się do wykonania za każdym razem przy otrzymaniu nowego ticka instrumentu. Możliwe jest uruchomienie doradcy również w odpowiedzi na szereg innych wydarzeń: OnTimer, OnChartEvent, OnTesterTimer i in.

Doradcy wykorzystywani są w celu stworzenia interfejsów użytkowników. Roboty, tak samo, jak i wskaźniki, mają dostęp do obiektów graficznych.

Poniżej przytoczono kod prostego robota handlowego. Przy każdym nowym ticku symbolu, na wykresie którego działa doradca, ma miejsce kontrola transakcji rynkowych. Jeśli transakcja symbolu już jest, doradca czeka na jej zamknięcie. Jeśli transakcji nie ma, to ma miejsce otwarcie transakcji w stronę przeciwną do poprzedniej transakcji. Parametry doradcy: zakres, poziomy stop loss i take profit, to ustawia użytkownik. W chwili pierwszego uruchomienia dokonany zostanie zakup waluty. Po jej zamknięciu kolejna otworzy się na sprzedaż, następnie znowu na zakup i t. d. W przypadku nieudanej próby otwarcia transakcji doradca zapisuje wiadomość o błędzie w dzienniku i zatrzymuje się na 60 sekund, potem próba jest powtarzana. Doradca nie sprawdza poprawności wprowadzonych przez użytkownika parametrów, dlatego uważnie śledźcie ich poprawności. Potencjale problemy, które z grubsza widać od razu to:

  • Nie sprawdzana jest w całości możliwość handlu. Może ona zostać wyłączona przez użytkownika w terminalu lub konkretnie dla tego doradcy. Serwer handlowy również może mieć ograniczenia odnośnie handlu automatycznego.
  • Zakres może być mniejszy od najmniejszego lub większy od największego, jak również może nie pasować, jeśli na serwerze jest ograniczenie co do kroku zakresu. Na przykład użytkownik wprowadza 0.23 lota, a na serwerze zadano minimalną zmianę 0.05 lota. W efekcie transakcja nie otworzy się i funkcja  OrderSend zwróci błąd.
  • Poziomy stopów dla transakcji również nie są sprawdzane w kwestii poprawności. Mogą one nie pasować do minimalnej/maksymalnej wartości lub nie pasować do ograniczeń, ustawionych przez poziomy zamrożenia.

Najprostszy kod, który może być wykorzystany jako przygotowanie do realizacji decyzji na większą skalę.

Ten kod kompiluje się i działa na MetaQuotes Language Editor 5 build 2375 31 March 2020.

LiteForex: Robot handlowy czy doradca

Wskaźnik

Jest wykorzystywany w celu wyprowadzenia informacji o danych nt. cen, przekształconych w pewien sposób. Wszelkie możliwe oscylatory, linie trendowe, fraktale, wszystko to są wskaźniki. Dla wskaźników dostępne są środki do pracy z grafiką. Na MQL4 jest ich 6, na  MQL5 już 18. na przykład Moving Average odzwierciedla niektóre uśrednione i/lub wygładzoną wartość cenową w ciągu okresu cen w przeszłości i pośrednio wskazuje na przyszły kierunek ceny instrumentu. Działa na wykresie nieprzerwanie. Aktualizacja i przeliczenie wskaźnika odbywa się za każdym razem przy wstąpieniu ticka instrumentu, na wykresie którego działa wskaźnik, czyli przy otrzymaniu wydarzeń od użytkownika.

Z każdym wskaźnikiem wewnątrz MetaTrader Client Terminal skojarzony jest jeden lub kilka buforów, w którym znajdują się dane liczbowe. MQL4 oferuje 32 bufery dla jednego wskaźnika, MQL5 pozwala operować 512.

Poniżej przytoczono przykład wyjściowego kodu wskaźnika Bears, który oferowany jest przez projektantów platformy razem z MetaTrader4.

LiteForex: Wskaźnik

Skrypt

Projektanci wykorzystują skrypty w celu stworzenia algorytmów, nie wymagających opracowania danych w czasie rzeczywistym. Na przykład w celu załadowania danych statystycznych lub wprowadzenia informacji debugowania. Skrypty działają raz podczas przyłączenia do jakiegoś wykresu w oparciu o wydarzenie OnStart, jedynego, które może obrobić skrypt.

Na poniższej ilustracji przytoczono kod dla zamknięcia wszystkich zleceń rynkowych na koncie. Skrypt obrabia wszystkie zlecenia, niezależnie od tego, na wykresie którego symbolu zostanie on uruchomiony. Zlecenia oczekujące przy tym są ignorowane.

LiteForex: Skrypt

Efektem uruchomienia tego skryptu będzie mniej więcej następujące wyprowadzenie do dziennika MetaTrader:

LiteForex: Skrypt

Aby nauczyć ten skrypt obrabiać zlecenia oczekujące oddzielnie MQL4, trzeba będzie włożyć więcej wysiłku. Na początek stworzymy property, aby skrypt mógł pokazać okno z danymi wstępnymi. Następnie dodamy enum, zawierający 3 warianty zamknięcia transakcji przez skrypt: tylko zlecenia rynkowe, tylko zlecenia oczekujące lub wszystkie transakcje, które są na koncie w danej chwili. Następnie dodamy tabele do przechowywania  unikalnych numerów otwartych pozycji i uzupełnimy ją w odpowiedni sposób w pierwszym cyklu for. Teraz pozostaje opracować wybrany przez użytkownika wariant zamknięcia transakcji.

W efekcie otrzymujemy taki skrypt, który teraz nie tylko zamyka wszystkie transakcje, ale i uwzględnia wyb,or użytkownika.

LiteForex: Skrypt

Włączana iblioteka mqh

Wykorzystywana jest, jak wynika z nazwy, w celu włączenia do pozostałych typów programów dla MetaTrader Client Terminal. Doświadczony projektant może wybrać własne narzędzia, które mogą wielokrotnie być wykorzystywane w różnych aplikacjach.

W MetaQuotes Language Editor w tym celu trzeba jedynie wskazać drogę do załączonego pliku nagłówkowego odnośnie lokalizacji pliku, do którego odbywa się włączenie. Przy kompilacji programu MetaEditor znajdzie ten plik i włączy kod z niego zamiast dyrektywy #include. Teraz cały kod biblioteki może zostać wykorzystany w aplikacji.

Analogicznie programiści C i C++ ponownie wykorzystają kod przez włączenie plików nagłówkowych do swoich projektów i linkowanie z plikami binarnymi.

W przykładzie poniżej przedstawiono najmożliwiej uproszczoną interpretację dynamicznej tabeli aka std::vector ze standardowej biblioteki C++. ten kod kompiluje się i działa z MetaEditor version: 5.00 build 2375 31 March 2020.

LiteForex: Włączana iblioteka mqh

Rodzaje danych i syntaktyka języków MQL4 i MQL5

Rodzaje danych i syntaktyka języka dziedziczony jest od C++. Kod nа MQL przed kompilacją przechodzi przetwarzanie wstępne i interpretowane jest do odpowiedniego kodu na C++, dlatego konstrukcje językowe, trafne w  poprzedniku, prawdopodobnie skompilują się i będą działać w MQL. Programista znający C, C++ czy C# z łatwością poradzi sobie z napisaniem kodu na  MQL.

Typy danych

W MQL istnieją następujące, fundamentalne, typy danych:

  • logiczny typ danych;
  • liczby zmiennoprzecinkowe o pojedynczej i podwójnej precyzji;
  • liczby całkowite, również o pojedynczej i podwójnej precyzji, ze znakiem i bez;
  • char do przechowywania symboli;
  • wyliczenia enum, ale enum class przy tym nie ma wsparcia;
  • struktury, klasy i szablony klas.

Przy czym dodatkowo istnieje wsparcie color, string i datetime jako wbudowane rodzaje, co oczywiście nieco upraszcza życie programisty. Praca z tymi typami zorganizowana jest w stylu C, tzn. przy pomocy globalnych funkcji. Zachowanie MQL string mocno różni się od szablonów  std::string для C++03, nie wolno ich mylić.

LiteForex: Typy danych

Syntaksa języków MetaQuotes

MQL posiada syntaksę podobną do C++. Semantyka poprzednika jest standardowa, jak w przypadku C++03, przeszła do  MQL z nieznacznymi zmianami. Teraz MQL, jeśli chodzi o poziom możliwości odpowiada wg poziomu standardowi C++03.

Główna różnica między MQL a C++ to różna semantyka wskaźników. Tak, jak C++ jest wirtualnym adresem, wg którego znajdowane są dane, to MQL jest deskryptorem, odpowiednikiem deskryptora standardu POSIX, wyliczonym wskaźnikiem, pewną osłoną „surowego” wskaźnika, wg którego możemy wyróżnić obiekty, stworzone w pamięci dynamicznej i związane one są z tym wskaźnikiem. Operator „strzałka” („→”) dla wskaźnika MQL nie posiada wsparcia, dereferencja odbywa się przy pomocy operatora „punkt”. Deskryptor jest taki sam, jak i wskaźnik, powinien zostać usunięty po zakończeniu pracy programu. Przy czym jeśli zapomnicie usunąć obiekt, na który powołuje się ten deskryptor, środowisko wykonawcze zrobi to za Was podczas deinicjalizacji programu.

W języku MQL brakuje pojęcia tymczasowej zmiennej i przeniesienia danych. Przekazanie zmiennych poprzez link i wg wartości różni się od C++. I realizowane jest w MQL na swój sposób. Każdy skomplikowany obiekt lub klasa użytkownika będzie przekazywana do funkcji wg linku niezależnie od tego, czy wykorzystacie operator „Et” czy też nie.

Istnieje szereg ograniczeń odnośnie przodka. Będziecie mogli pisać funkcje i szablony ze zmienną liczbą argumentów. Ale, co ciekawe, jest szereg wbudowanych funkcji: iCustom, którą potem przeanalizujemy w tym artykule, printf, StringFormat, PrintFormat przyjmują, paradoksalnie, zmienną liczbę argumentów.

Praca z linkami na dane i obiekty różni się niuansami w porównaniu z C++, ale można je z łatwością usuwać przy pomocy wiadomości od kompilatora. Są różnice w sygnaturach konstruktora kopiowania i operatora kopiującego nadawania przez różną semantykę przekazywania zmiennych wg linku. Również w MQL brakuje semantyki przeniesienia zmiennych i egzemplarzy obiektów.

Różnice między językami MQL4 a MQL5

Różnice między językami MQL czwartej i piątej generacji uwarunkowane są różnicami w samych platformach MetaTrader4 i MetaTrader5. Wiele osób, jak ja, powie, że od chwili uruchomienia 600 wersji MT4 w celu napisania i kompilacji programów MQL4 i MQL5 wykorzystuje się MetaQuotes Language Editor jedynie piątej wersji. Szczególnie języki różnie operują operacjami handlowymi, gdyż na piątej platformie więcej jest trybów handlu i podzielone są pojęcia zlecenie, transakcja i pozycja.

Wysłanie zleceń teraz odbywa się tylko przez funkcję OrderSend, w odróżnieniu od czwartej wersji, gdzie wykorzystuje się oddzielne funkcje w celu zainstalowania modyfikacji lub usunięcia zlecenia.

 MQL4MQL5
Interwały czasowe9 (M1, M5, M15, M30, H1, H4, D, W, MN)21 (M1, M2, M3, M4, M5, M6, M10, M12, M15, M20, M30, H1, H2, H3, H4, H6, H8, H12, D1, W1, MN1)
Style rysunku

6

DRAW_NONE

DRAW_LINE

DRAW_SECTION

DRAW_HISTOGRAM

DRAW_ARROW

DRAW_ZIGZAG

Od 600 wersji liczba zaczęła odpowiadać piątej wersji.

18

DRAW_NONE

DRAW_LINE

DRAW_SECTION

DRAW_HISTOGRAM

DRAW_HISTOGRAM2

DRAW_ARROW

DRAW_ZIGZAG

DRAW_FILLING

DRAW_BARS

DRAW_CANDLES

DRAW_COLOR_LINE

DRAW_COLOR_SECTION

DRAW_COLOR_HISTOGRAM

DRAW_COLOR_HISTOGRAM2

DRAW_COLOR_ARROW

DRAW_COLOR_ZIGZAG

DRAW_COLOR_BARS

DRAW_COLOR_CANDLES

Zdarzeniowy model uruchamiania

OnInit

OnStart

OnDeinit

OnTick

OnCalculate

OnTimer

OnChartEvent

OnTester

OnInit

OnStart

OnDeinit

OnTick

OnCalculate

OnTimer

OnTrade

OnTradeTransaction

OnBookEvent

OnChartEvent

OnTester

OnTesterInit

OnTesterDeinit

OnTesterPass

Handel

OrderSend

OrderModify

OrderDelete

Postępowanie ustawia się przez poszczególny  zestaw parametrów dla każdej funkcji. Przeszkadza napisanie i  debugowanie programów.

OrderSend

Jednak funkcja dla wszystkich operacji.  Wymagane zachowanie ustawiane jest w strukturze MqlTradeRequest. Odpowiedź wraca do struktury MqlTradeResult. Prościej jest projektować zachowanie, sprawdzać rezultat i debugować program.

Wskaźnikowe bufory danych32512
Wskaźniki wbudowaneLiczba: 30

Liczba: 38

Wskaźniki tworzone są przy pomocy handles. Zmniejszona została liczba kopiowań i wymagania odnośnie pamięci.

Tryb handluHedgingowanie

Kompensowanie sald

Hedgingowanie

Giełdowy

Środki pracy z wykresem OpenCL i DirectXBrakJest
Generacja robotów handlowychBrakJest. Przy czym możecie zadawać indywidualne moduły sygnałów.

Zatem różnic jest niewiele, ale są. Po zaktualizowaniu 600 wersji MQL4 różni się ona od  MQL5 tylko w tej kwestii, gdzie różnią się same platformy. Na blogu LiteForex jest już artykuł poświęcony porównaniu 4 i 5 wersji MetaTrader, który bardzo polecam przeczytać, jeśli chceicie pogłębić wiedzę w tym temacie.

W jaki sposób napisać doradcę na MQL4 lub MQL5

Zanim zabierzecie się za pisanie eksperta, należy zrozumieć, że powinniście już mieć strategię handlową. Dopiero po tym można zabierać się wcielanie koncepcji w postaci formalnego algorytmu. Kod sam w sobie daje jedynie językowe narzędzia do zrealizowania pewnej idei.

Zatem pierwsze, co trzeba zrobić, to opracować strategię handlową. Kwestia jej opracowania znajduje się poza ramkami tego artykułu, dlatego weźmiemy coś prostszego dla przykładu. Przypuśćmy, że w okresach małej aktywności instrumentu w pozycji neutralnej możliwe jest otwarcie transakcji w przeciwnych stronach z niewielkimi poziomami limitów. Pozwoli to na wykorzystanie niewielkich ruchów rynku bocznego i pozyskiwać zysk z tych ruchów.

Napiszemy doradcę, który pozwoli zautomatyzować otwarcie rynkowe transakcji oraz kontrolę ich limitów i będziemy uruchamiać go na koncie handlowym w okresach flatu.

Na początku proces jest taki sam, niezależnie od wersji języka. W celu napisania programów MQL należy zainstalować terminal handlowy MetaTrader Client Terminal, częścią składową którego jest MetaEditor. Teraz możemy uruchomić MetaEditor bezpośrednio z katalogu roboczego terminala lub poprzez główne menu w terminalu handlowym: Tools i potem MetaQuotes Language Editor (F4). W oknie MetaEditor w głównym menu klikamy Plik → Nowy (File → New). To samo czyni klawisz „Stwórz” („New”) w menu graficznym.

Jak napisać robota handlowego na MQL4

W kreatorze tworzenia aplikacji wybieramy Doradca (szablon) (Expert Advisor (template)) i “Dalej” (“Next”).

LiteForex: Jak napisać robota handlowego na MQL4

Następnie wprowadzamy parametry, które udostępniają użytkownikowi interface, służący interakcji z naszym programem oraz potwierdzeniu poprzez kliknięcie ok. Tu dodamy:

  1. Instrument handlu,
  2. Wybór kierunku pierwszej transakcji, która otworzy robot. Na razie jest to całkowity typ, ale później naprawimy kod w ten sposób, aby można było wybrać tylko Buy lub Sell.

LiteForex: Jak napisać robota handlowego na MQL4

MetaEditor automatycznie włączy w kod programu obsługi zdarzenia OnTick. Pozostałe należy wybrać samodzielnie. Jak widzimy, jest dostępny dodatkowo OnTimer, który przywoływany jest za każdym razem z częstotliwością ustaloną dla interwały i OnChartEvent, które będzie uruchomione w odpowiedzi na działania użytkownika z wykresem. Widać tu, że dla MQL5 dostępnych jest więcej programów.

LiteForex: Jak napisać robota handlowego na MQL4

Przechodzimy dalej i wybieramy programy obsługi zdarzeń w trybie testowania W MQL5 znowu jest więcej wydarzeń  w trybie testowania, a zatem dostępne jest większa liczba programów dla nich.

LiteForex: Jak napisać robota handlowego na MQL4

W dwóch poprzednich krokach pozostawiłem pustymi wszystkie warianty. Cała logika zawarta jest u nas w funkcji OnTick. Przywoływana ona jest za każdym razem podczas pojawienia się nowego ticka symbolu.

Po kliknięciu w „Gotowe”, MetaEditor stworzy dla nas jeden plik dla przyszłego doradcy z przyznaną nazwą i parametrami. W kod zostaną również włączone wybrane programy obsługi zdarzeń. Nie będę szczegółowo zatrzymywać się na każdym z nich. Wszelka niezbędna informacja na ten temat znajduje się w informacji.

LiteForex: Jak napisać robota handlowego na MQL4

Kod ten już można skompilować i uruchomić w terminalu handlowym. Ale przy tym nic nie będzie się działo. Mamy zmienne input, ale nie ma jak z nich, na razie, skorzystać. Funkcja  OnInit zawsze informuje terminal o pomyślnej inicjacji, a OnTick i OnDeinit nie zawierają żadnych instrukcji.

Przystępujemy do pisania kodu.

Najpierw ogarnijmy. Usuwamy wszelkie spacje i zmniejszamy komentarze do jednej linijki. Następnie określamy enum TradeCmd (wiersze 11 – 14), aby wskazać kierunek pierwszej transakcji w naturalny sposób, a nie liczbą. Zmieniamy typ input zmiennej FirstTradeDirection z int na TradeCmd (20). I stworzymy statystyczną, globalną zmienną Direction z typem TradeCmd, aby wziąć pod uwagę kierunek poprzedniej transakcji i zmieniać go na przeciwną w stosunku do kolejnej.

W ekspercie na początku zapomniałem dodać zmienne dla zakresu transakcji, poziomów stoploss i takeprofit. Dodajemy je z kluczowym słowem input i grupujemy z pozostałymi zewnętrznymi ustawieniami.

LiteForex: Jak napisać robota handlowego na MQL4

Przechodzimy do funkcji OnTick. Analizujemy obecność otwartych transakcji, w tym celu przebieramy wszystkie otwarte transakcje przy pomocy prostego cyklu w zakresie [0, TotalTrades) . Sprawdzamy kolejno, czy symbol wybranej transakcji pokrywa się z tym, co wskazano w InputSymbol. Jak tylko znalazła się choć jedna taka transakcja, to nic nie trzeba robić. I wcześniej wychodzimy z funkcji OnTick przy pomocy return (wersy 29 – 35). czekamy do ostatniego uruchomienia.

LiteForex: Jak napisać robota handlowego na MQL4

W przeciwnym przypadku trzeba otworzyć transakcję. Zwrócimy się do dokumentacji MQL4, aby prawidłowo wykorzystać funkcję OrderSend, przy pomocy której będziemy wysyłać zamówienie na serwer handlowy. Ogłoszenie wygląda następująco:

LiteForex: Jak napisać robota handlowego na MQL4

Rozpatrzymy parametry wg:

  1. Symbol. My już go mamy, ale w żaden sposób nie sprawdzamy poprawności i powołujemy się jedynie na prawidłowe wprowadzenie od użytkownika.
  2. Kierunek transakcji. W tym celu wykorzystujemy globalną zmienną statystyczną Direction.
  3. Zakres. Użytkownik wskazuje go sam. I znowu, trzeba by sprawdzić wprowadzoną wartość na limity: minimum, maksimum i minimalny krok zmiany zakresu.
  4. Cena. Ask, jeśli kupujemy, Bid, jeżeli sprzedajemy.
  5. Splash. W naszym przypadku nie ma większego znaczenia. Ustawiamy na 2 pipsy.
  6. Stop Loss. Znowu, tu zależy to od kierunku transakcji. Powinien być mniejszy od ceny otwarcia, jeżeli kupujemy i większy od ceny otwarcia, jeśli sprzedajemy.
  7. Take Profit. Jak i w przypadku stop loss, zależy od kierunku transakcji.

Pozostałe 4 parametry z wartością domyślną nas, na razie, nie interesują. W rezultacie w celu otwarcia transakcji mamy : zakres InputVolume, kierunek transakcji Direction, symbol InputSymbol, splash ustawiamy na 1 punkt. A liczyć musimy w zależności od Direction: cenę otwarcia price, stop loss sl i take profit tp. Jeśli kupujemy, to cena ask, stop loss poniżej bieżącej ceny, take profit – powyżej, a inaczej jeżeli sprzedajemy, cena wówczas jest bid, stop loss powyżej bieżącej ceny, a take profit – poniżej. Potrzebujemy także 2 dodatkowych zmiennych. W celu dokonania konwersji poziomu limitów z punktów w nominalne wartości point to minimalna wartość, o którą może zmienić się notowanie wg symbolu. W celu znormalizowania wartości ze zmiennym punktem digit – liczba istotnych kategorii w części ułamkowej notowania.

„Przenosimy” to na MQL.

LiteForex: Jak napisać robota handlowego na MQL4

Przechodzimy bezpośrednio do otwarcia transakcji. Zerujemy zmienną systemową _LastError przy pomocy wbudowanej funkcji ResetLastError. Wysyłamy zlecenie przy pomocy OrderSend, a rezultat zapisujemy w zmiennej result. Istnieją dwa warianty rozwoju wydarzeń:

  1. Transakcja pomyślnie się otworzyła, jeśli result zawiera wartość powyżej zera – ticker transakcji. A to oznacza, że musimy zmienić wartość Direction, aby następnym razem otworzyć transakcję w przeciwna stronę.
  2. Jeśli result zawiera ujemną wartość, to transakcja nie została otwarta. Trzeba sprawdzić ostatni błąd przy pomocy GetLastError, przeanalizować go i podjąć jakieś kroki: powtórzyć próbę, przeczekać, wyprowadzić informacje o debugowaniu w log i t. p. W celu uproszczenia ja wyprowadziłem wartość ostatniego błędu w log.

Przyglądamy się.

LiteForex: Jak napisać robota handlowego na MQL4

I tak, napisaliśmy dosłownie kilkadziesiąt wierszy kodu i robot handlowy jest gotó. Przyznam, że on, póki co, jest mało funkcjonalny, ale może służyć za znakomity przykład tego, że napisanie kodu nie wymaga ogromnej wiedzy i wysiłku.

Przytoczę pełny listing, może okaże się pomocny.

LiteForex: Jak napisać robota handlowego na MQL4

Kompilujemy kod i uruchamiamy doradcę w terminalu handlowym.

W jaki sposób napisać doradcę na MQL5

MQL5 ma, w stosunku do MQL4, bezsprzeczną przewagę. Możecie stworzyć robota dla piątej wersji kilkoma kliknięciami, nie pisząc faktycznie ani jednej linijki kodu.

Na MetaEditor klikamy w „Stwórz” (“New”). I w ekspercie tworzenia aplikacji wybieramy „Doradca (wygenerować)” (“Expert Advisor (generate)”).

LiteForex: W jaki sposób napisać doradcę na MQL5

Nazwiemy naszego eksperta MQL5_Generated_Robot. Opcjonalnie wskażemy autora i jego stronę www czy profil. Dodajemy, jeśli to konieczne, parametry doradcy: symbol i interwał czasowy dla handlu. Podwójnym kliknięciem aktywujemy parametr, kliknięcie na nazwę czy na wartość zmiennej pozwala zmienić zaproponowane ustawienia. Symbol można ustawić jaki się chce. I interwał ustawiłem M15, aby zwiększyć prawdopodobieństwo pojawienia się sygnałów handlowych.

LiteForex: W jaki sposób napisać doradcę na MQL5

Idziemy dalej. I teraz musimy wybrać sygnał oraz ustawienia dla niego. Tu można improwizować i spróbować różnych kombinacji z sygnałów, zaproponowanych przez autorów. Te sygnały będą generować dla eksperta zdarzenia na zawieranie transakcji.

LiteForex: W jaki sposób napisać doradcę na MQL5

Możecie dodawać sygnały użytkownika do tej sekcji, w tym z monitoringu na mql5.com. Domyślnie razem z platformą proponowane są następujące warianty:

LiteForex: W jaki sposób napisać doradcę na MQL5

Wybrałem „Handel na przecięciu dwóch średnich” i ustawiłem okresy równe 21 i 55. Zbyt krótkich okresów nie ma co wybierać, jeśli trzeba zmniejszyć liczbę fałszywych działań. Symbol pozostawiamy bieżący, będziemy handlować na przykład EURJPY i otrzymywać sygnały od średnich kroczących stosowanych do cenowych danych tego właśnie EURJPY. Wybierajcie tu inny symbol, jeśli Wasza strategia opiera się na instrumencie w zależności od zachowania jakiegoś innego. Interwał również pozostawię M15.

LiteForex: W jaki sposób napisać doradcę na MQL5

Potwierdzamy. Widzimy, że dodany został sygnał wg bieżącego symbolu i interwału, który i będzie generować zdarzenia dla eksperta.

LiteForex: W jaki sposób napisać doradcę na MQL5

Przechodzimy dalej do ustawienia trybu Trailing Stop dla naszych transakcji. Tu wybrałem ustaloną wielkość limitów. 150 punktów stop loss i 200 take profit.

LiteForex: W jaki sposób napisać doradcę na MQL5

Następnie proponuje się nam wybrać jeden z pięciu trybów zarządzania kapitałem rachunku handlowego. Dostępny jest handel:

  • przy pomocy ustalonego zakresu;
  • przy pomocy ustalonej wartości depozytu;
  • przy pomocy ustalonego ryzyka;
  • przy pomocy minimalnego możliwego zakresu;
  • przy pomocy zoptymalizowanego zakresu pozycji.

LiteForex: W jaki sposób napisać doradcę na MQL5

Zatrzymałem się na ustalonym ryzyku 1% od środków na rachunku.

LiteForex: W jaki sposób napisać doradcę na MQL5

Klikamy „Gotowe” (“Done”)... Profit! Stworzyliśmy eksperta, nie pisząc ani jednej linijki kodu.

Rozpatrzymy szczegółowo i przeprowadzimy niewielką analizę kodów źródłowych.

LiteForex: W jaki sposób napisać doradcę na MQL5

Czapka i atrybuty – jak zwykle. Następnie ma miejsce włączenie modułów biblioteki. Expert to nasz robot. MACross – generator sygnałów przecięcia Moving Average, TrailingFixedPips – moduł risk management. I dalej idą ustawienia – zmienne input, określające interface dla współdziałania z aplikacją. Wygląda znajomo? Tak. To i ustawialiśmy w ekspercie generacji eksperta. W przyszłości wartości domyślne mogą zostać zmienione tu.

Następnie zadeklarowana automatyczna globalna zmienna typu Cexpert, która zsotała zainicjowana przez wartość default. Dla obiektu oznacza to, że został wywołany konstruktor domyślny. W ciele OnInit ma miejsce inicjalizacja doradcy, stworzenie sygnałów i filtró oraz ich inicjalizacja przez zadane w ustawieniach wartości. Poniżej przytaczam kod, z którego usunąłem wszystkie kontrole rezultatów inicjalizacji sukcesu i deskryptorów na trafność, aby wizualnie zmniejszyć zakres kodu.

LiteForex: W jaki sposób napisać doradcę na MQL5

Poniżej znajdują się funkcje OnDeinit, OnTick, OnTimer, OnTrade. W każdej z nich po prostu wywołuje się odpowiednia metoda klasy CExpert.

LiteForex: W jaki sposób napisać doradcę na MQL5

Jeśli uważnie się przyjrzycie, w nawigatorze z lewej strony w Folderze Include -> Experts widać dostępne w generatorze sygnały i moduły. Zatem możecie dodawać jakieś specjalne rozwiązania do generatora. I tworzyć, w zależności od potrzeb, przy pomocy kliku kliknięć.

Spróbujmy skompilować kod. 0 błędów, 0 ostrzeżeń – to sukces. I uruchamiamy w trybie testowania strategii Ctrl + F5 czyli lewym klawiszem myszki w graficznym menu na górze.

LiteForex: W jaki sposób napisać doradcę na MQL5

Zarządzanie ma miejsce na MetaTrader Client Terminal w ustawieniach testera strategii. Następnie wybieramy plik, który będziemy testować. Ustawiamy pozostałe parametry: symbol, interwał, głębokość historii, bilans i dźwignię rachunku handlowego oraz inne. Ustawień jest wiele i każdego z nich są opisy w pliku informacji. W celu uruchomienia informacji najedźcie na tester i kliknijcie F1 w celu uzyskania szczegółowej informacji o ustawieniach i trybach testowania.

LiteForex: W jaki sposób napisać doradcę na MQL5

W celu uruchomienia klikamy „Start” w prawym dolnym rogu testera i, jeśli testowanie odbywa się bez optymalizacji, możecie wybrać tryb wizualizacji Waszej strategii.

Autorzy grzecznościowo udostępnili opis dla każdego wbudowanego modułu i sygnału. https://www.mql5.com/en/docs/standardlibrary/expertclasses. Przyjrzyjcie się dokumentacji, aby dowiedzieć się więcej.

Wady oraz zalety języków MQL4 i MQL5

Główną wadą jest samo przeznaczenie tych języków. MetaQuotes Querying Language to język do opisu aplikacji tylko dla MetaTrader. Kompilacja i debugowanie kodu na MQL możliwe jest tylko w środowisku MetaEditor. Uruchomić działanie programu może tylko MetaTrader Client Terminal. Brak jest ręcznego zarządzania pamięcią. Wciąż wybieracie, gdzie stworzyć zmienną, na stosie czy w obszarze dynamicznym, ale w każdym z tych przypadków nie macie dostępu do jego wirtualnego adresu.

Zalet jest dużo więcej. Niski próg wchodzenia, szczególnie jeśli już jest doświadczenie w opracowaniach w językach ze statystyczną typizacją. Wysoka wydajność na poziomie C i C++. Wsparcie o charakterze obiektywnym i określonym programowania: hermetyzacja i rozszerzalność, dziedziczenie, polimorfizm i wirtualne metody klas. Możliwe jest stworzenie szablonów klas i funkcji, tzn. Parametryczna polimorficzność. Wszystko to pozwala na wielokrotne korzystanie z kodu. Bezpłatna infrastruktura to terminal handlowy, środowisko opracowania, tester strategii, załączone biblioteki.

Konwertacja kodu MQL4 w MQL5

Rozpatrzymy przekształcenie, uaktualnienie programu jednej wersji w drugą na przykładzie robota, który wcześniej już był przytaczany w tym artykule w rozdziale o możliwościach języka [1] . tworzymy pusty ekspert na MetaEditor 5 i kopiujemy wyjściowy kod doradcy MQL4_Example_EA. Skompilować ten kod bez zmian nie uda się. Podczas próby otrzymujemy wiele błędów.

Zaczynamy po kolei. Na początku praktycznie nic się nie zmienia, oprócz kilku niuansów:

  1. Usuwamy #property strict z dyrektyw preprocesora, bo ma to sens przy kompilacji kodu MQL4.
  2. Przenosimy stworzenie statystycznej zmiennej Direction powyżej funkcji inicjalizacji eksperta, aby inicjować ją w OnInit w szczególny sposób, w zależnosci od posiadanych pozycji. Pozwoli to w przyszłości zmieniać ustawienia doradcy w środku procesu handlowego.

Zauważcie, że wybór transakcji wg jakiegoś symbolu na MQL5 jest prostsze przy pomocy wbudowanej funkcji PositionSelect, nie uciekając się do przebierania wszystkich otwartych transakcji.

LiteForex: Konwertacja kodu MQL4 w MQL5

Funckję OnTick przytaczam w pełni. Wykorzystujemy PositionSelect w celu sprawdzenia obecności otwartej pozycji wg symbolu. Jeśli takiej nie ma, to wchodzimy do środka ciała if i szykujemy się do wysłania zlecenia na otwarcie transakcji. MQL5 w ciekawy sposób przedstawia nam strukturę MqlTradeRequest dla stworzenia zlecenia w przeciwną stronę parametrów na MQL4. Nie będę teraz rozpatrywać każdego jej pola oddzielnie. Zauważę jedynie, że tak samo, jak na MQL4 mamy 4 z 7 niezbędnych parametrów: symbol transakcji, zakres, kierunek i odchylenie od zamawianej ceny. Pozostałe trzy: cenę otwarcia, stop loss i take profit obliczamy  w zależności od kierunku transakcji. Uzupełniamy strukturę po kolei. Widzimy również, że teraz nie potrzebna jest normalizacja liczb w punktem zmiennym, dlatego nie jest konieczna zmienna digit.

Wysłanie zlecenia w ostatniej wersji języka wygląda bardziej lakonicznie. Cała informacja o efekcie spełnienia funkcji OrderSend teraz wraca do MqlTradeResult.

LiteForex: Konwertacja kodu MQL4 w MQL5

Ja otrzymałem następujący kod po debugowaniu i serii testów. Wielkość programu nie zmieniła się, choć dokonaliśmy zmian w logice, potrzeba było dodatkowych działań na etapie inicjalizacji do OnInit.

LiteForex: Konwertacja kodu MQL4 w MQL5

Reasumując. Upgrade aplikacji z MQL4 do MQL5 jest prosty. Przy obecności podstawowej wiedzy o MQL nie sprawi trudności.

Specjalnie dla Was dobrałem szereg powszechnych pytać o MQL i postaram się, krótko, ale i dociekliwie na nie odpowiedzieć .


FAQ na temat MQL4 i MQL5

MetaQuotes Language to wielopoziomowy język programowania w celu pisania aplikacji dla platformy handlowej MetaTrader ze statystycznie słabą typizacją z syntaktyką, bardzo podobną do składni poprzednika, C++. On również realizuje multi paradygmatyczną koncepcję. Podczas pisania kodu możecie wykorzystać podejście obiektywnie zorientowane czy funkcjonalne, proceduralne czy zmieszane. W ramach OOP wspierana jest hermetyzacja, dziedziczenie, polimorfizm. Dostępne są szablony funkcji i klas. Niestety, ale możliwe jest wykorzystanie metaprogramowanie z obliczeniami na etapie kompilacji.

W celu napisania programu na MQL trzeba zainstalować terminal handlowy MetaTrader Client Terminal, w pakiecie dostawy którego wchodzi MetaEditor, środowisko dla opracowania aplikacji MQL. Uruchamiamy go przy pomocy głównego menu Tools -> MetaQuotes Language Editor (F4). Jesteśmy gotowi, aby napisać swój pierwszy program na MQL.

Plik w formacie mq4 jest prostym plikiem tekstowym. Takie rozszerzenie pozwala systemowi operacyjnemu na automatyczne zestawienie samego pliku ze środowiskiem opracowania MetaEditor. Plik w formacie ex4 jest plikiem wykonywalnym, którego nie można przeczytać jako tekstowy i zawiera sam w sobie dane w postaci binarnej, podwójny kod.

W procesie kompilacji kod programu mq4 przekształca się w wykonywalny kod ex4. Takie przekształcenie po prostu jest powszechne przy tworzeniu programów. To jest właśnie to, czym zajmuje się kompilator.

Odwrotny proces to dekompilacja kodu wykonywalnego ex4 w tekstowy mq4 i jest rzadki, często nie ma podstaw. Projekty z otwartym wyjściowym kodem na ogół dają kody źródłowe każdemu, kto się zgadza z zasadami ich rozpowszechniania, przekształcania i wykorzystywania. Pozostałe projekty chronią wszystkie swoje opracowania prawem autorskim. Nie ma standardowych środków dla wykonania dekompilacji.

A jeśli trzeba przekształcić kod wykonywalny ex4 w kod programu? Oto kilka wariantów odpowiedzi na to pytanie od najprostszego:

  1. Skontaktować się z autorem programu i wyjaśnić warunki otrzymania kodu.
  2. Znaleźć programistę, który będzie mógł zrealizować logikę założonego w Waszym programie ex4 i dogadać się z nim.
  3. Przestudiować MQL i samodzielnie napisać program odpowiadający ex4. To niełatwa droga, ale może zwiększyć Wasze możliwości jak żadna inna.
  4. Przeprowadzić dekompilację samodzielnie lub z czyjąś pomocą. Pamiętajcie o odpowiedzialności, przewidzianej prawem o prawach autorskich.

Pliki z rozszerzeniem mq4 (mq5) są prostymi plikami tekstowymi, które zawierają kod MQL w postaci tekstowej. Najprostsze, co można zrobić w danej sytuacji, jeśli nie chcecie dzielić się własnym kodem wyjściowym, to nie rozpowszechniać plików w tym formacie.

Jest prosty sposób ochrony kodu, mianowicie rozpowszechnianie go w formacie ex4 (ex5). Pliki w takim formacie generowane są przez MetaEditor’ом podczas kompilacji kodu mq4 (mq5). Instrukcje w tekście zgodnie z zasadami języka przeistoczą się w podwójny kod wykonywalny, który realizuje terminal, kiedy dodajecie doradcę, skrypt czy wskaźnik na wykres.

Dokonać deasembler kodu wykonywalnego w wyjściowy nie jest proste, co sprzyja zabezpieczeniu Waszego wyjściowego kodu. W każdym razie podczas dekompilacji do wyjściowego kodu zostaną utracone znaczące nazwy zmiennych Waszego kodu i będzie znacznie trudniej zrozumieć logikę programu.

MetaQuotes Language to język programowania OOP o wysokim poziomie ze słabą typizacją statystyczną, następca C++. MQL5 jest logicznym rozwinięciem języka MQL4, który ujrzał światło dzienne razem z platformą MetaTrader 5. Ptem okazał on znaczny wpływ na rozwój MQL4 i sprzyjał jego aktualizacji.

W MQL5 stworzono środek do generowania ekspertów, co pozwala na całkowita rezygnację z pisania kodu ręcznie. Przy pomocy kilku kliknięć otrzymujecie robota handlowego wraz z kodem wyjściowym. Ustawienie go na handel odbywa się przy pomocy sygnałów. Kontrola stanu rachunku handlowego odbywa się na podstawie ryzyka I zarządzania kapitałem, zestawionych z terminalem handlowym.

Pobranie wskaźnika nie różni się od ściągania każdego innego pliku na Wasz komputer. Należy to robić właśnie na komputerze, bo wykorzystać MQL można tylko razem z wersją komputerową MetaTrader Client Terminal. (Plik -> otwórz katalog danych) (File -> Open Data Folder). Następnie wchodzimy w katalog MQL/indicators i kopiujemy tu ściągnięty wskaźnik. Ponownie uruchamiamy terminal i widzimy, że wskaźnik teraz jest dostępny w Nawigatorze. Pozostało przeciągnąć go na wykres i ustawić parametry wyjściowe.

Faktycznie wszystkie programy MQL4 czy MQL5 tworzone są przy pomocy piątej wersji MetaQuotes Language Editor. Między starszą a młodszą wersją języka jest odwrotna korelacja. Ograniczeniem w danym przypadku jest tylko sam MetaQuotes Server. Części funkcji i struktur brakuje w czwartej wersji serwera. Są też różnice i w wewnętrznej budowie wskaźników. W czwartej wersji można wykorzystać najwyżej osiem byforów wskaźnikowych. Na MetaTrader 5 liczba buforów została zwiększona do 21.

Wbudowana funkcja iCustom pozwala na wykorzystanie sygnałów od wskaźników w celu realizacji logiki handlowej wewnątrz doradcy. Jeśli macie własny wskaźnik i chcecie generować sygnały handlowe w doradcy w celu realizacji operacji handlowych, musicie wykorzystać iCustom. Zaglądamy do dokumentacji i widzimy takie określenie dla MQL4:

I następujące dla MQL5:

W istocie funkcja jest taka sama, mimo iż jej sygnatura różni się w obu wersjach, rozpatrzymy szczegółowo każdy z parametrów:

  1. Wiersz string symbol — symbol, wg którego odbędzie się obliczenie.
  2. Interwał. Na MQL4 to całkowity typ int, na MQL5 — także całkowity, ale enum, który zawiera w sobie wyliczenia interwałów.
  3. Liniowy parametr name. Do niego należy przekazać drogę do wskaźnika, jeśli, np. Znajduje się on w innym katalogu i nazwa wskaźnika wraz z rozszerzeniem, dla którego chcemy dokonać obliczeń. Następnie przekazywane są wymagane parametry dla wskaźnika, który chcemy wykorzystać.
  4. Potem ma miejsce seria parametrów dla wskaźnika, który zostanie uruchomiony przez funkcję iCustom. Ich liczba zależy od tego, ile argumentów potrzeba do otrzymania wymaganej wartości waszego wskaźnika. Logiczne, że funckja przyjmuje zmienną liczbę parametrów. Np. dla Alligator (wchodzi w pakiet instalacyjny MetaTrader Client Terminal):

    Dla Ichimoku będzie to jakiś inny komplet zmiennych:

  5. I na MQL4 czwartej wersji są jeszcze dwa parametry. Pierwszy to całkowity mode, który oznacza linie wskaźnika i wykorzystywany jest przez wykonywalną średnią dla indeksacji intraday buforów danych.
  6. Kolejny całkowity shift oznacza przeniesienie wskaźnika do przodu lub w tył na skali czasowej.

MQL jest następca języka C++, w którym została napisany serwer handlowy MetaTrader i wszystkie aplikacje do niego, w tym Client Terminal oraz Language Editor. Niestety, ale jeśli porównać MQL z poprzednikiem, widać, że język rozwija się z opóźnieniem. Obecnie możliwości MQL odpowiada możliwościom C++ standardu z 2003 r. Ale podkreslić należy, że MQL to dość poważny język i w obecnej wersji może pokryć 99% bieżących potrzeb programistów oraz autorów.

Kod programów w języku 4 i 5 wersji różni się na pierwszy rzut okaz nieznacznie, ale różnice jednak są. W 5 wersji wszystkie określenia makro z 4 zostały zamienione na wyliczenia.

Rozszerzony został i urozmaicony model uruchamiania aplikacji użytkownika. Szczególnie pojawiły się programy obsługi zdarzeń: OnTrade, OnTradeTransaction, OnTesterInit, OnTesterDeinit, OnTesterPass. Poprawiono nieprawidłowe zachowanie OnTick i OnTimer w trybie testera strategii. Funkcja OnTimer teraz może być uruchamiana z częściową dyskretyzacją interwału 1000 razy większej, niż na MQL4: raz na mikrosekundę w porównaniu z milisekundami.

MQL5 zmienił logikę wysyłania zleceń handlowych i mechanizm odpowiedzi na nie. Kilka funkcji handlowych na MQL4 zostało połączonych w jedną, OrderSend z różnymi trybami pracy. Sam proces handlowy na MetaTrader 5 różni się od handlu na 4 platformie. Pojawił się tryb nettingu pozycji jako dodatek do hedgingowania transakcji. Dodatkowo do zleceń MT4 pojawiły się pozycje i transakcje. W arsenale języka pojawiła się funkcja OrderSendAsync do wysyłania zleceń na serwer handlowy a synchronicznym trybie.

Wszystkie określenia makro MQL4 w MQL5 został zamienione na obliczenia, zatem kompilator obecnie wskazuje programiście na niejawne rzutowanie typów.

MetaTrader 5 pozwala na pracę z 21 standardowymi interwałami w porównaniu z 9 na MetaTrader 4. Wskaźniki na MQL5 otrzymały więcej buforów na wykresie.

Przekształcenie kodu MQL4 w kod MQL5 jest trywialnym zadaniem początkującego programisty, ale wymaga od Was uwagi i cierpliwości. Kompilator sam pokaże Wam większość niezgodności z MQL5.

Należy zwrócić uwagę na opracowanie zleceń handlowych i ich wysyłanie na serwer.

  • Na MQL4 zlecenie handlowe realizowane jest przy pomocy jednej funkcji OrderSend oraz skompletowania parametrów do niej, a modyfikacja zlecenia i usunięcie zlecenia oczekującego przez poszczególne funkcje. Rezultat zlecenia określany jest przez wartość boolowską, które wracają po zakończeniu funkcji. Analiza efektu sprowadza się do określenia kodu powrotu serwera przy pomocy funkcji GetLastError.
  • Na MQL5 istnieje specjalna struktura MqlTradeRequest, służąca wysyłaniu zleceń handlowych na serwer. Należy ją uzupełnić zgodnie z odpowiednim typem operacji i rodzajem zlecenia. W celu uzyskania efektu należy poinformować i przekazać egzemplarz struktury MqlTradeResult z linku podczas wywoływania OrderSend w celu otrzymania odpowiedzi z serwera, następnie połączyć rozsiane parametry, wcześniej przekazane podczas wywoływania OrderSend, w jedną strukturę MqlTradeRequest i wysłać na serwer. Otrzymaną w odpowiedzi strukturę MqlTradeResult analizujemy. Wszelka niezbędna informacja będzie dostępna w postaci odpowiedzi serwera.

Szczególną uwagę należy zwrócić na programy obsługi zdarzeń w kodzie swoich programów. Na MQL5 istnieją dodatkowo OnTesterTick, OnTesterTimer, OnBookEvent. Uruchomienie różnych aplikacji odbywa się w odpowiedzi na zdarzenia terminala handlowego.



Dla ekspertów:
  • OnInit, OnDeinit, OnTimer, OnTick, OnChartEvent, OnTester

Dla skryptów:

  • OnStart (we wskaźnikach i skryptach nie wolno korzystać z tego programu).
  • Dla zestawionych bibliotek nie ma środków do uruchomienia, gdyż wykorzystywane są one wyjątkowo wewnątrz innych, większych, projektów.
  • Jeszcze jedna różnica polega na tym, że przedefiniowanych zmiennych Ask, Bid, jak również masywów Open[], High[], Low[], Close[], Volume[], Time[] brakuje na MQL5. Dlatego kod programu powinien być poprawiony w celu samodzielnego otrzymania tych danych przy pomocy wbudowanych funkcji dostępu do serii time CopyRates, CopyOpen, CopyHigh i t. d. Ogłaszamy dynamiczny masyw i uzyskujemy do niego dane. Funkcja, prezentująca rezultat, pozbawiona jest zmian wielkości masywu samodzielnie.


P.S. Podobał się mój artykuł? Udostępnij go w sieciach społecznościowych, najlepszy sposób na podziękowanie:)

Wykres cen EURJPY w czasie rzeczywistym

Języki MQL4 i MQL5: różnice oraz właściwości

Treść tego artykułu stanowi wyłącznie prywatną opinię autora i może nie pokrywać się z oficjalnym stanowiskiem LiteForex. Materiały publikowane na tej stronie mają wyłącznie charakter informacyjny i nie mogą być traktowane jako porada inwestycyjna ani konsultacja w rozumieniu dyrektywy 2014/65/UE.
Zgodnie z przepisami prawa autorskiego artykuł ten jest chronionym obiektem własności intelektualnej, co obejmuje zakaz kopiowania i rozpowszechniania bez zgody.

Oceń ten artykuł:
{{value}} ( {{count}} {{title}} )
Zacznij handlować
Śledź nas w sieciach społecznościowych!
Live Chat