7.1.2013
Kategorie: Programování AOS

Zadání podmínek pro vstup a posunutí na break-even (díl 7.)

7.1.2013
Kategorie: Programování AOS

 

Začneme posunutím SL na break-even. V naší zkušební EA máme stanoven PT na úrovni 200 pipů. Zkusme nyní naprogramovat posunutí SL na break-even (na vstupní cenu) v okamžiku, kdy se bude trh vyvíjet správným směrem a dosáhne zisku 100 pipů. Opět to budeme programovat co nejvíce flexibilně. Budeme tedy definovat proměnou „Posun_na_BE_v_pipech“ a to jako externí proměnnou, abychom ji mohli zadávat a testovat. Budeme ji zadávat v pipech a následně ji převedeme na cenové vyjádření, tak jako jsme to udělali u PT a SL v předchozích dílech.

extern double Posun_na_BE_v_pipech = 1000;

double BE = Posun_na_BE_v_pipech * Point;

71

Ani kód pro posunutí SL nebude složitý. Opět začneme počítadlem, tak jako u omezovače vstupů či kódu na ukončení otevřených pozic. Princip je stejný „filtrujeme“ všechny obchody na účtu v MT4 a pokud patří k naší EA provedeme akci. V dalším kroku vydefinujeme podmínky, za kterých se má posun na BE provést. Opět použijeme již známé části kódu pro filtraci pokynů v MT4:

