Trading Bot: Obchodování na kryptoburze s podvozkem Cloud Native

Jak jsme využili plného potenciálu Cloud Native technologií při programování bota pro real-time trading měnových párů na kryptoburze

Logo
Logo Binance

Požadavek

Přání klienta

Klient chtěl najít řešení pro automatizovaného trading bota, který bude efektivně obchodovat v rámci cenového rozpětí (range), když kryptoměny nevykazují výrazné pohyby nahoru ani dolů. Bot by měl být propojen s Binance a postaven modulárně – tak, aby jednotlivé součásti byly snadno vyměnitelné a umožňovaly budoucí rozšíření. Cílem bylo tedy vytvořit flexibilní systém s potenciálem pro škálování jako SaaS.

Jak to funguje

Výzva pro naše vývojáře

Trading bot využívá real-time spojení s burzou pomocí naslouchání websocketu z platformy Binance, který přijímá ceny zvoleného měnového páru. To nám poskytuje informace o historickém i aktuálním vývoji libovolného měnového páru, díky čemuž můžeme na vývoj aplikovat určité strategie. Vývoj ceny měnového páru lze sledovat na svíčkovém grafu v různých frekvencích – od jedné minuty až po týdny či měsíce.

Na základě zvolené strategie se bot rozhoduje, kdy má zadat jaký příkaz a jakou transakci má provést (prodej vs. nákup). Strategie je obvykle definována určitými parametry a je možné ji nastavit podle volatility trhu, úrovně podstupovaného rizika i budgetu, se kterým bot operuje. Jakmile zadaný obchod proběhne, bot všechny parametry zaznamená a podle zvolené strategie naplánuje další obchody.

Tradingbot
Data v aplikaci

Řešení

Design patterns

Při programování bota jsme se co nejvíce opírali o tzv. design patterns („návrhové vzory“) z OOP (objektově orientované programování). OOP je programovací paradigma založené na přiřazení kódu k datům (metody jsou zapouzdřeny v objektech), což usnadňuje přenos kódu mezi více projekty. Objekty fungují jako vzájemně zaměnitelné stavební bloky, ze kterých mohou vývojáři „stavět“ funkce systémů a aplikací. 

Tato modularita a flexibilita nám umožnila jednoduše implementovat celou řadu funkcí našeho bota. Díky návrhovým vzorům jsme například schopni podporovat různé obchodní páry na burze, aniž bychom museli měnit základní strukturu systému. Modulární design usnadňuje také sestavování obchodních strategií a přidávání nových funkcí rychlým vytvářením instancí komponent bota. Návrhové vzory dále umožňují spuštění určitých komponent v jediné instanci, takže lze systém otevřít milionům uživatelů a efektivně zpracovávat jejich požadavky. Tímto způsobem jsme vytvořili robustní a efektivní systém, který dokáže zvládnout vysokou zátěž a rozmanité požadavky uživatelů.

Zvolená strategie

Jak jsme na to šli

Pro první plnohodnotnou implementaci jsme zvolili tzv. grid trading. Tato obchodní strategie spočívá v pokrytí určité výseče pohybu volatilního aktiva (jako jsou například kryptoměny, pro které jsou velké cenové výkyvy i v krátkých časových obdobích typické). Trading bot tak aktivně uskutečňuje nákupy či prodeje na určité cenové hladině (hodnotě) aktiva. Pokud uskuteční nákup (otevření pozice), vytvoří k němu automaticky prodej (uzavření pozice) na takové hladině, aby transakce byla zisková.

Mezi nastavitelné parametry trading bota patří velikost rozsahu (tzv. range) nákupů, která má být pokryta, dále velikost kroku mezi nákupem a prodejem (od poloviny range nahoru se prodává, od poloviny range dolů se nakupuje). Dále je potřeba nastavit rozpočet (budget) na range (rozdělený na nákupy a prodeje) a požadovaný zisk na každém kroku (násobek kroků v range).

Klient

 

Actso s.r.o. 

Časová náročnost

  • Doba vývoje: 4 měsíce (a poté 2 měsíce testování)

Data

  • Počet uživatelů/botů: neomezeně

  • Počet obchodních transakcí za hodinu: desítky tisíc

Data v aplikaci

