Rozbor obchodního systému I

Závěr série věnujeme konečně konkrétním obchodním systémům. Předpokládáme, že pokud se učíte programovací jazyk MQL, je vaším cílem právě programování obchodních systémů. AOS rozhodně přinášejí vašemu tradingu nové možnosti a sama automatizace jako taková v sobě nese spoustu výhod. Automatický backtest je rozhodně pohodlnější než ruční a během několika vteřin prozradí, zda má smysl danou myšlenku dále rozvíjet.

V posledních dvou dílech si rozebereme dva obchodní systémy, které byste po stažení Metatraderu měli najít i mezi svými soubory. Jmenují se Moving Average a MACD Sample a nejdete je v Experts ve složce dat vaší platformy (jejíž obsah uvidíte po spuštění MetaEditoru). Poskytují inspiraci přímo od Metaquotes, jak by mohl jednoduchý AOS v Metatraderu se všemi náležitostmi vypadat, zároveň ale dávají najevo, že každý obchodní systém může být postaven naprosto odlišně.

Dnes začneme jednodušším MACD Sample. Kód rozdělíme na několik částí. Pod obrázkem vždy následuje popis dané části, čísla v závorkách označují pro lepší orientaci čísla řádků kódu dle obrázku.

MACD hlavička

Hlavička obsahuje kromě informací o autorovi (6-7) externí proměnné (9-14), které má zadat uživatel obchodního systému. Jedná se o proměnné money managementu a risk managementu a o nastavení parametrů indikátoru MACD.

MACD úvod

Následuje funkce OnTick(), kde na začátku jsou klasicky deklarovány proměnné, které se ve funkci použijí (20-23). Po skupině komentářů (24-31) následuje kontrolní blok, který zamezuje zbytečné exekuci programu (32-41). Není nutný, ale je vhodné nějaký podobný ve svém programu mít. V tomto případě se exekuce hned na začátku ukončí, pokud je v grafu méně než 100 svíček anebo pokud uživatel zadal příkaz Take Profit menší než 10. Program toto vyhodnotí jako chybu, napíše o tom záznam do programového logu funkcí Print() (34 a 39) a ukončí exekuci. V dalším bloku jsou vypočítány hodnoty, za základě kterých se bude program rozhodovat, zda otevřít nebo uzavřít pozici, a jsou uloženy do proměnných (43-48). Autor nám zároveň vysvětluje proč – zjednodušuje to kód a zrychluje exekuci (42). Konkrétně jde o současné a předchozí hodnoty indikátoru MACD a klouzavého průměru.

MACD před checkem

Následuje konečně blok rozhodování o otevření pozice (50-88). Vše je uloženo v podmínce, která se ptá, zda je již nějaká pozice otevřena (51). Z toho plyne, že tento AOS dovoluje mít otevřenou vždy jen jednu pozici. Faktem ale je, že i kdyby tam tato podmínka nebyla, více pozic než jednu by ani ze své podstaty otevřít nemohl. S touto podmínkou se ale opět vyhneme zbytečné exekuci některých operátorů, když už bude pozice otevřena. Další podmínka se týká dostupné marže (54-58). Pokud nemáme dostatek prostředků, nemá smysl dále pokračovat a zkoumat, zda přišel signál pro otevření pozice. Uzavření pozice je ale mimo tuto podmínku, což je v pořádku.

MACD open check

Po kontrole dostupných prostředků nás čeká konečně rozhodovací mechanismus otevření pozice. Pokud je splněna série podmínek, která odpovídá nákupnímu signálu (60-61), je zavolána funkce OrderSend() s určitými parametry (63). Pokud se podaří pozici otevřít, dostane číslo tiketu a uloží se do proměnné ticket (stále 63). Když se tak stane, v logu se objeví hláška o úspěšném otevření pozice s číslem příslušného tiketu (64-68). Pokud se někde objeví chyba, rovněž je o tom odeslána informace do logu. Pomocí funkce GetLastError() je chyba v takovém případě identifikována a exekuce ukončena (69-71). Pokud je totiž splněna podmínka pro long, těžko bude splněna také pro short. Následuje totožný blok, který se exekuuje v případě signálu pro short (74-87). První důležitý blok tímto máme za sebou. Jak však autoři správně v komentáři poznamenávají (89), vstoupit do trhu správně je důležité, ale ještě důležitější je z něj správně vystoupit. Čeká nás tedy blok, který kontroluje otevřenou pozici a ověřuje, zda není čas ji uzavřít, případně upravit.

MACD close check

Vše je uzavřeno v cyklu for (90-151), který má za úkol udělat tolik iterací, kolik je otevřených pozic. Možná si řeknete „proč, když může být otevřena vždy jen jedna pozice?“. Z toho důvodu, že otevřené pozice v terminálu nemusí pocházet jen z činnosti tohoto obchodního systému. My však chceme prohledávat pouze tyto. V první podmínce (92-93) načítáme konkrétní pozici do paměti. Pokud se načtení nepodaří, operátor continue zahájí rovnou další iteraci cyklu. Pokud se podaří načíst pozici, je zjištěno, zda se nejedná o limitní příkaz (94) a z jakého instrumentu pochází (95). Pokud se jedná o long (98), podíváme se na něj blíže. Pak už se konečně kontroluje, zda jsou splněny podmínky pro uzavření obchodu (101-102). Pokud ano, pozici uzavřeme, zapíšeme o tom záznam a ukončíme exekuci (105-107). Pokud ne, autoři vložili kód, který funguje jako TrailingStop (110-122). Pokud je uživatelem úroveň Trailing Stopu zadán (110), zkontroluje se, jestli je obchod v dostatečném zisku (112) a jestli je nad případným stoplossem (114). Je-li tomu tak, pozice se modifikuje a exekuce ukončí (117-119). Pokud je podmínka na řádku 98 vyhodnocena jako neplatná, je jasné, že náš příkaz je short a následuje analogický blok 124-149, kde je rozhodováno o jeho uzavření a o posunutí stoplossu.

V příštím díle se podíváme na druhý ze zmiňovaných ukázkových obchodních systémů, který funguje v zásadě podobně, ale je zkonstruován zcela odlišně.