Także trzymam mojego robota giełdowego w szafie:
![Obrazek](https://i.postimg.cc/Gp1z13XN/r.png)
To po prostu jednostka serwerowa Della pod kontrolą Rocky Linux (system binarnie kompatybilny z Red Hat Linux Enterprise).
Powyżej widać także modem od dostawcy światłowodu i UPSa, za którego pośrednictwem zasilany jest serwer i modem w celu zabezpieczenia przed chwilowymi zanikami prądu. Do serwera loguję się przy pomocy SSH z innego komputera w sieci lokalnej. Mam zmienne IP, ale skonfigurowałem dynamicznego DNSa, dzięki czemu mogę się łączyć ze swoim serwerem także spoza sieci lokalnej.
Od strony softwarowej system dość rozbudowany, składa się z wielu usług, które komunikują się ze sobą poprzez REST API.
Najważniejsze to:
1. Moduł "global" - odczytuje dane z orderbooków i historii transakcji największych giełd takich jak Binance, Coinbase, Bitstamp, Kraken i Bitfinex, w zależności od ustawień odpowiednio je uśrednia, a następnie udostępnia je innym usługom wewnętrznym.
2. Moduł "spider" - na bieżąco odczytuje dane z modułu "global" i zapisuje je w plikach csv, takie dane mogą się w przyszłości przydać np. w celu trenowania modeli uczenia maszynowego.
3. Moduł "signals" - odczytuje dane z modułu "global", agreguje je do świec z różnym interwałem i na bazie tych danych udostępnia innym wewnętrznym usługom popularne wskaźniki analizy technicznej. W tej chwili zaimplementowane są MACD, RSI, SSL, EMA, ATR.
4. Poszczególne moduły odpowiedzialne bezpośrednio za handel na różnych giełdach. Jest ich kilka. Dużo ludzi pisze, że strategia jest nieporównywalnie trudniejsza do zaprojektowania niż sama obsługa komunikacji z giełdą. Jednak zaimplementowanie komunikacji w sposób maksymalnie wydajny (równoległe strumieniowanie danych z orderbooka i danych z konta klienta, zsynchronizowanie tego z zachowaniem spójności, obsługa błędów czy obsługa orderbooka tak, aby oferty bota były zawsze na wierzchu) to w praktyce rzecz 100x bardziej skomplikowana niż może się to wydawać na pierwszy rzut oka. Jest tutaj bardzo dużo niuansów, które wychodzą w trakcie.
Każda usługa obsługuje wiele wątków, wszystko co się da, jest wykonywane współbieżnie.
Poniżej widoczny fragment logu z jednego wątku modułu "hefajstos" działającego na rynku Futures, nad którym pracuję ostatnio:
![Obrazek](https://i.postimg.cc/XJBwZT1F/n.png)
Aktualnie mam uruchomione dwa rynki BTCUSD (kontrakt wieczysty odwrotny i prosty). W odwrotnym zyski rozliczane są w BTC.
Poniżej dane z kilku ostatnich dni dla kontraktu odwrotnego BTCUSD:
Kurs BTCUSD:
![Obrazek](https://i.postimg.cc/d0k7nGRc/x1-main.png)
Pozycja:
![Obrazek](https://i.postimg.cc/k4W2P9hj/x4-posc.png)
Stan konta:
![Obrazek](https://i.postimg.cc/hvrhhsnT/x5-balc.png)
Te miejsca, w których linia stanu konta jest idealnie prosta to okresy braku pozycji.
Teoretycznie mój system obsługuje jeszcze ETH, LTC, BCH i XRP, ale na razie nie korzystam z tego.
I tak to wygląda, kiedyś jak robiłem Market Making i każda tysięczna sekundy była na wagę złota to przez pewien czas hostowałem w zewnętrznym centrum danych. Teraz mam w domu.