Použití VB.NET pro obchodování na burze–1. díl

vbnetRozhodl jsem se napsat miniseriál popisující některé moje techniky a nástroje, pomocí nichž obchoduji. Postupně představím několik tipů a triků pro programovací jazyk, kterým se živím a pomocí něhož mimo jiné sestavuji AOS, natahuji data, vypočítávám indikátory a sestavuji obchody. Tím to jazykem je pro mě VB.NET. Pojďme na první díl.

Proč VB.NET?

Moderní programovací jazyky jsou co do výkonu, škálování a možností zhruba rovnocenné. Je tedy úplně jedno, jestli pro práci s burzovními daty použijete například Javu, C#, Python nebo třeba VB.NET. Já jsem sáhnul po posledně jmenovaném jazyce jen proto, že ho ve své praxi již používám zhruba 20 let a za ty roky ho už docela dobře umím.

Je to tedy čistě otázka osobních preferencí. Postupy, které tady budu ukazovat lze naprosto jednoduše použít i v C# (na internetu existují i nástroje pro konverzi kódu z VB.NET do C# a naopak). Javisté prominou, ale některé techniky zde uvedené nelze přímočaře použít v Javě kvůli absenci LINQ, neboť “There is nothing like LINQ for Java” ;-(

ETF použitý v příkladech

Ačkoliv uvedené postupy budou samozřejmě fungovat pro výpočty napříč aktivy, já jsem si pro ilustraci vybral ticker GLD (SPDR Gold trust) prostě proto, že tento fond nevyplácí dividendy a neměl splity. Tím pádem bude výpočet vždy co možná nejjednodušší a o to mi v příkladech šlo. Pokud bychom počítali indikátory nad něčím, co mělo splity či dividendy, je třeba indikátory upravit, a to už by bylo nad rámec jednoduchých ukázek, o které mi jde.

Výpočet klouzavého průměru za 200 dnů (SMA200)

Začneme zlehka. Pokud máme ve VB.NET k dispozici zavírací ceny nějaké akcie za posledních 200 dnů, je otázka výpočtu průměru práce na jediný řádek:

Code Snippet
Module Module1
Sub Main()
Dim Ceny As List(Of Decimal) ‚ceny GLD od 4.12.2013 do 19.9.2014 (200 obch. dnů)
Ceny = New List(Of Decimal)(
{119.96, 118.3, 118.55, 119.72, 121.82, 120.86, 118.29, 119.38, 119.69, 118.65,
117.61, 114.82, 115.94, 115.57, 116.1, 116.74, 117.12, 115.39, 116.12, 118,
119.29, 119.5, 118.82, 118.12, 118.46, 120.26, 121.02, 119.89, 119.66, 119.79,
120.93, 119.7, 119.19, 121.79, 122.29, 120.96, 120.95, 122.47, 119.77, 120.09,
121.32, 120.99, 121.29, 121.24, 122.17, 122.92, 124.36, 124.43, 125.49, 127.15,
127.4, 126.27, 127.6, 127.58, 128.99, 129.21, 128.11, 128.2, 127.62, 130.29,
128.68, 128.89, 130.17, 129.09, 129.13, 129.86, 131.76, 132.21, 133.1, 131.64,
130.62, 128.09, 127.86, 128.47, 126.18, 126.41, 125.41, 124.59, 124.56, 123.61,
123.39, 124.32, 123.92, 125.57, 124.91, 126.09, 126.32, 127.01, 126.93, 127.85,
125.49, 125.54, 124.75, 124.24, 123.78, 123.76, 124.56, 125.43, 124.88, 124.86,
124.22, 123.8, 125.06, 126.22, 125.98, 124.17, 124.17, 124.1, 124.94, 124.6,
125.81, 124.77, 124.5, 124.58, 124.69, 124.39, 124.67, 124.51, 121.85, 121.2,
120.94, 120.43, 119.7, 120.01, 119.76, 120.66, 120.61, 120.65, 121.39, 121.41,
122.64, 122.96, 122.42, 122.28, 122.67, 126.94, 126.5, 126.85, 126.98, 126.99,
126.73, 126.66, 128.04, 127.7, 127.7, 127.16, 127.02, 127.07, 127.84, 128.54,
128.78, 125.72, 124.53, 124.97, 127.09, 126.13, 126.34, 125.74, 125.62, 124.35,
125.79, 125.58, 125.2, 124.83, 123.39, 124.38, 123.99, 123.87, 125.67, 126.18,
126.19, 125.96, 125.99, 126.2, 126.31, 125.48, 124.96, 124.68, 124.22, 122.88,
123.19, 122.74, 123.35, 123.32, 124, 123.86, 121.65, 122.15, 121.48, 122.06,
120.73, 120.87, 120.26, 119.47, 118.38, 118.64, 118.83, 117.54, 117.78, 117.09
})
Console.Write(Ceny.Average) ‚vypíše 123.71015
End Sub
End Module

