VB.NET na burze–14. díl–automatizujeme spouštění IB GW

V devátém díle seriálu jsme si řekli, že pro komunikaci mezi našimi programy a Interactive Brokers slouží program zvaný IB Gateway. Ten je potřeba spustit vždy ještě předtím, než zahájíme samotné obchodování, a já dnes s Vámi proberu několik způsobů, jak to udělat, včetně jednoho způsobu, jak to automatizovat.

Ruční způsob

Po korektní instalaci IB TWS nám na ploše vznikne ikona IB Gateway

ibgw

a po kliknutí na “Vlastnosti” můžeme vidět, s jakou hrůzou se příkaz vlastně spouští.

run

já tam mám:

C:\ProgramData\Oracle\Java\javapath\javaw.exe -cp jts.jar;total.2012.jar -Dsun.java2d.noddraw=true -Dswing.boldMetal=false -Dsun.locale.formatasdefault=true -Xmx768M -XX:MaxPermSize=128M ibgateway.GWClient C:\Jts

Čili ruční způsob je jasný, poklepeme na ikonu a ono se “to” nějak spustí.

Poloautomatický způsob

Položka “cíl” v zástupci se dá editovat, a pokud přidáme další dva parametry, pochopí je IB Gateway jako uživatelské jméno a heslo, a nebude nás otravovat s přihlašovacím dialogem. Pokud upravíte příkaz v okně “Cíl” nějak takto: C:\ProgramData\Oracle\Java\javapath\javaw.exe -cp jts.jar;total.2012.jar -Dsun.java2d.noddraw=true -Dswing.boldMetal=false -Dsun.locale.formatasdefault=true -Xmx768M -XX:MaxPermSize=128M ibgateway.GWClient C:\Jts username=“edemo“ password=“demouser“ dočkáte se spuštění bez interakce a bez přihlašovací obrazovky.

Pozn.: uvedené jméno a heslo skutečně funguje jako testovací, takže pokud to vyzkoušíte, měli byste se připojit k virtuálnímu účtu.

Automaticky z VB

Poloautomatický způsob má jednu podstatnou nevýhodu – a to tu, že uživatelské jméno a heslo musíme vložit přímo do vlastností zástupce, a tudíž si jej může kdokoli přečíst. Pomocí VB.NET můžeme vytvořit jednonoduchý spouštěč, kde jméno a heslo vložíme přímo do .exe souboru. Vypadalo by to nějak takto:

Code Snippet
    Dim startInfo As New ProcessStartInfo
    startInfo.WorkingDirectory = "c:\JTS" 'nikoliv složka prostředí javy !!!
    startInfo.FileName = "javaw.exe"
    startInfo.Arguments = "-cp jts.jar;total.2012.jar -Dsun.java2d.noddraw=true -Dswing.boldMetal=false -Dsun.locale.formatasdefault=true -Xmx768M -XX:MaxPermSize=128M ibgateway.GWClient C:\Jts username=""edemo"" password=""demouser"""
    Dim myProcess As New Process()
    startInfo.UseShellExecute = False 'nutné!!!
    myProcess.StartInfo = startInfo
    myProcess.Start()

Ke spouštění externích procesů ve VB.NET slouží objekt “Process”, kterému jen přiřadíme potřebné instrukce a spustíme. S ukončováním běžícího procesu si v tomto případě nemusíme dělat příliš starosti, protože IB Gateway chceme nechat spuštěnou i po ukončení programu ve VB.NET.

Uvedený způsob sice přihlašovací jméno a heslo “schová” do exe souboru, ale příliš velké vítězství to není. Pro VB.NET totiž existují decompilery, které nám prakticky celý zdrojový kód včetně řetězců ukáží. Viz obrázek, obsahující výpis pořízený decompilerem IlSpy:

ilspy

Utajování dat ve zdrojových kódech (tzv. obfuskace) je nicméně už nad rámec našeho článku. Řeší se to tak, že citlivé informace se ukládají mimo zdrojový kód a šifrují se.

… a mimochodem, ani to by nepomohlo. Lepší správci procesů (jako je processHacker) pohodlně ukáží celou příkazovou řádku, která spustila proces, včetně našeho jména a hesla. Takže je to vždy něco za něco.

Příspěvek byl publikován v rubrice Nezařazené. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

