Obchodní funkce

Většina z nás se jazyk MQL učí za účelem programování automatických obchodních systémů. Ty se samozřejmě neobejdou bez funkcí, které zajišťují otevírání, uzavírání a správu obchodních pozic. Tyto funkce se souhrnně nazývají obchodní funkce, v dokumentaci docs.mql4.com je najdeme ve skupině Trade functions. Ty nejdůležitější z nich si v dnešním článku rozebereme.

OrderSend()

Funkce OrderSend() je jedinou funkcí, která dokáže otevřít pozici nebo zadat limitní pokyn. V případě úspěšného otevření pozice vrátí číslo tiketu otevřené pozice, jinak -1. Z tohoto důvodu je vhodné funkci umístit např. do podmínkového operátoru, který v případě výsledku funkce -1 zjistí pomocí funkce GetLastError(), kde se stala chyba. Funkce má následující tvar:

ordersend

Vidíme poměrně velké množství parametrů, pojďme si je popsat.

symbol – zkratka symbolu, na kterém se má pozice otevřít (např. „EURUSD“, záleží na brokerovi, jak instrument značí ve své platformě). Často se za parametr vkládá funkce Symbol(), která vrátí název symbolu grafu, na kterém strategie běží.

cmd – Označuje typ příkazu podle následující tabulky. Zadat můžeme jak hodnotu ID, tak i ve formě čísla.

ID Hodnota Popis
OP_BUY 0 Nákup Market
OP_SELL 1 Prodej Market
OP_BUYLIMIT 2 Limitní příkaz Buy Limit
OP_SELLLIMIT 3 Limitní příkaz Sell Limit
OP_BUYSTOP 4 Limitní příkaz Buy Stop
OP_SELLSTOP 5 Limitní příkaz Sell Stop

volume – označuje velikost pozice v lotech. Může to být samozřejmě přímo napsané číslo, vzorec, nebo uživatelská funkce, která má za úkol podle různých parametrů trhu a účtu vypočítat optimální velikost. Setkáme se s ní například v ukázkové strategii Moving Average. Hodnota musí být povolena brokerem, jinak se pozice neotevře, funkce vrátí -1 a GetLastError() vrátí chybu 131 (ERR_INVALID_TRADE_VOLUME).

price – ano, je potřeba zadat i otevírací cenu, a to buď Ask nebo Bid. Program totiž neví, která z těchto cen je správná pro otevření dané pozice. Pro úplnost dodávám, že nakupujeme za cenu Bid a prodáváme za Ask. Cena Bid nebo Ask platí pro instrument grafu, na kterém běží strategie. Pokud chceme otevřít pozici jiného instrumentu (a máme tedy v parametru symbol jeho název), pak musíme cenu zjistit pomocí funkce MarketInfo(symbol, Bid/Ask). Pokud cenu zadáme špatně, funkce opět skončí chybou.

slippage – udává maximální odchylku v pipech od požadované ceny, tedy maximální vámi akceptovatelný skluz. Pokud bude vyšší, pozice se neotevře.

stoploss – cena, na kterou bude umístěn příkaz Stoploss. Obvykle se v praxi zadává jako vzdálenost od vstupní ceny, např. „Ask + 10*Point“ v případě krátké pozice. Často se také jedná o výsledek komplikovanější funkce, jak úroveň tohoto příkazu spočítat. Je potřeba dát pozor na to, aby stoploss byl pod cenou v případě longové pozice a nad cenou v případě shortu. Pokud bychom parametr zadali špatně, nemusíte se obávát, že by se pozice otevřela bez stoplossu. Neotevře se vůbec, skončí chybou.

takeprofit – cena, na kterou bude umístěn příkaz Takeprofit. Opět se obvykle zadává jako vzdálenost od vstupní ceny, např. „Bid + TakeProfit*Point“ v případě dlouhé pozice, kde proměnná TakeProfit může být třeba uživatelsky nastavená.

comment – komentář k dané pozici ve formě řetězce, musí být tedy v uvozovkách.

magic – „magické číslo“, které lze použít například pro odlišení obchodů otevřených konkrétní strategií. Výchozí hodnotou je nula, tedy žádné magické číslo.

expiration – datum a čas expirace limitního příkazu. Nejčastěji se zadává jako rozdíl oproti času zadání příkazu TimeCurrent() nebo TimeLocal(), tedy např. „TimeCurrent()+3600“ pro expiraci za hodinu.

arrow_color – sem zadáváme případnou barvu šipky, kterou chceme zobrazit na grafu v době otevření pozice. Klasicky bychom mohli zadat clrRed pro shorty a clrGreen pro longy. Pokud necháme pole prázdné nebo zadáme nulu, žádná šipka nebude zobrazena.