OrderSelect(p,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY && OrderMagicNumber()==Magic_number.

Takže u vybraného pokynu otestujeme zda je BUY či SELL a zjistíme, zda magic number odpovídá naší EA (opakování z dřívějška). přidáme však testující podmínku, která nám řekne, kdy je zisk již větší než požadovaných 100 pipů. Podmínku vytvoříme takto:

Bid >= OrderOpenPrice() + BE pro pokyn typu long. Bid je aktuální tržní cena, za kterou prodáváme. Testujeme proto situace, kdy bude aktuální tržní cena vyšší nebo rovno naší vstupní ceně + požadovaný počet pipů pro posun na BE. Vstupní cenu zjistíme příkazem OrderOpenPrice(), který nám zjistí cenu vstupu vybraného příkazu a přičteme k němu námi požadovaný BE. Když bude cena Bid vyšší měli bychom SL posunout.

Ask <= OrderOpenPrice() – BE pro pokyn short. Cena, za kterou short pozici ukončíme je Ask. Chceme tedy, aby byl Ask menší než vstupní cena mínus BE a pak posouváme SL.

Do podmínek vložíme ještě následující podmínku: OrderStopLoss()!=OrderOpenPrice(). Má to jediný důvod. V okamžiku, kdy je tržní cena vyšší než požadovaných 100 pipů zisku, podmínka by byla pořád splněna a EA by se snažila znovu upravovat SL a to na stejnou hodnotu a to prakticky pořád dokola, dokud by buď nebyl zasažen PT (200 pipů) a nebo neklesl zisk pod 100 pipů. Nechceme EA nechat vykonávat zbytečné úkoly, proto vložíme podmínku, která říká, že posun na BE proveď pouze pokud se aktuální SL daného pokynu nerovná vstupní ceně tohoto pokynu. Jinak řečeno, jakmile se posune SL na BE, bude se rovnat vstupní ceně a tato podmínka nebude splněna, tak EA se nebude zbytečně snažit upravovat již upravený SL. Pokud tam tuto podmínku nedáte neznamená to, že by EA nefungovala, ale bude dělat řadu zbytečných úkonů.

 

Zbývá již jen zadat příkaz pro modifikaci pokynu. OrderModify (ticket, price, stoploss, takeprofit, expiration, color)

Vše se znovu opakuje jako u příkazů OrderSend a OrderClose, takže jen stručně:

ticket – číslo ticketu pokynu zjistíme příkazem OrderTicket()

price – je vstupní cena, tu nezle modifikovat. Její hodnotu zjistíme příkazem OrderOpenPrice()

stoploss – zde chceme upravit hodnotu a tedy zadáme hodnotu vstupní ceny tzn. OrderOpenPrice(). Jen pro pořádek samozřejmě můžeme doplnit i jinou cenu. Pokud chceme posunout SL jen o kousek nahoru např. 20 pipů doplníme OrderOrderStopLoss() + 20 * Point, nebo pokud nechceme posunut na BE a mít nulu, v případě že se trh vrátí a chceme alespoň malý zisk 10 pipů zadáme OrderOpenPrice() + 10 * Point, apod.

takeprofit – i zde je možné upravovat hodnotu. Zvyšovat jí či snižovat. My PT měnit nechceme, takže ponecháme jeho původní hodnotu, kterou zjistíme příkazem OrderTakeProfit()

expiration – zde se dá změnit délka platnosti pokynu (ale pouze u čekajících pokynů). Ukážeme si později

color – barva šipky

A můžeme zapsat finální kód do naší EA. My vám teď trochu zamotáme hlavu. V budoucnu vám budeme ukazovat ještě trailing stop a další části kódů, které budou vždy vycházet s podobného principu tzn. budeme využívat počítadlo atd. … je zbytečné opisovat do EA počítadlo desetkrát. Můžeme použít to původní z kódu pro ukončení pozice a pouze posunout závorku. Zní to jednoduše, ale raději to ještě trochu popíšeme.

Kód pro ukončení pozice v pátek vypadal takto:

72

Kód pro posunutí na BE by vypadal takto:

73

My oba kódy schováme pod jedno počítadlo:

74

Není na tom nic složitého, ale je potřeba si dát pozor na závorky resp. jejich počet. Bohužel i operátory if používají závorky. Navíc v řadě případů budeme používat kaskádovité podmínky tzn. podmínku if (závorky) a v rámci toho další podmínku if (závorky) takže nám půjde ze závorek hlava kolem…

Podívejme se tedy na zápis kódu. Jen pro pořádek uvádíme, že ještě definujeme proměnou modify.

75

Není vám na těch kódech něco divné? V případě zavírání pozice jsou definovány podmínky pomocí operátoru if a do něj vloženy ještě další podmínky if, které testují, zda jde o BUY či SELL pozici. V případě posunu na BE máme definovány dvě samostatné skupiny podmínek if pro BUY a SELL samostatně. Oba zápisy jsou správně a fungují stejně. Záleží na vás jakým způsobem to uděláte. Nicméně není špatné si „ustálit“ jednotný postup. Budete se v tom snáze orientovat a hledat chyby atd. Nicméně je Vám nyní jasné, že každý takovýto zápis je možné udělat několika různými způsoby. Znovu proto apelujeme na to, snažte se dělat kódy co nejpřehledněji a nešetřete komentáři. Vám i všem ostatním to usnadní orientaci v kódu. My proto upravíme zápis pro zavírání pozic následovně:

76

A teď zkusíme v testeru, zda funguje EA tak, jak má.

77

Výborně posun na BE funguje správně. Nyní se můžeme pustit na náš dnešní druhý úkol, a to je definice komplikovanějších podmínek pro vstup do pozice. EA v současné podobě vstupuje současně do long i short pozice. To není zrovna šťastné řešení a pojďme tedy vstupovat pouze do jednoho směru třeba na základě nějakého indikátoru. Zkusíme tedy naprogramovat následující podmínku:

1) když páteční svíčka zavře pod SMA(50), tak vstoupíme short

2) když páteční svíčka zavře nad SMA (50), tak vstoupíme long

Nejprve si ukážeme jak zjistit hodnotu SMA(50). Výhodou je, že MQL má v sobě definovánu většinu standardních ukazatelů. Pro výpočet SMA tedy použijeme následující příkaz:

iMA (symbol, timeframe, period, ma_shift, ma_method, applied_price, shift)

Projdeme jednotlivé parametry:

Symbol – zde zadáme měnový pár, pro který zjišťujeme SMA. My vložíme příkaz Symbol(), který nám přiřadí měnový pár odpovídající tomu, který je v grafu. Takto jsme to již dělali v minulosti. To zajistí univerzálnost EA na jakkoliv měnový pár. Můžeme však zadat „natvrdo“ i určitý měnový pár např. „EURUSD“. To má svůj význam v případě, že chceme obchodovat určitý měnový pár např. GBPUSD, ale vstupní podmínka se odvíjí od jiného měnového páru např. EURUSD.

TimeFrame – zde musíme zadat časový úsek, pro který chceme hodnotu SMA zjišťovat. My obchodujeme denní graf tzn. zadáme PERIOD_D1. Popis můžete zadat textově či číslem (viz. tabulka níže). My používáme textové označení, lépe si ho pamatujeme a je pro nás snáze rozpoznatelné.

