Programowanie
Teraz czytasz
MQL Praktycznie. Panic Button, część I [Kurs programowania]
0

MQL Praktycznie. Panic Button, część I [Kurs programowania]

utworzył Radek Szafron21 marca 2019

Witajcie w drugim odcinku MQL Praktycznie! W drugiej części naszego kursu ponownie rozpoczniemy z pustą kartką papieru i krok po kroku napiszemy nową aplikację. Poznamy elementy, które każdy programista na co dzień wykorzystuje w swojej pracy takie jak funkcje, operatory logiczne i pętle, czyli to o czym na pewno każdy z Was słyszał, ale nie do końca wiedział z czym to się je. Na szczęście w naszym cyklu teorię podajemy smacznie i bez przesady, a skupiamy się na tym co najważniejsze, czyli na programowaniu w praktyce.

W tym tygodniu napiszemy pierwszą część aplikacji “Panic Button”, której nazwa myślę, że tłumaczy już wiele. Zadaniem naszego programu będzie, po naciśnięciu przycisku, natychmiastowe zamknięcie wszystkich otwartych pozycji i zleceń, gdy na naszym czole pojawi się zimny pot, świat ucichnie, a obraz zwęzi się do małego, zamglonego pola z migoczącym kursem pędzącego dolara po jednym z uroczych tweetów jednego z naszych ulubionych polityków.

Zakasajmy rękawy i włączmy MetaEditor

Rozpocznijmy od utworzenia w edytorze pustego pliku typu Expert o nazwie Panic Button.mq4. Plik znajdzie się w katalogu MQL4\Experts. Następnie umieśćmy w odpowiednich folderach wszystkie potrzebne nam dziś pliki.

Plik “Przydatne_funkcje.mqh” należy umieścić w katalogu MQL4\Include\Panic Button\

Plik “Biblioteka_panic_button.ex4” należy umieścić w katalogu MQL4\Libraries\Panic Button\

POBIERZ ZESTAW PLIKÓW MQL

Pierwsze znaki

Przejdźmy do edycji kodu naszej aplikacji, czyli pliku Panic Button.mq4 z katalogu Experts. Poinformujmy kompilator, że korzystamy z najnowszej składni języka MQL4 wpisując:

#property strict
Kod MQL4

Trzy razy “i”

#include

Za pomocą słowa kluczowego #include możemy dołączać do swojego kodu inne pliki źródłowe. W pliku Przydatne_funkcje.mqh przygotowaliśmy niezbędną w dalszej części funkcję:

bool Zamknij_pozycje_i_zlecenia(bool tylko_ten_instrument)

Abyśmy mogli korzystać z dodatkowego kodu musimy dodać go do naszego pliku wpisując #include i ścieżkę dostępu. Dokładnie tak jak w ramce poniżej.

#include “..\\Include\\Panic Button\\Przydatne_funkcje.mqh”
Kod MQL4

#import

Słowo kluczowe #import pozwala nam natomiast korzystać z zewnętrznych bibliotek. Biblioteki to osobne, skompilowane algorytmy, które udostępniają swoje funkcje i zasoby innym programom. Poniżej importujemy bibliotekę o nazwie Biblioteka_panic_button.ex4, która zawiera elementy graficzne i funkcje dla naszego przycisku. Pomiędzy elementami #import umieszczamy listę definicji funkcji jakie biblioteka powinna nam udostępnić.

Prawidłowy import biblioteki wygląda następująco:

#import “Panic Button\\Biblioteka_panic_button.ex4”
void Przycisku_utworz_sie(int x, int y, bool wybieram_niebieski); void Przycisku_badz_czujny(); bool Przycisku_czy_jestes_klikniety(string nazwa_obiektu); void Przycisku_bye_bye();
#import
Kod MQL4

input

Po dodaniu plików źródłowych i bibliotek możemy przejść do tworzenia funkcji naszego programu. Zacznijmy od dodania poniższej linii:

input bool Tylko_ten_instrument = false;
Kod MQL4

Element input informuje kompilator, że tworzymy parametr, który będzie dostępny w oknie ustawień aplikacji, a jego wartość zależała będzie od wyboru użytkownika. Utworzony przez nas parametr przyjmuje wartość typu bool, czyli true lub false. Nazwaliśmy go Tylko_ten_instrument i za pomocą tej nazwy będziemy mogli w przyszłości odwołać się do jego wartości, która to posłuży nam, aby zdecydować czy zamknąć wszystkie pozycje, czy jedynie pozycję instrumentu, na którym uruchomiony jest nasz program.

Pierwsza funkcja

Dopiszmy do naszego pliku poniższy fragment kodu:

int OnInit()
{
return INIT_SUCCEEDED;
}
Kod MQL4

Powyższy zapis oznacza że tworzymy funkcję o nazwie OnInit, która będzie zwracała wartości typu int, czyli liczby całkowite. Funkcje zwracają wartości za pomocą słowa kluczowego return.

Wspomnieliśmy, że za pomocą słowa return nasza funkcja zwraca wartości w postaci liczb całkowitych. Czym jest więc tajemniczy zapis INIT_SUCCEEDED ? Dla naszej wygody w języku istnieje wiele automatycznie zdefiniowanych wartości i INIT_SUCCEEDED jest właśnie jedną z nich. Pod jej nazwą kryje się liczba całkowita, znana dla kompilatora i rozumiana jako “wszystko jest ok”.

Funkcja OnInit() jest częścią MQL API, czyli funkcją dostępną w ramach języka. Funkcje MQL API oznaczone są w kodzie na fioletowo. Po uruchomieniu aplikacji nasz algorytm automatycznie wywoła funkcję OnInit() i zrobi to jedynie raz, na samym początku, aby umożliwić nam wykonanie operacji niezbędnych do uruchomienia i funkcjonowania naszego programu.

Treść funkcji

Pomiędzy nawiasami klamrowymi każdej funkcji wpisujemy instrukcje jakie dane funkcja powinna wykonać. Nasza funkcja OnInit() zawiera już jedną instrukcję – return INIT_SUCCEEDED;

Rozbudujmy teść funkcji OnInit(), pamiętając, aby kod return INIT_SUCCEEDED; zawsze pozostawał na samym dole funkcji, ponieważ chcemy go wywołać tylko, gdy wszystkie inne instrukcje wykonają się pomyślnie.

Operator warunkowy if

if(IsDemo() == false)
{
 
return INIT_FAILED;
 
}
Kod MQL4

Powyższy kod, za pomocą operatora warunkowego if, sprawdza czy środowisko do naszych eksperymentów jest bezpieczne i pracujemy na koncie demo.

Konstrukcja operatora if jest zawsze bardzo podobna. Zapis pomiędzy nawiasami po operatorze, czyli zapis IsDemo() == false nazywamy wyrażeniem warunkowym. Jest to wyrażenie logiczne, które może zwracać jedną z dwóch wartości – true lub false. Gdy wyrażenie warunkowe zwróci wartość true to wykonany zostanie kod pomiędzy nawiasami klamrowymi, które występują bezpośrednio po operatorze if.

Symbol == w wyrażeniu warunkowym zadaje pytanie czy wartość po jego lewej stronie jest równa wartości po prawej. Ponieważ funkcja IsDemo() zwróci wartość false, gdy włączymy program na koncie live to nasze wyrażenie warunkowe, jako całość, zwróci wartość true, ponieważ wartość po lewej stronie symbolu == odpowiadała będzie wartości po prawej. Gdy wyrażenie warunkowe zostanie spełnione wykona się kod pomiędzy nawiasami klamrowymi operatora if i program zwróci informację o niepowodzeniu za pomocą operatora return i wartości wygenerowanej automatycznie pod nazwą INIT_FAILED.


expert advisors


Rysujemy przycisk

