Použití VB.NET pro obchodování (data od IB) – 12. díl

Vraťme se nyní od Linuxu k praktičtějším věcem, a to je získávání historických dat z placených zdrojů. Dnes to bude o tom, jak vydolovat historická data od brokera Interactive Brokers. Ten poskytuje v rámci obchodního účtu nějakou část historie dat jaksi “v ceně” – a tomu odpovídá i kvalita. Zájemcům o předchozí díly seriálu připomínáme, že už jsme dolovali data z YAHOO, GOOGLE, a dokonce jsme dolovali údaje z GOOGLE realtime. Dnes se tedy pokusíme vyrazit nějaká data od IB.

Dobrá rada na úvod – nedělejte to

Od získávání historických dat zde uvedeným způsobem bych nicméně chtěl pro reálné obchodování spíše odradit. Proč? Protože historická data od IB trpí celou řadou omezení. Mezi ta nejvážnější patří fakt, že dříve nebo později skončíte při dolování historických dat s chybou: “162 – Historical Market Data Service error message: Historical data request pacing violation”, což znamená, že data požadujete po brokerovi příliš rychle, nebo opakovaně, nebo obojí. S touto chybou si sice lze poradit, na druhou stranu to není spolehlivé a už vůbec ne elegantní.

Pokud na tom ale trváte

… v takovém případě by aplikace vypadala skoro stejně jako v devátém díle, pouze bychom namísto “mujKlient.RequestCurrentTime” požadovali “mujKlient.RequestHistoricalData”. Tohle volání v zásadě přebírá tato argumenty:

  1. TickerID. Protože v reálné aplikaci můžeme chtít data více tickerů najednou, musíme nějak vědět, k jaké otázce daná odpověď patří. K tomu slouží právě TickerID. V obdržené odpovědi (odpovědích) je pak toto ID obsaženo jako RequestID. My v aplikaci potřebujeme data pouze pro jediný ticker, tak to moc nevyužijeme, nicméně položka je povinná, proto dávám jedničku.
  2. Contract. Tady jde o to, čí data vlastně potřebujeme. Zda akcie, opce, futures a tak dále. V aplikaci volíme stále ticker GLD. Contract se musí nadefinovat, což lze udělat na samostaném řádku, nebo inline, jak jsem to udělal já.
  3. Datum, dokdy data potřebujeme. Logika IB (nakolik je zvrácená) praví, že budeme muset / chtít poskytnout konečné datum, tedy datum “dokdy” data chceme. Pokud nás zajímají data “až dodnes”, uvedeme “now”, pokud bychom chtěli data například do 31.12.2014, uvedeme toto datum.
  4. Dalším argumentem je, kolik dat budeme potřebovat. “20 D” znamená třeba 20 dnů.Pozn.: Také se Vám zdá, že vývojáři API měli více přemýšlet? Člověk by čekal vstupní argumenty ve smyslu “datum od – datum do”, že?
  5. Pak tu máme velikost baru. V příkladu požadujeme denní data, lze ale samozřejmě chtít data například hodinová. Toto je ošetřeno hezky.
  6. Šestým argumentem je jaká data potřebujeme (BID, ASK, TRADE)
  7. A konečně posledním argumentem je, zda požadujeme i data mimo pravidelné otevírací hodiny burzy či ne. Jinými slovy, zda nás zajímají obchody mimo hlavní seanci.

Pokud je program správně napsán, reakce je, že bude dvacetkrát zavolána událost “client_HistoricalData”. V ní můžeme data například vypsat na obrazovku. Celý kód by vypadal následovně:

Code Snippet
Imports Krs.Ats.IBNet
Module Module1
  Dim WithEvents mujKlient As IBClient
  Sub Main()
    mujKlient = New IBClient
    mujKlient.Connect("127.0.0.1", 4001, 100)
    mujKlient.RequestHistoricalData(1, New Contract("GLD", "SMART", SecurityType.Stock, "USD"), Now, "20 D", BarSize.OneDay, HistoricalDataType.Trades, False)
    Do
      Threading.Thread.Sleep(100)
    Loop
  End Sub
  Private Sub client_HistoricalData(ByVal sender As Object, ByVal e As Krs.Ats.IBNet.HistoricalDataEventArgs) Handles mujKlient.HistoricalData
    If Not e Is Nothing Then Console.WriteLine("Data: Datum: {0:dd.MM.yyyy}, Cena: {1:0.00}", e.Date, e.Close)
  End Sub