Co “to” vlastně dělá? Nejprve definujeme seznam (objekt List), který naplníme posledními 200 zavíracími cenami “zlatého” fondu GLD. V praxi by se to dělalo nějakým kódem, my pochopitelně zatím naplníme ručně. Potom vypíšeme do okna průměr těchto cen, který získáme pomocí “vestavěné” funkce Average. Později si o těchto funkcích řekneme více.

Řekněte, není to jednoduché?

Graf

Pro porovnání připojuji ještě graf zlata, z něhož vidíte, že 200-denní jednoduchý klouzavý průměr je opravdu na hodnotě 123,71.

zlato

Ostatní články tohoto seriálu

  1. Použití VB.NET pro obchodování – zasílání e-mailů (25.2.2015)
  2. VB.NET, burza a Linux–není to šílené? (30.1.2015)
  3. Použití VB.NET pro obchodování na burze–10. díl (16.1.2015)
  4. Použití VB.NET pro obchodování na burze–9. díl (2.1.2015)
  5. Použití VB.NET pro obchodování na burze–8. díl (14.12.2014)
  6. Použití VB.NET pro obchodování na burze–7. díl (3.11.2014)
  7. Použití VB.NET pro obchodování na burze–6. díl (27.10.2014)
  8. VB.NET a burza – REALTIME data z Google–5. díl (20.10.2014)
  9. Použití VB.NET pro obchodování na burze–4. díl (13.10.2014)
  10. Použití VB.NET pro obchodování na burze–3. díl (6.10.2014)
  11. Použití VB.NET pro obchodování na burze - 2. díl (29.9.2014)
  12. Použití VB.NET pro obchodování na burze–1. díl (22.9.2014)
Příspěvek byl publikován v rubrice Nezařazené se štítky . Můžete si uložit jeho odkaz mezi své oblíbené záložky.