Pro úplnost uvedu dva příklady, v jakém tvaru může funkce být:

ordersend ukazka

 

Tato funkce otevírá pouze longy na páru GBP/JPY a SL a TP umisťuje ve vzdálenosti 15 pips. Poslední 4 parametry úplně chybí, takže se přijímají jejich výchozí hodnoty. Konkrétně tedy tato funkce bude bez komentáře, magického čísla i bez šipek v grafu.

Teď se podívejme na část kódu v kontextu i s ověřováním úspěchu a zobrazení případné chybové hlášky:

ordersend ukazka2

Vidíme, že funkce OrderSend() zde otevírá shorty na instrumentu dle grafu, na kterém běží. Pro velikost pozice se zavolá funkce Objem(). Úrovně stoplossu i profit targetu jsou již předem uloženy v proměnných. Dále vidíme, že výsledek funkce se šikovně uloži do proměnné ticket a potom je analyzován. Pokud je vyšší než 0, znamená to, že pozice byla úspěšně otevřena a pomocí funkce Print() je o tom zapsán záznam do logu. Pokud je ale ticket menší než 0, znamená to, že se někde stala chyba. Potom se do logu vytiskne hlášení o chybě a číslo této chyby získané funkcí GetLastError(). Kódy chyb lze analyzovat na stránce https://book.mql4.com/appendix/errors

OrderSelect()

Tato funkce je velmi důležitá pro načtení konkrétní pozice (otevřené nebo uzavřené) a další práci s ní (uzavírání, změna, získání informací atd.). Většinou bývá umístěna v cyklu, který pozice postupně projíždí. Vrací true v případě úspěšného výběru a false v případě neúspěchu. Parametrů máme již méně:

orderselect

index – tento parametr závisí na druhém paramatru. Buďto se bude jednat o pořadové číslo nebo o konkrétní číslo tiketu.

select – udává, na základě čeho se má pozice vybrat. Jsou dvě možnosti:

SELECT_BY_POS – vybrat dle indexu v tabulce pozic, de facto podle pořadového čísla;
SELECT_BY_TICKET – vybrat dle čísla tiketu.

pool – udává, ve které tabulce se má hledat. Má smysl pouze, pokud předchozí parametr je SELECT_BY_POS. Možné jsou opět dvě hodnoty:

MODE_TRADES (výchozí) – vybrat z tabulky Obchod, tj. z otevřených pozic a čekajících limitních pokynů;
MODE_HISTORY – vybrat z tabulky Historie účtu, tj. ze seznamu uzavřených pozic a zrušených pokynů.

Část kódu obsahující tuto funkci pak může vypadat třeba takto:

orderselect ukazka

Cyklus projíždí všechny pozice v tabulce Historie účtu a funkce OrderSelect vždy načte jednu z nich. Všechny další obchodní funkce uvnitř podmínkového operátoru se potom budou vztahovat právě k vybrané pozici. Může jít o funkce jako OrderProfit() vracející profit této pozice, OrderOpenTime() vracející datum a čas otevření pozice apod.

OrderClose()

Jakmile umíme pozici otevřít a načíst, bude určitě dobré se naučit pozice také uzavírat (pokud nám nestačí zavírání pomocí stoplossů a profittargetů). Bude to jednoduché:

orderclose

S parametry se zachází naprosto stejně, jako v případě OrderSend(). Jak vidíte, abyste uzavřeli konkrétní pozici, musíte získat její ticket. Pokud váš systém umožňuje mít otevřenou vždy jen jednu pozici, lze použít proměnnou, kam se tiket uloží při jejím otevření. Pokud tomu ale tak není, nezbývá než pozici nejdříve vybrat pomocí funkce OrderSelect() a potom můžeme do parametru ticket umístit funkci OrderTicket().

Na závěr ještě krátce zmíníme některé další důležité obchodní funkce.

OrderCloseBy() – uzavře pozici a otevře novou pozici v opačném směru,

OrderDelete() – zruší otevřený limitní příkaz,

OrderModify() – změní příslušnou otevřenou pozici nebo limitní příkaz (např. posun stoplossu, změna expirace apod.),

OrdersHistoryTotal() – vrací počet záznamů v tabulce Historie účtu,

OrdersTotal() – vrací počet otevřených pozic a aktivních čekajících příkazů.

Ostatní funkce, které nalezneme v příslušné skupině, již vracejí informace o konkrétní načtené pozici. Nezapomeňte, že pro načtení do mezipaměti lze použít jedině funkci OrderSelect().

V dalším díle zjistíme, co máme dělat v případě, že funkce, kterou bychom potřebovali, není mezi standardními předdefinovanými funkcemi. V takovém případě si ji musíme vytvořit sami a příště si povíme, jaká u toho musíme respektovat pravidla.