[Infrastruktura tradingowa · Maszyny stanów · Automatyzacja backendu]
Zarządzanie ryzykiem i cykl życia transakcji
Kontrolowany cykl życia operacji tradingowych: każdy sygnał jest weryfikowany regułami ryzyka, przechodzi przez jawne stany i kończy się zapisanym wynikiem.
01Przegląd projektu
Wygenerowanie sygnału to tylko połowa zadania. Druga połowa to to, co dzieje się dalej: weryfikacja parametrów, zastosowanie ustawień ryzyka konta, śledzenie pozycji i decyzja, kiedy i jak ją zakończyć.
Ten podsystem modeluje cykl życia w sposób jawny. Transakcja przechodzi przez zdefiniowane stany, a każde przejście jest chronione walidacją i zapisywane w bazie danych.
02Wyzwanie inżynierskie
Automatyzacja tradingu psuje się po cichu: pominięta aktualizacja, częściowe wykonanie, którego nigdy nie uzgodniono, albo błąd giełdy, po którym stan lokalny rozjeżdża się z rzeczywistym. Cykl życia musi takie przypadki ujawniać i umożliwiać ich naprawę.
- A
Odrzucać niebezpieczne kombinacje parametrów przed jakąkolwiek próbą operacji.
- B
Obsługiwać różne tryby ryzyka i dźwigni dla każdego konta.
- C
Zachować spójność stanu lokalnego, gdy wywołanie zewnętrzne się nie powiedzie lub przekroczy czas.
- D
Wytworzyć końcowy, audytowalny wynik każdej operacji.
03Architektura rozwiązania
Najedź lub dotknij etapu.
Sygnał wejściowy
Ustrukturyzowany sygnał przychodzi z silnika sygnałów lub innego źródła.
04Główne komponenty
- 01
Walidator parametrów
Sprawdza relacje wejścia, stop loss i take profit, zakresy liczbowe i pola wymagane.
- 02
Silnik ryzyka
Stosuje ustawienia konta — tryb ryzyka, dźwignię, limity ekspozycji — i blokuje operacje, które je naruszają.
- 03
Maszyna stanów
Utworzona → Zwalidowana → Aktywna → Częściowo zamknięta → Zamknięta, plus jawne stany „Odrzucona” i „Błąd”.
- 04
Integracja z giełdą
Opakowuje wywołania API klasyfikacją błędów, aby awaria stawała się znanym stanem, a nie crashem.
- 05
Dziennik zdarzeń
Każde przejście jest zapisywane z czasem i powodem, tworząc historię transakcji.
- 06
Kontrola wyników
Ocenia zamknięte operacje i zasila automatyczne raporty.
05Stack technologiczny
Rdzeń
- Python
- asyncio
- State machine design
Integracja
- Binance Futures API ecosystem
- Error classification
Dane
- SQL
- Event history
- Reports
06Interaktywna demonstracja
Maszyna stanów cyklu życia transakcji
IlustracjaDemo ilustracyjne. Wywołuj zdarzenia i sprawdź, które przejścia są dozwolone. Uproszczony model, bez połączenia z giełdą.
state = created · fire an event
07Decyzje inżynierskie
- 01
Jawne stany zamiast flag
Jedno pole stanu z dozwolonymi przejściami łatwiej walidować i audytować niż zestaw flag logicznych, które mogą sobie przeczyć.
- 02
Błędy to stany
Awarie API przenoszą operację do stanu „Błąd” z powodem, aby można ją było zbadać i rozwiązać, zamiast ją zgubić.
- 03
Reguły ryzyka w kodzie
Limity są egzekwowane przez system przed wykonaniem. Błąd konfiguracji nie może ich obejść.
- 04
Historia tylko dopisywana
Przejścia są zapisywane jako zdarzenia, więc odtworzenie przebiegu jest proste.
08Niezawodność i testy
- Strażnicy przejść odrzucają niemożliwe zmiany stanu.
- Klasyfikacja błędów giełdy na ponawialne i ostateczne.
- Uzgadnianie stanu lokalnego z zewnętrznym po awariach.
- Testy regresji reguł walidacji ryzyka.
09Przykład kodu
from enum import Enum
class TradeState(str, Enum):
CREATED = "created"
VALIDATED = "validated"
ACTIVE = "active"
PARTIALLY_CLOSED = "partially_closed"
CLOSED = "closed"
REJECTED = "rejected"
ERROR = "error"
ALLOWED: dict[TradeState, set[TradeState]] = {
TradeState.CREATED: {TradeState.VALIDATED, TradeState.REJECTED},
TradeState.VALIDATED: {TradeState.ACTIVE, TradeState.REJECTED, TradeState.ERROR},
TradeState.ACTIVE: {TradeState.PARTIALLY_CLOSED, TradeState.CLOSED, TradeState.ERROR},
TradeState.PARTIALLY_CLOSED: {TradeState.CLOSED, TradeState.ERROR},
TradeState.ERROR: {TradeState.ACTIVE, TradeState.CLOSED},
}
class InvalidTransition(Exception):
pass
def transition(current: TradeState, target: TradeState) -> TradeState:
if target not in ALLOWED.get(current, set()):
raise InvalidTransition(f"{current.value} -> {target.value} is not allowed")
return targetIlustracja Przykład ilustracyjny — uproszczona tabela przejść.
Kod źródłowy produktu jest prywatny. Przykłady pokazują podejście inżynierskie, a nie wewnętrzną logikę. Więcej w Engineering Lab.
10Możliwe kierunki rozwoju
- Dashboardy ryzyka per konto oparte na zapisanej historii zdarzeń.
- Tryb symulacji uruchamiający cały cykl na zapisanych danych.
- Alerty dla operacji, które pozostają w stanie „Błąd” dłużej niż próg.