Textový kód

Hodnota

Popis

PERIOD_M1 1 1 minute.
PERIOD_M5 5 5 minutes.
PERIOD_M15 15 15 minutes.
PERIOD_M30 30 30 minutes.
PERIOD_H1 60 1 hour.
PERIOD_H4 240 4 hour.
PERIOD_D1 1440 Daily.
PERIOD_W1 10080 Weekly.
PERIOD_MN1 43200 Monthly.
0 (zero) 0 Timeframe used on the chart.

Ma_shift – někdy se setkáte s variantami průměrů s různým časovým posunem. To můžete zadat číslicí.

Ma_method – my používáme jednoduchý klouzavý průměr, takže zadáme hodnotu MODE_SMA. Můžeme však pracovat i s jinými typy klouzavých průměrů. Tabulka ukazuje textový či číselný kód pro různé varianty klouzavých průměrů:

Textový kód

Hodnota

Popis

MODE_SMA 0 Simple moving average,
MODE_EMA 1 Exponential moving average,
MODE_SMMA 2 Smoothed moving average,
MODE_LWMA 3 Linear weighted moving average.

Applied_price – zde zadáme cenu, z které chceme klouzavý průměr počítat. My chceme použít zavírací ceny, takže doplníme PRICE_CLOSE. Další varianty cen uvádí tabulka:

Constant

Value

Description

PRICE_CLOSE 0 Close price.
PRICE_OPEN 1 Open price.
PRICE_HIGH 2 High price.
PRICE_LOW 3 Low price.
PRICE_MEDIAN 4 Median price, (high+low)/2.
PRICE_TYPICAL 5 Typical price, (high+low+close)/3.
PRICE_WEIGHTED 6 Weighted close price, (high+low+close+close)/4.

Shift – určuje, pro kterou svíčku chceme hodnotu zjistit. Aktuální svíčka má pořadové číslo 0. Předchozí svíčka hodnotu 1, Předpředchozí svíčka má hodnotu 2. My doplníme hodnotu 1. Neboť my hodnotu SMA zjišťujeme v neděli. Tato svíčka má pořadí 0 a chceme vědět hodnotu SMA v pátek. Jelikož v sobotu se neobchoduje, sobotní svíčka v platformě není a nedělní svíčce předchozí páteční svíčka a doplníme tedy hodnotu 1. Toto je důležité pochopit, neboť se s tím budeme setkávat velice často. Připojujeme proto i ilustrační obrázek:

78

Je patrné, že pokud bychom chtěli v neděli zjistit hodnotu z minulé středy, museli bychom zadat shift = 3.

Celý zápis vypadá takto:

SMA = iMA(Symbol(),PERIOD_D1,SMA_Period,0,MODE_SMA,PRICE_CLOSE,1)

Hodnotu SMA chceme porovnat se zavírací cenou v pátek. Zavírací cenu zjistíme následovně:

C = iClose(NULL,PERIOD_D1,1)

Příkaz iClose má 3 parametry. První je symbol. Zadáme buď Symbol() nebo NULL. Oba tyto výrazy zajistí, že bude přiřazen měnový pár z grafu. Druhý parametr je time frame a třetí parametr je shift. Opět doplníme 1, neboť chceme znát hodnotu pátečního close.

Obdobně můžeme zjišťovat ceny open, high a low. Příkazy jsou iOpen, iHigh a iLow.

 

Nyní už stačí matematicky vyjádřit naše podmínky:

1) když páteční svíčka zavře pod SMA(50), tak vstoupíme short: SMA > C

2) když páteční svíčka zavře nad SMA (50), tak vstoupíme long: SMA < C

 

Tyto podmínky doplníme do naší EA.

79

Uložíme pomocí „Compile“ a otestujeme v testeru, zda EA funguje správně.

79b

Je vidět, že se již zadává pouze jeden pokyn, buď short nebo long. Z grafu je vidět, že se správně zadávají short i long pokyny podle toho, zda je SMA nad či pod pátečními cenami.

Naše podmínky pro vstup jsou poměrně jednoduché, ale princip je vám již určitě zřejmý. Pokud bude vstup definován na základě kombinace více např. 4 indikátorů, tak budeme postupovat stejně, akorát budeme mít více proměnných.

V příštím díle tohoto seriálu o programování se pokusíme naprogramovat si jednoduchý trailing stop.

 

Vložit komentář