13.1.2013
Kategorie: Programování AOS

Programování indikátoru do MT4 (díl 13.)

13.1.2013
Kategorie: Programování AOS

 

V dnešním článku se pokusíme naprogramovat jednoduchý indikátor. Zkusme například naprogramovat Gannův indikátor, který v klasické nabídce indikátorů v MT4 nenajdeme. Vzorec pro výpočet indikátoru je jednoduchý = (((High – Open) + (Close – Low)) / 2*Range)*100.

 

Pusťme se tedy do programování indikátoru. Nejprve otevřeme nový soubor, tak jako jsme začínali při programování naší pokusné strategie:

13-1

Tentokrát však nezvolíme „Expert Advisor“, ale zvolíme „Custom Indicator“. V dalším okně pak můžeme zaškrtnout, že chceme zobrazit indikátor ve vlastním okně. To bude náš případ. Pokud bychom chtěli programovat indikátor, který chceme zobrazit přímo v grafu a ne pod ním, tak tuto volbu nezaškrtneme.

13-2

… potvrdíme a otevře se nám základní kostra. Prakticky shodná s tou, kterou jsme si ukazovali v díle 3. Strukturu si již nebudeme znovu vysvětlovat, kdyžtak se podívejte do dílu 3.

13-3

Všimněte si, že již v kódu máme zápis pro zobrazení indikátoru ve vlasním (separátním) oknu. Pokud bychom chtěli zobrazit indikátor přímo v grafu (např. pokud bychom programovali klouzavý průměr, ATR, Bollinger Bands apod.) vložíme: indicator_chart_window a indikátor se vykreslí v okně grafu

Klíčovým prvkem v tvorbě indikátorů jsou buffery. Představme si to jako dlouhé pytle, do kterých si budeme ukládat vypočtené hodnoty indikátoru pěkně za sebou pro svíčku 1, svíčku 2, svíčku 3 atd. Každý buffer si pojmenujeme, a kdykoliv budeme potřebovat hodnotu indikátoru x-svíček zpět vždycky jí v našem pytli najdeme. Bufferů můžeme mít celkem 8. Nevím, zda to někdy využijete, ale běžně využijete 1-3 buffery. My dnes použijeme 1, ale pokud bychom dělali indikátor např. 2 klouzavých průměrů (pro dvě různé periody, a chtěli bychom vykreslit 2 křivky), potřebovali bychom buffery 2.

Musíme tady vydefinovat počet bufferů, které pro indikátor použijeme v našem případě tedy: #property indicator_buffers 1

Další věc, kterou si můžeme nadefinovat je barva indikátoru. Řekněme, že chceme zelenou a zapíšeme takto: #property indicator_color1 Green. Pokud bychom měli více bufferů (křivek) doplníme i barvu pro druhý buffer např. červenou: #property indicator_color2 Red. Všimněte si, že za slovem color (barva) je potřeba doplnit číslici (pořadí bufferu), jemuž chceme barvu přiřadit.

V úvodu musíme také vydefinovat proměnné, tak jako jsme to dělali u EA. Konkrétně musíme vydefinovat označení jednotlivých bufferů. My máme jeden a zápis bude vypadat takto: double Buffer1[]; Identicky bychom definovali další buffery, pokud bychom je měli.

 

13-4

Dále do části init() vložíme parametry, které chceme načíst hned na začátku a to:

IndicatorShortName(„Gann indikátor“);

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Buffer1);

První řádka kódu definuje název indikátoru, který se nám v okně zobrazí. Toto není povinné, ale je to více než praktické, vidět název použitého indikátoru.

Další povel SetIndexStyle definuje, jak má být náš indikátor zobrazován. Ačkoliv my si zde definujeme pouze dva parametry lze definovat celkem 4 např. SetIndexStyle(3, DRAW_LINE, EMPTY, 2, Red).

1) První číslo je „line index“ – můžete doplňovat hodnoty 0-7. Pro první buffer přiřadíme 0, Pokud bychom měli 2 buffery, tak druhému bychom přiřadili line index 1 tzn. SetIndexStyle(1, DRAW_LINE)

2) Druhý parametr je typ zobrazení indikátoru. My jsme použili klasickou čáru, ale na výběr jsou ještě následující typy: DRAW_LINE, DRAW_SECTION, DRAW_HISTOGRAM, DRAW_ARROW, DRAW_ZIGZAG.

