Blížíme se k finále o jazyku MQL4 v automatizovaných systémech. Jednotlivé díly, kterými jste si prošli, si postupně slepíme. Některé díly nebyly tak záživné, ale měly svůj smysl. Od základů jazyka přes vzhled editoru jste zjistili, jak získat informace z grafu, dozvěděli jste se, že existují metody pro práci s indikátory a nyní je čas se naučit metody, které komunikují s brokerem a umějí pracovat s jednotlivými pokyny.
Přesně to, co jste zvyklí dělat manuálně (otevírat pokyn, upravovat stop-lossy, zavírat pokyny), to vše můžete dělat automaticky. Je třeba jen správně rozhodnout kdy.
Úplný výpis funkcí pro obchodování naleznete v referenční dokumentaci v sekci Trading functions.
OrderSend()
Funkce pro otevření pokynu nebo pro zadání čekajícího pokynu. Funkce vrací identifikátor pokynu, se kterým se později pracuje.
Definice funkce je:
int OrderSend(string symbol, int cmd, double volume, double price,
int slippage, double stoploss, double takeprofit, string comment,
int magic, datetime expiration, color arrow_color)
Parametr symbol je identifikátor měnového páru
Parametr cmd je typ operace
- OP_BUY = okamžitý nákup
- OP_SELL = okamžitý prodej
- OP_BUYLIMIT = čekající nákup, který se aktivuje, jakmile cena klesne k zadané hranici
- OP_SELLLIMIT = čekající prodej, který se aktivuje, jakmile cena stoupne k zadané hranici
- OP_BUYSTOP = čekající nákup, který se aktivuje, jakmile cena stoupne k zadané hranici
- OP_SELLSTOP = čekající nákup, který se aktivuje, jakmile cena klesne k zadané hranici
Parametr volume je počet lotů, které chcete obchodovat
Parametr price je preferovaná cena pro obchodování u čekajících pokynů
Parametr slippage je maximální odchylka ceny při zadávání pokynu
Parametr stoploss je cena určující hladinu zastavení ztrát
Parametr takeprofit je cena určující hladinu pro realizování zisku
Parametr comment je komentář k pokynu
Parametr magic je obchodníkova vlastní číselná značka
Parametr expiration je datum vypršení platnosti pokynu (platí pouze pro čekající pokyny)
Parametr arrow_color je barva značky otevření pokynu, která se zobrazuje v grafu
Př.: Chceme otevřít pokyn pro nákup aktuálního měnového páru v hodnotě 0.5 lotu a zastavení ztrát chceme nastavit na 30pips.
int ticketId = OrderSend(Symbol(), OP_BUY, 0.5, Ask, 0, Ask – 30 * Point, 0,
NULL, 0, 0, CLR_NONE);
V prvním parametru jsme pomocí funkce Symbol() řekli, jaký měnový pár chceme obchodovat. Dále jsme pomocí typu operace OP_BUY určili, že chceme nakupovat. Poté určili 0.5 lotu coby výši obchodu, dále nastavili preferovanou cenu nákupu pomocí Ask (zde tento parametr server využívá pro čekající pokyny, přesto je třeba ji vyplnit, ikdyž čekající pokyn nezadáváme). V dalším parametru jsme nastavili nulovou odchylku na 0. Pak jsme určili výši SL. Jelikož známe počet pipsů, musíme vypočítat cenu SL. Víme že proměnná Point vrací hodnotu bodu a Ask vrací aktuální nabídku. Tím pomocí vzorce Ask – Pips * Point vypočítáme cenu SL. Cenu pro realizování zisku (TP) nechceme a proto nastavujeme na 0. Přesto, kdybychom chtěli cenu stanovit, vzorec by byl: Ask + Pips * Point. Další parametr reprezentující komentář pokynu nenastavujeme, proto NULL, naši značku (magic) také nevyplňujeme, proto 0 a datum expirace se týká pouze čekacích pokynů, proto také 0. Poslední parametr je již barva značky a tu necháme na systému, proto konstanta CLR_NONE.
Někdy se může stát, že se pokyn neotevře kvůli nějaké chybě, např. že se nepodařilo spojit se serverem, nebo že se cena mezitím změnila, nebo že cena SL či TP je příliš malá, než měnový pár povoluje. Pokud se tak stane, tak ID pokynu je -1. Hodnotu chyby pak lze získat pomocí funkce GetLastError(). Hodnoty chyb najdete v referenční příručce v sekci Standard constants / Error codes nebo v sekci Trading functions / Execution errors. Chyby se vypisují do logového souboru, který najdete v adresáři, kde máte nainstalovaný MetaTraders ve složce experts\logs.
OrderClose()
Funkce pro zavření pokynu. Pokud nám otevřený pokyn nezavře SL, TP nebo broker, tak jej můžeme zavřít sami. Funkce vrací True nebo False, pokud se operace zavření povede nebo nepovede. Nepovést se může, protože pokyn již neexistuje, byl již zavřen nebo zavření selhalo. Stejně jako u OrderSend() je možné pomocí GetLastError() zjistit číslo chyby a pak v sezamu chyb zjistit, proč se pokyn nepodařilo zavřít.
Definice funkce je:
bool OrderClose(int ticket, double lots, double price, int slippage, color Color)
Parametr ticket je ID pokynu, který chceme zavřít
Parametr lots je počet lotů, které chceme v daném pokynu zavřít
Parametr price je preferovaná zavírací cena
Parametr slippage je maximální odchylka ceny
Parametr Color je barva značky zavření pokynu, která se zobrazuje v grafu
Př.: Zavření pokynu s 0.5 loty, kde ID pokynu máme uložený v pomocné proměnné ticketId.
bool isOK = OrderClose(ticketId, 0.5, Ask, 0, CLR_NONE);
V prvním parametru předáváme ID pokynu, který chceme zavřít. Ve druhém počet lotů, ve třetím musíme vyplnit preferovanou cenu, ač ji server ve skutečnosti ignoruje, tak funkci předáme např. aktuální nabídku pomocí Ask. Odchylku nenastavujeme, proto 0 a barvu značky necháváme na systému, proto CLR_NONE.
OrderModify()
Tato funkce upravuje vlastnosti otevřeného nebo čekajícího pokynu, např. novou cenu SL, TP či datum expirace pro čekající pokyny. Pokud úprava proběhne v pořádku, funkce vrací True, jinak False.
Definice funkce je:
OrderModify(int ticket, double price, double stoploss, double takeprofit,
datetime expiration, color arrow_color)
Parametr ticket je identifikátor pokynu, který chceme upravit
Parametr price je nová cena pro čekající pokyny
Parametr stoploss je cena zastavení ztrát (SL)
Parametr takeprofit je cena realizování zisku (TP)
Parametr expiration je datum vypršení platnosti čekajícího pokynu
Parametr arrow_color je barva značky SL / TP, která se v grafu zobrazuje
Př.: Potřebujeme upravit cenu SL pro existující otevřený pokyn typu BUY. ID pokynu máme uložené v pomocné proměnné ticketId.
bool isOK = OrderModify(ticketId, OrderPrice(), Ask – Point * 20,
OrderTakeProfit(), 0, CLR_NONE);
V prvním parametru předáváme ID pokynu, který chceme upravit. Ve druhém nastavujeme preferovanou cenu. Zde trochu předbíhám a použil jsem funkci OrderPrice(), která zjistí tuto cenu z daného pokynu, ale více se dozvíte později. Ve třetím parametru pomocí vzorce upravíme novou cenu SL. V dalším parametru pomocí funkce OrderTakeProfit() předáme cenu realizování zisku, která je nastavena v daném pokynu, více se opět dozvíte v následujících funkcí. V posledních parametrech již jen nastavíme 0 pro datum expirace a barvu značky pro SL/TP necháme na systému.
OrderSelect()
Tato funkce najde pokyn dle ID nebo dle pořadí a provede vybrání tohoto pokynu. Vybrání pokynu slouží pro další funkce zpracovávající informace o pokynu, které nespecifikují pokyn dle ID, ale jsou odkázané právě na služby této funkce.
Definice funkce je:
bool OrderSelect(int index, int select, int pool)
Parametr index je buď ID pokynu nebo číslo pořadí pokynu. Pořadí je pak závislé na třetím parametru
Parametr select specifikuje, podle čeho se pokyn vybírá
- SELECT_BY_POS = vybírá se pokyn dle pořadí a index tak stanoví číslo pořadí
- SELECT_BY_TICKET = vybírá se dle ID pokynu
Parametr pool určuje typ pro výběr pokynu dle pořadí. Tento parametr se bere v úvahu pouze, pokud je parametr select nastaven na SELECT_BY_POS
- MODE_TRADES = vybírá dle pořadí pokyny z tabulky otevřené nebo čekající pokyn
- MODE_HISTORY = vybírá dle pořadí pokyny z tabulky zavřené (ukončené) pokyny
Př.: Potřebujeme vybrat pokyn dle ID, které máme uložené v pomocné proměnné ticketId.
bool isSelected = OrderSelect(ticketId, SELECT_BY_TICKET);
V prvním parametru říkáme ID pokynu, který chceme vybrat a v druhém specifikujeme, že se jedná o výběr dle ID a ne dle pořadí. Třetí parametr nevyplňujeme, protože se používá pouze pro druhý typ výběru.
Ostatní funkce
Následující výčet několika funkcí, které pracují v součinnosti s funkcí OrderSelect().
OrderOpenPrice() – zjišťuje, jaká je otevírací cena pokynu, za kterou byl pokyn vytvořen
OrderClosePrice() – zjišťuje, jaká je zavírací cena pokynu. Může vrátit 0, pokud pokyn je ještě aktivní a nebyl ukončen.
OrderOpenTime() – zjišťuje čas otevření pokynu
OrderCloseTime() – zjišťuje čas zavření pokynu. Touto funkcí lze tak ověřit, zda pokyn je ještě otevřen. Pokud vrací 0, pokyn nebyl ještě zavřen.
OrderLots() – zjišťuje, s kolika loty pokyn obchoduje
OrderStopLoss() – zjišťuje, jaká je cena SL
OrderTakeProfit() – zjišťuje, jaká je cena TP
OrderType() – zjišťuje typ pokynu. Vrací číslo operace, viz. parametr cmd funkce OrderSend().
Př.: Známe ID otevřeného pokynu a chceme zjistit, zda je pokyn ještě otevřen, nebo je již zavřen (např. byl zavřen kvůli SL).
int ticketId = 12345;
if(OrderSelect(ticketId, SELECT_BY_TICKET))
{
if(OrderCloseTime() > 0)
{
// pokyn je již zavřen
}
else
{
// pokyn není zavřen
}
}
else
{
// chyba při výběru pokynu, do logu vypíšeme chybovou zprávu
Print("Chyba při vybírání pokynu, chyba č: ", GetLastError());
}
Tím jsme si představili základní funkce pro obchodování. Z předchozích dílů jsme nyní schopni napsat vlastní strategii. Než se k tomu dostaneme, je třeba strategii otestovat. Testování strategie si představíme v dalším díle.