Až budete vyvíjet svůj vlastní skript, budete potřebovat „dolovat“ data o aktuální ceně na trhu pro daný měnový pár. Jazyk MQL4 nabízí několik vestavěných proměnných, které vracejí různé informace o dění na trhu.
Ask
V našem testovacím skriptu jsme se již seznámili s touto proměnou a víme, že vrací cenu, za kterou můžeme nakupovat daný měnový pár. Slovo „ask“ v anglickém jazyce znamená „žádat“. Přesto z pohledu obchodu vůči nám se jedná o nabídku, je to cena, kterou nám nabízí trh.
double nabidka = Ask;
Bid
Opačná proměnná k proměnné Ask je Bid. Jedná se o cenu, za kterou můžeme prodávat daný měnový pár. Stejně jako u Ask jsme si vysvětlili anglický význam, i zde musím podotknout, že „bid“ je v anglickém jazyce „nabídka“, ale pro obchodování vůči nám to znamená poptávku, jelikož se jedná o cenu, kterou trh poptává.
double poptavka = Bid;
Bars
Tato proměnná vrací počet dostupných svíček ve svíčkovém grafu (dovolil jsem si nahradit slovo bar slovem svíčka kvůli lepšímu pochopení významu). MetaTrader vám ukládá data z trhu a uchovává tak historii cen. Bars pak vrací počet těchto záznamů. Čím více, tím lépe pro statistiku. Otázkou je, kolik svíček vlastně pro své výpočty budete potřebovat.
int pocetSvicek = Bars;
Digits
Proměnná vrací počet desetinných míst, ze kterých se skládá cena daného měnového páru. Pokud bychom tuto proměnou použili např. u měnového páru EURUSD, kde cena může být např. 1.3032, vrátila by nám proměnná číslo 4.
int pocetMist = Digits;
Point
Vrací hodnotu jednoho bodu daného měnového páru. Tato proměnná se hodně používá při nastavování ceny StoppLoss (zastavení ztrát) a TakeProfit (realizování zisku) v metodě pro otevření pokynu případně pro úpravu pokynu.
double hodnotaBodu = Point;
Close[]
První proměnná typu pole. Pole je proměnná, která v sobě ukládá více hodnot, kde každá hodnota je identifikována indexem právě v hranatých závorkách. Tato proměnná vrací zavírací hodnotu daného měnového páru a to pro všechny dostupné svíčky v grafu (viz. proměnná Bars). MetaTrader automaticky naplní tuto proměnnou daty ze svíček, které jsou v grafu dostupné. Hodnoty pole se indexují od 0 a první hodnota je vždy aktuální hodnota. Je třeba zmínit, že hodnota je aplikovaná na svíčku grafu a tudíž je hodnota jiná pro jinou periodu, proto Close[] vrací jinou hodnotu pro třicetiminutový graf a jinou pro hodinový graf.
// vrátí aktuální zavírací cenu
double aktualniHodnota = Close[0];
// vrátí předchozí zavírací cenu
double predchoziHodnota = Close[1];
// vrátí zavírací cenu poslední svíčky, která je pro graf dostupná
// jelikož Bars vrací počet svíček, index svíčky musí být o 1 menší
// než celkový počet, protože se indexuje od 0 a ne od 1
double posledniHodnota = Close[Bars - 1];
Open[]
Tato proměnná vrací otevírací cenu pro konkrétní svíčku daného měnového páru. Platí pro ni stejná pravidla jako pro Close[].
double aktualniHodnota = Open[0];
High[]
High vrací nejvyšší hodnotu konkrétní svíčky měnového páru pro danou periodu.
double aktualniHodnota = High[0];
Low[]
Low vrací nejnižší hodnotu svíčky měnového páru pro danou periodu.
double aktualniHodnota = Low[0];
Volume[]
Volume vrací hodnotu objemu obchodů na dané svíčce měnového páru pro danou periodu. Přesněji vrací počet změn ceny v daném intervalu. Neříká tedy, kolik obchodníků obchodovalo v dané době, ale kolikrát toto obchodování ovlivnilo cenu.
double aktualniHodnota = Volume[0];
Time[]
Poslední z proměnných je Time, která vrací datum a čas svíčky měnového páru pro danou periodu.
datetime casHodnoty = Time[0];
Bonus na závěr
Když už víme, jak získat informace z grafu, můžeme si ukázat příklad, který projde všechny dostupné svíčky a vypíše základní údaje o ceně. Jako výstup použijeme funkci Alert(). Kód můžete použít ve vašem existujícím skriptu MyTestScript nebo si kliknutím na New z menu File založte nový skript, kde v průvodci přidáním nového souboru nezapomeňte vybrat položku Script. V případě, že použijete existující skript z předchozí kapitoly, nahradíte pouze obsah funkce start() níže uvedeným kódem. Pro lepší přehled uvádím kód včetně funkce start():
int start()
{
// zjistíme, kolik svíček máme k dispozici
int nc = Bars;
// pokud je svíček víc než 30, nastav max. 30
if(nc > 30)
{
nc = 30;
}
// pro každou svíčku vypiš čas, otevírací a zavírací cenu
for(int i = 0; i < nc; i++)
{
string casSvicky = TimeToStr(Time[i], TIME_DATE|TIME_MINUTES);
string oteviraciCena = DoubleToStr(Open[i], Digits);
string zaviraciCena = DoubleToStr(Close[i], Digits);
string msg = "Čas svíčky: " + casSvicky;
msg = msg + ", otevírací cena je " + oteviraciCena;
msg = msg + ", zavírací cena je " + zaviraciCena;
Alert(msg);
}
return(0);
}
Rozebereme si výše uvedený kód. Jeho úkolem je projít určitý počet dostupných svíček, získat z každé svíčky informaci o ceně a zobrazit složenou zprávu v Alarm dialogu.
Nejprve definujeme proměnou nc, do které si uložíme počet dostupných svíček, které nám MetaTrader může nabídnout.
int nc = Bars;
Dále následuje podmínka if. Až budete vytvářet vlastní EA, určitě se nevyhnete podmínkám. Podmínky řídí tok kódu na základě zadaných kritérií. Obecně lze podmínku vyjádřit asi takto: když něco platí, tak udělej tohle, jinak udělej tohle. Podmínky tedy vyhodnocují booleanovská data, zda je něco pravda nebo není.
Definice podmínky se zapisuje takto:
if(podmínka)
{
// kód
}
else
{
// kód
}
Nebo rozšířená upřesňující podmínka
if(podmínka)
{
// kód
}
else if(jiná podmínka)
{
// kód
}
else
{
// kód
}
Podmínky můžete do sebe zanořovat, tzn., že v jednom bloku if nebo else můžete napsat další podmínku.
if(podmínka)
{
if(jiná podmínka)
{
// kód
}
else
{
// kód
}
}
else
{
// kód
}
V našem kódu máme podmínku, která říká: pokud počet svíček v proměnné nc je větší jak 30, tak nastav proměnnou nc na 30. Jinak zůstává počet svíček takový, který jsme dostali z proměnné Bars. Tuto podmínku jsem zavedl čistě s limitních důvodů. Proměnná Bars vám může vrátit tisíce záznamů a výpis tolika záznamů do Alarm dialogu by nebyl zrovna nejlepší ukázkou, proto jsem tento počet omezil a zároveň vás seznámil s podmínkami.
if(nc > 30)
{
nc = 30;
}
Další část kódu představuje cyklus, který se bude vykonávat pro určitý počet výskytů. Pro procházení nějakých cyklických dat se používají funkce, které umí cykly zpracovávat. Jednou z nich je operátor for. Jeho definice je:
for(Výraz1; Výraz2; Výraz3)
{
// tělo cyklu
}
Výraz1 je inicializace cyklu, zde se nachází proměnná, která nám nastaví počítadlo cyklu.
Výraz2 je podmínkový výraz, který nám vyhodnocuje, zda je pravda, že se má cyklus stále vykonávat, nebo již ukončit.
Výraz3 je iterace počítadla. Když bych měl vlastními slovy říct, co přesně definice říká, tak by to bylo asi takto: pro každý cyklus, dokud je to pravda, vykonej něco, co potřebuju.
for(int i = 0; i < nc; i++)
Nejdříve se nastaví hodnota i na 0 a pak při každém opakování se zvýší o 1. Cyklus bude vykonávat kód, dokud hodnota i bude menší jak nc (např. 30).
Dále si pak v kódu ukládáme do pomocných textových proměnných hodnoty, které spojíme do jednoho řetězce a později zobrazíme.
string casSvicky = TimeToStr(Time[i], TIME_DATE|TIME_MINUTES);
string oteviraciCena = DoubleToStr(Open[i], Digits);
string zaviraciCena = DoubleToStr(Close[i], Digits);
Do proměnné casSvicky si uložíme čas svíčky v podobě textu v určitém formátu pomocí funkce TimeToStr().
Funkce TimeToStr() je konverzní funkce a převádí hodnotu datumu do řetězce. Když bychom zobrazili hodnotu pouze použitím Time[i], tak by se nám zobrazila celočíselná hodnota, které rozumí počítač, ale pro nás by tato hodnota byla nic neříkající. Tato funkce má dva parametry, kde v prvním předáváme hodnotu datumu a v druhém říkáme, jak hodnotu chceme zobrazit. Druhý parametr je bitový příznak a je kombinací následujících konstant:
TIME_DATE – zobrazí hodnotu datumu ve formátu „yyyy.mm.dd“, kde yyyy reprezentuje číslo roku, mm číslo měsíce a dd číslo dne.
TIME_MINUTES – zobrazí hodnotu datumu ve formátu „hh:mi“, kde hh je hodina a mi je minuta.
TIME_SECONDS – zobrazí hodnotu datumu ve formátu „hh:mi:ss“ kde ss je sekunda a zbytek je stejný jako u TIME_MINUTES.
Kombinací TIME_DATE|TIME_MINUTES tak získáme datum ve formátu „yyyy.mm.dd hh:mi“. Jednotlivé kombinace se oddělují bitovým operátorem OR, reprezentující znak „|“. Pokud používáte českou klávesnici, napíšete tento znak kombinací kláves <AltGr>+<W> (Pravý Alt + písmeno W). Samozřejmě můžete funkci předat pouze jednu z výše uvedených konstant a nemusíte kombinovat.
Do proměnných oteviraciCena a zaviraciCena si uložíme hodnotu otevírací a zavírací ceny v podobě textu, kde hodnotám upřesním, kolik desetinných míst mají zobrazit a to pomocí funkce DoubleToStr().
Funkce DoubleToStr() převádí číslo typu double na řetězec. V prvním parametru se předává hodnota čísla a v druhém parametru se říká, kolik desetinných míst chceme v čísle zobrazit. Když bychom chtěli zobrazit číslo s 2 desetinnými místy, napsali bychom následující:
string vysledek = DoubleToStr(1.23456, 2); // vysledek bude „1.23“
Jak jste si všimli, tak v našem příkladu jsme hnedka využili služeb proměnné Digits, která vrací počet desetinných míst pro daný měnový pár.
Jelikož jsme v cyklu a díky proměnné i, která při každém opakování cyklu zvyšuje svou hodnotu, můžeme tak pomocí proměnných Time[], Open[], Close[] číst hodnoty jednotlivých svíček směrem do historie.
Další část kódu v cyklu již skládá výslednou zprávu, která se má zobrazit. Spojování řetězce se v jazyku MQL4 provádí znakem „+“. Výsledný text se nám uloží do proměnné msg.
string msg = "Čas svíčky: " + casSvicky;
msg = msg + ", otevírací cena je " + oteviraciCena;
msg = msg + ", zavírací cena je " + zaviraciCena;
Finále cyklu je završeno výpisem do Alarm dialogu pomocí funkce Alert().
Alert(msg);
Nyní, když zkompilujete kód (nebudete mít žádné chyby v okně Errors) a spustíte skript v platformě přetažením do grafu, výpíše se vám 30 zpráv, kde bude zobrazena informace o cenách v daném čase.