Rozbor obchodního systému II

V minulém díle jsme rozebrali příkladný obchodní systém dodávaný s platformou Metatrader – MACD Sample. Dnes navážeme rozborem dalšího ukázkového obchodního systému – Moving Average, který byste rovněž měli najít ve své platformě. Princip fungování obou systémů je podobný, řídí se tradičním použitím indikátoru MACD, respektive překřížením klouzavého průměru cenou. Proč rozebíráme zrovna tyto dva? Kromě toho, že je má v platformě každý, je jedním z důvodů ten, že z hlediska programátorského jsou napsány úplně jiným způsobem. Čtenář tak získá de facto dva odlišné pohledy na jednu věc, což by mělo rozvinout kreativitu a poskytnout inspiraci.

Rozbor budeme provádět stejně jako v minulém díle – řádek po řádku tak, jak program kód exekuuje. Popis vždy následuje pod obrázkem rozebírané části. V závorkách jsou pro přehlednost uvedeny příslušné řádky kódu, na které je odkazováno. Začneme samozřejmě hlavičkou.

MA hlavička

V hlavičce jsou nejprve tradičně uvedeny informace o tvůrci kódu (1-8). Následuje příkaz #define, pomocí kterého dává autor pro jednoduchost jméno určité konstantě, která se v kódu objeví vícekrát (10), v tomto případě jako takzvané magické číslo obchodu. To se používá například pro odlišení obchodů pocházejících z jedné konkrétní strategie. V dalším bloku je výpis všech uživatelem zadávaných proměnných (12-16). Aby je mohl zadat uživatel, stačí před deklaraci vložit příkaz input.

Na dalším řádku následuje funkce CalculateCurrentOrders(). My však víme, že program nejprve exekuuje speciální funkci OnInit(). Ta v programu úplně chybí, takže následuje speciální funkce OnTick().

MA Ontick

Zde vidíme první podstatný rozdíl oproti systému MACD Sample. Celý kód MACD Sample k exekuci je umístěn uvnitř funkce OnTick(), kdežto zdejší funkce OnTick() se omezí jen na pár řádků. Nejprve program kontroluje, zda je v grafu více než 100 svíček a zda je povoleno automatické obchodování (138). Pokud je jedna z podmínek porušena, exekuce ihned končí (139). Následuje rozhodování. Pokud funkce CalculateCurrentOrders() s parametrem názvu symbolu grafu (ten vrací funkce Symbol()) vrátí nulu, je zavolána funkce CheckForOpen() (141). Pokud vrátí cokoliv jiného, je zavolána funkce CheckForClose() (142). Z těchto dvou řádků plyne, že strategie může mít naráz otevřený pouze jeden obchod, stejně jako tomu bylo u MACD Sample. Pojďme se nyní podívat na ony tři funkce, které jsou uvnitř této funkce volány.

MA calculate open

Funkce CalculateCurrentOrders(), do které vstupuje parametr „symbol“ obsahující název grafu, na kterém strategie běží, je obyčejná uživatelská funkce, která má za úkol spočítat počet otevřených pozic. Toho dosahuje cyklem, který projíždí všechny pozice v tabulce obchod (tj. jak otevřené, tak čekající limitní). Pro účely cyklu je použito pomocné proměnné i (24). Po výběru pozice je zjištěno, zda je otevřena na stejném symbolu, na kterém běží strategie a zároveň zda je její magické číslo shodné s naším (27). Tím je zajištěno, že obchody, které prošly tímto sítem, byly otevřeny touto strategií na tomto grafu. Zbývá již jen zjistit, zda je daná pozice long (29) nebo short (30) a pokud ano, přičíst do příslušné proměnné jedničku. Vrácen bude počet longů nebo záporná hodnota počtu shortů (34,35). Získáme tak de facto expozici, kterou strategie vytvořila.

MA Checkforopen

Tato funkce má, jak název napovídá, za úkol zjistit, zda jsou v trhu podmínky pro otevření pozice. Zajímavý je řádek 78. Ten říká, že pokračovat ve funkci se má pouze u prvního ticku nové svíčky. Jde tedy o obchodní systém, který exekuuje signály pouze na nové svíčce. V případě prvního ticku nové svíčky tedy program nejprve zjistí aktuální hodnotu klouzavého průměru s parametry, které zadal uživatel programu, a uloží ji do proměnné „ma“ (80). Následně se zjišťuje, zda byl překřížen klouzavý průměr a případně kterým směrem. Pokud open poslední hotové svíčky bylo výše než průměr, ale close bylo již níže (82), znamená to, že cena protnula průměr směrem dolů, což znamená prodejní signál (84,85). Opačná situace je řešena na řádcích 88-91. Pro výpočet objemu pozice je v obou případech zavolána funkce LotsOptimized(). Funkce představuje určitý nadstandard pro money management a v tomto díle ji rozebírat nebudeme.

MA checkforclose

Funkce, která kontroluje podmínky pro uzavření pozice, má v podstatě stejnou konstrukci jako CheckForOpen(). Kontrola opět probíhá jen při prvním ticku nové svíčky (102). Opět je zjištěna poslední hodnota klouzavého průměru (104) a porovnána s otevírací a zavírací cenou poslední svíčky (113 a 122). Nejdříve je ale potřeba vybrat pozici, kterou budeme kontrolovat pro uzavření. To probíhá podobným cyklem jako ve funkci CalculateCurrentOrders(). Rozdíl je pouze v druhé podmínce, která je pojata opačným způsobem (109). Pokud magické číslo nebo symbol grafu nesouhlasí s magickým číslem strategie a s grafem, na kterém běží, vynutí se nová iterace cyklu (přejde se na další pozici), neboť taková pozice nás nezajímá. Jakmile máme pozici, která nás zajímá, stačí zjistit, zda se jedná o long (111) nebo o short (120), a potom zkontrolovat, jak je na tom klouzavý průměr vůči ceně. Pokud cena překřížila průměr shora (113), je to signál k uzavření longu (115,116). Pokud jej překřížila zespoda (122), je to signál k uzavření shortu (124,125). Pokud je nějaká pozice uzavřena, cyklus lze ukončit (118,127), neboť strategie může mít otevřenou nanejvýš jednu pozici.

Tím jsou u konce oba rozbory obchodních systémů. Zbývá poslední díl, ve kterém se naučíme naše obchodní systémy rychle a efektivně testovat na historických datech a také optimalizovat jejich parametry, aby byla zajištěna maximální ziskovost.