Struktura programu

Jaké jsou části programu? Liší se tyto části dle typu programu? Proč je důležité kódy dělit na logické části? Jak se mezi částmi pohybuje kontrola programu?

Každý program můžeme rozdělit do několika logických částí. Jejich počet a použití závisí na typu a účelu daného programu. Základní schéma s částmi, které obsahuje většina programů, nabízí následující diagram. Pod diagramem je vysvětlen postup exekuce programu tak, jak ji počítač provádí. Poté jsou rozebrány jednotlivé hlavní části programu. Možná se to zdá jako zbytečná teorie, poznáte však sami, že znalost toho, jak se co exekuuje, je velice důležitá.

Struktura běžného programu

Struktura běžného programu

Postup exekuce programu

Obvyklý postup exekuce programu mezi jednotlivými částmi naznačuje červená linie na diagramu. Jak již vyplynulo z minulého dílu, program nejdříve přečte hlavičku a následně exekuuje funkci OnInit(), je-li přítomna. Poté se přesune k hlavní speciální funkci, která se liší dle typu programu, jak jsme viděli v minulém díle. Je-li programem skript, speciální funkce OnStart() se vykoná pouze jednou. V ostatních případech se hlavní speciální funkce vykonává pořád dokola, dokud nepřijde pokyn k ukončení programu. Ten může přijít buďto přímo z nějaké části kódu, nebo od uživatele programu. Jakmile se tak stane, exekuce jde na funkci OnDeinit(), je-li přítomna, a následně program končí.

Žluté linie označují možné volání uživatelských funkcí z hlavních funkcí. Uživatelskými funkcemi se budeme blíže zabývat později. Jsou to části kódu, které mají za cíl vykonat určitý úkol. V kódu jsou umístěny mimo ostatní funkce, obvykle pod celým kódem. Jak je vidět, funkce mohou být volány ze všech speciálních funkcí, nejen z hlavní, ale také mezi uživatelskými funkcemi navzájem. Množství uživatelských funkcí v programu není omezeno.

Modré šipky označují komunikace jednotlivých funkcí s terminálem. To se může dít například za účelem získání aktuální ceny instrumentu, objemů a dalších informací. V některých případech může program zajišťovat komunikaci i mimo terminál, což označují černé šipky. Jedná se třeba o exekuci příkazů, kdy program komunikuje se serverem brokera, nebo o práci se soubory, kdy se vyměňují informace přímo s operačním systémem.

Hlavička

V hlavičce se obvykle nejprve nachází základní informace o programu, jako verze, autorství, popis atd. Jsou to ty informace, které se nám zobrazí po spuštění programu v Metatraderu. Aby se zobrazily uživateli, v kódu musí vždy začínat modifikátorem #property a názvem daného typu informace (např. copyright, description, version atd.).

Dále v hlavičce definujeme globální proměnné. Tyto proměnné budou k dispozici všem funkcím v programu. O proměnných si samozřejmě povíme blíže v dalších částech série. Pokud je před názvem proměnné modifikátor „input“, pak definujeme proměnnou, jejíž hodnotu bude mít možnost zadat sám uživatel programu (v případě skriptu je ale třeba ještě zadat modifikátor #property show_inputs, aby se zobrazilo okno s proměnnými). Dále lze v hlavičce například importovat funkce z jiných souborů knihoven a další činnosti. Podstatou ale je, že v hlavičce není kód k exekuci, pouze prostor pro základní definice. V hlavičce nelze používat operátory a uživatelské funkce.

Hlavička

Příklad hlavičky programu

Speciální funkce OnInit()

Tato funkce obsahuje kód, který bude exekuován jako první. Je to tedy souhrn akcí, které mají být vykonány před spuštěním hlavní části programu. Může se jednat o přípravu grafiky, definici linií indikátoru, přípravné výpočty apod. U indikátoru je funkce přítomna téměř vždy, jinak ani nemusí být potřeba a můžeme ji nechat prázdnou nebo úplně smazat. V takovém případě kontrola přejde z hlavičky rovnou k hlavní speciální funkci. Přestože MetaEditor ji vždy vygeneruje na první místo, v praxi je úplně jedno, kde je v programu umístěna. Kontrola k ní vždy zamíří jako první, je-li v kódu přítomna.

OnInit

Příklad funkce OnInit() v programu typu indikátor, kde definujeme počet a styly linií.

Hlavní speciální funkce

Každý program musí obsahovat speciální funkci, která bude obsahovat hlavní část programu k exekuci. Tedy tu část, která definuje hlavní poslání našeho programu. Konkrétní hlavní speciální funkce se liší dle typu programu. V případě skriptu má název OnStart(), u strategie jde o OnTick() a konečně indikátor má OnCalculate(). Do programů lze přidávat ještě několik dalších speciálních funkcí. O nich bude po ukončení základní série následovat speciální článek, pro základy jich nebude třeba. Název speciální funkce naznačuje, při jaké události se funkce přivolá. OnInit() se exekuuje při inicializaci, OnTick() při příchozím novém ticku apod. V této části programu se obvykle nachází největší část kódu a exekucí této části se rovněž kontrola programu zabývá nejdelší čas. V případě strategie nebo indikátoru se tato část opakuje stále dokola, dokud není program ukončen.

Vlastní uživatelské funkce

Většina trochu složitějších kódů bude z důvodu přehlednosti obsahovat uživatelské funkce. To jsou všechny nepředdefinované funkce, které si programátor nadefinuje v kódu sám. Podrobně se jimi budeme zabývat později. Rovněž je úplně jedno, na kterém místě jsou v kódu umístěny. Obvykle se pro přehlednost dávají na úplný konec. Exekuovány jsou ve chvíli, kdy jsou takzvaně zavolány z jiné části kódu, která se právě exekuuje. Princip volání a konstrukce uživatelských funkcí si ukážeme v dalších dílech, ale určitě není na škodu se již nyní podívat, jak může vypadat.

Vlastní funkce

Příklad programu na výpočet přepony pravoúhlého trojúhelníku, který využívá volání na uživatelskou funkci. Samotné volání uživatelské funkce z hlavní funkce skriptu OnStart() je na řádku č. 6, tělo volané funkce s názvem Pythagoras je na řádcích 14 – 16. Do funkce jsou převedeny parametry A a B, funkce vrací proměnnou C, tedy délku přepony.

Speciální funkce OnDeinit()

Jak plyne z názvu, tato speciální funkce má na starost provést kód při deinicializaci, tedy ukončení programu. Je to tedy soubor akcí, které jsou vykonány, jakmile uživatel nebo terminál dá příkaz k ukončení programu. Může se jednat třeba o vymazání grafických prvků programu, rozloučení s uživatelem apod. Opět nezáleží na pozici v kódu. Jakmile je dokončena exekuce této funkce, program končí. Pokud funkce chybí, stejně jako u OnInit() se program ukončí rovnou po signálu k ukončení.

Příklad jednoduché funkce OnDeinit(), při které jsou smazány veškeré grafické objekty grafu.

Příklad jednoduché funkce OnDeinit(), při které jsou smazány veškeré grafické objekty grafu.

V dalších dílech se již konečně podíváme na konkrétní vlastnosti jazyka MQL. Začneme rozdělením dat na jednotlivé typy.