Monorepo

Při programování našeho bota jsme využili speciální druh repozitáře – tzv. monorepo. Monorepo umožňuje vyvíjet několik na sobě logicky nezávislých projektů, jejichž kód je uchováván na jednom místě a sdílen např. pro vývoj front-endu a back-endu. Silnou stránkou monorepa je vysoká efektivita testování, protože moduly aplikace nebo systému nejsou rozděleny mezi více repozitářů.

Sdílení komponentů, tříd a dalších prvků mezi jednotlivými částmi systému je velice výhodné z hlediska provozu, ale o něco náročnější z hlediska přípravy. Pro nás to znamenalo věnovat více pozornosti a času instalaci, vytvoření a nasazení, avšak dlouhodobě jsme ušetřili na vývoji a zpřehlednili fungování celého systému. Jelikož náš tým zvládá vývoj back-endu i front-endu (tzv. fullstack vývoj), byl tento postup ideální.

Cloud Native

Služba Managed Kafka od Amazonu nabízí nejrychlejší odezvu na trhu, což je zásadní pro každou event-based aplikaci (aplikaci založenou na událostech – v tomto případě na obchodních transakcích). Realizuje frontu, která je mnohem rychlejší než cokoliv jiného. S provozem služby je spojeno minimum starostí – o dostupnost, bezproblémový chod a spolehlivost se stará Amazon.

Všechny operace se logují do nástroje AWS Cloud Watch, který umožňuje odesílání e-mailů nebo SMS (podle důležitosti sděleni) v případě problémů.

Dalším z pilířů našeho bota je objektové úložiště Amazon S3, které slouží k ukládání a získávání libovolného objemu dat z webu. V tomto konkrétním případě jsme úložiště použili k uchovávání rozsáhlých datových sad týkajících se historických cen měnových párů, tržních indikátorů a obchodovaných objemů. V kombinaci se serverless službou AWS Lambda nám toto úložiště umožnilo provádění tzv. backtestů (zpětné testování na základě historických dat, které ověřuje funkčnost a ziskovost zvolené obchodní strategie). Historická data ze služby Amazon S3 jsou zpracována a použita pro backtesting službou Lambda a výsledky se poté uloží zpět do Amazon S3 pro účely kontroly nebo vizualizace.

Logo
AWS logo

Ochrana

CN ochrana je zajištěna službou AWS Shield, která spolehlivě eliminuje útoky typu Denial-of-service („odepření služby“ – útoky s cílem narušit funkčnost určitého systému nebo přístup k němu). O dodatečnou vrstvu ochrany se stará web application firewall taktéž od AWS.

Řešení je v rámci globální architektury AWS (s přístupovými body po celém světě) nasazené v regionu Tokio tak, aby to bylo co nejblíže serverům burzy Binance.

Co se týče nasazení, zvolili jsme tzv. blue/green model. Tato strategie spočívá ve vytvoření dvou samostatných, ale identických prostředí. Na jednom z nich běží aktuální a na druhém nová verze aplikace, což usnadňuje automatizované testy. Přepnutí na novou verzi proběhne vždy až po úspěšném dokončení všech testů, aby bylo možné ověřit funkčnost provedených změn.

Mikroservisy

Náš trading bot je založený na tzv. microservices architektuře. Toto modulární uspořádání využívá na sobě nezávislých mikroservis, které pracují samostatně a plní vždy jednu konkrétní funkci. Pokud dojde k výpadku jedné mikroservisy, neohrozí to nutně funkčnost celého systému – stačí nasadit „zdravou“ instanci a aplikace může pokračovat v činnosti. Microservices architektura nabízí také možnosti škálování instancí podle vytížení – loadbalancery umožňují přidat další instance a vytížení rozložit. Řešení je tak připraveno na budoucnost a na přidání více strategii, uživatelů a runnerů. Za zmínku stojí také lepší zabezpečení díky vzájemné izolaci uživatelských botů, aby se nemohlo stát, že jeden uživatel získá přístup k datům jiného uživatele.

