Propojení Excelu a IB - základní tutoriál na stavbu VBA kódu
Jmenuji se Petr a zde na finančníku vystupuji pod nickem gizmo. Tomáš zde nedávno publikoval článek o automatickém obchodování z Excelu, a protože několik lidí vyjádřilo zájem mít zde technicky zaměřený tutorial, rozhodl jsem se jeden napsat. Pátým rokem pracuji jako software inženýr pro jednu velkou softwarovou firmu a programování je i mým velkým koníčkem. Sám ve Visual Basicu neprogramuji, nicméně Excel jeho podobu používá jako makro jazyk (abych byl přesný, používá VBA – Visual Basic for Applications), a proto ho budeme muset používat i v tomto článku.
Pro samotné propojení s trhem budeme používat platformu Trader Workstation (dále TWS) od Interactive Brokers. Tato platforma má docela propracované API a disponuje také rozhraním DDE (Dynamic Data Exchange), což je sice rozhraní poměrně zastaralé a bylo postupem času do značné míry nahrazeno rozhraním COM (Component Object Model), ale pro naše účely je naprosto dostačující. A co víc, je relativně jednoduché.
Cílem článku není poskytnout kompletní návod programování ve VBA. Cílem je okomentovat základní princip propojení Excelu s Interactive Brokers. Nebudu zde tedy rozebírat samotné principy programování. O VBA toho na Internetu najdete víc než dost.
Rozhraní DDE
Někteří z vás už mají nejspíš s DDE rozhraním nějaké zkušenosti, protože ho lze využít také například k propojení s platformou ThinkorSwim (dále TOS), o kterém už tu Petr psal v minulosti (zde). Propojení s touto platformou TOS je velice jednoduché. Stačí spustit TOS, spustit Excel a do nějaké buňky vložit =TOS|LAST!MSFT a Excel automaticky začne streamovat Last cenu titulu MSFT. Propojení s TWS je o něco komplikovanější, ale v podstatě to funguje na stejném principu jako propojení s TOS. Nejdříve si samozřejmě musíte nainstalovat TWS. To musí vždy běžet, jinak nebude mít Excel odkud tahat data. Také musíte povolit DDE rozhraní, Tomáš to popisuje ve svém článku (zde). Pokud nemáte účet u IB, můžete použít uživatelské jméno edemo a heslo demouser. Poběží to v demo módu a místo reálných dat to generuje náhodná data, ale pro účely testování je to naprosto dostačující.
Nachvilku se ještě vrátím ke vzorovému XLS, které IB poskytuje na stránkách a Tomáš o něm psal ve svém článku. V dnešním článku si ukážeme, jak replikovat funkce, které jsou ve vzorovém XLS obsaženy v prvním listu. Proč dělat něco, co už je hotové? Abychom si ukázali, jak vše funguje pod pokličkou. IB má v Excelu hodně kódu a pro neprogramátora je to nejspíš naprosto nepochopitelné. Já jsem sice programátor, ale ve VBA jsem dělal za svůj život minimálně, a proto mi taky chvilku trvalo, než jsem to všechno rozluštil. V následující ukázce si tak vytvoříme výrazně zjednodušený Excel, který nám také načte data z TWS, ale bude k tomu potřeba minimum VBA kódu.
Načítání dat do Excelu
Jak už jsem zmínil, propojení Excelu a TOS je záležitost jednoho příkazu. S TWS je to trošku složitější, protože potřebujeme příkazy minimálně dva. První příkaz vytvoří „ticker“, IB to nazývá vytvoření „control linku“ a druhým přistupuje k určitým datům z tickeru.
Na obrázku vidíte screenshot ze vzorového XLS od IB. Na první řádek jsem umístil titul MSFT, vyplnil těch pár dalších políček, které jsou potřeba a stiskl tlačítko “Request Market Data”. Nás nyní zajímá sloupeček s názvem “Ctrl” - ten obsahuje již zmíněný control link. Vidíte, že se v něm zobrazuje nula, ale když danou buňku označíte, v řádku formule se zobrazí DDE příkaz. V našem případě je tam: =edemo|tik!id1?req?MSFT_STK_SMART_USD_ISLAND
. Co to všechno znamená? Znak "rovná se" na začátku Excelu říká, aby obsah buňky interpretoval jako formuli, ne jako obyčejný text. Dále tam máme „edemo“, což je jméno účtu, ke kterému se chceme v TWS připojit, „pipe“ znak („|”) Excelu říká, že předcházející řetězec je název DDE severu, ke kterému se má připojit a „tik“ značí „ticker“ DDE doménu, která se stará o všechno, co se týče dat. Pak tam máme identifikátor „id1“, „req“ znamenající požadavek (anglicky request) a dále je tam už jen specifikace titulu, pro který daný ticker vytváříme. My jsme chtěli symbol „MSFT“ typu „STK“ (stock – akcie), „SMART“ říká TWS platformě, že má použít funkci smart routing a sama určit burzu, kde se symbol obchoduje, „USD“ je měna, ve které se finanční nástroj obchoduje. Dále je v kódu v našem případě ještě primary exchange „ISLAND“. Jde o identifikaci primární burzy a kód je nezbytný v případě, že má více symbolů stejné jméno. V našem příkladu to používat nebudeme, protože jsem ještě nenarazil na případ, kdy by to bylo nezbytné.
Control link bychom měli, podívejme se dále, jak tedy konečně získat nějaká užitečná data:
Ve stejném řádku jako předtím jsem si označil buňku ve sloupci „Last Price“. Tato buňka streamuje cenu posledního spárovaného obchodu. Pokud se podíváme do řádku formule, je tam tentokrát: =edemo|tik!id1?last. První část příkazu je shodná. A co je důležité, musí být shodný i identifikátor, v našem případě “id1”. To je totiž identifikátor, pod kterým jsme vytvořili ticker a přesně k tomu tickeru se teď chceme připojovat. A pak už je tam místo “req” pouze “last”, čímž TWS říkáme, že chceme poslední cenu. Tento příkaz už je velice podobný tomu z propojení Excelu a TOS. Pokud bychom tam například místo “last” uvedli “bid”, tak nám to bude streamovat cenu poptávky. “ask” nám zase analogicky zprostředkuje cenu nabídky atd.
Praktické využití
Nyní už víme, jak vytvářet příkazy pro DDE. Pojďme si proto zkusit vytvořit takový náš jednoduchý Excel sheet. Uděláme si ho pro akcie, použijeme vždy SMART exchange a budeme automaticky předpokládat, že se titul obchoduje v dolarech. To vše proto, abychom do našeho XLS mohli zadat pouze akciový symbol a nic jiného. U každého symbolu si pak budeme zobrazovat velikost poptávky, cenu poptávky, cenu nabídky, velikost nabídky a poslední cenu (přesně jako ve vzorovém XLS).
Nejprve si vytvoříme v Excelu šablonu s rozvržením stránky, a pak si k tomu napíšeme VBA kód. Pro práci s kódem je třeba si zobrazit „Developer“ záložku v menu (v české verzi to bude asi něco jako „Vývojář“). Klepněte na tlačítko Office úplně nahoře vlevo, pak na tlačítko „Možnosti“. Měl by to být třetí checkbox. Vyberte záložku, která se vám tam nyní zobrazila a klepněte na „Vložit“ (nebo v anglicke verzi je to aspoň Insert) a vyberte tlačítko. Až ho vložíte do Excelu, tak zatím zrušte dialog přiřazení makra. To uděláme později. Vytvořte si podobné rozvržení Excelu jako je na následujícím screenshotu:
Tak a teď trošku programování. Našim úkolem bude naprogramovat funkci, která po stisknutí tlačítka projde řádek po řádku, načte jméno symbolu z prvního sloupečku, vytvoří control link do druhého a načte realtime data do sloupečků C až G. Budeme tedy provádět v podstatě tu samou věc dokola pro každý řádek, a na to se v programování používají cykly. My použijeme „While“ cyklus, který na začátku zkontroluje podmínku, a pokud podmínka platí, provede tělo cyklu. Podmínkou bude, že první sloupeček obsahující symbol nesmí být prázdný.
V záložce „Developer“ je v menu první tlačítko „Visual Basic“. Klepněte na něj a otevře se vám vývojové prostředí Visual Basicu. Z menu vyberte „Vložit“->“Modul“ (Insert->Module) a napište tam následující kód:
klikněte pro obrázek v plném rozlišení
Kód jsem zde vložil jako screenshot, aby to nezabíralo tolik místa. Vzorový XLS je k dispozici ke stažení na adrese www.financnik.cz/download/DDE_tutorial.zip a komu se nechce psát, může si kód odtud zkopírovat. Pak už stačí jenom kliknout pravým tlačítkem na naše tlačítko „Načíst data“ a přiřadit k němu makro „NacteniDat“ (to je funkce, kterou jsme si právě vytvořili). Potom už jenom nezapomeňte vyplnit správné uživatelské jméno a stiskněte ono tlačítko. Mělo by vám to načíst data řádek po řádku. Až se načtou všechna data, měla by se začít data streamovat. Někdy to chce trošku trpělivosti, než se všechna data zobrazí. Všechny ty zelené řádky v kódu jsou komentáře a kód je jednoduchý, takže by mělo být jasné, co se v tom VBA kódu děje.
Závěrem
Doufám, že aspoň někomu byl tento článek přínosný a objasnil trochu taje propojení Excelu s TWS přes DDE rozhraní. Byl bych rád, kdybyste do diskuzního fóra napsali, co vám v článku nebylo jasné, případně na jaký detail by bylo lepší se zaměřit podrobněji. Tento konkrétní příklad pracuje s akciovými tituly, ale měl by v principu stejně fungovat třeba i pro komodity. Jenom tam bude třeba v control linku uvést více informací. Nicméně pokud budete třeba kód přizpůsobit dalším trhům, stačí trochu prozkoumat vzorový XLS od IB (pro opce je například potřeba specifikovat dobu expirace, směr – PUT nebo CALL – atd.).
Přeji hodně štěstí s experimentováním, a pokud budou nějaké dotazy, pokusím se na ně odpovědět. Chtěl bych ale všechny poprosit, aby se neptali na otázky typu „Na co mi to je?“. Pokud to nevíte, je vám to nanic. Tento článek je pro lidi, kteří vědí, k čemu podobný kód použít, jenom potřebovali vysvětlení, jak přesně na to.
Autor: Petr alias gizmo
Finančník.cz