Nasz przycisk narysujemy za pomocą funkcji Przycisku_utworz_sie(int x, int y, bool wybieram_niebieski), która pochodzi z zaimportowanej wcześniej biblioteki. Funkcja przyjmuje dwa parametry o typie danych int (liczby całkowite) o nazwach x oraz y, które służą jako współrzędne położenia przycisku na wykresie względem górnego, prawego rogu okna.

Dodatkowo funkcja przyjmuje parametr typu bool (true lub false) o nazwie wybieram_niebieski. Ponieważ nasza aplikacja będzie mogła działać w dwóch trybach, dla całego konta lub jednego instrumentu, nasz przycisk będzie miał odpowiedni kolor w zależności od wybranych ustawień.

Lubimy ify

Ustalmy, że zależy nam, aby przycisk był niebieski, gdy działa w trybie dla jednego instrumentu, a czerwony dla całego konta. Kolorowanie przycisku umożliwimy dodając poniższą instrukcję do funkcji OnInit():

bool niebieski = false;
if(Tylko_ten_instrument == true)
{
 
niebieski = true;
}
Kod MQL4

Aby algorytm mógł ustalić kolor dla przycisku, na początek, definiujemy zmienną bool o nazwie niebieski i przypisujemy do niej wartość false. Następnie korzystamy z operatora warunkowego if, który sprawdza czy parametr ustawień aplikacji Tylko_ten_instrument został ustawiony przez użytkownika na wartość true. Jeśli tak jest to uruchamiany jest kod, który ustala wartość zmiennej niebieski  również na true. Tak przygotowaną zmienną niebieski możemy zaserwować funkcji Przycisku_utworz_sie(..) dodając poniższą linijkę kodu do funkcji OnInit().

Przycisku_utworz_sie(5, 15, niebieski);
Kod MQL4

Ostatnia funkcja (na dziś)

Gdy program zakończy pracę lub coś zmieni się w ustawieniach wywołana zostanie funkcja MQL API void OnDeinit(const int reason).

Za pomocą funkcji OnDeinit() wykonujemy operacje, które są potrzebne by prawidłowo zakończyć działanie programu. W naszym przypadku, po wyłączeniu algorytmu, niezbędne jest usunięcie przycisku za pomocą zaimportowanej wcześniej z biblioteki funkcji Przycisku_bye_bye().

void OnDeinit(const int reason)
{
 
Przycisku_bye_bye();
 
}
Kod MQL4

Zauważmy, że przed nazwą funkcji znajduję się słowo void. Oznacza ono, że nasza funkcja nie będzie zwracała żadnej wartości.

Dodajemy średniki, zacieramy ręce i naciskamy kompiluj

Po udanej kompilacji kod, który dzisiaj napisaliśmy narysuje na wykresie przycisk i nada mu odpowiedni wygląd w zależności od konfiguracji wprowadzonej przez użytkownika w oknie ustawień. Gratuluję, zakończyliśmy pierwszy etap tworzenia naszej aplikacji, stworzyliśmy interfejs użytkownika.

W przyszłym tygodniu rozwiniemy nasz program o obsługę zleceń i dodamy parę ciekawych gadżetów.

POBIERZ ZESTAW PLIKÓW MQL

Co o tym sądzisz?
Lubię
0%
Interesujące
100%
Heh...
0%
Szok!
0%
Nie lubię
0%
Szkoda
0%
O Autorze
Radek Szafron
Radek Szafron
Autorem publikacji jest Radek Szafron, właściciel firmy Expert Advisors, która od wielu lat wspiera inwestorów dostarczając technologie dedykowane dla rynku FOREX. Autor jest absolwentem finansów SGH ze specjalizacją "Rynki finansowe" i programistą z prawie 20 letnim doświadczeniem. Firma realizuje projekty algorytmów i aplikacji pisanych we wszystkich językach z rodziny "C", w tym dla popularnych platform Meta Trader 4 i 5. Firmę Expert Advisors można znaleźć pod adresem www.expertadvisors.pl.