23 komentářů u VB.NET na burze–14. díl–automatizujeme spouštění IB GW

  1. foglik napsal:

    IBGW může jet „full time“ – pro prvotní spuštění není potřeba řešit složitě – spustím, zadám User & Login a hotovo.

    Spíše by mě zajímalo, jak máte ošetřený (z jakékoliv příčiny) restart – tady už skript své opodstatnění má. Jaká máte ošetřeno, že je IBGW OK a právě v případě nečekaných událostí se provede restart (automaticky, proto je potřeba skript s údaje o uživateli a hesle)? Teda jestli to někdo vůbec řeší – já zatím neměl problém s IBGW, a proto jsem dosud nehledal řešení.

    • admin napsal:

      Na to už je třeba být Opravdový Programátor, protože
      a) je třeba detekovat zavěšení
      b) je třeba umět odstřelit „zombie“
      c) a pak samozřejmě ten restart

      Chápu na co se ptáš, ale tohle nechci prozrazovat, to už je moje „nou-haf“ ;-))

      • foglik napsal:

        Jj, mířím přesně tam, ale když to nemůžeš vyhafat do světa, to se nedá nic dělat. Mi právě ten dnešní díl přišel jako řešení po detekci zavěšení a odstřelu.

        Já to sice řeším všechno v excelu a studijně v pythonu, ale taky do jde. Jenom je potřeba k tomu excelu přistupovat jinak, než že je to jen program na tabulky (což si 99,9 % lidí myslí). Prostě bude potřeba trošku hlouběji zagooglit, ale dnesku už se dá zjistit cokoliv:)

  2. Joystick napsal:

    A obsahuje tvoje nou-haf i zadávání secure kódu? Moje nou-haf umělo vše co píšeš, ale na tomto jsem skončil.

    • admin napsal:

      Vzhledem k tomu, že mám server s pevnou IP adresou, v managementu u IB mám nastaveno „připojit pouze z této jedné IP adresy“ a k serveru nemá přístup nikdo jiný, přišlo mi jako paranoidní používat Security Card a proto jsem ji pro danou IB GW vypnul.

      Mám tedy dva podúčty: Jeden, z něhož lze obchodovat odkudkoliv, security card enabled, a druhý, z něhož lze obchodovat pouze z jediné IP adresy, security card disabled a přijde mi to ok.

      • foglik napsal:

        Hele, to je to správné téma – IB accounts, typy a více účtů (ne jen secuser), family acc., advisory acc. atd. ;)

        • admin napsal:

          to asi je, akorát já na to nejsem profík, takže bych si nedovolil o tom psát… Někdo jiný? Klidně vydám článec někomu !

  3. TJM napsal:

    Foglik:

    Restart IB GW neni potreba resit. Aspon me se nikdy nestalo, ze by se GW dostala do nejakeho nefunkcniho stavu a bylo nutno ji zabit. Umi se zotavit z vypadku spojeni, a funguje porad a spolehlive. Takze jediny pripad je kompletni gavarie celeho operacniho systemu nebo hardwaru, coz je situace, ktera se stane jednou za mnoho let, a tu pak opravim rucne, a system proste par hodin (v uplne nejhorsim pripade, kdybych byl mimo civilizaci, dnu) nepobezi.

    Jina vec je, aby se z vypadku umel zotavit ten klient, ktery se ke gateway pripojuje, pripadne aby se umel restartovat. Ale tam je situace o level jednodussi, protoze ten nepotrebuje zadavat jmeno a heslo.

    • Kolous napsal:

      Domnívám se, že to potřeba řešit je, protože trh na tebe těch pár dnů čekat nebude….a Murphyho zákony taky znáš ;-) Mě se stalo s IB GW že se o víkendu odpojila (mívají asi údržbu serverů nebo co) a v pondělí se ověřovala furt dokola ale spojení se neobnovilo. Co se týče TWS, tak mi zase visela ve stavu, že se tváří že všechno jede ale přes API nic nepřileze.
      Tohle by šlo vyřešit, že si uděláš program co jednou za čas položí dotaz třeba na OrderID a pokud nic nedostane, tak GW sestřelí a spustí znovu. Klient by ti mohl posílat zprávu sám o sobě, jinak dostane kapky taky.

      • misch napsal:

        Na druhou stranu, pokud obchodování funguje na základě statistické výhody (s čímž se asi dá počítat), tak by z dlouhodobého hlediska nemělo být podstatné jestli jeden nebo dva dny něco nefungovalo, případně jestli se párkrát nepodařil nástup za MKT ve 21:59 apod.

        Já obchoduju živě, s tím že automatizovaně mi to funguje cca 3/4 roku, a i když se snažím o co nejlepší automatickou obsluhu výjimečných událostí (a pořád zjišťuju že stále vznikají další a další :)), tak automatický restart GW zatím nevidím jako nutný. Hlídání jeho stavu je samozřejmě něco jiného, ale … tam by se mi měl být problém detekovat automaticky jakmile se některému ze systémů nepodaří zaevidovat objednávku nebo mu nebudou přicházet market data, takže extra kontrolu GW neřeším.

        No a počítám prostě s tím, že v nejhorším případě:
        a) u některých systémů mám STOP lossy
        b) tam kde je nemám, tak v případě většího propadu trhu během doby co nepojede AOS a já budu zrovna někde v tramtárii, by mělo být naopak výhodou to že až se vrátím a trhy budou dole, tak je to aspoň dobrá příležitost k dokoupení za lepší cenu, i když mimo AOS :)

  4. TJM napsal:

    Presne tak to beru. Obchodovani je o statistice, a jestli ten system neunese obcasny (vyjimecny) nekolikahodinovy vypadek, tak je s neco zasadne spatne. Pri obchodovani clovek musi resit milion ruznych rizik, a veci, ktere se muzou pokazit, a zrovna vypadek IB GW je jedno z tech malych a neskodnych.

    Ale pravda, je mozne, ze nekomu na jeho pocitaci GW pada, a pak to resit musi. Mluvil jsem jen o sve zkusenosti.

    Murphyho zakony nevypovidaji nic o fungovani sveta jako takoveho, ale spis o selektivnim lidskem vnimani: kazdej okamzik se muze podelat milion veci, ale v 99.99999% okamziku se nic nepodela a vsechno je fajn. A kdyz se v tom 0.00001% jedna z toho milionu veci podela, tak si to clovek vezme osobne a silne to proziva a udela z toho „zakon“.

    • Kolous napsal:

      Statistika je fajn….občas ti ji naruší broker, třeba tady měli kluci problém s vyplnění příkazů, občas ti ji naruší přítelkyně, kočka, počasí…. Proč si přidavat další výpadky jen že se ti nechce trošku programovat? Mě je to fuk, dělej si jak chceš….já si chybový stavy sw ošetřím ;-)

  5. TJM napsal:

    Jojo, ja chybovy stavy taky osetruju – umim automaticky se zotavit ze situace, kdy se IB GW odpoji (a pak zase automaticky pripoji), protoze se to stava nekolikrat tydne.

    Havarie IB GW samotne je (podle mych zkusenosti) velmi malo pravdepodba, a po dosazeni do vzorce

    (pravdepodobnost_havarie * ocekavana_ztrata_pri_havarii) – cena_mojeho_casu_na vyreseni_restartu

    mi vyslo nerentabilni se tim zabyvat :-)

  6. Kolous napsal:

    Ok, nebudu se hádat, když to máš takhle pěkně matematcky podložený :D

  7. admin napsal:

    Kluci, všichni máte „pravdu“ ;-). Já za mě ošetřuju co jde, protože to je prostě zvyk z programování. Ale jinak jasan, statistická výhoda nezmizí po jednom výpadku SW…

    • TJM napsal:

      Tak samozrejme, mate pravdu, idealni by bylo mit osetrene vypadky cehokoli – pocinaje restartem IB TWS, pres zalozni elektricky zdroj, zalozni internetove pripojeni, zalozni ucet u jineho brokera, po zdvojeny obchodni software (na fyzicky oddelenem miste), aby druha instance prebrala kontrolu, kdyby vyhorel celej stroj. Ale tohle vsechno stoji cas a penize, tak clovek dela kompromisy, podle toho, jak ktere riziko povazuje za akutni a palcive. Nekdo muze mit vypadky proudu, tak bude resit zalozni zdroj, jinymu zase treba pada gateway, tak bude resit jeji restart. A nekdo ma dost casu, penez, a chuti na to, aby zprovoznil dokonale zalohovane reseni jen tak pro vsechny pripady.

  8. Joystick napsal:

    Může mi prosím někdo poradit jak zařídit, aby mi GW vracena historické ceny opravené o splity? Třeba u AAPL mám do 6.6.2014 cenu 645,57 a dne 7.6.2014 cenu 93.7 Pak mi samozřejmě nevychází SMA200. Díky.

  9. vakov napsal:

    IB běžně historii přepočítává, ale u AAPL se tak bohužel na live nestalo. S tím asi nic neuděláš, jedině zkus napsat na IB jaká bude odpověď.
    Na paper účtu mají historii přepočítanou správně.
    Ať se daří, Vašek

    • Joystick napsal:

      Tak tohle jsem nepochopil. Napsali toto:

      Unfortunately, and unlike graphs, we do not adjust historical data by splits, we just report the price exactly as it quoted in the exchange on each date.

      Přitom když jsem stáhnul data dneska, tak ty historický ceny jsou OK. No asi to nemá cenu s nimi řešit, přidal jsem kontrolu na splity a když zas bude nějaká anomálie, vezmu data ze záložního zdroje.

  10. DsL napsal:

    Automatizaci přihlášení/odhlášení může také pomoct ib-controller

Napsat komentář

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