Jednoduchý program

Z předchozích dílů již známe všechny základní prvky, které programovací jazyk MQL používá pro tvorbu obchodních systémů a dalších programů do platformy Metatrader. Víme, jak deklarovat a inicializovat proměnné. Známe použitelné operace. Máme jasno ve struktuře programu a náležitostech pro různé typy programů. Víme, k čemu slouží které operátory. V neposlední řadě známe základní funkce, umíme si vytvořit funkci vlastní anebo víme, kde si najít standardní funkci, kterou potřebujeme. Zbývá již jen trénovat, zkoušet, překonávat překážky, učit se a vylepšovat své programy. Poslední díly proto budou ryze praktické. Dnes si ukážeme stavbu jednoduchého programu, který bude mít za úkol nás informovat o průměrném rozpětí posledních X period. Nejdříve takový program napíšeme a pak vymyslíme, jak bychom ho mohli vylepšit. První zadání zní následovně:

  1. Sestavte program, který jednorázově vypočítá průměrné rozpětí posledních 20 kompletních svíček grafu a oznámí výsledek.

Protože se má jednat o jednorázovou akci, víme, že potřebujeme vytvořit skript. Když nám MetaEditor vytvoří předlohu pro skript, je jasné, že veškerý kód umístíme do speciální funkce OnStart(). Program bude vhodné rozdělit na tři části. V první části nadeklarujeme, případně inicializujeme proměnné. Ve druhé části sečteme rozpětí oněch 20 posledních svíček. K tomu nám dopomůže cyklický operátor for a využijeme proměnné uzpůsobené na práci s časovými řadami. V poslední části výsledný součet vydělíme 20, čímž získáme průměrné rozpětí a nakonec o výsledku informujeme uživatele skriptu. S částí kódu jsme se již setkali v jednom z předchozích dílů. Podívejme se, jak by výsledný kód mohl vypadat. Každý řádek je vysvětlen pomocí komentáře.

PrůmRozp1

  1. Přetvořte program tak, aby informaci o rozpětí neustále aktualizoval a zobrazoval v grafu, aniž by bylo třeba čekat na první tick.

Nyní se již nebude jednat o jednorázovou akci, ale o pravidelně aktualizovanou informaci. Tím pádem musíme opustit skript a vytvořit strategii, která se exekuuje, v tomto případě přepočítá, s každým příchozím tickem (jindy se průměr z principu změnit nemůže). Tento požadavek splňuje program typu indikátor nebo automatický obchodní systém (strategie). O indikátor se nejedná, zvolíme tedy druhou variantu.

Vytvoříme nový program, šablona nám představí strukturu s funkcemi OnInit(), OnDeinit() a OnTick(). Kód, který jsme v předchozím případě měli v OnStart(), můžeme zkopírovat do OnTick(). Tak bude zajištěno, že se exekuuje vždy při novém ticku. Ještě jedna úprava je ale potřeba. Funkci Alert() musíme nahradit funkcí Comment(), aby byl splněn požadavek zobrazování v grafu. Má to ale i jiný dobrý důvod, který vám bude jasný, když funkci Alert() v tomto programu necháte a spustíte jej.

Malou nevýhodou je, že aby se informace za současné podoby kódu zobrazila, musí se počkat na první příchozí tick. To může být nepříjemné na méně likvidních trzích, nebo když z nějakého důvodu testujeme či analyzujeme v době, kdy jsou trhy zavřené. Lze to vyřešit tak, že kód funkce OnTick() nakopírujeme i do funkce OnInit(). Tento kód se exekuuje již při spouštění programu, hodnota proto bude vypočítána ještě před příchodem prvního ticku. Pro zefektivnění programu je potom lepší ze společných proměnných oběma funkcím (v tomto případě Mezisoucet, Soucet, Prumer a x) vytvořit globální proměnné, které se tak stanou přístupnými pro všechny funkce programu a není třeba je dvakrát deklarovat a inicializovat. Toho dosáhneme přesunutím dvou řádků s deklaracemi do hlavičky programu. Odpovídající dva řádky potom můžeme smazat z obou funkcí. Obrázek hlavičky uvidíme v dalším zadání.

  1. Vylepšete program tak, aby trader měl možnost sám si zvolit počet period, za kterou se bude průměr počítat a aby výsledná hodnota byla zaokrouhlená na dvě desetinná místa.

První požadavek vyžaduje jednoduchou úpravu. Stačí místo konstanty 20 použít globální proměnnou, která bude deklarována v hlavičce programu a vložit před ní modifikátor input. Ten zajistí, že se proměnná objeví v seznamu vstupů, které zadává uživatel. Číslovku 20 pak v programu jednoduše nahradíme názvem této proměnné.

Zaokrouhlení výsledné hodnoty dosáhneme buďto s pomocí funkce NormalizeDouble(), DoubleToStr() nebo DoubleToString(). Funkce NormalizeDouble() mi však občas z nějakého důvodu nefungovala správně, používám proto druhé dvě jmenované.

Tělo v rámci funkcí OnInit() a OnTick() po obou úpravách může vypadat takto:

PrůmRozp3

Hlavička programu je následující:

PrůmRozp3 hlavička

Dnes jsme si sestavili první smysluplný program, který si můžete vylepšovat a rozšiřovat podle svých potřeb a fantazie. Program můžete snadno doplnit například informacemi o otevřených či uzavřených pozicích, o spreadu, o času do konce svíčky a další a další funkcionality. Můžete také dovolit uživateli, aby si zvolil velikost písma, barvu a další vlastnosti, s jakými se informace bude zobrazovat. To by si vyžádalo opuštění funkce Comment(), vytvoření grafického objektu typu text a v případě změny hodnoty průměru, změnu vlastnosti tohoto objektu.

V příštím, finálovém díle základní série se dostaneme k tématu, kvůli kterému tuto sérii píšu a kvůli kterému bylo potřeba absolvovat všechny lekce, a totiž k automatickým obchodním systémům. Spolu s Metatraderem si totiž stahujeme i dva ukázkové jednoduché obchodní systémy přímo od Metaquotes. Právě ony dva si rozebereme a vysvětlíme si jednotlivé segmenty, které lze použít i ve vašich vlastních obchodních systémech.