Ostatní speciální funkce

V základní sérii padla řeč pouze na základní a nejčastěji používané speciální funkce (OnInit(), OnDeinit(), OnTick() a OnStart()). V novém MQL4 však přibylo oproti staré verzi jazyka několik nových speciálních funkcí, které mohou být velice užitečné. Jim se bude věnovat právě tento článek.

Ještě před jejich výkladem začneme malým výletem do historie. Stará verze jazyka rozlišovala pouze 3 speciální funkce, a to init(), start() a deinit(), se kterými se stále můžete setkat ve starších programech a i nová verze MQL4 je stále z důvodu zpětné kompatibility respektuje. Init() a deinit() měly stejný význam jako jejich dnešní ekvivalenty s předponou On, tedy volaly se při spuštění respektive ukončení programu. Kdy se volala funkce start() potom záleželo na typu programu. Pokud se jednalo o skript, zavolala se při spuštění, tedy stejně jako dnešní OnStart(). Pokud se ale jednalo o strategii, volal se start() každý tick, stejně jako nynější funkce OnTick(). A konečně, pokud se jednalo o indikátor, volal se také při každém ticku, dnešním ekvivalentem je ovšem funkce OnCalculate(). Právě touto funkcí začneme.

OnCalculate()

Je obdobou funkce OnTick() pro program typu indikátor. Volá se také při každém ticku. Je to logické, protože kdy jindy je potřeba přepočítat hodnotu indikátoru než při nové příchozí ceně. I já jsem se samozřejmě ptal, jaký je rozdíl oproti funkci OnTick(). Vše tkví v parametrech a typu funkce. Zatímco OnTick() je typu void a nemá žádné parametry, OnCalculate() je typu int a má několik parametrů, které lze použít pro výpočty hodnot indikátoru. Díky tomu je funkce mnohem efektivnější pro programy typu indikátor. Pojďme se na ony parametry podívat.

První parametr rates_total odpovídá počtu svíček na grafu, kde je indikátor spuštěn. Umožňuje tak zabránit například zbytečným výpočtům.

Druhý, velice důležitý parametr prev_calculated v sobě obsahuje hodnotu, která byla vypočítána při předchozí exekuci funkce OnCalculate(). Jeho použití umožní značné zefektivnění indikátoru, jelikož není nutné znovu přepočítávat hodnoty vypočítané pro svíčky, které se nezměnily od předchozího výpočtu. Pro většinu indikátorů to jsou všechny svíčky kromě té aktuální.

Ostatní parametry v sobě nesou časové řady příslušných proměnných jednotlivých svíček přesně tak, jak je známe z článku o proměnných.

Jak vidno, parametry tvořené na míru programu typu indikátor dělají tento program značně efektivnější a jednodušší, než kdyby exekuci měla na starost čistě funkce OnTick(). Více se o OnCalculate() a programování indikátorů dozvíme v připravovaném samostatném článku.

OnTimer()

Velice zajímavá speciální funkce, která v původní verzi MQL4 neměla obdobu. Jak plyne z názvu, tato funkce funkce je volána pravidelně po určitém čase. Umožňuje, aby část kódu v jejím rámci byla exekuována pravidelně a nezávisle na dění na trhu nebo v platformě. Můžeme se tak třeba každou hodinu nechat emailem informovat o stavu účtu, každý den si poslat report apod.

Možná si říkáte, že toto doteď šlo také celkem bez problému řešit. Že se změnil den poznám jednoduše třeba tak, že se změní výsledek funkce Day() a obdobně. Ale co když potřebuji nějakou úlohu řešit každé tři hodiny, dvě minuty, šest sekund nebo dokonce v řádech milisekund? A co když potřebuji, aby to fungovalo i o víkendu a mimo obchodní hodiny daného instrumentu? To vše je již možné právě díky funkci OnTimer(), která je volána pouze na základě uplynulého času, nezajímá ji, co se děje na trhu.

Periodické volání funkce OnTimer(), pokud ji máme v programu, spustíme funkcí EventSetTimer(), jejímž parametrem je počet sekund, po kterých se má funkce OnTimer() volat. Pokud tvoříme program se zaškrtnutou volbou OnTimer(), průvodce nám vygeneruje EventSetTimer(60) do funkce OnInit(), kde by měl být, není to však nutností. Viděl jsem i programy, kde se timer spouštěl z OnTick() za určitých podmínek. Ukončení timeru provádí funkce EventKillTimer(), která je obvykle umístěna v rámci OnDeinit(), ale opět to není nutnost. Pokud na EventKillTimer() zapomeneme, timer je ukončen násilím při ukončení programu. Dobré je vědět také to, že první zavolání timeru proběhne až po uplynutí nastavené čekací doby, nikoli ihned po zavolání EventSetTimer(). Pokud potřebujeme rozlišovací schopnost timeru pod sekundu, existuje spouštěcí funkce EventSetMillisecondTimer(), jejímž parametrem je počet milisekund, po kterých se exekuuje OnTimer().

Závěrem dlužno dodat, že v rámci jednoho programu lze použít jen jeden timer, ale zároveň může běžet více timerů na více různých strategiích a tyto se mezi sebou nebudou nikterak prát.

OnChartEvent()

Tato funkce exekuuje kód v případě, že uživatel provede některou z definovaných událostí. Obvykle se jedná o události spojené s objekty na grafu, třeba vytvoření, posunutí, smazání apod., nebo prosté kliknutí, pohyb myši či stisknutí klávesy. Funkce má následující parametry.

Parametr id označuje druh události. Ostatní parametry potom záleží právě na typu události. Například pokud jde o klik myší, lparam bude x-ová souřadnice grafu, dparam y-ová a sparam se nepoužije. Tabulku s výčtem různých událostí a jim příslušných parametrů nalezneme na stránce https://docs.mql4.com/basis/function/events#onchartevent samozřejmě v angličtině. Zanedlouho ovšem i této funkci bude věnován samostatný článek, kde bude tabulka vysvětlena v češtině.

OnTester()

Je funkce, která je volána pouze při testování strategie na historických datech, a to před vykonáním funkce OnDeinit(). Je typu double a nemá žádný parametr. Jejím účelem je obvykle výpočet hodnoty určitého testovacího kritéria, které uživateli poskytne možnost seřadit si podle tohoto kritéria testy s různými parametry strategie (optimalizace).

Článek přinesl základní přehled pokročilých speciálních funkcí, které přinesla aktualizovaná verze jazyka MQL4. Každá speciální funkce, včetně těchto bude mít v budoucnu v této kategorii vlastní podrobný článek.