3) Třetí parametr je šířka čáry.

4) Čtvrtý parametr je barva čáry. My jsme již definovali v úvodu, takže vynecháme.

SetIndexBuffer přiřazuje k jednotlivým zakreslovaným indikátorům buffer tzn. pytel vypočtených hodnot. První parametr je opět line index a druhý parametr je přiřazený buffer. Aby to bylo úplně jasné, tak pokud bychom měli 3 buffery, tak zápis by vypadal třeba takto:

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Buffer1);

SetIndexStyle(1,DRAW_HISTOGRAM);

SetIndexBuffer(1,Buffer2);

SetIndexStyle(2,DRAW_LINE);

SetIndexBuffer(2,Buffer3);

 

Takže zapišme do našeho pokusného souboru:

13-5

Tak a už nám zbývá pouze vypočítat hodnoty našeho indikátoru a nasypat je do pytle (tedy bufferu). Než se do toho pustíme, musíme si  říci jednu důležitou věc. Pro kolik svíček musíme indikátor spočítat a uložit do bufferu. Pro 10, 50 nebo 200 nebo 10.000? Na aktuálním grafu vidíme třeba jen 200 svíček, stačilo by tedy spočítat hodnotu indikátoru jen 200 svíček zpět. Ale, co když se budeme chtít posouvat v grafu do minulosti? Tak uděláme výpočet raději pro 1.000 svíček? Ale co když půjdeme ještě více do minulosti? Ne. Touto logikou bychom zachvíli počítali hodnoty pro 100.000 svíček.  

Jak to tedy uděláme? Využijeme chytrého příkazu IndicatorCounted(), který nám zajistí, že historické hodnoty indikátoru, které jsme již v minulém zobrazení indikátoru kalkulovali se již znovu kalkulovat nebudou. Již z předchozích dílů víme, že vše co dáme do části start() se neustále ve smyčce opakuje.

Pokud bychom kalkulovali stále dokola např. 100.000 hodnot indikátoru, tak bychom významně omezovali rychlost MT4 a zahlcovali ho, a to nechceme.

Uděláme to následovně. Potřebujeme do bufferu zadat hodnotu indikátoru pro svíčku 1, svíčku 2, svíčku 3 atd. Vydefinujeme tedy proměnnou z. 

Pro výpočet budeme potřebovat definovat High, Low, Open, Close a Range. To už umíme:

      double high =High[z];

      double low  =Low[z];

      double open =Open[z];

      double close=Close[z];

      double range=high-low;

kde z je 0 svíčka, 1 svička, 2 svíčka, 3 svíčka … Teď již můžeme vypočítat hodnotu indikátoru pro svíčku z a přiřadit do bufferu:

Buffer1[z]= (((high-open)+(close-low))/(2*range))*100;

 

… teď už zbývá ta poslední finta, abychom to nepočítali pro z 0 až 100.000. Při posledním zavření MT4 se indikátor vypočítal pro všechny tehdy existující svíčky. Když ho teď znovu otevřeme, otevřely se mezitím nové svíčky a my zjistíme jejich počet takto z = Bars – IndicatorCounted() . Funkce Bars nám říká, kolik svíček je aktuálně vidět na grafu a od nich odečteme již počet historicky zkalkulovaných svíček. Vyjde nám např. že nových svíček je 25. Pak budeme hodnotu indikátoru počítat pouze pro svíčku 25, svíčku 24, svíčku 23 až svíčku 0. K tomu použijeme smyčku:

while (z>=0)

     { výpočty

       z–; }                 Pozn. z– znamená snížení hodnoty z o 1 v každém cyklu tzn. 25, 24, 23, … 0

 

Takže se podívejme, jak bude celý zápis vypadat:

13-6

A máme hotovo 🙂 Teď se jen podíváme na to, zda se indikátor správně zobrazí.

13-7

Vše je jak má být. Jen jeden obchodní tip. Indikátor osciluje mezi 0-100. Zakreslete si úrovně 30 a 70 nebo 25 a 75 a všimnete si, že pokud indikátor překročí 70 (75) má trh tendenci k otočení do shortu. Pokud klesne pod 30 (25) má trh tendenci jít na další svíčce long.

Tímto končí náš miniseriál o programování v MQL4. Snad jsme alespoň některým z vás pomohli při snaze naprogramovat si svou vlastní EA či indikátor.

 

Štítky:

Vložit komentář