Sdílení komponentů, tříd a dalších prvků mezi jednotlivými částmi systému je velice výhodné z hlediska provozu, ale o něco náročnější z hlediska přípravy. Pro nás to znamenalo věnovat více pozornosti a času instalaci, vytvoření a nasazení, avšak dlouhodobě jsme ušetřili na vývoji a zpřehlednili fungování celého systému. Jelikož náš tým zvládá vývoj back-endu i front-endu (tzv. fullstack vývoj), byl tento postup ideální.

Použité mikroservisy

  • Backtesty, včetně dalších mikroservis
    • Čtení a ukládání dat na AWS S3
    • Čtení dat z CSV souborů
    • Serverless služba Lambda se stará o I/O backtestů
  • E2E testy
  • Propojení s API platformy Binance (lze vyměnit za jiné) pomocí AWS ECS
  • Manažer rozhodnutí
    • Využívá různé vyměnitelné strategie
  • Kontrola stavu systému
  • Včetně shutdownu systému
  • Fronta prostřednictvím služby Kafka, která zajišťuje veškerou komunikaci všech mikroservis
  • Zpracování všech dat z burzy (svíčkové grafy, tzv. candlesticks)
  • Pomocné microservisy
  • Generátor API pro front-end 
  • Front-end
    • S3 + CloudFront

Reference klienta

"Vývoj nástroje pro obchody na burze je náročný úkol, který je nutný vložit do rukou, kterým důvěřujete, a to speciálně v případě kryptoměn. Think Easy pro nás vytvořilo obchodujícího bota s perspektivní a rozšiřitelnou strukturou, podle našich specifických požadavků. Díky tomu je řešení nejen robustní, ale také škálovatelné díky cloud native přístupu. Nyní je aplikace nasazená na AWS a probíhají široké backtesty včetně menších ostrých běhů. Vážím si know-how, které společnost v tomto oboru má, a těším se na další spolupráci."

Michal Schuh, actso s.r.o. 

Data v aplikaci

E2E testy

Jak jsme při vývoji testovali

Systém na obchodování na burze musí projít mimořádně důkladným testováním. Z tohoto důvodu jsme pokryli 95 % kódu pomocí automatizovaných testů nebo E2E testy. Označení E2E znamená „End to End“, tedy „od začátku do konce“, a používá se pro automatizované testy zaměřené na všechny části systému v reálném provozu. Jednotlivé use cases jsou testovány prostřednictvím skriptů, které za uživatele klikají ve front-endu / webové aplikaci.

V tomto případě testy nastaví celého bota a jeho obchodní strategii a poté testují, zda bylo nastavení správně uloženo a přeneseno na platformu Binance, zda proběhly požadované obchody atd. Důležité je, že E2E testy skutečně spouštějí požadované procesy, a tím pádem se systém testuje opravdu „od začátku do konce“.

Backtest

Testovací obchody

Systém umožňuje stahování a nahrávání obřích dat  z archivu svíčkových grafů služby Binance. Historická data všech nabízených měnových párů ve všech frekvencích svíčkového grafu (až dva roky zpětně) si lze stáhnout a vložit je jako podklady do backtestu. To nám pomohlo nasadit požadovanou strategii na konkrétní data a vyzkoušet, jak by se botovi obchodování dařilo při daném nastavení. Výstupem tohoto testování byl počet obchodů, jejich detaily a také profit podle zvoleného nastavení.

Backtesting: 1 svíčka za sekundu (tzn. zpracování jedné hodiny u 1minutového grafu trvá jednu minutu, jeden den se zpracuje za 24 minut a týden za 168 minut)

Data v aplikaci

Bezpečnostní opatření

Bezpečnost nade vše

Při každém obchodování je potřeba myslet na zadní vrátka a řídit riziko, a proto jsme v rámci grid tradingu implementovali také tzv. boundary kill switche (příkazy k uzavření pozice v případě, že hodnota obchodovaného aktiva dosáhne definované mezní hodnoty). Strategie založené na grid tradingu jsou úspěšné tehdy, pokud daný měnový pár osciluje (časté změny pohybu nahoru a dolů) a nikoli pokud roste nebo padá příliš dlouho. Ze všeho nejhorší je pak tzv. flash crash neboli náhlý propad. Díky hranici (boundary), která je nastavena na hodnotu o něco vyšší nebo nižší než range, se daná strategie ihned vypne a upozorní na vypnutí.