Pracujeme s TradeStation (2)
V dnešním díle našeho seriálu postoupíme od teoretického úvodu k praxi. Ukážeme si konkrétně jak v programu TradeStation naprogramovat triviální "obchodní strategii" a jak porozumět jednotlivým položkám kódu.
Pojďme se rovnou pustit do práce s přípravou kódu našeho jednoduchého systému. Ten bude spočívat ve vstupu do krátké pozice v případě, že se indikátor CCI překříží s nulovou linkou. Věřím, že nemusím zdůrazňovat, že dnešní triviální příklad zde vytváříme čistě pro demonstraci a nejde o kompletní obchodní systém, který by byl připraven pro aplikování do trhu - přípravu takového si naznačíme v některém budoucím díle seriálu.
Pravidla pro automatizovaný obchodní systém (nebo jeho dílčí část) se v rámci TradeStation nazývají strategie a vytvářejí se v okně strategy. To se vyvolá nejsnadněji přes ikonku EasyLanguage v tzv. shortcut liště - svislé liště s ikonkami, která se nejčastěji zobrazuje na levé straně programu. Pokud lištu s ikonkami nemáte v TradeStation zobrazenou, vyvoláte ji přes hlavní horní menu View > Shortcut Bar (Ctrl + Shift + S).
Kliknutím na ikonku EasyLanguage se rozbalí kontextové menu, ve kterém v případě založení nové strategie zvolte New EasyLanguage Document > Strategy. Mimochodem - na uvedeném seznamu je vidět, jaké množství nejrůznějších typů kódu lze v TradeStation vytvářet.
V druhém kroku nás TradeStation vybídne k založení nové strategie. TIP: všechny strategie se ukládají na disk do jednoho adresáře a je proto dobré, připravit si nějakou vlastní konvenci řazení strategií v rámci adresáře. Zejména v testovacím období se vám jinak stane, že se v nejrůznějších strategiích přestanete orientovat. Osobně si např. testovací strategie vytvářím s tečkou na začátku, takže se mi řadí na začátek výpisu v adresáři.
V rámci založení nové strategie máme možnost vybrat si také šablonu, která nám do dokumentu vloží určitou základní pomocnou osnovu, jak by strategie měla vypadat a základní příkazy, které by měla obsahovat. V tuto chvíli si pojďme vybrat strategii se šablonou (template) None a začít "s prázdným papírem".
Každá základní strategie by v TradeStation měla obsahovat několik prvků. Ne všechny jsou povinné, ale většina těchto prvků je natolik praktická, že je dobré se je naučit v kódu používat od začátku.
Aby byl náš tutoriál co nepraktičtější, pojďme si strukturu celého našeho dnešního příkladu ukázat rovnou na kódu:
V kódu si všimněte, že různé příkazy, nebo chcete-li slova, mají různou barvu. Světle modře jsou automaticky vyznačeny systémové příkazy - tj. takové, které v rámci programovacího jazyka EasyLanguage mají předem definovaný význam a které je třeba se naučit používat. Fialově jsou zobrazeny existující funkce (na screenshortu je fialově zobrazeno slovo CCI. Tj. jde o odkazy na existující kódy, zajišťující příslušnou funkcionalitu. Nejčastějším příkladem funkce jsou nejrůznější indikátory - ty jsou pochopitelně v programu již naprogramovány a obchodník se tak může na danou funkci pouze odkázat. Např. tím, že napíše CCI, čímž vyvoláme funkci provádějící aktuální výpočet indikátoru CCI. Zeleně jsou zobrazována slova, která nemají žádný programový význam a vesměs slouží pro orientaci uživatele.
Jako první řádek našeho jednoduchého obchodního systému vidíme:
Inputs: CCIperioda(20);
Jde o definovaní vstupních konstant a příkaz Inputs: naleznete v kódech drtivé většiny obchodníků pracujících s TradeStation. Je to velmi jednoduchý způsob jak definovat konstanty, které budeme v kódu používat a potřebujeme jim přiřadit určitou hodnotu. Jako řada programovacích jazyků, také EasyLanguage potřebuje dopředu znát jména konstant, se kterými budeme v rámci kódu pracovat. Není třeba nastavovat žádný jejich typ, stačí je pouze programu představit - napsat jejich jméno a do závorky výchozí hodnotu. Inputs: CCIperioda(20); znamená, že budeme v kódu používat naši konstantu se jménem CCIperioda a tato konstanta bude mít hodnotu 20. Proč vkládáme hodnotu 20 "složitě" přes konstantu a nepoužijeme v kódu přímo dané číslo? To má dva základní důvody:
- ve složitějších kódech se můžeme na konstantu odkazovat na řadě míst kódu. V takovém případě už by bylo mnohem složitější případnou číselnou konstantu změnit (změnu bychom museli složitě provádět na mnoha místech dokumentu, takto stačí změnit číslo pouze v definici konstanty).
- TradeStation s hodnotami konstant dále pracuje a tyto hodnoty je možné později měnit v nastavení strategií, případně indikátorů atd., přes přehledný panel bez nutnosti zásahu do programového kódu. A především je možné přes konstanty velmi snadno provádět tzv. optimalizaci - nechat TradeStation projít řadu možných parametrů dané konstanty (tj. v našem případě např. CCI v rozsahu 9-50) a sledovat, jaké dopady to bude na danou strategií mít.
Tzn. definování konstant pomocí příkazů Inputs je velmi praktické a používané. Konstant můžeme definovat samozřejmě více než jednu - v takovém případě je oddělujeme čárkami. Za poslední konstantou je třeba vložit středník. Středníkem vždy ukončujeme každý příkaz v rámci EasyLanguage.
Příklad definování 3 konstant najednou:
Inputs: CCIperioda(20), mujstoploss(120), mujprofittarget(300);
Takto zapsaný řádek připravuje v rámci EasyLanguage tři konstanty obchodníka, se kterými se dále bude pracovat v kódu strategie. Všechny tři konstanty budou mít na začátku příslušné hodnoty - tj. např. konstanta mujprofittarget bude mít hodnotu 300 atd. Jak již bylo řečeno výše, výhodou tohoto nastavení je zejména skutečnost, že konstanty bude možné velmi efektivně zkoumat programem pomocí tzv. optimalizace - automatického hledání nejrůznějších kombinací parametrů a zobrazování jejich dopadu na strategii.
Konstanty zadané pomocí Inputs lze později velmi snadno konfigurovat v nastavení strategie. Snadno tak můžeme např. sledovat dopad různého stop-lossu. Výpočet provede TradeStation v rámci zvoleného rozsahu zcela automaticky (pomocí nástroje Optimalizace).
Druhý řádek obsahuje:
Variables: myCCI(0);
Tento řádek je velmi podobný řádku Inputs s tím rozdílem, že se definují proměnné. Ty představují pro obchodníka srozumitelná "slova", která později naplňuje určitým obsahem (různé výpočty atd.) a dále s nimi pracuje. Proměnné uvedené v řádku Variables nelze optimalizovat, je to čisté "představení" všech používaných uživatelských proměnných a jejich prvotní naplnění hodnotou. Prvotní hodnotu udává číslo zapsané v závorce. V našem případě pracujeme s námi vymyšlenou proměnnou myCCI, která při prvním spuštění kódu bude mít hodnotu nula. Všechny proměnné použité v kódu musí být uvedeny buď v řádku Inputs nebo Variables, jinak nebude kód fungovat. Budeme-li ve složitějším kódu pracovat s více proměnnými opět můžeme jejich představení řetězit tak, že je uvedeme do jednoho řádku, ukončeného středníkem:
Variables: myCCI(0),starttime(900),endtime(1200);
Máme-li v kódu mnoho konstant a proměnných, lze zápis udělat na více řádků - každý musí začít označením Variables, nebo Inputs a musí končit středníkem.
Třetím řádkem máme ukončeny veškeré "přípravy kódu" a dostáváme se již k samotné strategii. EasyLanguage vychází z běžných jednoduchých programovacích jazyků a všem obchodníkům, kteří kdy pracovali s libovolným programovacím jazykem bude zápis patrně velmi srozumitelný. Pro absolutní neprogramátory je pak porozumění pouze věcí určitého cviku a praxe. Uvidíte, že na konci našeho seriálu budete schopni jednoduché strategie připravovat bez jakýchkoliv problémů.
myCCI=CCI(CCIperioda);
Tento řádek přiřazuje naší proměnné myCCI hodnotu funkce CCI s příslušnou periodou. V našem konkrétním úvodním příkladu je tento řádek skoro nadbytečný, protože bychom mohli dále pracovat rovnou s funkcí CCI(CCIperioda), ve složitějších konstrukcí se však proměnným nevyhneme a je tak dobré si na jejich přítomnost zvyknout.
if myCCI crosses below 0 then
Sellshort ( "CCI_short" ) next bar at market ;
Poslední řádky kódu obsahují samotnou logiku našeho jednoduchého ukázkového systému. Angličtináři si patrně dokáží význam odvodit na první pohled. Modře vytištěné jsou příkazu jazyka EasyLanguage, které je třeba ovládat, a jejichž význam a seznam lze nalézt v uživatelské příručce nebo v nápovědě programu.
příkaz if znamená klasickou programovou logiku, nebo-li "jestli". Syntaxe if je následující:
if podmínka then ** základní zápis podmínky;
následují příkazy, které se mají vykonat při splnění podmínky.
V našem konkrétním příkladě tedy podmínka znamená:
pokud hodnota myCCI klesne pod hodnotu 0 (jinými slovy překříží nulovou linku) potom vykonat otevření krátké pozice s názvem "CCI short" následující bar za market.
Podmínky mohou být samozřejmě výrazně košatější a lze je jednoduše řetězit klasickými operandy jako je AND a OR.
Tj. chceme-li např. přidat další podmínky, že příkaz se má vykonat pouze v čase 9 - 15 hodin, můžeme zadat:
if myCCI crosses below 0
AND time>900 AND time Sellshort ( "CCI_short" ) next bar at market ;
Co se základních příkazů pro otevírání pozic v TradeStation týče, potom:
pro dlouhou pozici: otevřít=buy, uzavřít=sell
pro krátkou pozici: otevřít=sellshort, uzavřít=buy to cover
(pozor všimněte si, že příkaz sell neslouží k otevření krátké pozice, ale k uzavření dlouhé, a to je v pojetí EasyLanguage rozdíl!)
Pokyny lze vykonávat za market, jako v našem příkladu, ale samozřejmě i pomocí dalších typů obchodních příkazů jako je limit nebo stop. Tomuto se budeme ale věnovat v některém dalším díle seriálu v rámci konkrétního příkladu.
Ač to na první pohled může vypadat složitě, po určité praxi lze i s několika základními funkcemi a příkazy, kterým se budeme v tomto seriálu věnovat, poskládat řadu zajímavých systémů, které nemusí nutně fungovat jako plně automatizované, ale mohou i začínajícím uživatelům programu pomoci s testováním základních myšlenek, které lze posléze pilovat např. pomocí jemného diskréčního testování.
V příštím díle seriálu si ukážeme, jak náš první ukázkový systém aplikovat do různých trhů a vyhodnocovat jeho výsledky.
Díly seriálu:
Pracujeme s TradeStation (1)
Pracujeme s TradeStation (2)
Pracujeme s TradeStation (3)
Petr Podhajský
Fulltime obchodník věnující se tradingu více než 20 let. Specializace na systematické strategie obchodované na futures a akciích. Oblíbený styl obchodování: stavba automatizovaných portfolio systémů, které využívá i při správě většího externího kapitálu.
- 1