3.4 PRZYKŁADY STRUKTURY DANYCH I FUNKCJE MATEMATYCZNE TABLICE JEDNOWYMIAROWE TABLICE WIELOWYMIAROWE - PDF\n3.4 PRZYKŁADY STRUKTURY DANYCH I FUNKCJE MATEMATYCZNE TABLICE JEDNOWYMIAROWE TABLICE WIELOWYMIAROWE\nDownload "3.4 PRZYKŁADY... 43 4. STRUKTURY DANYCH I FUNKCJE MATEMATYCZNE... 44 4.1 TABLICE JEDNOWYMIAROWE... 44 4.2 TABLICE WIELOWYMIAROWE... 47 4."\n1 SKRYPT SZKOLENIOWY\n2 Spis treści 1.PLATFORMA METATRADER NAJWAŻNIEJSZE CECHY PLATFORMY METATRADER OTWIERANIE POZYCJI ZLECENIA PO BIEŻĄCEJ CENIE RYNKOWEJ MODYFIKOWANIE POZYCJI MODYFIKOWANIE I USUWANIE ZLECEO OCZEKUJĄCYCH ZAMYKANIE POZYCJI GODZINY HANDLU WYMAGANIE DEPOZYTOWE I RÓŻNE OPŁATY SKRÓTY KLAWISZOWE PODSTAWY PROGRAMOWANIA W MQL PODSTAWY SKŁADNI TYPY ZMIENNYCH OPERACJE NA ZMIENNYCH OPERATOR WARUNKOWY OPERATORY RELACJI PĘTLE PRZYKŁADY FUNKCJE I ELEMENTY DEBUGOWANIA DEFINICJA FUNKCJI FUNKCJE WBUDOWANE DEBUGOWANIE KODU\n3 3.4 PRZYKŁADY STRUKTURY DANYCH I FUNKCJE MATEMATYCZNE TABLICE JEDNOWYMIAROWE TABLICE WIELOWYMIAROWE FUNKCJE MATEMATYCZNE BUDOWA WŁASNEJ FUNKCJI MATEMATYCZNEJ PRZYKŁADY ZMIENNE PREDEFINIOWANE ŚWIECE JAPOOSKIE A ZMIENNE PREDEFINIOWANE ZMIENNE BID I ASK FUNKCJE SYMBOL() I PERIOD() PROSTY SYSTEM TRANSAKCYJNY PRZYKŁADY FUNKCJE DODATKOWE FUNKCJE DO ZARZĄDZANIA KONTEM FUNKCJE DATY I CZASU DANE HISTORYCZNE I INNE INSTRUMENTY UŻYTECZNE FUNKCJE PRZYKŁADY WSKAŹNIKI ŚREDNIE KROCZĄCE OSCYLATORY ATR I STOP LOSS ŁĄCZENIE WSKAŹNIKÓW PRZYKŁADY FORMACJE ŚWIECOWE\n4 8.1 WARUNKI ISTNIENIA FORMACJI FORMACJE MŁOTA I GWIAZDY KRZYŻ HARAMI OBJĘCIE HOSSY/ OBJĘCIE BESSY ANALIZA ZŁOŻONYCH FORMACJI PRZYKŁADY FUNKCJE TRANSAKCJI SYSTEMY AUTOMATYCZNE SKŁADANIE ZLECEO MODYFIKACJE I USUWANIE ZLECEO ZAMKNIĘCIE ZLECENIA PRZYKŁADY\n5 1.PLATFORMA METATRADER4 Platforma transakcyjna MetaTrader4 stanowi kompletne i w pełni profesjonalne narzędzie służące do inwestowania na rynku walutowym FOREX i amerykaoskim rynku funduszy STOCK. Umożliwia obserwację rynku oraz składanie zleceo przez 24h na dobę. Platforma posiada wysokiej jakości moduł informacyjny oraz aktualizowany na bieżąco moduł wykresowy wraz z wbudowanymi instrumentami do analizy technicznej. MetaTrader4 ma prosty i przyjazny dla użytkownika interfejs, który pozwala traderowi kontrolowad swoje transakcje i rachunek, jak również dokonywad analizy technicznej i rozwijad własne strategie handlowe. 1.1 NAJWAŻNIEJSZE CECHY PLATFORMY METATRADER 4 -umożliwia pracę z rynkiem: Forex i CFD; -wykonywanie zleceo: zlecenie natychmiastowe i zlecenie oczekujące; - poufny charakter wszystkich działao handlowych; - nieograniczona ilośd wykresów; - rozmaite interwały czasowe (od minuty do miesiąca); - duża liczba technicznych wskazówek; - możliwośd wgrania własnych wskaźników i skryptów; - wielojęzyczny interfejs; - export realnych danych za pomocą protokołu DDE; - sygnały i systemy w trakcie gry; - bieżące newsy online z rynku; - wewnętrzna skrzynka ; - drukowanie wykresów i raportów z transakcji. 5\n6 1.2 OBSŁUGA PLATFORMY OTWIERANIE RACHUNKU Platforma MetaTrader4 pozwala na pracą w systemie dwóch i rachunków: demo i rzeczywistym. Mimo, iż środki na rachunku demo są wirtualne, nie odbiera to możliwości testowania strategii inwestycyjnych w rzeczywistych warunkach rynkowych. OTWIERANIE RACHUNKU Aby otworzyd rachunek demo należy wybrad zakładkę: "Plik" -> "Otwórz rachunek". Następnym krokiem jest rejestracja, polegająca na wypełnieniu ankiety. Po pomyślnym zakooczeniu rejestracji pojawi się okno zawierające informacje o rachunku: - Login - unikalny identyfikator, w postaci ciągu cyfr nadany nam przez firmę brokerską. - Hasło - można je zmienid po zalogowaniu, wchodząc poprzez Narzędzia" -> Opcje". - Investor hasło inwestorskie, dzięki któremu można przeglądad dane rynkowe lecz bez możliwości dokonywania transakcji; UWAGA! Nie zaleca się zaznaczania opcji Zapisz dane rachunku", gdyż osoby niepowołane, posiadające dostęp do komputera, na którym została zainstalowana platforma, miałyby tym samym dostęp do rachunku - łącznie z możliwością zawierania transakcji. Zalogowanie na rachunek następuje po podaniu loginu i hasła, otrzymanych po rejestracji. AKTUALIZACJE Platforma MetaTrader4 w posiada wbudowany system automatycznej aktualizacji. Pozwala to na szybką instalację najnowszej wersji programu. System automatycznej aktualizacji jest zawsze włączony i nie ma możliwości wyłączenia go. Podczas połączenia z serwerem, system sprawdza dostępnośd najnowszej wersji. Jeżeli nowa wersja zostanie wykryta, system zapyta o chęd jej pobrania i instalacji. Aby 6\n7 rozpocząd aktualizację należy wybrad przycisk Start". Po pobraniu plików aktualizacyjnych należy wybrad przycisk Update and Restart". ZARZĄDZANIE WYKRESAMI Wykresy umożliwiają analizę zmian kursów i są pomocne w analizie graficznej, korzystaniu z różnorodnych wskaźników i wyznaczaniu linii trendu. Do opcji zarządzania wykresami zalicza się: TYP WYKRESU: - Bar Charts (Wykres słupkowy) - sekwencja słupków w wybranych interwałach. Pozioma kreseczka z lewej strony oznacza kurs otwarcia, z prawej strony kurs zamknięcia, natomiast maksymalna i minimalna cena wyznaczona jest przez pionową rozpiętośd słupka. - Candlestick Charts (Wykres świecowy) - sekwencja świec podobnych do słupków. Pojedyncza świeca składa się z korpusu (szersza cześd) oraz ceni (cieosze części na dole i górze korpusów). Cieo dolny wyznacza kurs minimalny, górny - maksymalny. W przypadku świec wzrostowych dolna jej krawędź odpowiada kursowi otwarcia, górna zaś - zamknięcia. Dla świec spadkowych odwrotnie. - Line Charts (Wykres liniowy) - łamana linia łącząca ceny zamknięcia. WSKAŹNIKI ANALIZY TECHNICZNEJ: Wskaźniki analizy technicznej są matematyczną transformacją cen i wolumenu. Na podstawie osiąganych przez nie wartości generowane są sygnały wejścia i opuszczenia rynku, lub powstrzymania się od jakichkolwiek działao. - Obiekty graficzne: Obok wskaźników analizy technicznej, użyteczną rolę analityczną pełnią także obiekty graficzne. Platforma daje możliwośd załączenia linii poziomych, pionowych, trendu oraz poziomów Fibonacciego. 7\n8 - Zmiana interwałów: Wykresy na platformie można przeglądad na jednym z 9 interwałów: od interwału minutowego (Ml) do miesięcznego (MN). - Przybliżanie/oddalanie wykresu: Wykresy mogą byd oddalane i przybliżane, co wpływa na ilośd wyświetlanych słupków i precyzją wyświetlania cen. -Przewijanie, automatyczne przewijanie i przesunięcie wykresu. Analiza cen historycznych wymaga czasem przesunięcia wykresu do okresów wcześniejszych. Przewinięcia wykresu w lewo (do okresów wcześniejszych) i prawo (do okresów bliższych teraźniejszości) dokonad można za pomocą przycisku znajdującego się pod wykresem. Na wykresie można także włączyd funkcję auto przewijania - wykres będzie się automatycznie przesuwał w prawo, do aktualnej ceny. HANDEL (TRADE) Okno handel zawiera informacje o aktualnym stanie rachunku, otwartych pozycjach i wystawionych zleceniach oczekujących. Wszystkie pozycje są posortowane po dacie otwarcia - od otwartej najwcześniej do otwartej ostatnio. Lista zleceo oczekujących, również posortowana po dacie, znajduje się pod paskiem salda. Jeżeli cena aktywacji zlecenia oczekującego zostanie osiągnięta, zlecenie zostaje wykonane. Następuje automatyczne usunięcie go z listy zleceo oczekujących i przeniesienie na listę otwartych pozycji. NOWE ZLECENIE Otwiera okno składania zleceo, za pomocą którego można otworzyd nową pozycję lub wystawid zlecenie oczekujące. Aby złożyd nowe zlecenie należy sprecyzowad jego parametry: 8\n9 instrument będący przedmiotem transakcji, wolumen zlecenia w lotach, typ zlecenia (po cenie rynkowej lub oczekujące), a także opcjonalnie poziomy Take Profit i Stop Loss. Więcej o składaniu zleceo w sekcji "Zarządzanie pozycją". ZAMKNIJ ZLECENIE Otwiera okno zamykania pozycji. Okno zostanie otwarte tylko wtedy, jeżeli naciśniemy szybko dwa razy rysikiem w otwartą pozycję. Zarządzanie pozycją: - MODYFIKACJA ZLECENIA - Po kliknięciu w otwartą pozycję lub prawym przyciskiem myszki, otworzy się okno, gdzie widad polecenie modyfikacji lub usunięcia zlecenia. W przypadku zleceo oczekujących można dokonad modyfikacji ceny aktywacji, a także poziomu Stop Loss i Take Profit. W otwartych pozycjach modyfikacji można poddad jedynie poziom Stop Loss i Take Profit. - POKAŻ ZLECENIE - po kliknięciu w wybrane zlecenie w nowym oknie wyświetlone zostaną informacje na temat zlecenia. W oknie znajdziemy wszystkie informacje na temat zlecenia: - NUMER ZLECENIA; - CZAS OTWARCIA POZYCJI - data i godzina otwarcia pozycji w formacie RRRR.MM.DD GG:MM; - TYP POZYCJI - buy (kupno) albo sell (sprzedaż); - LOTY - suma towaru jaką kupiliśmy (mierzona w jednostkach zwanych lotami); - SYMBOL - nazwa instrumentu, na jakim została dokonana operacja kupna albo sprzedaży; - CENA OTWARCIA - pokazuje cenę po jakiej otwarto pozycję; - T/P" (Take Profit) - pokazuje poziom Take Profit, jeżeli został on ustawiony dla zlecenia; - S/L" (Stop Loss ) - pokazuje poziom Stop Loss, jeżeli został on ustawiony dla zlecenia; - AKTUALNA CENA - pokazuje aktualną cenę. 9\n10 - ZYSK - pokazuje wynik z zawartej transakcji: w pipsach (punktach) i walucie depozytowej - USD. Kolejny pasek pokazuje: - BALANCE (Saldo) - informacje o saldzie rachunku; - EQUITY (Wartośd rachunku) - informacje o wartości rachunku. Wartośd rachunku równa jest saldzie rachunku skorygowanemu o wynik z otwartych pozycji. Jeżeli nie ma żadnych otwartych pozycji, wartości rachunku i salda są sobie równe. - MARGIN (Depozyt) - informacje na temat depozytu zabezpieczającego. - FREE MARGIN (Dostępny depozyt) - informacje na temat środków dostępnych pod depozyt potrzebny do zawarcia nowych transakcji. Dostępny depozyt równy jest wartości rachunku pomniejszonej o depozyt. Wyświetlana obok wartości nominalnej wartośd procentowa, odpowiada poziomowi zabezpieczenia. Poziom zabezpieczenia równy jest wartości rachunku podzielonej przez zablokowany depozyt. HISTORIA RACHUNKU (HISTORY) Okno historii zawiera informacje o przeprowadzonych operacjach, uwzględniających pozamykane pozycje i usunięte bądź odrzucone zlecenia oczekujące. Okno historii wyświetlane jest w postaci tabeli, która zawiera następujące informacje: - Zlecenie zawiera informacje na temat zamkniętych pozycji, w szczególności rodzaju zlecenia, instrumentu i wolumenu zlecenia w lotach. - Cena - zawiera ceny otwarcia zamkniętych pozycji. - Wynik - zawiera wyniki lub komentarze zamkniętych pozycji. WIADOMOŚCI (NEWS) Okno News" zawiera listę otrzymanych wiadomości rynkowych. Lista zawiera czas otrzymania oraz nagłówki przychodzących wiadomości. Nagłówki wyświetlone są w kolejności 10\n11 przychodzenia. Lista jest automatycznie aktualizowana po nadejściu nowej wiadomości. ALARMY (ALERTS) Zakładka ta umożliwia zarządzanie alarmami dźwiękowymi. Alarmy, w przeciwieostwie do sygnałów dźwiękowych wydarzeo, dotyczą poziomów cen osiąganych przez instrumenty. Ustawiony alarm zadziała w momencie spełnienia żądanego warunku, informując nas o tym, że określony poziom ceny lub czas został osiągnięty. SKRZYNKA POCZTOWA (MAIL) Zakładka otwiera skrzynkę pocztową, za pośrednictwem której, można odbierad i wysyład maile wewnętrzne. Nagłówki wiadomości wyświetlane są w tabeli. Po naciśnięciu prawym przyciskiem myszy w tabeli z listą maili otworzy się jej menu kontekstowe. Za pomocą menu można odczytad wybraną wiadomośd, utworzyd nową wiadomośd lub usunąd wybraną wiadomośd. STRATEGIE (STRATEGY) Miejsce, gdzie przechowywana jest informacja nt. utworzonych i wykorzystanych przez nas strategii handlowych. DZIENNIK (DIARY) Zawiera historię wszystkich operacji dokonywanych na platformie MetaTrader4. OBIEKTY GRAFICZNE (OBJECTS) Obiekty graficzne nakładane na wykresy w celu wyznaczenia linii trendu, istotnych poziomów wsparcia i oporu oraz zaznaczania istotnych dat. W platformie na wykresy nakładad można linie pionowe, poziome, trendu oraz poziomy Fibonacciego. 11\n12 NAZWA OBIEKTU - Linia Pozioma - Służy do zaznaczania na wykresie poziomów cen. W oknie właściwości obiektu edytowad można kolor, styl i grubośd linii, a także wprowadzid nowy poziom ceny, dla której linia ma byd wyświetlana. - Linia Pionowa - Służy do zaznaczania na wykresie przedziałów czasowych. W oknie właściwości obiektu edytowad można kolor, styl i grubośd linii, a także wprowadzid nową datę dla której linia ma byd wyświetlana. - Linia Trendu - Pozwala zaznaczyd na wykresie trend. Aby ją nałożyd, należy wybrad na wykresie jeden punkt i przytrzymując przeciągnąd do drugiego. W oknie właściwości obiektu edytowad można kolor, styl i grubośd linii, a także wprowadzid nowe poziomy cen i dat, dla których linia ma byd wyświetlana. Po zaznaczeniu opcji Promieo", linia zostaje przeciągnięta w nieskooczonośd. - Poziomy Fibonacciego - Pozwala na nałożenie linii poziomów Fibonacciego, wzdłuż linii trendu. Aby ją nałożyd, należy wybrad na wykresie jeden punkt i przytrzymując przeciągnąd do drugiego. W oknie właściwości obiektu edytowad można kolor, styl i grubośd linii, a także wprowadzid nowe poziomy czasu, ceny i kolejnych linii na nałożonym obiekcie. WSKAŹNIKI ANALIZY TECHNICZNEJ (INDICATORS) Wskaźniki analizy technicznej są matematyczną transformacją cen i/lub wolumenu. Na podstawie ich wartości dokonuje się predykcji cen i wyznaczania kierunku i siły trendu. Dzięki temu ułatwiają one podejmowanie decyzji o zajęciu pozycji. Platforma posiada zestaw 30 wbudowanych wskaźników. W zależności od rodzaju wskaźnika, zostanie on nałożony bezpośrednio na wykres cenowy lub otworzony w nowym oknie pod wykresem. Wskaźniki mogą byd załączane również do innych wskaźników (np. Średnia ruchoma z wartości innego wskaźnika). NAJBARDZIEJ POPULARNE TYPY WSKAŹNIKÓW WYKORZYSTYWANYCH W ANALIZIE TECHNICZNEJ: -Wskaźniki trendu - trend oznacza utrzymywanie się tendencji kursu w określonym czasie. Trendy mogą się poruszad w trzech kierunkach 12\n13 w górę, w dół lub w bok. Wskaźniki trendu korzystają z różnych danych kursowych, aby stworzyd wypadkowy kierunek rynku (np. średnie ruchome, linie trendu, Parabolic SAR, Price Oscillator). - Wskaźniki siły rynku - siła rynku oznacza intensywnośd opinii rynkowej w odniesieniu do ceny, za pomocą oceny pozycji rynkowej zajmowanej przez poszczególnych jego uczestników. We wskaźniku liczą się wolumen i liczba otwartych pozycji. Sygnały z nich płynące zbiegają się z rynkiem lub go wyprzedzają (np. Accumulation/Distribution,Wolumen). - Wskaźniki zmienności - zmiennośd to pojęcie określające rozmiar lub zakres dziennych wahao cen, niezależnie od ich kierunku. Zmiana w zmienności wskazuje zwykle zbliżające się zmiany cen (np. Wstęgi Bollingera). - Wskaźniki cyklu - cykl oznacza powtarzalny schemat zachowania rynku, zależny od powtarzalnych wydarzeo, np. pór roku, wyborów itp. Wiele rynków wykazuje cyklicznośd. Wskaźniki cyklu określają ustalony czas schematów rynkowych (np. Elliott Wave). - Wskaźniki wsparcia i oporu - wsparcie i opór oznaczają poziomy cen w sytuacjach, gdy rynki na zmianę rosną i spadają. Ma to związek z podstawową koncepcją popytu i podaży (np. Linie trendu). - Wskaźniki impetu - impet to szybkośd, z jaką ceny zmieniają się w danym okresie. Wskaźniki impetu świadczą o sile lub słabości trendu w czasie jego trwania. Impet jest największy w początkowej fazie trendu, a najmniejszy w punktach zwrotnych. Najmniejsze odchylenie kierunku ceny czy impetu ostrzega o słabości; wystąpienie skrajnych cen przy słabym impecie sygnalizuje zakooczenie poruszania się w danym kierunku. Impet utrzymujący się przy niezmiennych cenach sygnalizuje możliwą zmianę w kierunku cen (np. Oscylator stochastyczny, MACD, Wskaźnik siły zmiennej RSI). HANDEL Fundamentalną zasadą zyskownego handlu na rynkach finansowych jest kupowanie taniej i sprzedawanie drożej (zamknięcie zlecenia), albo sprzedawanie drożej a kupowanie taniej (zamknięcie zlecenia). System umożliwia składanie zleceo kupna lub sprzedaży po bieżącym kursie rynkowym a także zleceo 13\n14 oczekujących zawierających warunki realizacji Buy Limit, Buy Stop, Sell Limit oraz Sell Stop. Dodatkowo każde zlecenie może zawierad poziom realizacji zysków lub/i ograniczenia straty. 1.3 RODZAJE ZLECEO Zlecenia na platformie można podzielid na zlecenia zawierane po cenach rynkowych, zlecenia oczekujące oraz zlecenia typu Stop Loss i Take Profit. Zlecenia po cenach rynkowych - otwierane są po aktualnych cenach rynkowych: - cenie bid instrumentu dla zleceo sprzedaży; - cenie ask instrumentu dla zleceo kupna. Można także ustawid poziomy Stop Loss i Take Profit dla tego rodzaju zleceo. ZLECENIA OCZEKUJĄCE Są to zlecenia, które będą zrealizowane, jeżeli zostaną spełnione zadane przez inwestora warunki jego realizacji, w szczególności dotyczące ceny danego instrumentu, którego zlecenie oczekujące dotyczy. Są cztery typy zleceo oczekujących: - Zlecenie Buy Limit - Zlecenie oczekujące otwierające długą pozycję w wybranym instrumencie, po spełnieniu zadanych wcześniej warunków realizacji. Cena aktywacji zlecenia jest niższa od ceny rynkowej ask w chwili jego składania. W czasie notowao instrumentu zlecenia typu Buy Limit realizowane są po określonej w warunku realizacji cenie. Aby warunek był spełniony, rynkowa cena ask musi byd niższa lub równa cenie aktywacji. Jeżeli na otwarciu notowao danego instrumentu cena otwarcia jest niższa lub równa cenie aktywacji, to zlecenie realizowane jest po cenie otwarcia. - Zlecenie Buy Stop - Zlecenie oczekujące, otwierające długą pozycję w wybranym instrumencie, po spełnieniu zadanych wcześniej warunków realizacji. Cena aktywacji zlecenia jest wyższa od rynkowej ceny ask w chwili składania zlecenia. Zlecenia typu Buy Stop są realizowane zawsze po pierwszej cenie rynkowej ask, wyższej lub równej warunkowi realizacji. 14\n15 - Zlecenie Sell Limit - Zlecenie oczekujące, otwierające krótką pozycję na wybranym instrumencie, po spełnieniu zadanych wcześniej warunków realizacji. Cena aktywacji zlecenia jest wyższa od rynkowej ceny bid w chwili składania zlecenia. W czasie kwotowania instrumentu, zlecenia typu Sell Limit są realizowane po określonej w warunku realizacji cenie. Jeżeli na otwarciu notowao cena otwarcia jest wyższa lub równa cenie aktywacji, to zlecenie zostaje realizowane po cenie otwarcia. - Zlecenie Sell Stop - Zlecenie oczekujące, otwierające krótką pozycję w wybranym instrumencie, po spełnieniu zadanych wcześniej warunków realizacji. Cena aktywacji zlecenia jest niższa od rynkowej ceny bid w chwili składania zlecenia. Zlecenia typu Sell Stop są realizowane po pierwszej cenie rynkowe bid, niższej lub równej warunkowi realizacji. Stop Loss Zlecenie mające na celu ograniczenie strat z tytułu otwartej pozycji. Dla pozycji długich cena aktywacji zlecenia wyznaczana jest poniżej aktualnej ceny rynkowej bid. Analogicznie, cena aktywacji zlecenia Stop Loss dla pozycji krótkich, musi byd wyższa od aktualnej ceny rynkowej ask. Gdy kurs rynkowy osiągnie poziom ceny aktywacji, pozycja zostaje automatycznie zamknięta. Zlecenia Stop Loss realizowane są zawsze po pierwszej cenie spełniającej warunek aktywacji. Oznacza to, że w przypadku wystąpienia luki cenowej (wewnątrz której znajduje się cena aktywacji), pozycja długa zostanie zamknięta po kursie niższym od ceny aktywacji. Wystąpienie luki, zawierającej cenę aktywacji zlecenia Stop Loss dla pozycji krótkiej, oznacza zamknięcie tej pozycji po cenie wyższej, niż cena aktywacji. Zlecenie Stop Loss nie musi zamykad pozycji stratnych. Jeżeli otwarta pozycja jest zyskowna, to dzięki zleceniu Stop Loss, można zachowad częśd zysku, nie rezygnując jednocześnie z szansy na jego zwiększenie. W takich sytuacjach przydatny okazuje się Stop Loss kroczący, podążający za ceną. Stop Loss kroczący opisany został w sekcji Trailing Stop. Take Profit 15\n16 Zlecenie mające na celu automatyczne zamknięcie pozycji po cenie lepszej, niż aktualna cena rynkowa. Oznacza to, że dla pozycji długich, cena aktywacji zlecenia Take Profit jest wyższa niż bieżąca cena rynkowa bid. Analogicznie, dla pozycji krótkich, cena aktywacji jest niższa od aktualnej ceny rynkowej ask. W czasie kwotowao, zlecenia Take Profit realizowane są po kursie równym cenie aktywacji. Na otwarciu kwotowao instrumentu, zlecenia te realizowane są po cenie otwarcia, jeżeli spełnia ona warunek aktywacji. Oznacza to, że jeżeli na otwarciu wystąpiła luka cenowa, w której zawiera się cena aktywacji, to pozycja długa zostanie zamknięta po cenie wyższej, niż cena aktywacji. Luka cenowa na otwarciu, zawierająca cenę aktywacji zlecenia Stop Loss dla pozycji krótkiej, sprawia, że zlecenie to zostanie zrealizowane po cenie niższej niż cena aktywacji. Dla każdej otwartej pozycji można wyznaczyd jednocześnie zlecenie Stop Loss i Take Profit Trailing Stop Zlecenie to jest bardzo podobne do zlecenia Stop Loss, z tą różnicą, że w przypadku ruchu ceny w kierunku zgodnym z naszymi przewidywaniami poziom Stop Loss zostanie automatycznie przesunięty o odpowiednią ilośd punktów w celu ochrony wypracowanego zysku. Dlatego zlecenie to jest często nazywane podążającym Stop Lossem" lub ruchomym Stop Lossem". Zlecenia te są bardzo użyteczne podczas gry z trendem gdyż pozwalają na zachowanie dużej części wypracowanych zysków bez konieczności ciągłego, manualnego modyfikowania zlecenia stop loss. Należy pamiętad, że trailing stop zostanie aktywowany dopiero w momencie gdy nasza transakcja osiągnie zysk w wysokości Trailing Stopa plus 1 pips, a minimalna wartośd tego zlecenia to 15 pipsów. Aby ustawid Trailing Stop należy zaznaczyd zlecenie, do którego ma byd załączony Trailing Stop, a następnie otworzyd menu kontekstowe. Z listy menu należy wybrad Trailing Stop" i wielkośd w pipsach, o jaką ma się przesuwad Stop Loss. 1.4 RODZAJE EGZEKUCJI ZLECEO 16\n17 Egzekucja natychmiastowa W przypadku egzekucji natychmiastowej zlecenie jest realizowane po cenie wysłanej przez inwestora do brokera. Jeżeli broker akceptuje zawartą w zapytaniu cenę, zlecenie jest realizowane. Jeżeli broker nie akceptuje ceny w związku z jej zmianą, nastąpi rekwotowanie ( requote"). Wówczas system wyświetli okno zawierające wolumen, instrument oraz stronę transakcji (BUY/SELL), a także nową cenę i poprosi o ponowne kwotowanie. 1.5 ZARZĄDZANIE POZYCJĄ Fundamentalną zasadą zyskownego handlu na rynkach finansowych jest kupowanie taniej i sprzedawanie drożej. System transakcyjny MetaTrader4 umożliwia składanie zleceo kupna lub sprzedaży po bieżącym kursie rynkowym a także zleceo oczekujących zawierających warunki realizacji Buy Limit, Buy Stop, Sell Limit oraz Sell Stop. Złożone zlecenia można także modyfikowad, zamykad częściowo lub w całości, a w przypadku zleceo oczekujących - także usuwad. - otwieranie pozycji sprzedaż lub kupno instrumentów w wyniku złożenia zlecenia lub aktywacji zlecenia oczekującego; - modyfikowanie zleceo zmienianie poziomów Stop Loss i Take Profit w otwartych pozycjach; - składanie zleceo typu Buy Stop, Sell Stop, Buy Limit, Sell Limit; - modyfikowanie i usuwanie zleceo oczekujących, które nie zostały zrealizowane; - zamykanie pozycji częściowe lub całkowite. 1.6 OTWIERANIE POZYCJI Otwieranie pozycji polega na wejściu na rynek, przez zakup lub sprzedaż określonego instrumentu. Wejście to może nastąpid po złożeniu zlecenia kup/sprzedaj w trybie natychmiastowym lub po aktywacji zlecenia oczekującego. 17\n18 1.7 ZLECENIA PO BIEŻĄCEJ CENIE RYNKOWEJ System posiada dwa tryby realizacji zleceo po bieżącym kursie rynkowym. Należy pamiętad, iż otwarcie pozycji długiej (BUY) odbywa się zawsze po cenie ASK, a otwarcie pozycji krótkiej (SELL) zawsze po cenie BID. Aby złożyd zlecenie należy otworzyd okno składania zleceo. 1.8 SKŁADANIE ZLECEO OCZEKUJĄCYCH Składanie zleceo oczekujących przebiega według podobnego procesu jak zleceo po cenie rynkowej. Różnica polega na określaniu parametrów dodatkowych zlecenia. W oknie Nowe zlecenie" należy dodatkowo określid: - Typ - wybieramy Zlecenie oczekujące"; - Typ - wybieramy typ zlecenia oczekującego (Buy Stop, Buy Limit, Sell Stop, Sell Limit); - Po cenie - ustalamy ceną aktywacji zlecenia oczekującego; - Wygaśnięcie - opcjonalnie możemy określid okres ważności zlecenia oczekującego. Jeżeli do tego czasu zlecenie nie zostanie zrealizowane, system je usunie. Niezrealizowane zlecenia oczekujące bez określonego terminu ważności usuwane są automatycznie po roku. Po ustaleniu parametrów zlecenia, wybieramy przycisk Złóż zlecenie", aby je złożyd. 1.9 MODYFIKOWANIE POZYCJI Modyfikowanie otwartych pozycji sprowadza się do zmiany, wyznaczenia nowych lub całkowitego usunięcia, poziomów Stop Loss i Take Profit. Aby otworzyd okno modyfikacji otwartych pozycji, należy zaznaczyd wybraną pozycję w oknie Zlecenia, a następnie otworzyd menu kontekstowe i wybrad polecenie Modyfikuj zlecenie". Aby zmienid wartośd poziomu Stop Loss i Take Profit, należy wprowadzid cenę S/L i/lub T/P w komórkach S/L" T/P". Wprowadzając wartośd 0", wyłączamy Stop Loss i Take Profit. Wybierając określone wartości w komórkach Poziom" ustawimy poziomy Stop Loss i Take Profit w zadanej odległości od 18\n19 aktualnej ceny rynkowej. Aby wprowadzid zmiany wybieramy przycisk Modyfikuj" MODYFIKOWANIE I USUWANIE ZLECEŃ OCZEKUJĄCYCH Zlecenia oczekujące również mogą byd poddane modyfikacji. Aby otworzyd okno modyfikacji zleceo oczekujących należy zaznaczyd wybrane zlecenie w oknie Zlecenie", a następnie otworzyd menu kontekstowe i wybrad polecenie Modyfikuj zlecenie". Aby zmienid parametry zlecenia oczekującego, zmieniamy wartości w określonych komórkach: - Symbol - określa instrument którego zlecenie dotyczy i nie wymaga zmiany; - Typ - domyślną wartośd- Modyfikuj zlecenie" - pozostawiamy bez zmian; - Cena - w komórce możemy ustawid nową cenę aktywacji zlecenia oczekującego; - S/L, T/P - w komórkach możemy zmienid poziomy Stop Loss i Take Profit dla danego zlecenia; - Wygaśnięcie - możemy określid datę wygaśnięcia zlecenia, lub odznaczając ją nie określad daty ważności zlecenia. - Po wprowadzeniu zmian możemy je zaakceptowad przyciskiem Modyfikuj". Aby usunąd zlecenie oczekujące wybieramy przycisk Usuo" ZAMYKANIE POZYCJI Aby zamknąd pozycję, należy otworzyd okno zamykania pozycji. Można to zrobid na 3 sposoby: - Zaznaczyd otwarte zlecenie, otworzyd menu kontekstowe w oknie Zlecenia" i wybrad polecenie Zamknij zlecenie"; - Kliknąd dwukrotnie rysikiem w zlecenie, które chcemy zamknąd; - Wybrad przycisk w pasku narzędzi. 19\n20 - W oknie zamykania pozycji należy ustawid parametry zamykania pozycji: - Symbol - określa instrument w którym pozycja ma zostad zamknięta; - Wolumen - określa jaką częśd zlecenia chcemy zamknąd, zlecenie może zostad zamknięte częściowo lub w całości GODZINY HANDLU Klient może dokonywad transakcji dwadzieścia cztery (24) godziny na dobę, przez 5 dni w tygodniu, zaczynając ok. godziny 24:00 z niedzieli na poniedziałek, a koocząc ok. godz. 22:30 w piątek WYMAGANIE DEPOZYTOWE I RÓŻNE OPŁATY Wszystkie depozyty są rozliczane w dolarach amerykaoskich USD. Jeżeli klient chciałby zasilid swój rachunek inną walutą wówczas bank obsługujący brokera zamieni deponowaną walutę na USD zgodnie z obowiązującym kursem rynkowym. Aby otworzyd rachunek wymagany jest minimalny depozyt w wysokości dwóch tysięcy dolarów USD. Depozyty mogą byd realizowane przelewem bankowym. Rachunek zostanie zasilony środkami z czeku dopiero w momencie otrzymania przelewu bankowego przez bank obsługujący brokera. W przypadku MARATONÓW suma potrzebna do rozpoczęcia pracy na realnych pieniądzach wynosi od 300 do 1000 USD. Rachunki PAMM (Master Account - Konta Mistrzowskie) od USD w górę SKRÓTY KLAWISZOWE Ctrl +Tab = Przechodzenie pomiędzy zakładkami Ctrl + F = Krzyżyk Ctrl + G = Włączenie siatki Ctrl + L = Włączanie wolumenu 20\n21 Ctrl + I = Lista wskaźników Ctrl + E = Włączanie strategii Ctrl + D = Okno danych Ctrl + M = Rynek Ctrl + N = Okno Nawigator Ctrl + P = Wydruk grafiki Ctrl + T = Okno Terminal Ctrl + O = Okno opcje Ctrl + Y = Okresy czasowe Shift + F12 = Przesunięcie o jedną świeczkę w prawo F8 = Właściwości wykresu F9 = Nowe zlecenie Fil = Aktywny grafik na pełny ekran F12 = Przesunięcie o jedną świeczkę w lewo Alt + 1 = Wykres słupkowy Alt + 2 = Wykres świecowy Alt + 3 = Wykres liniowy Alt + F4 = Zamknięcie platformy Backspace = Usuo ostatni obiekt + = Zwiększ - = Zmniejsz 2. PODSTAWY PROGRAMOWANIA W MQL 4 MetaQuotes Language 4 (MQL 4) jest językiem umożliwiającym programowanie strategii handlowych. Silna kontrola typów i brak wskaźników powoduje to, że nawet źle napisany program nie zdestabilizuje pracy systemu. MQL 4 umożliwia tworzenie wskaźników, strategii i skryptów, co pozwala na automatyzację procesów handlowych i opracowanie własnych pomysłów. Dodatkowo, często używane funkcje mogą zostad dla wygody zebrane w bibliotekach. MQL w połączeniu z testerem strategii dostarczonym wraz z platformą MetaTrader pozwala na niemal natychmiastowe przetestowanie własnych pomysłów na danych historycznych. Najczęściej pomijaną kwestią w przypadku powyższego języka jest możliwośd tworzenia systemów ekspertowych. Należy tutaj jednoznacznie określid granicę pomiędzy tymi dwoma podejściami: strategia automatyczna (ang. Expert Advisor) jest znacznie szerzej opisywaną w literaturze koncepcją, gdzie od 21\n22 użytkownika wymagana jest minimalna znajomośd obsługi platformy. Cały proces handlu przebiega automatycznie, a żadna dodatkowa zgoda użytkownika przy podejmowaniu działao przez program nie jest wymagana. główną ideą systemu ekspertowego jest niejako wspieranie gracza w podejmowaniu decyzji. Program sugeruje potencjalne punkty wejścia na rynek, jednak ostateczna decyzja należy już tylko do użytkownika. Takie podejście pozwala w pełni kontrolowad sytuację na rynku przy jednoczesnym ograniczeniu czasu spędzonego na handlu. Niestety w tym wypadku wymagana jest od użytkownika podstawowa wiedza z zakresu analizy fundamentalnej oraz technicznej. Znajomośd zagadnieo związanych z rynkiem walutowym oraz przyswojenie podstaw programowania w języku MQL 4 pozwoli na tworzenie systemów znacznie ułatwiających śledzenie wielu par walutowych jednocześnie oraz skuteczny na nich handel. MQL 4 jest językiem, który dużo czerpie z języka ANSI C, znanego również jako C99 (norma ISO/IEC 9899: 1999). Programiści języka C oraz C++ a także języków pochodnych, takich jak Java czy C#, w MQL odnajdą się w nowym środowisku bardzo szybko. Do tworzenia programów w omawianym języku, oprócz środowiska, wymagany jest również kompilator (dostarczany wraz z platformą MetaTrader). MQL jest językiem kompilowanym. Kompilowanie tłumaczy kod programu pisanego w języku formalnym na język maszynowy. Pliki zawierające wykonywalne kody maszynowe muszą posiadad rozszerzenie EX4. Rozszerzenie to przez terminal kliencki jest rozpoznawane jako pliki wykonywalne. Edytor tekstu MetaEditor jest programem typu IDE (zintegrowane środowisko programowania) posiadającym funkcję podświetlania składni. W edytorze zastosowane zostało inteligentne podpowiadanie tekstu (rozwiązanie analogiczne do IntelliSense w 22\n23 środowisku Microsoft Visual Studio). Komunikaty dotyczące błędów są przekierowane i wyświetlone w zakładce "Błędy" w polu "Tekst". Po skompilowaniu programu tworzony jest plik wynikowy posiadający nazwę identyczną z plikiem źródłowym zawierający rozszerzenie EX4. W przypadku błędów podczas kompilacji, w zakładce "Błędy" pojawi się pełna ich lista. Oprócz poważnych błędów, uniemożliwiających kompilację, określanych jako "Errors", zdarzają się też ostrzeżenia (ang. Warnings). Ostrzeżenia nie mają bezpośredniego wpływu na działanie programu, jednak stanowią informację o potencjalnie niebezpiecznych/nadmiarowych fragmentach kodu. MetaEditor posiada zintegrowany system pomocy dostępny w zakładce "Pomoc" (alternatywnie klawisz F1). Samo środowisko jest stosunkowo elastyczne i pozwala użytkownikowi na dostosowanie licznych elementów do własnych preferencji. Wielkośd i krój czcionki, kolory, układ okien to tylko nieliczne z możliwych do edycji elementów. 2.1 PODSTAWY SKŁADNI Podstawowym elementem tworzenia rozbudowanych programów są instrukcje wysokiego poziomu - czyli czynności, które ma wykonad program. Instrukcje takie mogą występowad jako pojedyncze wyrażenia: 23\n24 Powyżej widoczna jest prosta instrukcja, gdzie zmiennej o nazwie a przypisywana jest wartośd 1. Najistotniejsza częśd programu znajduje się w części init(). Funkcje szczegółowo opisane zostaną w kolejnym rozdziale. Natomiast fragment kodu nad funkcją init() pełni rolę informacyjną: możliwe jest tutaj podanie adresu strony internetowej, czy też danych autora. Z kolei bloki stanowią bardziej złożone fragmenty kodu, gdzie zbiór instrukcji prostych traktowany jest jako całośd. W powyższym kodzie, blok instrukcji stanowi cała funkcja init(), gdzie kolejno zdefiniowana została zmienna, następnie przypisana została jej wartośd oraz nastąpił powrót z funkcji. Wszystkie bloki instrukcji w kodzie zaznaczane są przy pomocy nawiasów klamrowych. W każdym bloku może znaleźd się dowolna liczba instrukcji prostych. Zaleca się także, aby w przypadku instrukcji warunkowych (zagadnienie to opisane zostanie szerzej w dalszej części rozdziału) zawierających pojedyncze instrukcje również stosowad oznaczenia bloków. Pomijanie nawiasów w takich sytuacjach nie stanowi błędu, jednak w 24\n25 przypadku późniejszych modyfikacji kodu może już prowadzid do trudnych do zidentyfikowania błędów. 2.2 KOMENTARZE I ZNAKI PUSTE Język MQL posiada wolny format. Oznacza to, że układ linii oraz znaki puste nie są zaliczane do kodu programu (w przeciwieostwie do np. języka Python, gdzie układ wcięd jest istotnym elementem kodu). Umożliwia to pisanie wielu instrukcji w jednej linii kodu, oddzielenie fragmentów dowolną liczbą separatorów, a nawet pisanie jednej instrukcji w kilku wierszach. O ile zwłaszcza pierwsza z tych możliwości jest niezalecana (a w przypadku pisania programu przez kilka osób wręcz zabroniona), o tyle oddzielanie części kodu pozwala na opracowanie przejrzystych i starannie opisanych jego fragmentów. Bardzo ważnym elementem programu (szczególnie w sytuacji, kiedy konieczne mogą byd dodatkowe modyfikacje kodu) są szczegółowe komentarze. Komentarze w kodzie to fragmenty programu pomijane w procesie kompilacji, w których znajdują się informacje dla programisty. W MQL dostępne są dwa rodzaje komentarzy: liniowe oraz blokowe. Komentarze liniowe stosowane są najczęściej do krótkiego opisu wybranej zmiennej. Z kolei długie komentarze blokowe umieszczane są przed funkcją i służą do opisu większego fragmentu kodu, listy parametrów i udostępnianego przez funkcję typu. 25\n26 Sama treśd komentarza jest szczególnie istotna. Tekst powinien byd krótki i przejrzysty. Nie należy także opisywad oczywistych fragmentów kodu. 2.3 TYPY ZMIENNYCH Każda stosowana w programie nazwa musi zostad zadeklarowana. Chodzi tutaj o podanie informacji, że opisuje ona obiekt danego typu. W języku MQL dostępne są 4 typy fundamentalne: integer - typ całkowitoliczbowy; double - liczby rzeczywiste; string - typ łaocuchowy; bool - wartości prawda/fałsz; Każdy z powyższych typów stosowany jest w odmiennych sytuacjach i może opisywad różne zmienne. Powyższe typy stanowią jeden z najistotniejszych elementów języka MQL. Najprawdopodobniej najbardziej oczywistym typem wyda się integer. Jest to typ przeznaczony do reprezentacji liczb całkowitych. W języku MQL możliwy jest też zapis wartości w systemie 26\n27 ósemkowym i szesnastkowym. Opisywany typ oznaczany jest słowem kluczowym int. Każda liczba całkowita może ponadto zostad przedstawiona ze znakiem + lub -. Typ wartości rzeczywistych double przeznaczony jest do reprezentacji 8 - bajtowych wartości przeliczalnego zbioru liczb wymiernych w formacie dziesiętnym (o ograniczonej dokładności). Innymi słowy chodzi tutaj o liczby z ułamkiem dziesiętnym. Trzeci typ danych to typ tekstowy. Przeznaczony jest do reprezentowania ciągu znaków w fizycznie ciągłej tablicy. Maksymalna długośd słowa/zdania wynosi 255 znaków. 27\n28 Należy dodatkowo zaznaczyd, że ciąg znaków nie musi ograniczad się tylko do jednej linii tekstu. Możliwe jest podzielenie tekstu na kilka linii. Służy do tego znak kooca linii /n. Ostatnim prezentowanym typem jest typ logiczny bool. Chodzi tutaj o dwuwartościową zmienną logiczną przyjmującą wartości prawda/fałsz (true oraz false). Typ ten najczęściej stosowany jest do sprawdzenia, czy spełnione zostało dane założenie. Złożone instrukcje sprowadzane są do prostego pytania:tak/nie. W zależności od tego, czy udało się spełnid postawiony warunek, czy też nie, wykonywane są inne bloki instrukcji. 2.4 OPERACJE NA ZMIENNYCH Zarówno proste, jak i złożone operacje na zmiennych możliwe są po uprzednim ich zdefiniowaniu i określeniu typu. Przykładowo, prosta operacja dodawania liczb całkowitych widoczna jest poniżej: W tym wypadku instrukcja dwuargumentowa może zostad wykonana po wcześniejszym podaniu nazw dwóch zmiennych typu int. Na szczególną uwagę zasługują tutaj dwie linie służące do wypisania danych na ekran. MessageBox(...) to funkcja (więcej o funkcjach w kolejnym rozdziale), której parametrem jest łaocuch. Niestety typ int nie jest w tym wypadku uznany za łaocuch. Istnieją jednak metody służące przekształceniu jednego typu w inny - chodzi tutaj o funkcje konwersji. DoubleToStr(...) to funkcja pozwalająca na właśnie taką konwersję, gdzie na wejście funkcji przekazywany jest parametr int, natomiast na wyjście - zmienna łaocuchowa. W kolejnej linii natomiast zastosowana jest funkcja Alert(...), która 28\n29 otrzymuje dowolną zmienną łaocuchową, która następnie wypisana jest na ekran. W języku MQL obowiązują wszystkie znane z matematyki zależności i priorytety operatorów. Przykładowo, mnożenie jest instrukcją dwuargumentową, więc wymagane jest podanie dwóch wartości o tym samym typie. Oczywiście operacje mnożenia mają priorytet równy dzieleniu, dodawanie ma priorytet niższy, a wyrażenia w nawiasach mają priorytet najwyższy. Poza wymienionymi operacjami dwuargumentowymi jest też kilka operacji jednoargumentowych, których działanie może nie byd tak oczywiste. Przykładowo, w MQL dostępny jest operator zmiany znaku, który pozwala zmienid znak zmiennej na przeciwny (nie należy mylid tego operatora z dwuargumentowym odejmowaniem). Oczywiście operacje na zmiennych najczęściej kooczą się na przypisaniu, czyli wpisaniu nowej wartości danej zmiennej, do jednej ze zmiennych już istniejących. Przypisanie określane jest przy pomocy znaku rówości. Znak = może byd w tym przypadku interpretowany jako: "od teraz wartośd zmiennej jest równa...". Jednym z najczęściej popełnianych na początku błędów jest zamiana znaku równości na znak przypisania. Znak równości opisany zostanie dokładnie w następnym podrozdziale dotyczącym operatorów relacji. Możliwe jest też zastosowanie pewnego uproszczenia w kodzie, gdzie dwuargumentowe operacje matematyczne łączone są w jednej instrukcji z przypisaniem. Jest to pewne uproszczenie niepolecane początkującym programistom. Zwłaszcza na początku lepiej przygotowad programy nieco dłuższe i przejrzyste. 29\n30 2.5 OPERATOR WARUNKOWY Operator warunkowy jest jedną z podstawowych konstrukcji właściwie w każdym języku programowania. Opisane dotychczas przykłady instrukcji prostych, instrukcji blokowych i operatorów opisują prosty, liniowy kod. Operator warunkowy IF pozwala na wprowadzenie rozgałęzienia w kodzie: gdzie w zależności od podjętej decyzji (decyzji użytkownika, lub też decyzji ustalonej na podstawie innych zmiennych) możliwe jest wykonanie, lub też pominięcie pewnych fragmentów kodu. W języku MQL najczęściej stosowane w operatorze IF typy zmiennych to int oraz bool. Zmienna boolowska wydaje się w tym przypadku naturalna: przyjmuje dwie wartości oraz możliwe jest wykonanie dwóch odmiennych fragmentów kodu. Rozwinięciem operatora IF jest operator IF - ELSE. Pozwala on na tworzenie znacznie bardziej rozbudowanych programów, gdzie 30\n31 możliwośd opcji do wyboru zależy od liczby dodatkowych warunków: Ciekawe możliwości daje również zagnieżdżanie operatorów, gdzie przy spełnieniu warunku pojawia się następny warunek - warunek zagnieżdżony: Jednym z najpopularniejszych przykładów dotyczących wyrażenia IF ELSE jest problem wyznaczania pierwiastków równania kwadratowego, gdzie w zależności od wartości delta równanie posiada jeden, dwa lub nie posiada żadnych miejsc zerowych. 31\n32 2.6 OPERATORY RELACJI Operatory relacji pozwalają łączyd proste warunki w instrukcji IF w bardziej złożone wyrażenia. Przykładowo, zamiast stosowad zagnieżdżonych wyrażeo IF, możliwe jest połączenie jest ich w jedną instrukcję: Wszystkie dostępne w MQL operatory relacji przedstawione zostały poniżej: == równy;!= różny; < mniejszy; 32\n33 > większy; <= mniejszy lub równy; >= większy lub równy. Szczególnie istotny jest tutaj operator równości ==, który nierzadko mylony jest z operatorem przypisania. 2.7 PĘTLE Oprócz instrukcji warunkowej IF, konieczne jest również zapoznanie się z zagadnieniem pętli. Są to instrukcje pozwalające na wykonywanie pojedynczej instrukcji, lub też całego bloku instrukcji określoną liczbę razy. Prosty schemat blokowy pętli przedstawiony został poniżej: Pętle stosowane są najczęściej do przeglądu pewnego zbioru wartości, np. tablic (więcej o tablicach w dalszych rozdziałach). Innym popularnym zastosowaniem pętli jest wielokrotne wykonanie powtarzającej się instrukcji. Przedstawiona powyżej pętla FOR składa się części sterującej pętlą oraz bloku instrukcji. W 33\n34 części sterującej wymagane jest określenie warunku początkowego pętli, czyli wartości, od jakiej zaczyna się odliczanie (np. od 0 do 100, lub od 10 do 1). Drugi element to właśnie wartośd koocowa pętli. Wreszcie ostatnia częśd to wartośd, o jaką zmienia się pętla przy każdym przejściu przez blok instrukcji. Interesujący jest tutaj ostatni element pętli FOR, w tym przypadku jest to dekrementacja. Operacja dekrementacji w każdym przebiegu pętli to odjęcie wartości 1 od zmiennej sterującej pętlą. Istnieje też odpowienik dekrementacji dla zwiększania wartości zmiennej o 1: jest to inkrementacja. Drugi rodzaj pętli dostępny w MQL to pętla WHILE. Stosowana najczęściej w przypadku, gdy nie jest znana dokładna liczba powtórzeo pętli a blok kodu wykonywany jest aż do spełnienia zadanego warunku. Przykładowo: Dodatkowe elementy pomocne przy sterowaniu pętlą to instrukcje break oraz continue. W przypadku pierwszej z nich chodzi o przerwanie wykonywania pętli w momencie wystąpienia określonego warunku. Przykładowo, w pętli dana wartośd dzielona 34\n35 jest przez kolejne liczby, jednak w przypadku dzielenia przez zero wybrana wartośd jest pomijana. Instrukcją zbliżoną do continue jest break. Zasadnicza różnica polega jednak na tym, iż break natychmiast przerywa wykonywanie pętli, w której jest zawarta. W powyższym kodzie kolejne iteracje pętli są wykonywane, do momentu spełnienia warunku, czyli znalezienia takiej wartości pętli, która jest podzielna przez 17 - w tej sytuacji dalsze przebiegi pętli są zaniechane i następuje wykonanie pozostałej części kodu. 35\n36 2.8 PRZYKŁADY 1. Napisz program, który dla dwóch zmiennych typu double realizuje operacje dodawania, odejmowania, mnożenia oraz dzielenia. 2.Napisz program realizujący operację mnożenia liczb rzeczywistych, dodawania łaocuchów i przypisania dla wartości bool. 3. Napisz program, w którym podane są 3 zmienne: int oraz dwie zmienne double. Zmienna int może przyjmowad wartości 1,2 lub 3. Każda inna wartośd skutkuje komunikatem "Błąd". W przypadku, gdy wartośd int jest równa 1, na zmiennych double realizowana jest operacja dodawania. Dla int równego dwa: operacja odejmowania. Dla zmiennej 3: do pierwszej zmiennej przypisana jest wartośd zmiennej drugiej i na odwrót. POMOC: do wyświetlenia komunikatu użyj funkcji MessageBox. Do przepisania zmiennych wprowadź zmienną pomocniczą. 4. Napisz program, który wypisuje na ekran sumę liczb od 1 do 50, wypisuje liczbę elementów podzielnych przez 2 oraz liczbę elementów podzielnych przez Napisz program, który wypisuje, ile liczb niepodzielnych przez 2, 3 i 5 znajduje się w przedziale zadanym przez użytkownika. 6. Napisz program, który wypisuje trójkąt prostokątny z gwiazdek. 3. FUNKCJE I ELEMENTY DEBUGOWANIA MQL jest językiem proceduralnym, gdzie pewne fragmenty kodu powinny tworzyd jedną całośd. Takie elementy określane są jako funkcje. Dwie podstawowe przesłanki do tworzenia bloków kodu to: spójnośd kodu. W przypadku funkcji całe bloki instrukcji wywoływane są przy pomocy jednej linii kodu, co znacznie wpływa na jego bezpieczeostwo. Liczba miejsc, w których programista może popełnid błąd jest istotnie ograniczona. powtarzające się fragmenty. W przypadku stałych i często powtarzających się bloków instrukcji działaniem 36\n37 pożądanym jest w tym przypadku zamknięcie ich w funkcji i następnie jej wywoływanie. Ogranicza to nadmiarowośd kodu i wpływa pozytywnie na jego czytelnośd. Jednym z ciekawszych przykładów zastosowania funkcji w pisaniu strategii automatycznych jest wyszukiwanie formacji na wykresie. Metody te opisane zostaną w późniejszych rozdziałach. Warto również stosowad jednolitą konwencję nazwową, która pozwoli bez problemu w przyszłości modyfikowad wybrane fragmenty kodu. Przykładowy fragment programu: Wskazane zostały tutaj dwie metody nazywania zmiennych. Pierwsza, określana jako notacja węgierska, to sposób zapisu, w ktorej nazwa zmiennej poprzedzona jest pierwszą literą jej typu. Z kolei notacja wielbłądzia zakłada, iż pojedyncza zmienna może składad się z kilku połączonych słów, gdzie każde z nich pisane jest z dużej litery. Dodatkowo pierwsza litera nazwy zmiennej pisana jest z małej litery, natomiast nazwa funkcji rozpoczyna się wielką literą. 3.1 DEFINICJA FUNKCJI Lista parametrów to zmienne przekazywane do wnętrza funkcji stosowane przy obliczeniach. W pewnych sytuacjach lista parametrów jest pusta, a wszystkie obliczenia odbywają się tylko na zmiennych wewnątrz funkcji. Kolejnym istotnym elementem jest 37\n38 udostępniany typ. Każda funkcja po zakooczeniu swojego działania oddaje sterowanie do miejsca, w którym została wywołana. W miejscu powrotu do głównej części programu możliwe jest odczytanie wartości zwracanego typu. W pewnych sytuacjach zwracanym typem jest void, czyli typ pusty. Można to interpretowad, jako fragment kodu, który nie przekazuje dalej żadnej wartości: Na powyższym przykładzie widad fragment programu, do którego przekazane zostają dwa parametry, a jedynym efektem jego działania jest wypisanie na ekran pewnych informacji. Zamiast stosowad kilka linii kodu zawsze, kiedy na ekran podawana jest identyczna informacja - warto taki kod przekształcid w funkcję. Dzięki temu możliwe jest wywołanie jej po raz kolejny, jednak z innymi parametrami. Dobrym zwyczajem jest także określenie udostępnianego przez funkcję typu jako int. 38\n39 Wartośd zero na wyjściu funkcji oznacza brak błędów. Każda inna wartośd może byd kodem błędu. Nieco bardziej złożonym zagadnieniem są same konwencje nazwowe, a także typy udostępniane przez funkcję. Nazwa funkcji powinna byd w miarę krótka i co ważniejsze - przejrzysta. Już po nazwie i po liście parametrów, użytkownik powinien byd w stanie określid, jakie jest ogólne przeznaczenie takiego fragmentu kodu. 3.2 FUNKCJE WBUDOWANE MQL 4 predefiniuje trzy funkcje specjalne, są to funkcje o identyfikatorach: init(), start() oraz deinit(). Funkcja init() udostępnia wartośd typu prostego i może zostad zdefiniowana z listą parametrów. Natychmiast po uruchomieniu programu (przez dodanie go do wykresu i uruchomienie strategii), program rozpoczyna pracę od predefiniowanej funkcji init() - o ile jej ciało jest zdefiniowane. Fragment ten pełni niejako funkcję konstruktora, gdzie np. ustalane są wartości najważniejszych zmiennych (ustalanie ścieżek na dysku, typu wykresu, na jakim odbywa się handel). Funkcja init() wywoływana jest tylko raz: po uruchomieniu programu. 39\n40 Natomiast w trakcie pojawiania się nowych danych giełdowych wywoływana jest funkcja start(). Jest to najważniejsza funkcja w całej strategii - zawiera wszystkie funkcje dodatkowe związane z obliczeniami i ruchami cenowymi na wykresie. W funkcji start() mogą na przykład znaleźd się fragmenty kodu odpowiedzialne za wyszukiwanie formacji świecowych na wykresie, wyszukiwanie przecięd średnich, czy też informujące o poziomie wyprzedania instrumentu. Funkcja start() wywoływana jest dla każdego napływającego odczytu (nie dla każdej nowej świecy). Oznacza to, że przy szczególnie złożonych systemach pewne odczyty mogą nie zostad przeanalizowane. W przypadku, gdy funkcja analizuje poprzednie notowania, wtedy nowe notowanie jest pomijane przez program (funkcja uruchomiona zostaje ponownie w momencie zakooczenia poprzedniej analizy). Narzuca to pewne ograniczenia na użytkownika - funkcja powinna byd w miarę prosta, a cały kod powinien byd optymalny (bez zbędnych powtórzeo i niepotrzebnych, dodatkowych wywołao). Każdy program dołączony do wykresu kooczy pracę przez wywołanie predefiniowanej funkcji deinit() (o ile jest ona zdefiniowana). 40\n41 Funkcja ta wywoływana jest automatycznie przed zamknięciem skryptu, programu skojarzonego z wykresem, samego wykresu, wyłączenia terminala, przed zmianą okna czasowego, zmianą parametrów i zmianą konta. Funkcje init() oraz deinit() są tutaj opcjonalne, jednak warto dodad chociaż krótką informację o przebiegu działania programu. 3.3 DEBUGOWANIE KODU Niestety jednym z poważniejszych problemów przy pisaniu strategii automatycznych w MQL 4 jest brak debuggera, czyli tzw. "odpluskwiacza". Jest to program umożliwiający śledzenie na bieżąco zmian w programie w trakcie jego wykonywania. Brak takiego narzędzia jest szczególnie odczuwalny przy analizie złożonych programów, gdzie błędy są bardzo trudne do zlokalizowania. Poniżej przedstawiony zostanie jeden ze sposobów na radzenie sobie z wyszukiwaniem błędów w kodzie. 41\n42 Po pierwsze oczywiście, należy starad się ograniczad liczbę błędów - głównie poprzez pisanie przejrzystych fragmentów kodu, które najlepiej na bieżąco testowad. Należy zacząd od tego, że spora ich częśd to np. łatwe do znalezienia błędy składni. W takiej sytuacji wystarczy spojrzed na okno "Błędy", odczytad i przeanalizowad informację. Należy mied jednak świadomośd, że najpoważniejsze błędy, to tak zwane błędy logiczne: kiedy to sam program działa bez zarzutu, jednak sygnały kupna/sprzedaży płynące do nas z systemu nie pokrywają się z rzeczywistością. W tym miejscu warto sprawdzid, czy opracowany system "ma szansę w ogóle działad". Innymi słowy, czy na wykresie można wskazad moment, w którym system powinien dad sygnał, a jeżeli tak, to co było przyczyną braku takiego sygnału. Okazuje się, że funkcja Alert() pełni tutaj bardzo istotną rolę. Jest to jedna z funkcji wbudowanych, która pozwala wypisad dowolny tekst na ekran (alternatywą może byd funkcja MessageBox()). Przyczyną braku sygnału może byd niewłaściwa interpetacja sygnału płynącego z danej pary walutowej. W tym miejscu warto mied pod ręką szczegółowy opis funkcji generującej sygnał wraz z danymi, jakie powinna ona udostępniad. Przekazując wartośd udostępnianą do funkcji Alert(), można sprawdzid, co było rezultatem działania fragmentu programu (jednocześnie porównując wynik z wartością, której oczekiwano na wyjściu). 42\n43 Analiza wszystkich funkcji pozwala wskazad fragment programu generujący błędne sygnały. Badanie poszczególnych fragmentów wewnątrz funkcji umożliwi określenie konkretnych linii kodu, które są przyczyną błędu. Oczywiście w pewnych sytuacjach już na etapie wstępnej analizy kodu może okazad się, że funkcja generująca sygnał jest zbudowana błędnie. Opisany powyżej proces debugowania może wydad się uciążliwy, jednak przy odrobinie praktyki pozwala wyeliminowad właściwie 100% błędów w programie. Na koniec należy wspomnied o dośd istotnej kwestii: mianowicie korekty kodu przy użyciu wspomnianej metody możliwe są tylko w godzinach, kiedy rynek walutowy nie jest zamknięty. 3.4 PRZYKŁADY 1. Napisz funkcję, która jako parametr dostaje napis, a na wyjściu udostępnia liczbę samogłosek w łaocuchu. 2. Napisz funkcję, która jako parametr dostaje napis, a na wyjściu udostępnia odpowiednio zakodowany napis. Np. a + 3 = d, c + 2 = e, y + 2 = a. Drugim parametrem funkcji jest wartośd o jaką następuje przesunięcie. 3. Napisz funkcję, która jako parametr otrzymuje dwa łaocuchy znaków, a na wyjściu udostępnia jeden łaocuch, który zawiera na zmianę znaki z dwóch powyższych. 43\n44 4. Napisz program, który zlicza odczyty danych z wykresu i podaje ich liczbę w funkcji. 5. Napisz program, który w funkcji init() ustawia wartośd pewnej zmiennej double na wartośd Dla każdego odczytu sprawdza jego numer: jeżeli odczyt jest podzielny przez 7, to od zmiennej z początku odejmuje 5.3, w przeciwnym wypadku dodaje 0.2. Wartośd ta wyświetlana jest dla każdego odczytu podzielnego przez STRUKTURY DANYCH I FUNKCJE MATEMATYCZNE W rozdziale drugim przedstawione zostały fundamentalne typy danych. Należy jednak zauważyd, że wszystkie narzędzia służące interpretacji kursu par walutowych opierają się na okresach obejmujących minimum kilka świec. Stąd oczywiście prosty wniosek, iż potrzebne są struktury danych umożliwiające przechowywanie tych wartości w jednym miejscu tak, aby były one ze sobą logicznie powiązane. W tym celu stosowane są właśnie tablice jedno oraz wielowymiarowe. Dodatkowo, do przetwarzania tablic często stosuje się funkcje matematyczne, których pewien zbiór dostępny jest w języku MQL. Oczywiście w dośd prosty sposób można opracowad własne funkcje matematyczne. 4.1 TABLICE JEDNOWYMIAROWE Każda zdefiniowana w programie tablica posiada typ. Możliwe jest tworzenie tablic o dowolnym typie podstawowym (np. integer, double czy bool). Większośd danych na wykresie prezentowana jest w formie jednowymiarowej tablicy typu double, gdzie każdy element odpowiada jednemu odczytowi. 44\n45 Elementy każdej tablicy w programie numerowane są od zera. Przykładowo, 10-elementowa tablica indeksowana jest numerami 0 - pierwszy element tablicy, aż do 9 - ostatni element tablicy. Oczywiście możliwe jest przechowywanie wszystkich istotnych wartości w pojedynczych zmiennych, jednak przykładowo dla zwykłej świecy japooskiej potrzeba aż 4 wartości: otwarcie, zamknięcie, minimum oraz maksimum. Każda następna świeca, to kolejne wartości. W MQL 4 dostępne są 4 tablice jednowymiarowe wartości double przechowujące powyższe wartości świec: Open - tablica przechowująca wartości otwarcia kolejnych świec, Close - tablica z wartościami zamknięcia, High - wartości maksymalne dla świec, Low - wartości minimalne dla świec. Powyższe predefiniowane zmienne w oczywisty sposób ułatwiają wszelkie możliwe analizy danych. 45\n46 Do skutecznego stosowania tablic wymagane jest również opanowanie kilku prostych funkcji. Jedną z najważniejszych jest ArraySize(...), jako parametr przyjmuje dowolną tablicę, natomiast udostępnia jej liczbę elementów. Należy zdad sobie sprawę, że bardzo często dokładna liczba elementów tablicy nie jest znana. Możliwe jest jednak wywołanie funkcji, której parametrem jest dowolna tablica, a udostępnianą wartością właśnie jej liczba elementów. Połączenie ArraySize(...) z pętlą FOR pozwala na przegląd dowolnej struktury w zaledwie kilku krokach. Przy pomocy ArraySize(...) w prosty sposób można określid też, czy w tablicy przechowywana jest parzysta liczba elementów. Inną użyteczną funkcją jest ArrayMinimum(...), która udostępnia element minimalny w tablicy przekazywanej jako parametr. Możliwe jest napisanie własnej wersji opisywanej funkcji, która udostępnia minimum z tablicy z przedziału zadanego jako parametr. 46\n47 Kolejną ciekawą funkcją jest ArrayInitialize(...), która ustala wartości tablicy według zadanego parametru. Można jednak przygotowad własną wersję funkcji, która wypełnia tablicę wartościami losowymi z zadanego przedziału. Przykład taki przestawiony zostanie podczas opisu funkcji matematycznych w dalszej części tego rozdziału. 4.2 TABLICE WIELOWYMIAROWE Oprócz zwykłych, jednowymiarowych tablic, możliwe jest też stosowanie tablic wielowymiarowych. Tablica dwuwymiarowa interpretowana jest jako struktura posiadająca określoną liczbę wierszy i kolumn. Pojedyncze wartości znajdują się na przecięciu wierszy i kolumn. Analogicznie, tablica trójwymiarowa posiada również trzeci wymiar, a każdy z elementów znajduje się na przecięciu wszystkich trzech wymiarów. 47\n48 O ile bez tablic jednowymiarowych, przygotowanie jakiejkolwiek strategii jest praktycznie niemożliwe, to stosowanie struktur wielowymiarowych można zastąpid odpowiednią liczbą elementów jednowymiarowych. 4.3 FUNKCJE MATEMATYCZNE W MQL 4 dostępny jest szereg funkcji matematycznych pozwalających znacznie uprościd obliczenia. Dla osób niezwiązanych z programowaniem, nieco dziwny może byd brak operatora potęgowania. Oczywiście proste obliczenia można wykonad przy pomocy wielokrotnego mnożenia, jednak dla formuł, w których w 48\n49 wykładniku potęgi jest duża liczba warto zastosowad funkcję MathPow(...): Podobna sytuacja występuje przy pierwiastkowaniu wartości, kiedy to należy skorzystad z funkcji MathSqrt(...). Jedną z funkcji stanowi wbudowany w MQL 4 generator liczb pseudolosowych (platforma MetaTrader nie posiada rzeczywistego generatora liczb losowych). W połączeniu z funkcjami tablicowymi, można przygotowad wiele interesujących struktur. Wreszcie jedną z najważniejszych funkcji jest MathAbs(...), która pozwala obliczyd wartośd bezwzględną dowolnego wyrażenia. Należy zdad sobie sprawę, jak istotna jest to funkcja w kontekście analizy danych giełdowych. Nierzadko dochodzi do sytuacji, że wymagane jest obliczenie ruchu ceny w dwie strony, czyli po prostu zasięgu ceny. Dzięki funkcji MathAbs(...) możliwe jest obliczenie różnicy pomiędzy dwoma wartościami bez względu na to, która z nich jest większa. 49\n50 Charakterystyczną cechą wbudowanych funkcji matematycznych (podobnie zresztą jak innych typów funkcji w MQL 4) jest ich spójna definicja. Każda z nich posiada nazwę zaczynającą się od "Math...", następnie do nazwy dołączona jest nazwa właściwa, np. "Pow" - potęga (ang. Power). Wartością udostępnianą jest double. 4.4 BUDOWA WŁASNEJ FUNKCJI MATEMATYCZNEJ Pomimo licznych funkcji wbudowanych, często okazuje się, że kodu potrzebnego użytkownikowi w danej strategii niestety nie ma wśród elementów języka MQL 4. W takiej sytuacji możliwe są dwa wyjścia: opracowanie własnej funkcji wykorzystującej jedną (lub kilka) funkcji wbudowanych. Zabieg taki wydaje się dużo prostszy z punktu widzenia użytkownika i często wymaga tylko kilku dodatkowych linii kodu. Niestety w MQL 4 nie ma możliwości tzw. przeciążania, co ma miejsce w językach obiektowych i pozwala dosd prosto zmodyfikowad kod istniejących funkcji. drugim rozwiązaniem jest zaprojektowanie i napisanie własnej funkcji matematycznej od początku. Jest to zadanie znacznie trudniejsze, ponieważ trzeba dokładnie wiedzied, jak działa funkcja wbudowana, lub też wymyślid własne rozwiązanie. Funkcja do wyszukiwania elementu minimalnego przedstawiona została poniżej. 50\n51 Funkcja udostępniająca drugi od kooca element minimalny (z zastosowaniem funkcji Min(...)) przedstawiona została poniżej. 4.5 PRZYKŁADY 1. Napisz funkcję sortującą i wypisującą na ekran kolejne elementy tablicy. 2. Napisz własną wersję funkcji ArrayMin(...), która dla podanej tablicy udostępnia wartośd minimalną. 3. Napisz funkcję, która jako parametr dostaje dwie liczby: przedziały oraz trzeci: tablicę. Funkcja wypełnia określony fragment tablicy elementami losowymi. Fragment tablicy zadany jest swoma 51\n52 pierwszymi argumentami. Na koocu funkcja udostępnia sumę tych elementów tablicy. 4. Napisz program, który 4 tablice: Open, Close, Low oraz High przepisuje do tablicy dwuwymiarowej, gdzie każdy wiersz tablicy to odpowiednio tablice Open, Close, Low oraz High powiększone o 1 puste pole. Na ostatnim elemencie wpisane zostanie maksimum z każdego wiersza. Napisz również funkcję, która udostępnia iloczyn elementów znajdujących się na ostatnich polach każdego wiersza. 5. Napisz funkcję, która nie przyjmuje żadnych parametrów. Wewnątrz funkcji tworzona jest trójwymiarowa tablica 5x5x5 inicjalizowana elementami losowymi. Następnie wyzerowane powinny zostad elementy znajdujące się na środku każdego wymiaru oprócz środka tablicy (element 3x3x3). Wszystkie pozostałe, parzyste elementy tablicy powinny zostad do siebie dodane, a uzyskana wartośd udostępniona na wyjściu funkcji. 5. ZMIENNE PREDEFINIOWANE W poprzednim rozdziale opisany został szereg podstawowych funkcji wbudowanych w MQL 4 ułatwiających pracę z danymi. Należy jednak pamiętad, że podstawowym zadaniem strategii automatycznych i systemów ekspertowych w handlu walutowym jest śledzenie w czasie rzeczywistym danych napływających z rynku. Jednocześnie w tworzonym programie muszą znaleźd się informacje o typach realizowanych zleceo (zlecenia krótkie i zlecenia długie) a także o instrumencie. Możliwe jest opracowanie systemu grającego tylko na parze walutowej EURUSD - jednak od programisty wymagane jest, aby ta informacja podana była jawnie w kodzie. Podobnie wygląda sytuacja z oknem czasowym, na jakim może odbywad się handel. Do poprawnego działania systemu należy określid, czy strategia działa dla dowolnych danych, czy np. tylko na wykresie czterogodzinnym. Są to informacje dla tradera dośd oczywiste i nie zwraca się na nie uwagi. Niestety 52\n53 strategie automatyczne rządzą się swoimi prawami i wymagają opracowania szeregu dodatkowych założeo. 5.1 ŚWIECE JAPOŃSKIE A ZMIENNE PREDEFINIOWANE Świece japooskie w MQL to tablice wartości double, gdzie każdy z elementów tablicy odpowiada jednej świecy. Jest to zasadnicza różnica pomiędzy interpretacją wykresów przez użytkownika, gdzie świece i formacje świecowe po prostu "widad" a świecami w kodzie. Każda, nawet najprostsza formacja świecowa musi zostad opisana szeregiem warunków, aby można było ją w prosty sposób wskazad w tablicach Open, Close, High oraz Low. Pewnym ułatwieniem jest tutaj zależnośd, że np. wartośd otwarcia 5 świecy znajduje się w tablicy Open na 5 miejscu (czyli Open - indeksy od zera), a wartośd zamknięcia w tablicy Close również na 5 miejscu. Dzięki temu w prosty sposób można odróżnid świece wzrostowe oraz spadkowe: Długie cienie świecy, to nic innego jak sytuacja, kiedy wartości skrajne oddalone są dośd wyraźnie od wartości otwarcia/zamknięcia świecy. Dla kilku świec o długich cieniach u góry można wysnud hipotezę, iż cena instrumentu napotkała pewien opór. Do opisania sytuacji w programie należy sprawdzid długośd cieni kilku ostatnich świec. 53\n54 Oczywiście bardziej złożone analizy wymagają większej liczby warunków opisujących nawet pojedynczą świecę. Dodatkowo należy pamiętad o istotnej zależności: duża liczba warunków wpływa negatywnie na liczbę generowanych sygnałów. Sygnały są pewniejsze, jednak jest ich dużo mniej. W przypadku strategii automatycznej użytkownik stawia przede wszystkim na skutecznośd systemu. Dla systemu ekspertowego duża liczba sygnałów (z których częśd osoba obserwująca rynek może na bieżąco odrzucid) może wydad się znacznie trafniejszym rozwiązaniem. 5.2 ZMIENNE BID I ASK Dwie zmienne predefiniowane określające aktualne ceny instrumentów. Ask określa ostatnio znaną cenę dla kupującego, po której aktualny instrument jest oferowany. Kurs Ask jest zawsze wyższy od kursu Bid. Pamiętad należy o zasadzie, że długa pozycja, czyli zakup instrumentu takiego jak pary walutowe, indeksu czy surowca dokonywana jest po cenie Ask, czyli po cenie wyższej. Z kolei Bid określa ostatnio znaną cenę oferowaną przez kupującego dla sprzedającego na aktualnym instrumencie. Kurs Bid jest zawsze niższy od kursu Ask. Powyższe wartości są ważne w szczególności dla strategii automatycznych, w których ustalana jest cena dla zajęcia pozycji. 54\n55 Przy każdym odczycie możliwe jest sprawdzenie aktualnej wartości Bid lub Ask oraz porównanie tych wartości z ustaloną wcześniej ceną. Kolejnym zastosowaniem wspomnianych zmiennych jest szacowanie wartości Stop Loss oraz Take Profit podczas składania zlecenia. W momencie pojawienia się dogodnego sygnału do zajęcia pozycji sprawdzana jest aktualna cena wybranego instrumentu. Następnie ustalany jest poziom Stop Loss - np. na podstawie wskaźnika ATR (więcej o tej metodzie w rozdziale 7), lub też na podstawie wcześniej ustalonej wartości. 5.3 FUNKCJE SYMBOL() I PERIOD() Funkcje Symbol() oraz Period() związane są z problemem opisanym na początku tego rozdziału. Chodzi tutaj o automatyczny handel na z góry założonych instrumentach oraz na określonym oknie czasowym. Funkcja Symbol() udostępnia zmienną łaocuchową (String), która opisuje instrument na aktualnym wykresie. Jednym z podstawowych zastosowao funkcji Symbol() może byd tutaj sprawdzenie, jakiej wartości jest równy jeden pips. 55\n56 Popularnym zabiegiem jest też opracowanie oddzielnych funkcji generujących sygnały dla par walutowych. Przykładowo, jeżeli aktualnie wybranym wykresem jest EURUSD, wtedy wywoływane są funkcje związane ze średnimi kroczącymi. Natomiast w przypadku par z jenem mogą to byd funkcje generujące sygnały oparte na oscylatorach. 56\n57 Drugą wspomnianą funkcją jest tutaj Period(), czyli sprawdzenie, jakie okno czasowe jest aktualnie wybrane na danym wykresie. Należy przy tym pamiętad, iż wartości udostępniane przez tę funkcję podawane są w minutach: przykładowo dla wykresów godzinnych wartośd funkcji Period() wynosi 60. Najczęściej opracowane systemy automatyczne wymagają konkretnego okna czasowego, na którym strategia działa najlepiej. Przykładowo, strategie oparte o skalpowanie mogą sprawdzad się bardzo dobrze dla wykresu 5 - minutowego, a dla 30 - minutowych nie działad. 5.4 PROSTY SYSTEM TRANSAKCYJNY Przy tworzeniu prostego systemu transakcyjnego, który informuje użytkownika o punkcie wejścia na rynek należy brad pod uwagę kilka czynników. Przede wszystkim sytuacja wejścia na rynek powinna zostad dokładnie opisana. Użytkownik powinien np. w punktach wskazad najistotniejsze elementy strategii: 1. Strategia dla instrumentu EURUSD na oknie czasowym minimum 15 minut; 2. Tylko pozycje krótkie; 3. Wystąpienie świecy wzrostowej o długim korpusie; 4. Długie cienie nad świecą; 5. Korekta kursu do około połowy wartości długiej świecy wzrostowej. 57\n58 Na tym etapie można stworzyd szkielet programu, lub od razu przejśd do kodowania: Podczas przygotowania nawet najprostszego systemu konieczne jest jego gruntowne przetestowanie. W przypadku strategii automatycznych służy do tego wbudowany tester strategii, z kolei w przypadku systemów ekspertowych niezbędne jest ciągłe śledzenie sygnałów generowanych przez program. Należy oczywiście założyd, że konieczne będzie również przeprowadzenie procesu debugowania (opisanego szerzej w rozdziale 3) a także wprowadzenie modyfikacji kodu. 5.5 PRZYKŁADY 1. Napisz program, który oblicza liczbę świec wzrostowych oraz spadkowych dla ostatnich 50 świec, a także informuje, czy pojawiły się na wykresie świece Doji. 2. Napisz program, który działa tylko na wykresie 15 - minutowym na parze EURUSD i informuje użytkownika o pojawieniu się tylko nowej świecy. Dodatkowo podawana jest informacja, która świeca z kolei została odczytana podczas działania programu. 58\n59 3. Napisz program, który dla aktywnego instrumentu oblicza spread. Następnie dodaje go do TP oraz odejmuje od SL. Wartości TP oraz SL powinny zostad podane z menu. Dodatkowo, w opcjach powinna byd możliwośd wybrania opcji zlecenia: kupno oraz sprzedaż. Dla kupna TP > SL, dla sprzedaży TP < SL. Pomoc: skorzystaj ze zmiennych extern. 4. Napisz program, który dla dowolnej pary z jenem oblicza liczbę pipsów o jakie zmienił się kurs pary w ciągu ostatnich n odczytów świecy (dla dowolnego wykresu o oknie czasowym mniejszym od godziny) - n jest liczbą świec braną pod uwagę. 5. Napisz program, w którego menu podawana jest oczekiwana liczba pipsów zysku. Następnie program sprawdza liczbę świec wzrostowych oraz spadkowych w ciągu ostatnich 50 odczytów. Następnie obliczany jest średni wzrost dla jednej świecy. Wreszcie podawana jest szacowana liczba odczytów, po których osiągnięty zostanie założony zysk. 6. FUNKCJE DODATKOWE Oprócz licznych funkcji i zmiennych predefiniowanych w poprzednich rozdziałach, w języku MQL 4 jest też ogromna liczba funkcji związanych z zarządzaniem kontem, funkcji daty i czasu a także pozwalających na handel na innych instrumentach niż aktualnie wyświetlony. Opisywane w tym rozdziale funkcje z jednej strony nie są kluczowym elementem strategii automatycznych - stanowią tylko ich dopełnienie. Z drugiej jednak strony poznanie ich w znacznym stopniu ułatwi tworzenie programów automatycznych, które pozwalają ograniczyd funkcję użytkownika do minimum. 6.1 FUNKCJE DO ZARZĄDZANIA KONTEM Pierwszą grupę stanowią funkcje do zarządzania kontem. Przy realizacji większości transakcji jedną z ważniejszych wartości (z punktu widzenia użytkownika) jest wielkośd dostępnego kapitału. Oczywiście podczas handlu każdy z użytkowników konta sam 59\n60 dobiera wielkośd zlecenia i szacuje ryzyko. W wypadku strategii automatycznych nawet ogólne określenie poziomu ryzyka jest często niemożliwe, a jednym z podstawowych narzędzi jest w tym wypadku funkcja AccountFreeMargin(...), która sprawdza liczbę dostępnych na koncie środków. Obok wspomnianej funkcji kolejnym istotnym elementem jest AccountFreeMarginCheck(...), czyli funkcja sprawdzająca wartośd środków na koncie po złożeniu zlecenia podanego jako parametr. Zabieg taki umożliwia np. zablokowanie możliwości wykonywania dalszych transakcji po przekroczeniu pewnej kwoty na koncie. Powyższe funkcje stosowane są przede wszystkim podczas strategii automatycznych, gdzie do programu należy każdy aspekt 60\n61 handlu: od wyznaczenia potencjalnego poziomu wejścia na rynek, poprzez ustalenie parametrów zlecenia, złożenie zlecenia, jego zarządzanie a także zamknięcie. W przypadku systemów ekspertowych możliwe jest pominięcie stosowania powyższych funkcji, jednak to do użytkownika należy decyzja, do jakiego stopnia jest skłonny oddad sterowanie handlem do programu. Drugą grupę funkcji związanych z handlem stanowią elementy takie jak AccountCompany(), czy AccountNumber(). W pierwszej chwili może wydawad się, że ich zastosowanie w handlu jest znikome, jeżeli jednak użytkownik przygotowuje program dedykowany dla konkretnego konta, użytkownika, bądź też działający tylko u danego brokera, wtedy dobrze jest sprawdzid wartości takie, jak numer konta. Pozwoli to ograniczyd dostęp do strategii osobom nieupoważnionym. 6.2 FUNKCJE DATY I CZASU W systemach transakcyjnych, jednym z pomijanych elementów jest analiza fundamentalna. W prostym systemie automatycznym nie jest możliwa dynamiczna analiza napływających danych. Należy jednak pamiętad, że obecnie większośd serwisów związanych z rynkiem podaje istotne informacje o ważnych 61\n62 wydarzeniach na cały tydzieo. Dzięki temu możliwe jest np. określenie dni, w których handel jest zbyt ryzykowny (wielu traderów rezygnuje z gry w piątek przed weekendem). W takiej sytuacji możliwe jest zastosowanie funkcji DayOfWeek(), która udostępnia aktualny dzieo tygodnia. Warto też przyjrzed się jednej z metod na wprowadzenie własnego niestandardowego okna czasowego. Dzięki funkcji TimeCurrent(), która udostępnia liczbę sekund, jakie minęły od 1 stycznia 1970 roku (notacja systemów UNIX), możliwe jest określenie liczby sekund od ostatniego odczytu. Przykładowo sprawdzenie zależności "aktualny czas = poprzedni odczyt + 20 sekund" daje dostęp do okna czasowego równego 20 sekund. Jest to jeden ze sposobów na analizę danych tylko w określonych momentach czasu - przydatne dla bardzo złożonych funkcji, które w okresach największej aktywności na giełdzie nie są w stanie analizowad każdego odczytu z osobna. 6.3 DANE HISTORYCZNE I INNE INSTRUMENTY Interesującym aspektem automatycznych systemów transakcyjnych jest możliwośd analizy danych a także składania zleceo na innych instrumentach, niż aktualnie wyświetlany. Oznacza to, że uruchamiając strategię EURUSD możliwe jest złożenie zlecenia 62\n63 na parze USDJPY (oczywiście bez otwierania dodatkowego okna). W prostych systemach transakcyjnych jest to raczej rzadko spotykana cecha, jednak warto pamiętad o tym, iż jeden wykres z włączoną strategią może sprawdzad sytuację na kilku parach walutowych. Odpowiednikiem tablic Close, Open, High oraz Low dla innych instrumentów są funkcje iclose(...), iopen(...), ihigh(...) oraz ilow(...). Co ciekawe nie są to tablice, lecz funkcje udostępniające wartośd double dla wybranego instrumentu, okna czasowego oraz przesunięcia względem aktualnego odczytu. W dośd prosty sposób można jednak wartości te wpisad do tablicy. Jednym z ciekawych zagadnieo może byd analiza par, gdzie w jednej z nich dolar jest walutą bazową, a w innej - kwotowaną. Obserwując spadki na jednej z par walutowych możliwa jest natychmiastowa reakcja na innym instrumencie. 63\n64 6.4 UŻYTECZNE FUNKCJE Oprócz opisanych w powyższym rozdziale funkcji związanych z zarządzaniem kontem oraz pozycją warto wspomnied o funkcjach istotnych z dwóch powodów. Po pierwsze, zwłaszcza w przypadku nowych strategii automatycznych istotne jest dokładne sprawdzenie ich skuteczności. Funkcja IsDemo() umożliwia sprawdzenie, czy konto, na którym aktualnie odbywa się handel jest w rzeczywistości kontem demonstracyjnym, co nie narazi użytkownika na żadne dodatkowe straty. Innym ciekawym rozwinięciem (szczególnie dla firm) dla funkcji IsDemo() może byd przygotowanie wersji demonstracyjnej funkcji, z której korzystanie na koncie rzeczywistym jest możliwe dopiero po wykupieniu abonamentu. Można przyjąd, że obok funkcji IsTradeAllowed(), która umożliwia handel dla wybranej strategii, są to funkcje zapewniające pewnego rodzaju bezpieczeostwo. 64\n65 Wreszcie ostatnią opisywaną w tym rozdziale funkcją jest IsConnected() - niestety awarie związane z serwerem czasami się zdarzają i nie można ich uniknąd. W przypadku częstych awarii można zamknąd zlecenie minimalizując ewentualne straty gracza. 6.5 PRZYKŁADY 1. Napisz program, który może zostad uruchomiony tylko na platformie firmy Iron Fx. W menu możliwe jest podanie minimalnej liczby środków na koncie. Program informuje o możliwości złożenia zlecenia, kiedy 3 ostatnie świece były jednego koloru (odpowiednio możliwośd kupna lub sprzedaży), przy czym liczba środków na koncie musi byd większa, niż podana w menu wartośd. 2. Napisz program, który w menu posiada parametry: liczba świec przy odczycie, kierunek trendu: kupno/sprzedaż oraz oczekiwany zysk w pipsach. Program sprawadza numer konta użytkownika (nr podany w menu powinien zgadzad się z numerem w MetaTrader). Następnie dla każdej świecy obliczany jest ruch ceny - różnica pomiędzy ceną otwarcia, a ceną zamknięcia. Program informuje użytkownika, czy dla takich parametrów udałoby się zrealizowad zysk, lub ewentualnie ile pipsów braknie do realizacji zysku. Program działa na parach EURUSD oraz USDJPY. 3. Napisz program, który w przypadku spadku na kursie EURUSD w ciągu 3 ostatnich świec, sprawdza, czy na parze USDCHF nastąpił 65\n66 wzrost w ciągu trzech ostatnich świec i ewentualnie podaje informację o wzroście. Przy czym wzrost na parze USDCHF musi mied zasięg minimum 3/4 spadku na parze EURUSD. 4. Napisz program, którzy tworzy trójwymiarową macierz: pierwszym wymiarem są 4 pary walutowe: EURUSD, USDJPY, USDCHF oraz USDCAD. Kolejny wymiar to ceny otwarcia, zamknięcia, maksimum oraz minimum. Wreszcie ostatni wymiar to liczba odczytów: 4. W takiej macierzy 4x4x4 należy wskazad: która para walutowa zanotowała największą zmianę kursu (w pipsach). 5. Napisz program, który dla podanego w programie poziomu SL oblicza, czy zlecenie jest możliwe do realizacji: uwzględniając n ostatnich odczytów (n jako parametr w menu) ustalid lokalne maksimum (dla pozycji krótkiej) lub minimum (dla pozycji długiej) i sprawdzid, czy różnica pomiędzy ceną (Bid lub Ask w zależności od zlecenia) o lokalnym optimum jest mniejsza niż wartośd SL podana w menu. Rodzaj zlecenia wybierany jest z menu. 7. WSKAŹNIKI Zdecydowana większośd systemów automatycznych w większym stopniu opiera się na wykorzystaniu wskaźników analizy technicznej. Określenie kierunku ruchu ceny na wykresie opiera się na obserwacji, natomiast w przypadku języka MQL 4 wszystkie wskaźniki zamienione zostają na wartości liczbowe (podobnie, jak ma to miejsce w przypadku świec japooskich). Interpretacja i analiza takich danych odbiega istotnie od tradycyjnej analizy technicznej i wymaga pewnych dodatkowych umiejętności. Informacje przedstawione w dwóch kolejnych rozdziałach mają na celu nakreślenie najistotniejszych elementów i sposobów wyznaczania punktów wejścia na rynek. Informacje te mogą byd stosowane z powodzeniem w systemach ekspertowych ułatwiających handel (gdzie informacja o sygnale przekazywana jest do wiadomości użytkownika), jak i strategiach automatycznych, gdzie użytkownik obserwuje tylko efekty działania strategii. Ze względu na zachowanie spójności niniejszego skryptu, informacje o systemach 66\n67 automatycznych i składaniu zleceo w programie przedstawione zostaną w rozdziale LISTA PARAMETRÓW FUNKCJI Wszystkie funkcje wbudowane dotyczące wskaźników w MQL 4 mają podobną konstrukcję - chodzi tutaj przede wszystkim o listę parametrów funkcji. Przed szczegółowym opisem tej listy, należy zdad sobie sprawę, jak dokładnie działa wskaźnik w MQL 4. Dowolny wskaźnik (średnia krocząca, oscylator, SAR) to wartośd liczbowa naniesiona na wykres jako obiekt graficzny: i tak, średnia krocząca to linia łącząca ze sobą odczyty z poszczególnych chwil czasu. Mając to na uwadze interpretacja funkcji wskaźnika w MQL 4 wydaje się już oczywista: jest to funkcja, która dla zadanego instrumentu udostępnia wartośd double, czyli punkt, który powinien zostad umieszczony na wykresie. Z każdym odczytem świecy z wykresu sytuacja wygląda dokładnie tak samo, dlatego kluczowym problemem jest tutaj znalezienie odpowiedniej zależności pomiędzy ceną instrumentu w danej chwili, a wartością wskaźnika dla tego instrumentu. Mając powyższe wiadomości, oczywista w interpretacji jest również lista parametrów funkcji. Każdy wskaźnik udostępnia wartośd dla konkretnego instrumentu, konkretnej chwili czasu - stąd nie powinny dziwid wymagane parametry takie jak: nazwa instrumentu, czy okno czasowe. Funkcja udostępnia wtedy wartośd odczytu dla danego instrumentu w podanej chwili. Powtarzalnym parametrem jest też przesunięcie (ang. shift) występujące przeważnie jako ostatni parametr na liście. Chodzi tutaj o to, względem której świecy obliczany będzie dany wskaźnik. Nic nie stoi na przeszkodzie, aby obliczyd wartośd wykładniczej średniej kroczącej z ostatnich 20 okresów względem 9 świecy wstecz - wtedy przesunięcie będzie właśnie równe 9. Oprócz opisanych powyżej zmiennych z listy argumentów, dla każdego wskaźnika istnieje też kilka parametrów unikalnych, 67\n68 takich jak np. lista okresów, na podstawie której liczona jest wartośd średniej kroczącej. 7.2 ŚREDNIE KROCZĄCE Jednym z najprostszych, a jednocześnie najskuteczniejszych systemów automatycznych jest strategia oparta na średnich kroczących. Sygnały generowane przez średnie generowane są w momencie przecięcia wykresu przez średnią. Oczywiście w przypadku wykresów świecowych należy przyjąd spójny sposób obliczania wartości wykresu - np. na podstawie cen otwarcia poszczególnych świec. Samo sprawdzenie punktu przecięcia wskaźnika z wykresem daje tylko sygnał. Następnie należy wskazad potencjalny kierunek ruchu ceny: 68\n69 przecięcie wykresu przez średnią od góry to sygnał kupna; przecięcie wykresu przez średnią od dołu to sygnał sprzedaży. W tym kontekście przecięciem od góry można określid sytuację, kiedy wartości średniej są większe od wartości wykresu i w miarę zbliżania się do aktualnego odczytu maleją: Analogiczną sytuację można opisad w przypadku sygnału sprzedaży, kiedy to wartości średniej są mniejsze od wartości wykresu i w miarę zbliżania się do aktualnego odczytu rosną. Wiele systemów transakcyjnych opartych jest na kilku średnich kroczących. Jedną z najpopularniejszych wersji jest sytuacja, kiedy to na wykresie znajdują się dwie średnie kroczące, a sygnały generowane są w momencie przecięcia średnich. 69\n70 Nieco trudniejsze jest tutaj wskazanie oczekiwanego kierunku ruchu instrumentu. Można jednak wskazad to, wybierając główną średnią, np. tę o mniejszym okresie, która szybciej reaguje na zmiany cen instrumentu. Wynikiem tego jest przecinanie średniej o dłuższym okresie przez średnią o okresie krótszym. Przecięcie średniej od dołu to sygnał sprzedaży, natomiast przecięcie od góry, to sygnał kupna. Może to zostad przedstawione w podobny sposób, jak powyższy przykład. Jedyną różnicą tutaj jest to, że pod uwagę brane są odczyty dwóch różnych średnich kroczących, których różnica w miarę zbliżania się do aktualnych odczytów maleje. 7.3 OSCYLATORY Pomimo niewątpliwej skuteczności dobrze dobranych średnich kroczących ważne jest, aby do analizy włączyd dodatkowe wskaźniki weryfikujące poprawnośd sygnałów. Dobrym przykładem może byd tutaj np. CCI, czy też oscylator stochastyczny. Co ciekawe, wskaźniki widoczne w osobnym oknie (takie jak dwa powyższe) oparte są na tych samych zasadach. Lista parametrów zawierająca 70\n71 nazwę symbolu, przedział czasowy i parametry charakterystyczne dla siebie przekazywana jest do funkcji, która następnie udostępnia wartośd wskaźnika. Interpretacja wskaźnika CCI jest bardzo prosta: chodzi tutaj o poziomy: poniżej -100 oraz powyżej 100. Wskaźnik poniżej poziomu -100 przecinający linię na tym poziomie od dołu świadczy o sygnale kupna. W przypadku poziomu 100 chodzi oczywiście o przecięcie tej wartości od góry. Liczba odczytów wstecz stosowanych do wygenerowania sygnału świadczy o jego dokładności. Przykładowo, jeden ze scenariuszy dla wskaźnika CCI wygląda następująco: wartośd wskaźnika znajduje się nad poziomem -100 lecz maleje; przecięcie poziomu -100 przez wskaźnik; dalszy spadek wartości wskaźnika; stopniowy wzrost wartości CCI; przecięcie poziomu -100; wzrost ponad poziom sygnał kupna. Niestety tak szczegółowa interpretacja wskaźnika może doprowadzid do sytuacji, kiedy liczba wygenerowanych sygnałów wejścia na rynek jest bliska zeru. 71\n72 Nieco bardziej złożonym wskaźnikiem do analizy jest oscylator stochastyczny. Na wykresie oscylatora obecne są dwie średnie, jednak funkcja udostępnia tylko jedną wartośd. W tym wypadku należy zwrócid uwagę na jeden z parametrów charakterystycznych dla tego oscylatora: przełącznik, która ze średnich jest aktualnie aktywna. Dla MODE_MAIN funkcja udostępnia wartośd głównej średniej, natomiast dla MODE_SIGNAL jest to wartośd średniej sygnałowej. Dla poprawnej interpretacji tego wskaźnika należy wywoład funkcję dwa razy z różnymi parametrami signal, a następnie przeanalizowad wyniki. Jedną z możliwych interpretacji są tutaj dwa poziomy analogiczne, jak w przypadku wskaźnika CCI. 7.4 ATR I STOP LOSS Wszystkie powyższe przykłady odnoszą się tylko do generowania sygnałów, jednak równie istotnym elementem jest ustalenie poziomów Stop Loss i Take Profit. Jednym ze sposobów może byd tutaj wykorzystanie wskaźnika ATR do obliczenia dynamiki 72\n73 zmiany cen na rynku. Często określa się zależnośd pomiędzy ATR oraz Stop Loss jako: Stop Loss = ATR *n, gdzie n jest tutaj szacowanym wskaźnikiem ryzyka. Przykładowo, dla wartości n=1.5, wartośd Stop Loss powinna zostad ustalona na ATR*1.5. Kolejnym etapem jest wyznaczenie lokalnego minimum/maksimum na wykresie w obrębie kilku najbliższych świec. W przypadku, gdy oszacowana wartośd Stop Loss jest mniejsza niż odległośd do lokalnego dołka - transakcja może zostad uznana za bezpieczną. Sam wskaźnik ATR może byd również stosowany jako generator sygnałów. Tutaj jednak interpretacja wyników zależy od indywidualnych preferencji użytkownika. Duża zmiennośd wskaźnika oznacza dużą dynamikę cen. Dla jednego gracza może to byd miejsce do szukania punktów wejścia na rynek, z kolei dla innych - sygnał na przeczekanie. 73\n74 7.5 ŁĄCZENIE WSKAŹNIKÓW Zwłaszcza w przypadku bardziej złożonych systemów automatycznych konieczne jest stosowanie kilku sygnałów jednocześnie, co pozwala istotnie ograniczyd liczbę błędnych wejśd na rynek. W przypadku systemów ekspertowych nie jest to najistotniejsze, ponieważ każdy z sygnałów weryfikowany jest przez użytkownika. Należy pamiętad o stosowaniu różnych wskaźników, tj. należących do różnych grup. Możliwe jest oczywiście opracowanie systemu opartego na kilku średnich kroczących o różnym okresie, jednak poprawna implementacja wszystkich jego cech może byd kłopotliwa dla początkującego programisty. Na początku zaleca się stosowanie przede wszystkim średniej kroczącej połączonej z dowolnym oscylatorem. Taka strategia pozwala generowad sporo istotnych sygnałów wejścia na rynek. Przecięcie średniej kroczącej z wykresem to potencjalny sygnał, który następnie weryfikowany jest przez potwierdzenie sygnału na oscylatorze. Oczywiście tak przygotowany system powinien zostad poddany szczegółowym testom - sprawdzeniu jego skuteczności dla różnych par walutowych, okresów oraz okien czasowych. O ile w przypadku systemów ekspertowych błędny sygnał może zostad szybko odrzucony, to w przypadku strategii automatycznych każda pomyłka oznacza stratę gracza. Problem handlu z trendem może nie byd oczywisty w systemach automatycznych. Opracowanie metody pozwalającej wskazad kierunek trendu samo w sobie może byd zadaniem trudnym. Niestety nie istnieje wskaźnik pozwalający na wyznaczenie kierunku ruchu danego instrumentu. Jedną z metod może byd tutaj wyznaczenie globalnego oraz lokalnych maksimów, co pozwoli potwierdzid, iż kolejne szczyty cenowe znajdują się coraz niżej (w przypadku trendu spadkowego). 74\n75 7.6 PRZYKŁADY 1. Napisz program, gdzie w menu dla średniej kroczącej można podad typ średniej (wykładnicza, prosta), sposób obliczania ceny (otwarcie, zamknięcie, średnia z max i min) oraz okres. Program generuje przy każdym odczycie informacje o tym, jaka jest różnica pomiędzy ceną a wartością średniej. Dodatkowo powinna zostad wyświetlona informacja o tym, czy aktualnie średnia znajduje się nad czy pod wykresem ceny. 2. Napisz program, który jako parametr dostaje dwa parametry: górną oraz dolną granicę dla wskaźnika CCI. W momencie przecięcia górnej granicy od góry pojawia się informacja o sygnale sprzedaży. 75\n76 Natomiast przy przecięciu dolnej granicy od dołu - informacje o sygnale kupna. 3. Napisz program, który generuje sygnał wejścia na rynek w momencie, kiedy średnia o okresie podanym jako parametr przecina wykres świecowy, przy czym wysokośd świecy musi wynosid minimum n pipsów, gdzie n jest parametrem podanym w menu. Przy przecięciu wykresu od góry generowany jest sygnał wzrostowy, tak więc świeca powinna byd również wzrostowa. Przy uruchomieniu programu powinna zostad również wyświetlona informacja o brokerze, numerze konta i nazwie użytkownika. Sygnały generowane są tylko, jeżeli uruchomione jest konto demo. 4. Napisz program, który dla par EURUSD oraz USDCHF i okresów od 15 minut do godziny włącznie sprawdza, ile razy wykładnicza średnia krocząca przecinała wykres od góry. 5. Napisz program, który dla średniej kroczącej (wykładniczej lub prostej w zależności od parametru) generuje sygnały przy przecięciu wykresu - od góry, lub od dołu. Przy każdym przecięciu wykresu dodatkowo sprawdzane jest, czy wskaźnik CCI znajduje się w strefie wykupienia/wyprzedania. Przykładowo, dla sygnału spadkowego wygenerowanego przez średnią i wskaźnika CCI znajdującego się w strefie wykupienia generowana jest informacja "Silny sygnał". Dla sygnału spadkowego i wskaźnika CCI w strefie wyprzedania "Duże ryzyko". W pozostałych przypadkach "Słaby sygnał". Analogicznie należy rozpatrzyd przypadek sygnału wzrostowego. 8. FORMACJE ŚWIECOWE W poprzednim rozdziale przedstawionych zostało kilka przykładów zastosowania analizy technicznej w handlu automatycznym. Kolejnym istotnym czynnikiem wspomagającym generowanie sygnałów wejścia na rynek jest analiza formacji (na kursie zajmujemy się tylko formacjami świec japooskich). Połączenie tych dwóch elementów może dad bardzo dobre wyniki w przypadku systemów automatycznych. Z kolei dla systemów ekspertowych, już sama analiza formacji na wykresie i generowanie sygnałów na ich 76\n77 podstawie może dad bardzo dobre rezultaty. Należy przy tym pamiętad, że skutecznośd formacji świecowych zależy w dużym stopniu od stosowanego okna czasowego - gdzie duże okno czasowe (godzina, 4 godziny a nawet jeden dzieo) to silne sygnały, a ewentualne dane ekonomiczne przeważnie nie są w stanie odwrócid głównego ruchu cenowego. Niestety liczba takich sygnałów jest odwrotnie proporcjonalna do wielkości okna czasowego. Na wykresie 5-minutowym liczba takich sygnałów może byd bardzo duża, ale są to najczęściej ruchy o zasięgu kilku- kilkunastu pipsów. Z kolei dla świec na wykresie 4-godzinnym należy uwzględnid bardzo duży SL (nierzadko nawet ponad 100 pipsów). 8.1 WARUNKI ISTNIENIA FORMACJI Każda formacja to pewien charakterystyczny wygląd świecy lub świec na wykresie. Najistotniejszymi elementami są tutaj: kolor świecy i kolor świec poprzednich; cienie i ich długośd; punkty otwarcia i zamknięcia świecy w stosunku do świec poprzednich; długośd świecy. Już na podstawie powyższych elementów można opisad dowolną formację operując pewnymi warunkami. Przykładowo dla świecy wzrostowej będzie to: cena otwarcia jest niższa od ceny zamknięcia. Długośd świecy można określid na podstawie różnicy pipsów pomiędzy ceną otwarcia a ceną zamknięcia. Oczywiście, jeżeli kolor świecy nie jest tutaj istotny, warto posłużyd się wartością absolutną z różnicy pomiędzy ceną otwarcia a ceną zamknięcia. Liczba pipsów może byd w tym przypadku zdefiniowana jako parametr. Świeca długa na wykresie 5-minutowym może mied tylko 15 pipsów, z kolei długa świeca na wykresie dziennym to np. 500 pipsów. Warto dostosowad dany fragment kodu do z góry założonego okna czasowego. 77\n78 Teraz w zależności od wybranego okna czasowego oraz początkowych założeo wskazana zostanie tylko świeca spełniająca warunki. Dla złożonych formacji składających się z 3 i więcej świec liczba koniecznych do podania warunków może byd znacznie większa. Nierzadko wymagane jest także, aby oprócz określenia szczegółów formacji, podad kilka cech ogólnych dla elementów poprzedzających formację. Dla odwrócenia trendu spadkowego warto sprawdzid, czy trend utrzymywał się długo, lub czy formację odwrócenia poprzedzały znaczne spadki. W takiej sytuacji wygenerowany sygnał jest znacznie istotniejszy. Dla formacji świecowych liczba generowanych sygnałów wygląda podobnie, jak w przypadku analizy technicznej. Szczegółowy opis formacji i liczne warunki dodatkowe wpływają istotnie na jakośd sygnału, jednak ograniczają ich liczbę do minimum. 78\n79 8.2 FORMACJE MŁOTA I GWIAZDY Formacje młota oraz gwiazdy są jednymi z najpopularniejszych świec wskazujących na odwrócenie trendu. Formacje odwrócenia to układy wskazujące na załamanie aktualnego trendu. Młot charakteryzuje się długim cieniem pod korpusem, krótszym korpusem oraz brakiem cienia nad nim. Kolor świecy nie ma tutaj znaczenia, jednak można przygotowad dwie funkcje odpowiednio dla świecy wzrostowej oraz spadkowej. Przedstawiona powyżej wersja formacji młota jest bardzo prosta i nie uwzględnia wcześniejszych świec. Wpływa to niestety negatywnie na jakośd generowanych sygnałów. Uważa się, że jest to bardzo silny sygnał otwarcia pozycji, niestety w systemie automatycznym zastosowanie tylko tej formacji może nie przynosid oczekiwanych rezultatów. Bardzo podobną formacją jest gwiazda. Przy czym tutaj długi cieo znajduje się nad korpusem. Kolor świecy również nie ma znaczenia. Można jednak przygotowad zdecydowanie bardziej złożoną funkcję, w której oprócz samej świecy, sprawdzone zostają świece ją poprzedzające. 79\n80 8.3 KRZYŻ HARAMI Krzyż harami jes specyficzną formacją zbliżoną do formacji harami składającą się z dwóch świec. Druga ze świec w formacji to świeca Doji, w której cena otwarcia i cena zamknięcia znajdują się na tym samym poziomie. Analizując podaną formację warto zauważyd, iż w rzeczywistości opisana sytuacja występuje bardzo rzadko (cena zamknięcia równa cenie otwarcia), co przekłada się na małą liczbę sygnałów generowaną przez wspomnianą formację. Jednak zakładając niewielki margines błędu, kiedy to cena otwarcia oraz cena zamknięcia różnią się od siebie tylko o kilka (np. 2-3 pipsy). Krzyż harami występuje zarówno w trendzie wzrostowym, jak i spadkowym. Wskazane jest tutaj wyraźne wyróżnienie wzrostowego oraz spadkowego krzyża harami. Druga ze świec w formacji (poprzedzająca Doji) jest również bardzo istotna. Dodatkowo, np. w przypadku harami na trendzie wzrostowym, świece poprzedzające świecę drugą w formacji powinny byd również wzrostowe. Liczba uwzględnionych tutaj świec zależy już od interpretacji użytkownika. 80\n81 8.4 OBJĘCIE HOSSY/ OBJĘCIE BESSY Formacje objęcia hossy i bessy składają się tylko z dwóch świec, jednak istotną trudnośd stanowi tutaj określenie stosunku korpusu jednej świecy do korpusu drugiej świecy. Ponadto każda z tych świec może posiadad cienie. W przypadku objęcia hossy, gdzie formacja następuje po trendzie spadkowym, należy dodatkowo przyjąd założenie, że górne cienie świecy nie są zbyt długie. Długie cienie mogą w tym wypadku świadczyd o nieudanej próbie objęcia hossy i w konsekwencji doprowadzid do dalszych spadków. Analogicznie sytuacja przedstawia się dla objęcia bessy, która to formacja powinna pojawid się po wcześniejszych świecach wzrostowych. Tutaj z kolei długie górne świece mogą stanowid dodatkowy element potwierdzający możliwośd odwrócenia trendu. 81\n82 8.5 ANALIZA ZŁOŻONYCH FORMACJI Przy analizie dowolnej formacji najistotniejszym elementem jest określenie warunków jej wystąpienia. W przypadku układów 3 i więcej świec, liczba warunków może wynosid nawet kilkanaście elementów. Przede wszystkim należy zwrócid uwagę, aby poszczególne warunki nie wykluczały się. W sytuacji, kiedy łącznikiem w wyrażeniu warunkowym jest "LUB", możliwe jest wystąpienie jednej z kilku możliwych sytuacji. Przykładowo dla formacji młota sprawdzenie koloru świecy nie jest wymagane. Natomiast jeżeli w danym systemie świeca wzrostowa implikuje dodatkowo inny warunek (przykładowo korpus świecy dwa razy krótszy od cienia), wtedy warto skorzystad z wyrażenia "LUB". Każda formacja powinna byd przygotowana w formie jednej funkcji udostępniającej wartośd bool lub int. Zaistnienie formacji na wykresie to wartośd true z kolei brak formacji to wartośd false. Podejście takie pozwoli łączyd formacje świecowe ze sobą a także w prosty sposób modyfikowad przygotowane formacje w przyszłości. 82\n83 8.6 PRZYKŁADY 1. Napisz program, w którym dla liczby świec zadanej parametrem sprawdzane jest, ile z nich to formacja młota. Należy rozdzielid tę liczbę w zależności od koloru młota. 2. Napisz program, w którym dla ostatnich 100 świec sprawdzane jest, ile z nich miało korpus o długości liczba_minut*2. Program ma wypisad informację w ilu przypadkach (procent przypadków) nastąpiła korekta długiej świecy - przynajmniej do połowy jej długości. 3. Napisz program zliczający dla n ostatnich świec (n jako parametr) liczbę krzyży harami, gdzie ewentualna różnica pomiędzy ceną otwarcia i zamknięcia określana jako błąd podawana jest jako parametr. Przykładowo cena otwarcia - cena zamknięcia = 3 pipsy. Błąd ustalony na 5 pipsów - to formacja uznana jest za krzyż harami. 4. Napisz program, który dla n ostatnich świec sprawdza, w ilu przypadkach 3 świece pod rząd były tego samego koloru. Dodatkowo, każda ze świec powinna mied wysokośd minimum 0.5*m pipsów (gdzie m to okno czasowe: 15 min = 15 pipsów). Następnie należy wskazad, w ilu przypadkach nastąpiły dalsze wzrosty, a w ilu spadki. 5. Napisz program, który wyszukuje formacje młota i gwiazdy, a przy wystąpieniu formacji sprawdza, czy wskaźnik CCI również generuje sygnał. Jeżeli sygnał jest potwierdzony, wtedy pojawia się komunikat o sygnale. 9. FUNKCJE TRANSAKCJI Istotnym elementem dowolnego systemu automatycznego są specjalne funkcje odpowiedzialne za składanie zleceo oraz zarządzanie nimi. Funkcje transakcyjne są wbudowanymi elementami języka MQL 4 umożliwiającymi opracowanie gotowej strategii automatycznej. Oprócz samego składania zlecenia istotne jest też zarządzanie zleceniami i ich ewentualne modyfikacje (w szczególności zmiany dotyczące Stop Loss oraz Take Profit), a w 83\n84 przypadku zleceo oczekujących także ich usuwanie w przypadku nieprzewidzianych ruchów cenowych na rynku. 9.1 SYSTEMY AUTOMATYCZNE W przypadku systemów automatycznych, gdzie każde zlecenie składane jest automatycznie, wymagane jest dopracowanie znacznie większej liczby elementów, niż w przypadku systemów ekspertowych. W tych pierwszych oprócz funkcji generującej dobre sygnały należy też zadbad o odpowiednie zarządzanie kontem, monitorowanie sytuacji na rynku (kierunek trendu, istotne poziomy wsparcia i oporu). Oczywiście po wygenerowaniu sygnału należy sprawdzid, czy złożenie zlecenia jest możliwe, a następnie jego złożenie, lub też ustawienie zlecenia oczekującego. Następnym etapem jest zarządanie takim zleceniem i ewentualne wcześniejsze zamknięcie lub też usunięcie (w przypadku zleceo oczekujących). Te wszystkie elementy sprawiają, że samo przygotowanie skutecznego systemu generującego dobra sygnały wejścia na rynek to tylko połowa sukcesu. Następnym krokiem (nierzadko równie pracochłonnym) jest wyposażenie systemu w funkcje umożliwiające poprawny handel. Drugą opcją jest tutaj system ekspertowy generujący sygnały, które następnie analizowane są przez tradera. Ich niewątpliwą zaletą jest fakt, że użytkownik skupia się przede wszystkim na sposobie wyznaczania punktów wejścia na rynek, a samo zarządzanie zleceniem schodzi tutaj na dalszy plan, albo nawet jest całkowicie pomijane. Jest to ważne szczególnie w przypadku osób mających stycznośd z MQL 4 po raz pierwszy. System ekspertowy uczy przede wszystkim podstaw języka oraz sposobu przekształcenia swoich pomysłów w gotowe programy. Dopiero opanowanie tych elementów pozwoli na opracowanie w pełni automatycznego systemu. 84\n85 9.2 SKŁADANIE ZLECEŃ W momencie pojawienia się sygnału, który pozwala na złożenie zlecenia, konieczne jest wywołanie specjalnej funkcji transakcyjnej OrderSend(...) odpowiedzialnej za ten proces. Jest to jedna z najbardziej skomplikowanych funkcji wbudowanych w MQL, gdyż wymaga podania bardzo dużej liczby parametrów. Oprócz podstawowego parametru Symbol, który pozwala wskazad dla jakiego instrumentu zlecenie jest składane, konieczne jest też podanie szeregu innych: typ zlecenia - do systemu musi trafid jawna informacja, czy jest to zlecenie kupna, sprzedaży, czy też zlecenie oczekujące; wielkośd zlecenia - można ustawid wielkośd domyślną na początku działania programu, lub też dla każdego zlecenia podawad wielkośd osobno. Jest to przydatne zwłaszcza z niewielką liczbą środków na koncie, gdzie złożenie zlecenia o wielkości 1 lota może nie byd możliwe; ustalenie poziomów SL i TP - możliwe jest też złożenie zlecenia bez tych wartości oraz ich późniejsza modyfikacja przy pomocy innej funkcji. Samych argumentów jest oczywiście znacznie więcej, jednak podane powyżej są jednymi z najistotniejszych. 85\n86 Złożenie zlecenia w momencie pojawienia się sygnału jest oczywiście najprostszą sytuacją. Niestety należy też uwzględniad sytuację, kiedy złożenie zlecenia z jakiegoś powodu nie jest możliwe (problem z serwerem, brak środków na koncie, nieodpowiednie wartości SL/ TP). W tym momencie warto skorzystad z funkcji do zarządzania kontem, które pozwolą sprawdzid np. dostępne środki na koncie, a także (co nawet ważniejsze) dostępne środki po ewentualnym złożeniu zlecenia. Pozwoli to na uniknięcie przykrych niespodzianek dotyczących wyczyszczenia rachunku przez program. Warto też zastanowid się nad licznikiem zleceo. Otóż zdecydowana większośd graczy na bieżąco śledzi swoje otwarte pozycje i nimi zarządza. Podobnie sytuacja powinna wyglądad z systemem automatycznym - co jakiś czas otwarte pozycje powinny byd sprawdzane i ewentualnie modyfikowane. Stąd sugestia, aby ustalad maksymalny licznik otwartych zleceo - w zależności od wielkości dostępnego kapitału może to byd 5, 10 lub nawet więcej zleceo. Każde zlecenie posiada unikalny numer - tzw. bilet (ang. Ticket) pozwalający śledzid historię zlecenia. Pozwala to w pełni kontrolowad sytuację na swoim koncie. Warto wspomnied tutaj o funkcji OrderSelect(...), która umożliwia przegląd wszystkich aktywnych zleceo (z użyciem pętli FOR). 86