End Module

Co tomu chybí?

Ačkoliv ukázka funguje moc hezky, chybí jí dvě podstatné věci:

  1. Aplikace se sama neukončí. V reále to buď nevadí (pokud bychom data chtěli získávat průběžně a aplikaci nevypínali), nebo vadí (pokud chceme data získat a skončit). Pokud to vadí, aplikace by musela nějak ošetřit svoje ukončení po načtení dat (nebo po chybě). Toto jsem pro jednoduchost ukázky vynechal.
  2. Aplikace data nikam neuloží. V reále by samozřejmě došlo k uložení dat do nějakého souboru nebo databáze. Také to jsem neřešil, pro jednoduchost.
Příspěvek byl publikován v rubrice AOS. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

37 komentářů u Použití VB.NET pro obchodování (data od IB) – 12. díl

  1. TJM napsal:

    Ano, omezeni tam jsou – maximalni pocet baru v jedne odpovedi, a maximalni frekvence requestu, ale neni tezke se s nima vyporadat, a vsechno funguje stabilne a spolehlive. Ja grabuju minutova data, jeden request max na jeden den historie, a mezi requesty 11 vterin cekam, cimz k pacing violation nikdy nedojde. Pak je staci data za jednotlive dny pospojovat. Pouzivam tyhle data pro backtesty i obchodovani, a nikdy jsem nemel problemy s nedostupnosti dat (krome kratkych vypadku o vikendu) nebo nejakymi nesmyslnymi cenami v historii.

    • admin napsal:

      Počkej, a kolik tickerů takhle sleduješ? protože já potřebuju několik TISÍC tickerů realtime nebo skoro realtime a tady se IB vůbec nechytá…

      • TJM napsal:

        Pravda, v tom je rozdil. Ja na zivo sleduju 10-20 futures kontraktu a update potrebuju maximalne jednou za 15 minut, vetsinou mnohem min. A vetsi data pro experimentovani muzu stahovat o vikendu. Takze jak vidno, na nektere obchdovani jsou IB data bohate dostacujici, ale realtime tisic symbolu tam samozrejme nejde :-)

  2. TJM napsal:

    Vlastne by tam asi byl problem is 90% strategii, protoze by clovek potrebovat tesne pred close najednou updatenout 100 symbolu, pripadne to rozlozit do delsiho casoveho intervalu a tim ztratit neco na presnosti.

    • admin napsal:

      Ano, a nejen to. Představ si například, že si stavíš scanner na blbě spočítaný opce, nebo jedeš nějaké strategie na RUSSEL 2000. Prostě je toho víc. V tomto mají samozřejmě výhodu obchodníci s jedním druhem futek. Ale to já nejsem, no…

    • foglik napsal:

      Rozveď to trochu – pro 90ku potřebuješ sice 100 tickerů, ale jen 1x 100 ve 21.59 a 200x 100 kdykoliv během dne. Osobně streamuju (excel si řídí sám) pro celou 90ku last ceny od cca 21,30 do 21,59 a nikdy nebyl problém. Sem tam vyjede hláška o překročení 101 symbolů, ale vždycky to je v pohodě dál.

      • admin napsal:

        Devadesátka tvoří zhruba desetinu mých strategií, stačí takto?

        • foglik napsal:

          Nene, to bylo na TJM – asi jsme to psali ve stejnou chvíli;)

          A které jsou ty další?:)

          • admin napsal:

            Volatilita – VIX, VXX, VXV, XIV, ZIV, UVXY, SVXY
            Opce – bez podrobností
            něco na Russel 2000
            zde popsaná strategie na zlato + DIA + HYG
            mám něco na SPY
            zbytek je tajňačka ;-)))))

            • foglik napsal:

              Děkuji za info, na oplátku:

              spready – dnes už vyjma Softs, NG, BC, Metals a FX
              samozřejmě 90ku:)
              futka – ropu

              Chystám se na opce, ale zatím nemám čas a stejně ještě nemám plán kde začít – zatím jsem prolít těch tvých 10 nebo víc (už nevím) „lekcí“ ohledně myslím že PFE – to jsem pochopil, tak uvidíme.

              • admin napsal:

                Opce? Začni výběrem akcií, co to na ně budeš dělat, anebo pokud si to nechceš zesložiťovat, tak začni opcema na ETF. No, a pak už je to o trpělivosti a příležitosti. Opce jsou nuda. Ale to je záměr.

                • foglik napsal:

                  Mi teďkom jde spíš jak začít a co od opcí vůbec očekávat – nuda mi nevadí. I když podle toho co semtam pustí jakub nebo myšák, tak to nuda být nemusí. Myšleno tak, že pokud opce na ETF – OK, ale co teďkom a co potom;)

                  • admin napsal:

                    Teďkom začni s jednoduchejma strategiema typu naked call, naked put, covered call a podobně. Začni naostro, třeba s jednou opcí, backtesting tady není k ničemu.

                    Potom si „vymysli“ nějaký způsob, jak vyhledávat opční příležitosti. „Vymysli“ je v uvozovkách, protože pravděpodobně „objevíš kolo“, ale to nevadí.

                    Třetím bodem je pak bohatnutí ze strategií, které jsi „vymyslel“, nicméně není o nich běžně zmínka na webu, a tudíž je velká šance, že je masy nemusejí znát.

          • TJM napsal:

            Foglik: Chapu-li to spravne (akcie zatim neobchoduju), tak tesne pred zaverem seance vyhodnotime moving average a RSI, a podle toho se rozhodneme, ktere akcie nakoupit. Pres IB bys musel ty data zacit stahovat zhruba 20 minut pred koncem seance, aby se stahlo vsech 100 titulu bez pacing violation. Takze bys porovnaval RSI na datech porizenych v ruznem case. A behem tech 20 minut se muzou jak jednotlive tituly, tak i cely trh pohnout o poradny kus. Takze bych cekal, ze to cas od casu vybere jinou akcii, nez teoreticky idealne vykonana 90% strategie, kde je vsechno zalozene na closing cene.

            Z toho neplyne, ze uspesnost takto implementovane 90% strategie bude nutne horsi, ani si netroufam odhadnout o kolik se to bude od toho idealu lisit, ale lisit se to urcite bude.

            • foglik napsal:

              Já nevím, jestli chápu dobře to co jsi napsal:), ale pokud jsem něco nepřehlédl – není to tak, že stahuješ vše najednou (samozřejmě i to je možnost, ale proč to dělat proti „srsti“?), ale tím že 90ka potřebuje EOD data, tak pro nejdelší indi (SMA200) potřebuješ 199 EOD cen a jednu dnešní co nejblíže CLOSE. Těch 199 EOD bude mít hodnotu stejnou ráno, v poledne, i o půl desáté;) – takže je jedno, v kterou dobu je stáhneš a tím pádem potřebuješ od IB jen jednu „sadu 100 tickerů“ – tu dnešní. Více u druhého tvého postu.

  3. TJM napsal:

    Aha, nebo je to tak, ze ten excel posloucha kontinualni updaty ceny vsech titulu? To by potom fungovalo, pokud IB API dovoli poslouchat na 100 symbolu najednou. Ja delam pro jednoduchost vsechno pres historicka data – request od zacatku dne do ted, a podivam se na close posledniho baru.

    • admin napsal:

      IB API dovolí poslouchat 100 titulů najednou, o to nic, ale problém je, že to velice často zavěsí. Zkrátka to nefunguje, a to typicky v době, kdy to potřebuješ nejvíc. Takže návody jako je tento:

      http://statsadventure.blogspot.cz/2012/03/capturing-tick-data-via-c-interactive.html

      prostě a zkrátka po pár minutách / hodinách zavěsí, bez možnosti to nějak smysluplně detekovat, nebo nedej bože restartovat. To je jádro pudla ;-(

      • foglik napsal:

        Soráč, tomu kódu nerozumím, takže netuším co si představit pod „prostě a zkrátka po pár minutách / hodinách zavěsí“…

        IB dovolí streamovat násobky 100 titulů – jen je potřeba příslušný počet „Booster Packs“ (1 BP = 100 dat souhrnně – tzn. sečteno za akcie, opce, futka atd.) – jeden první je v ceně.

        Popíšu jak to funguje u mě (vynechávám popis kontrolních mechanismů, které se provedou) – upozorňuji, že se připojuju z excelu a tady je API asi nějaké jiné, bo jsem nikdy neměl problém s připojením, přerušením nebo nerealizací – pouze díky neošetřené chybě VBA;) V devět se spustí excel a stáhne se 199 EOD dat pro 100 akcií z Yahoo. O půl desáté se spustí stream 100 akcií od IB – funguje jak s TWS, tak IBGW – data se streamujou pro klidně 100 akcií naráz… max. dojde na hlášku, že byl přeročen limit 100 tickerů a že je potřeba zakoupit Booster Pack – nevím proč to dělá, řeším je „Second User“ (ale platí se dvojí data) takže poslední pohyby cen, klidně všech jsou ve 21.59, pak se provede vyhodnocení podmínek a provedou se nákupy, dokupy a prodeje…

        • admin napsal:

          No, pokud Ti to takto funguje, pak není co řešit. „zavěšením“ myslím to, že když já to takto nechám 2-3 dny, tak se streaming zkrátka přeruší, aniž bych věděl která bije a mohl na to nějak reagovat. Navíc já potřebuju data i během dne a potřebuju více než 100 titulů, takže mám prostě na poskytovatele dat úplně jiný požadavky, no …

          • vakov napsal:

            Padá ti jenom streamimg dat, nebo celé připojení k IB ?
            Já to používám tak, že IB GW mám spuštěnou nonstop, ale AOS každý den vypínám. AOS mám spuštěný v US čase 3:00 – 17:30 (vše automaticky). Možná to je důvod, proč s výpadky nemám problém. Třeba stačí, jak se říká, občas „vystoupit – nastoupit“.
            Ať se daří, Vašek

            • admin napsal:

              Tak já to mám jinak – systémová služba, co na základě cca 17 „senzorů“ odhadne, jestli služba běží jak má a pokud ne, tak se ji pokusí restartovat. Čili stejný princip, ale dělám to, až když je potřeba.

              • vakov napsal:

                Já mám kontrolován AOS dvěma způsoby. Jednak je kontrolováno přímo v AOS několik parametrů + chybové hlášky z IB a info o problému přeposíláno na SMS. Zároveň přímo AOS odesílá v minutových intervalech krátké zprávy na jiný server který hlídá tyto zasílané zprávy. Dozvím se tedy i o totálním výpadku. Je to něco podobného, jako někteří hlídají server pomocí pingu. Ale takhle hlídám přímo běh AOS.
                Ať se daří, Vašek

            • cubecoop napsal:

              Já ani nic nestreamuju, já si 21:59 řeknu o 100 snapshotů a jdu :) Samozřejmě řeším nějaké zotavení z chyb nebo když ty snapshoty nedorazí, což se mi ještě nestalo (ikdyž nejedu to dlouho).

          • foglik napsal:

            Jo, to chápu – já nikdy nepotřeboval jiná data, než pro 90ku. Proč mi to nepadá je asi tím, že už v začátku jsem měl strach nechat puštěný už jen ten excel. Takže excel se pouští a uzavírá sám a tím pádem i streaming dat. Jediné co jede v kuse je IBGW. Proto to asi nezlobí a doufám, že to tak zůstane, protože se každý den vytvoří nové Control Linky pro všechny tickery a streamování se až po deváté. Předpokládám, že takto je velká pravděpodobnost, že se to propojení po…..

            Vašku: dík za bleskovou reakci, budu se snažit napsat ASAP.

  4. TJM napsal:

    Foglik: Tak to ano, to zni rozumne, diky za informaci.

    Admin: IB API (prinejmensim v Jave) vola spoustu callbacku, kdyz se neco deje, nebo dojde k chybe, nebo vypadne spojeni. Takze si tam clovek muze povesit svuj kod a nejak se z toho zotavit. Ocekaval bych, ze neco podobneho pujde i na tech tick datech (ale tvrdit to nemuzu, nezkousel jsem to, pozdeji se jen tak ze zajmu podivam, jak to funguje). Mozna ze Foglikuv spreadsheet tohle zotaveni umi, a tak mu to funguje.

    • admin napsal:

      Ale to aj vim, jenze nejak zotavit = musim schodit cely stream. Proste to kdyztak vyzkousej a pochopis. Fakt to na enterprise aplikaci nejni

      • foglik napsal:

        Shození celého streamu v excelu znamená odhadem tři sekundy, než se načte ta stovka do plné síly.

  5. vakov napsal:

    Přidám taky svoji zkušenost s API IB a to za více jak 3 roky live provozu. Asi mám veliké štěstí, ale já problémy s API nemám.
    Spojení „drží“ bez problémů. Výpadky se sice čas od času vyskytnou, ale je to tak jednou do týdne na několik sekund a to beru i dobu mimo hlavní obchodní hodiny (propojení mám spuštěné 13 hod denně). Spojení se automaticky obnoví.
    V Live mám spuštěnou 90% a další testy na paper účtu. Načítám z IB vše včetně historických dat. Pravdou ale je, že je nutné ošetřit načítání historie v blocích tak, jak je omezení na IB – pokud si to dobře pamatuji, tak max 55 tickeru za 10 min. Hist. data načítám každý den znovu, a to 2x pro ověření platnosti. U 90% to trvá cca 30 min. Následně spouštím real stream. Zde je zase omezení na max. 100 tickeru, na 90% to stačí. Včetně indikátorů aktualizuji výsledky všech 100 tickerů po 1 sec a není problém.
    Na výpočty indikátorů mám takovou drobnou fintu :-)
    Aplikace píšu C# a Java. V Excelu bych si to teda netroufnul spustit na live účtu.
    Ať se daří, Vašek

    • admin napsal:

      To je dobry comment, diky za nej.!

    • admin napsal:

      Taky bych se Excelu bál, ale co čtu, tak někteří tuto zvrácenost dělají. Já mám na obchodování server, a tam mi Office zkrátka nesmí. Ale zase na druhou stranu když jim to funguje, proč ne.

      Jenom ze zvědavosti – proč Java a C# a ne jeden z nich?

      • vakov napsal:

        Zvládám vícero programovacích jazyků. Starší věci mám v C#, teď píšu spíše v Jave. Není to teda tak, že bych to kombinoval v jedné aplikaci. Java má výhodu v snadné přenositelnosti Win-Linux-Mac.

        Se serverem na AOS plný souhlas. Win2008 + aktualizace, Java, TWS, AOS a synchronizace času. Nic dalšího tam nesmí. Není tam antivir, neotvírá se web atd….

        Ať se daří, Vašek

  6. foglik napsal:

    Ahoj Vakov, můžeš mi na sebe hodit kontakt na mailpublic@seznam.cz? Díky

  7. cubecoop napsal:

    Mám data od IB – dnes mi nepřišel snapshot jedné akcie – VZ (Verizon Comm Inc). Ani když si o něj systém několikrát řekl znova. Neměl někdo podobný problém? Možná mám jenom chybu v kódu. Možná je čas rozloučit se s daty od IB. Mám pocit, že co měsíc to jedna perla…

  8. Joystick napsal:

    Kdo používáte historická data od IB – jak máte ošetřené splity na živém účtu? Nepochopil jsem jednu věc a to proč na paper účet posílají data prepocitaná a na live ne, typicky teď poslední Visa.

Napsat komentář

Vaše emailová adresa nebude zveřejněna.