Základní struktura EA (AOS) (díl 3.)
začínáme programovat. Otevřeme si svou první EA.
Tak a je to tady,V menu MetaEditoru vybereme File -> New
Pak si vyberte možnost Expert Advisor a klikněte na tlačítko „Další >“
Pak si svou první EA pojmenujte např: Pokus a dejte „Dokončit“
… a otevře je vám tělo nové EA.
Projděme si krátce jednotlivé části popsat:
1 – hlavička. Celá tato část je postavená na komentářích. Obsahuje základní informace o této EA. Tyto informace jsou zbytné, a pokud je smažete, EA bude fungovat úplně stejně. Já osobně hlavičku používám pro zapsání všech identifikačních údajů k dané strategii, kterou programuji.
2 – copyright. Opět zbytná část. Tyto údaje/informace se objevují na různých místech v MT4, když pak s touto EA pracujete. Nemají však žádný vliv na funkčnost EA. Pomocí #property můžeme v MQL4 specifikovat určité parametry. V EA je nepotřebujeme, větší význam má #property při tvorbě indikátorů.
3 – expert initialization function. Do této části budeme dávat definice externích parametrů. Samotná EA je rozdělena do 3 funkcí init(), deinit () a start (). Init () slouží pro definici toho, co potřebuje „zavést“ do programu předtím, než se rozběhne.
4 – expert deinitialization function. Deinit() obsahuje naopak instrukce, které je potřeba provést k vyčištění zavedených dat a instrukcí, když je program ukončen. Viděl jsem řadu EA, kde se programátoři vyžívali ve složitých kódech v částech 3 a 4. My jdeme cestou tvorby EA metodou snadno a rychle, takže se omezíme jen na to nejnutnější.
5 – expert start function. V části start () se bude nacházet tělo našeho programovaného systému a zde nás čeká nejvíce práce.
Pojďme si tedy zkusit naprogramovat nějakou jednoduchou myšlenku. Představme si, že chceme vstupovat do longu na EURUSD vždy při otevření trhů v neděli ve 23:00 SEČ s profit targetem 200 pipů a stoplossem 100 pipů.
EA můžeme naprogramovat hodně „staticky“, tzn. naprogramujeme natvrdo trh EURUSD, a hodnoty PT a SL. My se však pokusíme programovat EA co nejuniverzálněji s vidinou, aby EA fungovala i na jiných trzích než jen EURUSD. Profit target a stoploss také nastavíme tak, abychom ho mohli měnit a popřípadě i optimalizovat.
Než se pustíme do psaní kódu u složitějších obchodních systémů, je dobré si promyslet, jaké proměnné musíme nadefinovat a udělat si jednoduchý diagram podmínek a toho, co bude následovat po jich splnění atd.
V prvním kroku vydefinujeme základní proměnné, které budeme pro naprogramování výše uvedené myšlenky potřebovat, tzn. definice Stoplossu a Profit targetu.
extern double Stoploss_v_pipech = 100;
extern double Profit_target_v_pipech = 200;
Vzhledem k tomu, že proměnná uváděná v pipech je celé číslo, můžete proměnnou definovat pomocí datového typu int. Můžete však použít i datový typ double, ten pracuje s desetinnými čísly a lze ho samozřejmě použít i pro celá čísla. Pokud dáme před definici proměnné slovo extern, tak se tato proměnná bude zobrazovat při spuštění strategie a uživatel si bude moci tuto hodnotu upravovat. Tato proměnná pak bude moci být testována. Za každým řádkem nezapomeňte středník.
Na obrázku je vidět, že když pak přidáme EA do grafu, všechny proměnné označené extern se objeví v záložce vložit parametry a my je můžeme změnit. Pokud bychom nepoužili příkaz „extern“ proměnná by se v této záložce neobjevila.
POZOR ještě na jednu věc. Pokud máte brokera, který pracuje se čtyřmístnou cenou, dosadíte hodnoty 200 a 100. Pokud však broker používá pětimístné ceny, je potřeba zadat 2000 a 1000.
Podívejme se raději ještě jednou na to, co jsme již v EA provedli:
1 a 2 – upravili jsme hlavičku – nemá sice vliv na funkci EA, ale je dobré si zde poznamenat klíčové informace. Když pak budete programovat 30 jiných EA a pak se vrátíte k té první, tak Vám to pomůže v rychlejší orientaci. Proto razím zásadu: Dělejte si poctivě komentáře, pomůže Vám to při budoucích úpravách …
3 – definice SL a PT
4 – uložili jsme stiknutím „Compile“. Zapsaný kód uložíme stisknutím tlačítka „Compile“ v horní liště. Tím dojde k uložení zapsaného kódu a jeho kontrole. V případě, že je kód zapsán správně objeví se v dolním okně oznámení o tom, že je kód bez chyb. Popřípadě zde najdete chybovou hlášku, pokud je kód zapsán chybně.
Další věc, kterou potřebujeme definovat je den v týdnu a čas vstupu. Budeme ho potřebovat pro vstup do pozice. Jelikož půjde vždy o celé číslo, použijeme datový typ „int“. Zápis provádíme do části start(). V této části se bude programovat celý zbytek naší strategie.
int D = DayOfWeek(); // zjistí den v týdnu (neděle=0 … pátek=5)
int m = TimeMinute(TimeCurrent()); // zjistí aktuální minutu
int h = TimeHour(TimeCurrent()); // zjistí aktuální hodinu
Tyto 3 funkce pro zjištění aktuálního dne, hodiny a minuty si dobře zapamatujte, budeme je potřebovat skoro v každé strategii. Teď, když se učíme, tak pro názornost zapisujeme každou proměnnou na vlastní řádek, ale zápis lze zjednodušit takto:
int D = DayOfWeek (), m = TimeMinute (TimeCurrent ()), h = TimeHour (TimeCurrent ());
Nemusí se pokaždé opisovat „int“, jednotlivé proměnné se oddělí čárkou a za poslední proměnnou se udělá středník.
V červeném rámečku je vidět přidaný kód. Ve spodní části MetaEditoru vidíte nápovědu pro funkci DayOfWeek(). Nápovědu pro jakoukoliv funkci zobrazíte tak, že nastavíte kurzor v textu na vybraný příkaz či funkci a stisknete F1. Ve spodní části se Vám objeví nápověda, Je to velice šikovné, zkuste si to.
Klikejte průběžně „Compile“. Nejen, že tím průběžně svou práci uložíte, ale naleznete snáze chybu (errorová hláška). Dávejte si hlavně pozor na závorky a středníky na konci řádků. Pokud se Vám objeví nějaká errorová hláška, vždy obsahuje popis chyby a číslo řádku, ve kterém vznikla.
Nyní už můžeme přistoupit k zadání příkazu LONG. Těsně předtím, však musíme vydefinovat podmínky, aby program věděl, kdy má vstoupit. EA můžeme na účtu aktivovat kdykoliv v pondělí v 8:30, nebo ve středu v 16:25, či v neděli ve 23:45. My však chceme, aby se příkaz provedl pouze při otevření trhů v neděli ve 23:00. Musíme tedy v EA tuto podmínku definovat pomocí operátoru if:
if (D == 0 && h == 23 && m == 0)
Tento zápis nám říká, že když D (den) bude 0 (neděle) a zároveň h (hodina) bude 23 a zároveň m (minuta) je 0, tak potom … a bude následovat příkaz, neboť podmínky pro vstup byly splněny. Nicméně zde provedeme jednu modifikaci. Někdy se stane, že broker otevře trh ne přesně ve 23:00 SEČ, ale o minutu či dvě později. Proto navrhuji dát do podmínek místo m == 0 raději m < 5. Tím si zajistíme, že příkaz se zadá i v případě, že broker otevře až např. ve 23:03 SEČ.
Zde si musíme dát na časy pozor. Čas, který zadáte, musí odpovídat času Vašeho brokera. Podívejte se, když trh otevře, jaký čas má Váš broker. Pokud má Londýnský čas, bude ukazovat 22:00. Musíte pak podmínku upravit na h == 22. Někteří brokeři jsou posunutí „dopředu“ a nedělní svíčku vůbec nemají a otevírají vlastně v pondělí 0:00, pak musíte opět upravit na D == 1 a h == 0 atd.
Teď, když již EA ví, kdy má vstoupit do pozice, můžeme zadat příkaz a to tímto zápisem:
{Jízdenka = OrderSend (Symbol (), OP_BUY, 0,01, Ask, 0, Ask-SL, Ask + PT, Text, magic_number, 0, modrá); }
No tento zápis Vás určitě dost postrašil, co? Nebojte se, vše si vysvětlíme. Nyní si zapište výše uvedené do EA a klikněte na Compile.
V EA je momentálně 5 chyb. Všechny si postupně projdeme a odstraníme je. Co je však nejdůležitější je příkaz OrderSend. Zadání příkazu je klíčové, protože pokud to uděláme špatně, můžeme přijít o spoustu peněz. Příkaz obsahuje velké množství parametrů a je dobré si to dopodrobna projít. Ale myslím, že pro dnešek už to stačilo. V příštím díle opravíme chyby a vysvětlíme si příkaz OrderSend. Naší první EA dokončíme a zkusíme jí spustit.