Proměnné typu pole

Co je to proměnná typu pole? Jak se indexují její hodnoty? V čem se liší deklarace a inicializace oproti normální proměnné? Jak vyvolám konkrétní hodnotu ze souboru hodnot? Proč takové proměnné existují a v čem mi usnadní práci?

Jak jsme uvedli minule, jeden díl je potřeba vyčlenit na proměnné typu pole, zvláště pak na ty předdefinované, které jsou naštěstí jejich nejjednodušším případem. Je tomu tak proto, že tyto proměnné jsou používány pro vyvolání charakteristických hodnot svíček v grafu, které jsou nutné pro tvorbu většiny obchodních systémů a indikátorů.

Proměnná typu pole obecně

Běžná proměnná v sobě může současně nést pouze jedinou hodnotu. Oproti tomu proměnná typu pole v sobě nese celý indexovaný soubor hodnot, který navíc může být až čtyřrozměrný. Díky indexům posléze můžeme vyvolat konkrétní hodnotu ze souboru, kterou zrovna potřebujeme. V jednom okamžiku lze mít přístup pouze k jediné z hodnot souboru. Čím více rozměrů má soubor, tím více souřadnic index má. Je to stejné, jako když hledáme bod na dvourozměrné ploše, třeba na mapě. Taky musíme zadat zeměpisnou délku a šířku. Když ale hledáme bod v třírozměrném prostoru, potřebujeme už souřadnice tři. Oproti zeměpisným souřadnicím by to mohlo být třeba ještě patro budovy. Hezky to ilustruje obrázek ze stránek mql.com:

Obrázek a) ilustruje jednorozměrný soubor hodnot proměnné typu pole, b) dvourozměrný a c) třírozměrný. Pro účely této série nám bude naštěstí stačit práce s jednorozměrnými soubory.

Obrázek a) ilustruje jednorozměrný soubor hodnot proměnné typu pole, b) dvourozměrný a c) třírozměrný. Pro účely této série nám bude naštěstí stačit práce s jednorozměrnými soubory.

Deklarace a inicializace

Deklarace proměnné typu pole se oproti běžné deklaraci liší jen v jedné věci. Oproti datovému typu a názvu proměnné musí být uveden ještě počet hodnot souboru, a to v hranatých závorkách. Inicializace probíhá rovněž jen mírně odlišně. Chceme-li soubor hodnot vložit ručně, provedeme to jejich výčtem ve složených závorkách.

int Rada[4] = {9,8,7,6};

Takto jsme nadeklarovali jednorozměrnou proměnnou Rada celočíselného typu, která obsahuje hodnoty 1, 2, 3 a 4. Indexace probíhá zleva doprava od nuly. Konkrétní hodnota je později v programu vyvolána názvem řady a indexem v hranaté závorce.

Vysledek = Rada[1];

Po provedení tohoto přiřazení nabude proměnná Vysledek hodnoty 8, jelikož hodnota proměnné Rada s indexem 1 je 8 (první hodnota, tedy 9, má index 0).

Ruční deklarace však není moc praktická hlavně pro obrovské soubory hodnot a moc se nepoužívá. Šikovnější způsob inicializace proměnné typu pole tkví v cyklech. Ty nás čekají až v díle o operátorech, ale přesto si pro ilustraci ukážeme, jak by taková inicializace mohla vypadat.

for (x = 0; x < Bars; x++) { Rada[x] = (High[x]+Low[x])/2 } V tomto případě poslouží cyklus for, který funguje tak, že z hlavičky (závorka nahoře) vezme první výraz (x = 0), provede iteraci cyklu (exekuuje kód uvedený ve složený závorce), potom provede třetí výraz v kulaté závorce (x++, což je x+1), provede další iteraci cyklu a takto postupuje stále dokola, dokud je splněna podmínka ve druhém výrazu kulaté závorky (x < Bars). O proměnné Bars jsme si již říkali – jedná se o počet svíček v grafu. Jak vidíme, každá iterace je provedena s x vyšším o jednu hodnotu a poslední iterace je provedena pro x = Bars-1, protože posléze již není splněna podmínka druhého výrazu. Při každé iteraci cyklu je hodnotě proměnné Rada s indexem x přiřazena hodnota, která vyplyne z rovnice (High[x]+Low[x])/2, což není nic jiného, než průměr High a Low svíčky s indexem x. Výsledkem tedy bude jednorozměrná proměnná typu pole „Rada“, která v sobě bude obsahovat soubor průměrů high a low všech svíček v grafu. Tím se krásně dostáváme k velice důležité problematice takzvaných časových řad a jejich indexaci.

Předdefinované proměnné časových řad

Jak jsme si řekli už v minulém díle, jazyk MQL obsahuje několik předdefinovaných proměnných, které není třeba deklarovat ani inicializovat. Některé z nich jsou typu pole, a především pro ně vznikl tento díl. Pro jistotu v následující tabulce zopakuji, o jaké proměnné se jedná.

Proměnná Hodnota
Time Časy otevření všech svíček grafu
Open Otevírací ceny všech svíček grafu
High Nejvyšší ceny všech svíček grafu
Low Nejnižší ceny všech svíček grafu
Close Zavírací ceny všech svíček grafu
Volume Objemy všech svíček grafu

Seznam je vám dost možná povědomý. Pokud totiž v Metatraderu v grafu najedete kurzorem myši na konkrétní svíčku, zobrazí se tooltip právě s těmito jejími specifiky. Stejná specifika také současně vidíte na stavovém řádku vpravo.

Díky těmto proměnným můžeme v kódu snadno vyvolat hodnotu jakéhokoliv z těchto specifik jakékoliv svíčky na grafu, kde je program spuštěn. Jak hodnotu vyvolat už víme, teď potřebujeme jen vědět, na základě jakého klíče se tyto hodnoty svíček indexují.

Indexace svíček probíhá od nuly vzestupně zprava. To znamená, že aktuální úsečka, která se právě vytváří, má index 0. Poslední hotová úsečka má index 1 atd. Vše ilustruje následující obrázek a tabulka:

Indexace barů

 

Indexace tabulka

Na obrázku je minutový graf, kde čísla nad svíčkami odpovídají jejím indexům. V tabulce jsou potom konkrétní specifika svíček s danými indexy. Z obrázku a tabulky plyne, že chceme-li získat například otevírací cenu aktuální svíčky, potřebujeme hodnotu Open[0], která je aktuálně 1,54370. Volume svíčky s indexem 19 – Volume[19] má aktuální hodnotu 82 a podobně. Pokud se vrátíme k příkladu výše s proměnnou Rada a aplikujeme jej na tuto konkrétní situaci, pak po provedení tohoto výrazu

Rada[2] = (High[2]+Low[2])/2

Bude do proměnné Rada s indexem 2 uložena hodnota (1,54352 + 1,54324)/2 = 1,54338.

S tímto typem proměnných se setkáme v této sérii ještě mnohokrát, takže pokud jste tématu plně neporozuměli, nevadí, v praxi bude vše jasnější. V příštím díle nás čeká poměrně odpočinkové téma, a to operace.