Zadáváme pozici short (díl 6.)

V minulém díle jsme dokončili naší první EA a ukázali si jak ověřit její funkčnost. Nyní si naší EA rozšíříme o short pozici. Zápis kódu již zvládnete jistě sami, je stejný jako u pozice buy, jen upravíme následující:

Typ pozice bude OP_SELL, jako tržní cenu pro prodej musíme použít cenu Bid. Jako barvu pro šipku, která nám v grafu ukáže vstup do pozice, zvolíme červenou barvu. Je vám to určitě jasné, ale jen připomenu, že SL a PT zadáme vzorcem stejně jako u pokynu LONG. Ale pozor, v tomto případě musíme SL přičíst a PT odečíst. Pro úplnost viz. následující obrázek:

Takže zapišme kód pro SHORT. Pro jednoduchost předpokládáme, že vstupujeme SHORT za stejných podmínek jako do LONGu, tzn. při otevření trhu ve 23:00 SEČ. Zápis vypadá takto:

Nyní si můžeme zkontrolovat dle návodu z minulého dílu, zda EA pracuje správně. Na následujícím obrázku vidíme, že se skutečně zadávají dvě pozice. Jedna LONG (označené modrou barvou) a jedna SHORT (označené červenou barvou).

Všimněte si také toho, že křivka ekvity vypadá také jinak. Dokud jsme obchodovali pouze LONG pozici, křivka směřovala na jih. Nyní je vývoj více vybalancovaný. Ale to není teď podstatné. Projeďte si celý graf a zjistíte, že přidáním short pokynu se ještě zvětšil počet situací, kdy se zvýšil počet případů, kdy se pokyn neukončil v rámci daného týdne a přesáhl do následujícího, čímž se nazadaly short a long pokyn pro následující týden. Na konci minulého týdne jsme si řekli, že zkusíme naprogramovat ukončení pokynu k určitému časovému okamžiku.

Řekněme tedy, že pokud se pokyn LONG či SHORT (nebo oba) neukončí do pátku zasažením PT či SL, tak je ukončíme v pátek ve 22:30 SEČ.

Použijeme již znalosti z omezovače vstupů. Jako první věc budeme potřebovat počítadlo. Opět budeme v situaci, že bude v platformě MT4 zadáno x příkazů, my je potřebujeme jeden po druhém zkontrolovat, zda nepatří k naší EA, a pokud ano tak je ukončíme.

Zápis počítadla bude vypadat následovně: for(p = 0; p < OrdersTotal(); p++) { }

Opět použijeme příkaz OrdersTotal(), který nám zjistí kolik celkem příkazů je aktuálně v MT4 a my potom provedeme opakovaně soubor operací uvedených v závorce.

Jaký kód dáme do závorky (do těla počítadla)? Vložíme tam:

1) definici podmínek pro výstup a

2) samotný příkaz pro ukončení pokynu

 

ad 1) definice podmínek bude jednoduchá (opět je to obdoba toho, co již známe z omezovače vstupů):

if(OrderSelect(p, SELECT_BY_POS, MODE_TRADES)==true && D == 5 && h == 22 && m >= 30 && OrderMagicNumber()==Magic_number)

Nejprve vybereme pokyn v MT4 s pořadovým číslem p (1,2, … x) a u něj zjistíme jaký má magic number tzn. zda patří k naší EA či nikoliv. Pokud magic number odpovídá naší strategii, chceme obchod ukončit/zavřít. Ale pozor pamatujte, jak EA funguje … běží stále dokola, tzn. že se příkaz zadá při otevření trhů ve 23:00 SEČ a hned v dalším cyklu by EA identifikovala otevřený pokyn a chtěla by ho zavřít, musíme proto ještě doplnit podmínku, kdy to smí udělat. A to je v pátek (tedy D == 5), ve 22 hodin (tedy h == 22) a ve 30 minut (tedy m == 30). Zde opět doporučuji neomezovat minuty pouze na 30 minutu, ale nahradit např. zápisem m >= 30. EA či broker můžou mít ve 22:30 výpadek a obnovit činnost až ve 22:32. Váš pokyn nebude uzavřen, pokud m == 30, pokud však zadáte, že příkaz se může zavřít ve 30 či výše, tak se příkaz zavře okamžitě po ukončení výpadku.

ad 2) příkaz pro ukončení pokynu

OrderClose ( ticket, lots, price, slippage, color)

Struktura příkazu je velmi podobná struktuře příkazu OrderSend, který jsme si popisovali dříve. Je však o něco jednodušší, neboť cílem je uzavření obchodu, nepotřebujeme informace o PT, SL apod. abychom mohli pokyn zavřít.

ticket – zde je potřeba zadat číslo ticketu, který chceme zavřít. Počítadlo nám vybralo konkrétní pokyn dle pořadí a příkaz OrderTicket() zjistí číslo ticketu, takže dosadíme tuto funkci

lots – je objem pozice, který chceme uzavřít. V našem případě doplníme proměnou, kterou jsme použili pro definici objemu, který chceme obchodovat, tedy „Velikost_pozice“

price – cena, za kterou chceme vystoupit. Vystoupit chceme za tržní cenu, takže doplníme Bid či Ask. ALE POZOR! U long příkazu jsme vstupovali za Ask a tedy vystupujeme za Bid cenu a obráceně u short příkazu jsme vstupovali za Bid a vystupujeme tedy za Ask cenu.

A pak už jen slippage a barva šipky (známe z minula). Příkaz by tedy měl vypadat takto (pro long):

close=OrderClose(OrderTicket(),Velikost_pozice,Bid,2,Yellow)

Proč je to tak důležité rozlišit Ask a Bid cenu? Trh se nemusí již příliš hýbat a u párů s velkým spreadem by se long za Ask cenu, která se bude lišit o spread od tržní ceny na ukončení long pozice (tedy Bid), nemusel zobchodovat. Proto vložíme do našeho kódu ještě jednu podmínku, která otestuje, zda se jedná o pokyn long či short a každému přiřadí svou vlastní cenu pro ukončení pozice.

Jak tedy bude vypadat zápis kódu:

A je to. Jen ještě upozorním, že jsme použili dvě nové proměnné, které je potřeba definovat a to „p, close“. Opět si dejte pozor na závorky. Jednu sadu závorek má operátor for, druhou sadu operátor if a třetí sadu druhý operátor if, který rozpoznává, zda je příkaz long či short. Na konci zápisu kódu jsou tedy 3 závorky. A ještě jedna důležitá věc. Zápis kódu musíte dát před omezovač vstupů, jinak by nefungoval. Omezovač by zjistil, že existuje příkaz, který patří k naší EA a vrátí se na začátek. K našemu „ukončovateli“ příkazů by ho tedy vůbec nepustil 🙂

Zbývá tedy jen zmáčknout compile, spustit tester a podívat se na grafu, zda EA dělá to, co jsme chtěli:

Funguje výborně. Tento krátký kód můžete použít i do jiných EA. Podmínkami výstupu nemusí být jen časové hledisko, ale i jiné podmínky jako např. určitá hodnota indikátoru apod. Pouze upravíte podmínky pro ukončení.

Musím uznat, že není úplně ideální vstupovat v jednom okamžiku short a long zároveň, V příštím díle tedy přidáme do naší cvičné EA nové podmínky pro vstup. Ukážeme si dvě varianty. První vstup na bázi indikátoru. Druhý na bázi nějaké cenové formace. A pak již budeme vstupovat pouze jedním směrem, buď long, nebo short. EA se pak ještě pokusíme rozšířit o posunutí na break-even při dosažení určité ceny.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *