Kurs MetaQuotes Language 4.doc

(1692 KB) Pobierz
Kurs MetaQuotes Language 4

Kurs MetaQuotes Language 4

1.          
Wstęp

Þ    Wstęp

Þ    MQL 4

Þ    Kompilator

Þ    IDE

1.                 Wstęp

Jeśli w 2005 roku powiedziano by mi, że napiszę kurs MQL, spytałbym o to, co to jest MQL. Jestem pełen optymizmu pisząc ten kurs, optymizm ten jest tym większy, że to jest pierwszy pełny i całkowicie po polsku kurs MQL 4. Kiedy skończyłem pracę nad próbną wersją tego kursu, nie wiedziałem jak on zostanie przyjęty. Już pod koniec roku 2006 wziąłem się za pisanie tego kursu, od tego czasu wprowadziłem do niego wiele poprawek i nadal go rozwijam, głównie, dlatego, że firma MetaQuotes nie udostępniła sformalizowanej definicji języka, dokumentacja zawiera błędy tak samo jak kompilator, ale bez formalnej definicji języka nie można stwierdzić czy błędy można zrzucić bezpośrednio na barki implementacji kompilatora czy może błąd tkwi w samej definicji języka, sprawę komplikują ciągłe zmiany identyfikatorów, argumentów formalnych oraz listy funkcji. Pisząc ten kurs jednocześnie się uczyłem. Starałem się uczynić ten kurs jak najbardziej użytecznym i zrozumiałym, dlatego ma strukturę podobną, do helpa MetaEditor`a, co ułatwi w przyszłości śledzenie zmian w funkcjach, ich nazwach i liście parametrów formalnych. Kurs zdobywa coraz większą popularność. W Internecie słychać głosy, że ten kurs jest „super” jak i takie, że tego nie da się nazwać kursem, w tym pierwszym przypadku dziękuje za uznanie, a stwierdzenie, że to nie jest kurs traktuje na równi ze stwierdzeniem ludzi, którzy narzekają na efektywność MQLa twierdząc, że MQL nie jest językiem programowania tylko jakimś tam „skrypterem”. Wskaźniki pisane w MQL są wolne, ale mogą być pisane w C i importowane przez MQL. Tłumaczę sobie to nie dedukowaniem ludzi, którzy piszą takie rzeczy. Pisząc ten kurs napisałem kilkadziesiąt wskaźników i doszedłem do wniosku, że zaimplementowanie nawet istniejącego wskaźnika mając na uwadze własne preferencje i odporność psychiczną daje lepsze rezultaty niż wypróbowywanie całej armii gotowych wskaźników. Mam nadzieje, że ten kurs pomoże Wam w realizacji marzeń, bo nie ma, co ukrywać, ale nawet, jeżeli pieniądze nie dają szczęścia to na przekór temu twierdzeniu wysuwam tezę, że nie wielu jest ludzi, którzy swoje szczęście upatrują w nie ustawicznym ich braku.

We wstępie chcę poczynić uwagę, że zebrane w tym, kursie informację oparłem na swoim osobistym doświadczeniu programistycznym i nie wszyscy muszą bezkrytycznie podzielać moje poglądy. Wręcz mam nadzieję, że znajdą się ludzie którzy podejmą polemikę z tym co zaprezentowałem w tym kursie.

Język polski jak inne języki etniczne różni się od języków formalnych przede wszystkim tym, że język polski jest kontekstowy i wyrażenia w nim zawarte często są nie jednoznaczne, więc żeby uniknąć dużej część nie jednoznaczności poczynię zastrzeżenie, że jeżeli z treści danego fragmentu nie wynika inaczej to dany fragment dotyczy semantyki i/lub syntaktyki MQL 4. Dodatkowo poczynię zastrzeżenie, że kompilator działa w sposób sekwencyjny i bez kontekstowy, więc jak mu damy do skompilowania tekst fraszki „Na zdrowie” autorstwa Jana Kochanowskiego to też będzie próbował ją skompilować z skutkiem do przewidzenia nawet przez ucznia szkoły podstawowej. Dla tego jak piszę, że jakiś warunek musi być spełniony to nie dlatego, że permanentnie w sposób aksjomatyczny innego wyjścia nie ma, tylko dla tego, że inaczej program się nie skompiluję albo w przypadku funkcji importowanych istnieje możliwość błędnego działania i jakby tego nie rozpatrywać to efekt końcowy i tak nie wiele się będzie różnił od próby kompilacji tekstu fraszki.

2.                 MQL 4

MetaQuotes jest firmą, która stworzyła platformę transakcyjną MetaTrader. To, co najbardziej wyróżnia tą platformę z pośród innych platform tego typu to, to, że jako jedna z niewielu implementuje wbudowany język programowania, który umożliwia napisanie nawet bardzo skomplikowanych programów pozwalających na łatwiejsze zarządzanie procesami handlowymi lub nawet na ich całkowitą automatyzację przez implementację własnej strategii handlowej. Oprócz tego MQL 4 można użyć do tworzenia skryptów i bibliotek. Programy mogą być w łatwy sposób dołączane do jednego z otwartych wykresów przez przeciągnięcie urządzeniem wskazującym z okna nawigatora terminala klienckiego na odpowiedni wykres techniką przeciągnij i upuść. Programy działają przynajmniej jak na razie tylko pod kontrolą aktywnego terminala klienckiego. Niestety w przeciwieństwie do zasady twórców języka, który był pierwowzorem dla tego języka, według, której nowa wersja powinna być całkowicie kompatybilna z wcześniejszymi wersjami, firma MetaQuotes nie specjalnie dba o kompatybilność wsteczną języka zmieniając i usuwając niektóre standardowe definicje funkcji, co uniemożliwia w ekstremalnych przypadkach kompilacje starszych programów bez modyfikacji kodów źródłowych lub ściągnięcia odpowiednich plików. Dodatkowy problem w opanowaniu tego języka mogą stanowić błędy merytoryczne w dokumentacji powielane a najczęściej wręcz mnożone przez autorów innych kursów tego języka.

MetaQuotes Language 4 (MQL 4) jest względnie młodym językiem i jednym z niewielu języków, który powstał z myślą o programowaniu strategii handlowych. Silna kontrola typów i brak wskaźników powoduje to, że nawet źle napisany program nie zdestabilizuje pracy systemu przy założeniu, że całość kodu wykonawczego napisana jest w MQL 4, to oznacza, iż dopóki program nie wykorzystuje funkcji bibliotecznych z bibliotek DLL to najgorsze co może się stać to zawieszenie pracy terminala klienckiego na przykład przez wejście w nieskończoną pętlę. MQL 4 pozwala tworzyć wskaźniki, strategie i skrypty, co pozwala na automatyzację procesów handlowych i wypróbowywanie własnych pomysłów. Dodatkowo często używane funkcje można dla wygody zebrać w bibliotekach. Język ten zawiera dużo funkcji niezbędnych dla analizy trendu opartych na historycznych i aktualnie napływających notowaniach, podstawowe działania arytmetyczne i logiczne też są włączone do struktury tego języka. Ponadto są również wbudowane podstawowe wskaźniki analizy technicznej oraz funkcje kontroli zleceń transakcji. MQL 4 dużo czerpie z języka ANSI C znanym również jako C99, norma ISO/IEC 9899:1999, więc programiści programujący w języku C i C++ odnajdą się bardzo szybko w tym języku. W tym kursie na prostych przykładach pokazana jest semantyka i syntaktyka tego języka oraz funkcje wbudowane.

Na jednym wykresie może pracować tylko jeden skrypt, jedna strategia i wiele wskaźników. Liczba wskaźników jest ograniczona przez zasoby systemowe i zdrowy rozsądek użytkownika. Skrypty i strategie pracują w swoich własnych wątkach. Wskaźniki pracują przeważnie w wątku interfejsu. Jeśli wskaźnik został wywołany przez funkcję iCustom, pracuje w wątku programu, który go wywołał. Wywołane importowane funkcje biblioteczne, także pracują w wątku programu. Dla zatrzymania programu, należy go usunąć z wykresu. Wskaźniki i strategie działają dopóki nie zostaną usunięte z wykresu jednak istnieje możliwość nakazania strategii by nie podejmowała żadnych działań przez wprowadzenie jej w stan nieaktywny, wtedy zamiast emotikona w prawym górnym rogu głównego okna wykresu, po nazwie strategii, pojawi się symbol û. Wskaźniki i strategie są uruchamiane podczas ponownego uruchomienia terminala klienckiego dzięki zapisywaniu informacji o uruchomionych wskaźnikach i strategiach  podczas zamykania terminala klienckiego jednak skrypty nie są uruchamiane podczas ponownego uruchomienia terminala klienckiego z powodu nie zapisywania informacji o uruchomionych skryptach podczas zamykania terminala klienckiego.

Strategie są programami, które umożliwiają automatyzacje procesów handlowych przez tak zwany mechanical trade system (MTS). Jeden wykres może być obsługiwany co najwyżej przez jeden program tego typu. Uruchomione programy strategii są wywoływane za każdym razem gdy terminal otrzyma bieżące dane chyba, że poprzedni cykl operacji jeszcze się nie skończył. Strategie mogą informować o możliwości transakcji jak i automatycznie wysyłać zlecenie transakcji kupna i/lub sprzedaży krótkiej a następnie mogą automatycznie wysyłać zlecenie zamknięcia pozycji. MetaTrader jak większość systemów tego typu, wspiera test strategii na danych historycznych z pokazywaniem miejsc otwarcia i zamknięcia transakcji, niestety brak bazy tickowej może spowodować dość duże rozbieżności pomiędzy testami a rzeczywistym działaniem strategii, szczególnie na mało płynnych rynkach albo nawet na płynnych rynkach, w okresach w których ceny instrumentów zmieniają się bardzo gwałtownie. Na szczęście platforma MetaTrader jakoś sobie radzi z emulacją ruchów tickowych i przy testach obejmujących znaczny okres czasu i sytuacji rynkowych takich jak bessa czy hossa wyniki testów w mniejszym lub większym stopniu odpowiadają rzeczywistości. Strategie są zgromadzone w katalogu .\experts.

Wskaźniki są wskaźnikami technicznymi pisanymi często niezależnie od dodatkowych wskaźników już zintegrowanych z terminalem klienckim, chociaż mogą być pisane w oparciu o wskaźniki dołączone do terminala klienckiego. Wskaźniki te są programami, które umożliwiają analizę techniczną, ale tak jak wbudowane wskaźniki techniczne nie mogą automatyzować procesów handlowych lecz mogą być i w zdecydowanej większości przypadków są wykorzystywane do budowy strategii. Wskaźniki są zgromadzone w katalogu .\experts\indicators.

Skrypty są programami, które umożliwiają jednorazowo wykonanie jakiejś czynności. Wykonywanie skryptów nie zależy od napływających notowań. W przeciwieństwie do strategii czy wskaźników są wykonywane tylko raz od razu na każdorazowe żądanie użytkownika i są automatycznie zamykane po wykonaniu operacji przy czym przy zmianie okresu czasu wykresu, przy zamknięciu wykresu na rzecz, którego został uruchomiony lub przy zamknięciu terminala klienckiego praca skryptu jest przerywana poczym skrypt jest usuwany z pamięci terminala klienckiego.  Skrypt nie jest uruchamiany podczas ponownego uruchomienia terminala z powodu nie zapisywania informacji o uruchomionych skryptach podczas zamykania terminala klienckiego. Skrypty są zgromadzone w katalogu .\experts\scripts.

Biblioteki są zbiorem często używanych funkcji, literałów stałych, zmiennych i innych zasobów zebranych w jednym pliku. Biblioteka nie jest samodzielnym programem wykonawczym lecz z jednej biblioteki może korzystać większa liczba procesów jednocześnie. Biblioteki EX4 służą tylko jako magazyny kodów maszynowych funkcji ale to zważywszy na charakterystykę programów pisanych na platformę MeraTrader w zupełności wystarczy. Biblioteki EX4 są zgromadzone w katalogu .\experts\libraries.

Pliki nagłówkowe są plikami tekstowymi zawierającymi najczęściej używane fragmenty kodu źródłowego do wykorzystania w programach. Pliki te mogą być dołączone do kodu źródłowego strategii, skryptu, wskaźnika a nawet biblioteki na etapie przetwarzania przez preprocesor. Użycie plików nagłówkowych jest lepszym pomysłem niż użycie bibliotek bo wywołanie funkcji bibliotecznej nieuchronnie wiąże się ze zużyciem dodatkowych zasobów w postaci czasu procesora lub procesorów i pamięci operacyjnej a niekiedy też dyskowej. Pliki nagłówkowe są zgromadzone w katalogu .\experts\include.

3.                 Kompilator

Aby kompilować napisany kod źródłowy programu potrzebny jest kompilator. Do pakietu MetaTrader został dołączony kompilator, znajduje się w katalogu aplikacji w zbiorze .\MetaLang.exe. Metalang.exe jest programem konsolowym, który ma dwa parametry. Pierwszy parametr jest to opcja zachowania kompilatora i jest opcjonalny. Jedyna możliwość dostępna w tym kompilatorze to opcja q inne znaki są ignorowane. Opcje kompilatora piszemy po znaku myślnika „-”. Opcja q sprawia, że nie wyświetlane są komunikaty dotyczące przebiegu kompilacji. Drugi parametr jest pełną albo relatywną ścieżką do pliku kodu źródłowego.

MQL 4 jest językiem kompilowanym do natywnego kodu maszynowego, przetwarzanego bezpośrednio przez centralne jednostki ALU/FPU. Kompilowanie tłumaczy kod programu pisanego w języku formalnym na język maszynowy. Żeby centralne jednostki ALU/FPU mogły przetwarzać program konieczna jest jego bezbłędna kompilacja, przy czym ewentualne ostrzeżenia powinny być przeanalizowane. Pliki zawierające wykonywalne kody maszynowe muszą mieć rozszerzenie EX4, jeżeli mają być widziane jako pliki wykonywalne przez terminal kliencki.

Przykład:

X:\Program Files\MetaTrader>metalang.exe

MetaQuotes Language 4 compiler version 4.00 build 216 (16 Apr 2008)

Copyright 2001-2008, MetaQuotes Software Corp.

 

usage: metalang [ options... ] filename

options:

-q : quiet mode

 

 

X:\Program Files\MetaTrader>metalang.exe X:\Program Files\MetaTrader\experts\przykład.mq4"

MetaQuotes Language 4 compiler version 4.00 build 216 (16 Apr 2008)

Copyright 2001-2008, MetaQuotes Software Corp.

 

CollectTokens: 3762 MqlToken [1146 Kb], used 3415 MqlToken [size: 312 bytes]

Exp file "F:\Program Files\X-Trader 4 XTB\experts\przykład.ex4" produced - 0 error(s), 0 warning(s)

 

 

X:\Program Files\MetaTrader>metalang.exe –q "X:\Program Files\MetaTrader\experts\przykład.mq4"

CollectTokens: 3762 MqlToken [1146 Kb], used 3415 MqlToken [size: 312 bytes]

 

 

X:\Program Files\MetaTrader>

UWAGA: Skompilowany plik ma tą samą nazwę, co źródłowy i rozszerzenie EX4, jeśli istnieje plik o nazwie jednobrzmiącej z nazwą pliku wynikowego to kompilator spróbuje zastąpić ten plik bez ostrzeżenie.

4.                 IDE

MetaTrader 4 jest instalowany z tekstowym edytorem kodu, MetaEditor 4, który jest programem typu IDE (zintegrowane środowisko programowania), integrującym edytor tekstu służący do edycji kodu źródłowego programu z funkcją podświetlania składni konstrukcji języka. To ma ułatwić nam orientacje w kodzie. IDE ułatwia kompilacje programu, wystarczy użyć klawisza F5 a MetaEditor wywoła proces kompilacji. Komunikaty ze standardowego wyjścia błędów kompilatora będą prze kierowane i wyświetlone w zakładce Errors w polu Description. Po pomyślnym skompilowaniu plik ma tą samą nazwę, co plik źródłowy i rozszerzenie EX4. Jeśli kompilacja się nie powiedzie w zakładce Errors w polu Description pojawi się lista błędów. IDE ma też zintegrowany system pomocy dostępny w zakładce Help i po naciśnięciu klawisza F1. W systemie pomocy znajdują się opisy funkcji standardowych podzielonych na kategorie tematyczne, operatory, słowa zastrzeżone i wiele innych. System pomocy opisuje też zachowane funkcje, które zmieniły nazwę.

2.          
Składnia

Þ    Składnia

Þ    Instrukcje

Þ    Separatory

Þ    Format

Þ    Komentarze

Þ    Słowa zastrzeżone

Þ    Identyfikatory

1.                 Składnia

Składnia tego języka, jak już zaznaczałem wcześniej, jest zbliżona do składni języka C czy C++, ale brak w niej niektórych elementów, między innymi takich konstrukcji i wyrażeń jak:

- arytmetyka przestrzeni adresowej procesora,

- operatora do ... while;

- operatora goto ...;

- operatora <warunek> ? <wyrażenie 1> : <wyrażenie 2>;

- operatora pre-inkrementacji/dekrementacji,

- organizacji struktur danych,

- wielokrotnego przypisywania,

- wczesnego zakańczania obliczeń wyrażeń logicznych.

Składnia większości języków programowania w tym składnia MQL 4 jest opisywana poprzez wyrażenia regularne. Zaletą takiego podejścia jest to, że wyrażenia regularne jednoznacznie opisują syntaktykę języka nie pozwalając na jakiekolwiek nieścisłości czy rozbieżności. Aby używać jakiegoś języka poprawnie trzeba poznać jego gramatykę w przypadku tego języka gramatyka określa takie elementy jak: instrukcje, separatory, format, komentarze, słowa zastrzeżone i identyfikatory.

2.                 Instrukcje

Instrukcje wysokiego poziomu oznacza jedną czynność, jaką ma wykonać program, którą kompilator zamieni, na co najmniej jedną instrukcję maszynową. Instrukcja może też występować jako instrukcja blokowa, czyli, mimo że składa się z szeregu instrukcji wysokiego poziomu, to do dalszego przetwarzania traktowana jest tak samo jak pojedyncza instrukcja wysokiego poziomu.

Przykład:

x = 2;

y = x + 2;

3.                 Separatory

Separatory to ciągi znaków używanych do ograniczenia fragmentów kodu źródłowego posiadających określone znaczenie. Program pisze się umieszczając kolejne instrukcje oddzielając je separatorami. Wewnątrz instrukcji też można umieścić separatory. Stosowanie separatorów służ na ogół zwiększeniu czytelności kodu. Do separatorów zaliczają się znaki: spacje, tabulatory, koniec wiersza i koniec strony. Do oddzielenia każdych dwóch instrukcji można stosowa kilka separatorów. Ale dyrektywy preprocesora muszą być pisane w jednej linii.

Przykład:

x =     2;

y = x + 2;

// kompilator zgłosi błąd

#property

Copyrigtch "Prawa Autorskie ® 2007, Konrad Kudzin"

 

x =     2;

y = x + 2;

// a teraz kompilator nie zgłosi

#property Copyrigtch "Prawa Autorskie ® 2007, Konrad Kudzin."

4.                 Format

MetaQuotes Language 4 jest językiem o tak zwanym wolnym formacie to znaczy, że układ linii nie jest nam odgórnie narzucony przez co możemy w instrukcji stosować dowolną ilość spacji, znaków tabulacji i pustych linii na przykład w jednej linii kodu zapisać dwie instrukcje lub w dwóch liniach kodu jedną instrukcję. Dzieje się tak, dlatego, że koniec instrukcji określany jest przez średnik a nie przez znaki końca linii. Pamiętaj jednak, że nie możesz używać takich samych reguł do formatowania linii zawierających dyrektywy preprocesora, ale nie należy tego traktować jako wyjątku od reguły, wyrażenia regularnego, bo dyrektywy preprocesora są przetwarzane w pierwszej kolejności modyfikując kod źródłowy a dopiero tak zmodyfikowany kod j...

Zgłoś jeśli naruszono regulamin