21 komentářů u Použití VB.NET pro obchodování na burze–1. díl

  1. Joystick napsal:

    Jsem rád za tento seriál a pevně doufám, že se dostaneme dále než je výpočet klouzavého průměru :-)))). Já se teď osobně docela peru s API od IB, tak kdybys časem, přidal něco z tohoto soudku, byl bych rád. Díky.

    • admin napsal:

      Jojo, někde začít musíme. Dnes v noci jsem napsal 4 díly, tak uvidíme, jak dlouho mě to bude bavit ;-)))

    • labros napsal:

      Napsal jsem aplikaci, která je přes IB API připojená k TWS. Sleduje aktuální kurzy několika akcií a v okamžiku, kdy nějaká akcie splní určitá kritéria, pošle soubor objednávek (Buy Limit, Sell Stop, Sell on Close). Pokud máš nějaký konkrétní dotaz z této oblasti, zkusím ho zodpovědět.

      • admin napsal:

        Klidně pošli fragment kódu, ať tedy alespoň něco máme…

        • labros napsal:

          Pokud má Joystick nějaký konkrétní problém, tak ať ho sem dá. Zkusím odpovědět. Dávat sem fragmenty kódu by ale asi bylo nošení dříví do lesa. Pro zajímavost dám k dobru věc, která mě na začátku chvíli potrápila. Posílám příkaz Buy at Limit, přičemž limitní cena je vypočtena jako násobek včerejšího close (třeba 0.99*close). Některé příkazy mě systém akceptoval a některé zdánlivě náhodně odmítl. Pointa je v tom, že limitní cena musí být zaokrouhlena na dvě desetinná místa (přesněji na tolik míst, kolik jich používá u daného instrumentu burza, tj. u akcií dvě), jinak ji TWS odmítne. Takže to je jedna z vychytávek, která mě u IB API stála pár večerů a pár promarněných obchodů.

          • Joystick napsal:

            Tak já začnu. Nepoužívám TWS, ale IB GW. Co jsem už zjistil:

            Windows Form App – OK, jsem schopný připojit IB GW, zjistit info o tickerech, vygenerovat příkaz, ohlídat exekuci a cenu, načíst otevřené pozice a další základní operace.

            Problém: Nejsem schopen toto vytvořit v Console App. Mám naimportovaný Namespace TWSLib, ale jediné co jsem zatím schopen udělat je připojit a odpojit IB GW. Když chci odchytit události ze GW, tak tu mám neustále chyby tohoto typu „Type ‚AxTWSlib._DTwsEvents_tickPriceEvent‘ is not defined.“

            Když se podívám do WinForm App, tak ty eventy „_DTwsEvents“ jsou součástí TWSLib, tak nevím jestli se to v konzoli musí nějak ručně definovat :-(

            • Anonym napsal:

              Drobný dotaz: proč trvat na konzolové app?

              • Joystick napsal:

                Původně jsem si říkal, že vzhledem k tomu, že to má být bezobslužná aplikace, tak že to bude jednodušší. Ale postupem času zjišťuji, že to ve finále bude asi složitější.

                • admin napsal:

                  Já jsem kapituloval a mám trvale běžící aplikaci na výpočet cen a indikátorů OKENNÍ namísto KONZOLOVÉ prostě proto, že mi v konzoli furt něco nefungovalo. Čili, nejsi sám ;-)

            • labros napsal:

              S console aplikací nemám zkušenosti, takže budu jenom hádat. Problém může být v tom, že Windows Form aplikace má připojenou message queue a má už v sobě implementovanou správu událostí. Console aplikace nic z toho nemá, takže se to musí naprogramovat a nakonfigurovat třeba přes Win32 API. Zkus se podívat třeba sem.

              • admin napsal:

                Nebo se mu může „tlouct“ dvaatřicetibitovost se šedesátičtyřbitovostí, nebo používá komponenty vyžadující GUI. Bez kódu ale neporadíme …

                • labros napsal:

                  Na problém 32/64 bit jsem taky narazil. Původně jsem ve své aplikaci používal TWS ActiveX API. Když jsem, ale chtěl spustit aplikaci na virtuálním serveru MS Windows Server 2008 64 bit, tak jsem to prostě nerozchodil nejspíš právě kvůli problému 32/64bit. Naštěstí od verze 9.70 obsahuje IB API CSharp klienta, takže jsem kód přepsal, přeložil a to už chodí jak na 32bit, tak i 64bit systémech.

                • Joystick napsal:

                  Ono se asi fakt bude jednat o komponentu vyžadující GUI. Co jsem vyčetl z dokumentace API, tak tam konzolovou app zmiňují pouze ve spojení se C# a pro něj mají i jinou komponentu (CSharpAPI).

            • labros napsal:

              Ještě je celkem srozumitelně popsaná obsluha událostí v console aplikaci tady

  2. Kolous napsal:

    Osobně mi nejsympatičtější přijde mít výpočetní část (kód samotné strategie) v matlabu a backend pro komunikaci s TWS a databází v Javě (zatím mi to obchoduje přímo z matlabu, backend nemám ještě hotový).
    Matlab umožňuje provádět výpočty s celými maticemi, takže například jedno volání funkce mean spočte SMA pro všech 100 akcií. Potom třeba jedním voláním find(prices(:,end) > smaVector200) získáš všechny indexy kde je cena nad SMA 200.
    Dále umožňuje spouštět kód psaný v Javě. Ve verzi home je za rozumnou cenu.
    Jste se chlapi pěkně rozjeli…jsem byl týden pryč a sotva stíhám koukat, co se dělo ;-)

    • Ondrej napsal:

      Mohl bys prosim trosku rozvest Tvoje reseni v matlabu? Prave se s nim chystam experimentovat. Jak mas resene obchodovani primo z matlabu? Diky moc

      • admin napsal:

        Pokud by kolous chtěl napsat článek, rád ho publikuju…

        • Kolous napsal:

          Tak jo. Pojedu ale od pondělí na tři týdny pryč a nevím jak tam bude Internet, takže zkusím dát něco dohromady ještě tenhle týden.
          Moc jsem toho na internetu k tématu nenašel, takže jsem většinu zkoušel z referenční příručky API metodou pokus/omyl.

  3. admin napsal:

    Pátý díl seriálu – reálná data bez zpoždění zdarma – bude stát za to ;-)))

Napsat komentář

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