Funkce a volání na funkci

Již v minulém díle jsme si představili základní typy funkcí, které v programech využíváme. Jsou to funkce speciální, které nemohou chybět v žádném programu, dále funkce standardní neboli předdefinované a funkce uživatelské. Povídání o funkcích zabere 4 díly. Dnes se budeme věnovat obecnému úvodu do problematiky funkcí, v dalších třech dílech se podíváme na funkce standardní, blíže si rozebereme obchodní funkce a nakonec ještě uživatelské.

Funkce

Funkce obecně je část kódu, která má za úkol předepsaným způsobem vyřešit nějaký problém nebo zadání a obvykle vrátit určitou hodnotu. Obecný tvar funkce vypadá následovně:

int Moje_funkce(double par1, string par2, int par3)

{

blok určený k exekuci – tělo funkce

return(vracena_hodnota);

}

První řádek se označuje jako hlavička a v ní je definován datový typ funkce, který odpovídá datovému typu vrácené hodnoty (v tomto případě int, tedy celé číslo), následně název funkce a v závorce seznam parametrů s příslušnými datovými typy. Následují složené závorky a v nich uložené tělo funkce, tedy její samotná podstata – skupina operátorů, operací, dalších funkcí atd. V těle musí být umístěn operátor return a za ním v závorce hodnota, kterou má funkce vrátit (nejedná-li se o funkci typu void). Operátor return slouží zároveň i jako ukončení funkce, po kterém kontrola funkci opouští a vrací se do původního kódu.

Většina funkcí pracuje se vstupy, takzvanými parametry, které jí musíme zadat. Parametry se zadávají za název funkce do závorky, oddělují se čárkou. Parametr umožňuje převod nějaké hodnoty proměnné z okolního kódu dovnitř funkce, aby s ní mohla pracovat. Například takto vypadá hlavička funkce se dvěma parametry.

double Podil(double zisk_dny, int ztrat_dny)

Jsou ale i funkce, které žádné parametry pro svou práci nepotřebují. V závorce prostě nebudou mít nic, ale samotná závorka tam být musí, aby program poznal, že jde o hlavičku funkce a nikoli o proměnnou. Taková funkce může vypadat následovně:

kapitalJde o funkci, která v historii vyhledá pozice s typem 5 a více, což jsou deposity a výběry. Jejich hodnoty sečte, uloží do proměnné Kapitál a tuto vrátí.

Na funkci lze nahlížet třeba jako na tiskárnu. Potřebuje vstupy – parametry (tonery, papír, elektřinu) a výstupem bude vytištěný dokument. U funkce je výstupem nějaká získaná hodnota – číslo, text, kterýkoliv z přípustných datových typů, které jsme rozebírali v pátém díle. Datový typ, který funkce vrací, určuje datový typ celé funkce. Obojí musí být v souladu.

Stejně jako existují funkce, které nepotřebují vstupy, existují i funkce, které nevracejí žádnou hodnotu. Říká se jim funkce typu „void“. Jejich účelem potom není vrátit hodnotu, ale exekuce samotná. Jde například o hojně využívanou standardní funkci Alert(), která v terminálu zobrazí upozornění se zadaným textem. Jako taková ale nevrací do kódu žádnou hodnotu. Mezi funkce typu void patří mimochodem i speciální funkce OnDeinit() nebo třeba OnTick(). I tak ale funkce typu void mohou obsahovat operátor return. Ten se hodí třeba v případě, že je vhodné za určité podmínky funkci ukončit dříve, tedy když za určité podmínky není potřeba funkci dále exekuovat (je to vlastně analogie s operátorem break v cyklu). Jen za tímto operátorem bude chybět závorka s vracenou hodnotou. Opět neuškodí příklad s částí funkce:

return

Toto je ukázka z příkladového obchodního systému Moving Average, který je součástí každého MetaEditoru. Řádky 138 a 139 jednoduše říkají, že pokud je na grafu méně než 100 svíček nebo je zakázáno automatické obchodování, funkce OnTick má být ukončena (a kontrola tedy má být předána funkci OnDeinit a program ukončen).

Funkce obsahuje každý program. Pokud ne jiné, tak speciální určitě. O speciálních funkcích jakožto tahounech veškeré exekuce jsme již napsali mnoho, ať už v díle minulém nebo ve čtvrtém díle, kde jsme se zabývali obecnou strukturou programu. Dodám jen, že z výše uvedeného by vám mělo vyplynout, že celý program je vlastně jedna velká funkce vzhledem k tomu, že veškerá část, která se exekuuje (tedy vše kromě hlavičky programu), se odehrává uvnitř speciálních funkcí.

Volání na funkci (function call)

Aby program věděl, kdy má funkci exekuovat, je potřeba se ještě seznámit s jejich spouštěči. Jsou to operátory, kterým se říká Function call, tedy volání funkce. Jedinými funkcemi, na které se nevolá, jsou funkce speciální. Respektive, volá na ně sám terminál podle určitého klíče. Například při spuštění programu se zavolá speciální funkce OnInit(), při příchozím ticku OnTick(), při spuštění skriptu OnStart() a tak dále.

V předchozí kapitole jsme si ukázali, jak vypadá samotná funkce, nyní si ukážeme tvar operátoru volání funkce. Ten je následující:

Moje_funkce (par1, par2, par3);

Operátor sestává z názvu volané funkce a hodnot předávaných parametrů. Ukončen je samozřejmě jako každý jiný operátor středníkem. Počet a datové typy parametrů volání funkce a dané funkce musí souhlasit, jinak kompilátor oznámí chybu. Krásně to ilustruje následující obrázek, který jsem si vypůjčil z book.mql4.com. Z něj je také vidět, že předávaný parametr může být jakýkoliv datový typ a může to být konstanta, výraz nebo proměnná.

Parametry

Zároveň vidíme, že jakmile kontrola zaregistruje volání funkce, exekuce se přesune k tělu této funkce. Ta může být v případě uživatelské funkce umístěna kdekoliv v programu, samozřejmě mimo těla jiných funkcí. Ovšem v případě, že jde o funkci standardní neboli předdefinovanou, tak funkce samotná v programu vůbec není potřeba, stačí na ni jen zavolat. Můžeme si to představit tak, že kódy těchto funkcí jsou již hotové a zabudované přímo v Metatraderu. Právě na ně se blíže podíváme v příštím díle.