5.3 KiB
Strategia bota: “Reversal (sekundy → minuty)” — metryki i parametry
Cel: podejmować decyzje w sekundach, wejść w pozycję na minuty tylko gdy mikrostruktura (orderbook) sprzyja, a następnie zarządzać pozycją w prosty i kontrolowalny sposób.
Ten dokument jest propozycją “MVP strategii” i listą parametrów, nad którymi będziemy iterować.
Dane wejściowe (features) — co już mamy
Trend/impuls (krótki horyzont)
Źródło: ticki/candles z drift_ticks (np. przez
get_drift_candles(...)).
Przykładowe serie:
px_1s/px_5s: zamknięcia z krótkich świec,mom_3s,mom_10s,mom_30s: momentum/ROC,vol_30s: zmienność krótkoterminowa.
Mikrostruktura (koszt wejścia i “czy da się wejść”)
Źródło: DLOB workery → Hasura/DB:
dlob_stats_latest:mid_price,spread_bps,depth_bid_usd,depth_ask_usd,imbalancedlob_depth_bps_latest:bid_usd/ask_usdw pasmach ±bps (np. 10/20/50)dlob_slippage_latest:impact_bpsdla progówsize_usd(np. 100/500/1000/…)
Ważne: “liquidity” i “kasa” (USD notional) liczymy z L2 jako sumy
size_base * price (opis w
doc/dlob-basics.md).
Architektura decyzji (loop)
Strategia jest podzielona na 2 pętle:
- Detektor warunków (sekundy):
- wykrywa potencjalny reversal,
- sprawdza bramki mikrostruktury (gates),
- ustala “desired exposure” (np. +K USD, -K USD, albo 0).
- Zarządzanie pozycją (minuty):
- utrzymuje pozycję do warunku wyjścia (czas/SL/TP/degradacja warunków),
- dba o order management (limit/chase) i idempotencję.
Bramki wejścia (gates) — żeby nie wchodzić w złych warunkach
Wejście w trade jest dozwolone tylko jeśli wszystkie gates są spełnione:
1) Freshness gate (dane muszą być świeże)
now - dlob_stats_latest.updated_at < freshness_max_ms- analogicznie dla depth/slippage, jeśli ich używasz w danym sygnale.
2) Spread gate
dlob_stats_latest.spread_bps <= spread_max_bps
3) Slippage gate (dla planowanego rozmiaru)
dlob_slippage_latest.impact_bps(size_usd=entry_notional_usd, side=buy|sell) <= slippage_max_bps
4) Liquidity gate
Wariant A (top‑N):
min(depth_bid_usd, depth_ask_usd) >= depth_topn_min_usd
Wariant B (band bps):
min(bid_usd(band_bps=X), ask_usd(band_bps=X)) >= depth_band_min_usd
W praktyce często warto użyć obu: top‑N + band (bo mierzą różne rzeczy).
Trigger reversal (sekundy) — szkic logiki
To jest intencjonalnie prosty szkic, który można zastąpić modelem ML później.
Przykład (entry LONG):
mom_30s < 0(krótkoterminowo spadkowo),mom_3s > 0(zaczyna się odbicie),- opcjonalnie:
imbalancerośnie (przechyla się na bid) albo spread się zawęża, - gates spełnione.
Przykład (entry SHORT) analogicznie:
mom_30s > 0,mom_3s < 0, itd.
Wystawienie i “modyfikacja” wejścia (order policy)
Zalecenie MVP: limit/post-only + chase
Zamiast market (który “nie jest modyfikowalny”), utrzymujemy order przy top‑of‑book:
- Place entry limit:
- buy: blisko
best_bid(np.best_bid + tick) - sell: blisko
best_ask(np.best_ask - tick)
- buy: blisko
- Jeśli order nie fill i cena “ucieka”:
- cancel + place nowy (reprice),
- ale z ograniczeniami:
cooldown_ms,max_orders_per_min,reprice_bps.
Market order może być fallback tylko przy urgency=true i
nadal spełnionych gates (zwłaszcza slippage).
Zarządzanie pozycją (minuty) — proste reguły
Minimalne wyjścia (wystarczy na start):
- max hold time:
hold_max_s(po czasie wychodzimy zawsze), - stop loss:
stop_bpsod ceny wejścia, - take profit:
take_bpsod ceny wejścia, - degradacja warunków: wyjście, gdy np.
spread_bpslubimpact_bpsprzekracza limit przez X sekund.
Parametry bota (do
bot_config) — propozycja
Parametry są zgrupowane tak, żeby łatwo je stroić.
A) Sizing i częstotliwość
entry_notional_usd: ile USD “na wejście”min_trade_usd: próg “ignoruj małe delty”decision_interval_ms: jak często liczysz sygnał (np. 250–1000ms)hold_max_s: maks. czas trzymania pozycji
B) Gates mikrostruktury
freshness_max_msspread_max_bpsslippage_max_bpsdepth_topn_min_usddepth_band_bps(np. 10 lub 20)depth_band_min_usd
C) Reversal trigger
mom_fast_s(np. 3s)mom_slow_s(np. 30s)mom_entry_threshold(jak mocny sygnał)imbalance_entry_threshold(opcjonalnie)
D) Order policy (limit/chase)
order_policy:limit_post_only | limit | marketreprice_bpsreprice_after_mscooldown_msmax_orders_per_min
E) Risk/exit
stop_bpstake_bpsexit_on_bad_spread_bps+exit_on_bad_spread_sexit_on_bad_slippage_bps+exit_on_bad_slippage_s
Metryki bota (do
logowania w bot_events)
Żeby stroić strategię, logujemy na każdy “decision tick”:
features: snapshot (albo hash + wybrane wartości: spread, slippage, depth, imbalance, mom)gates: które przeszły/nie przeszły + wartościdecision:target_exposure_usd,side,confidence,urgencyactions: place/cancel/close (z parametrami)outcome: fill, avg price, realized PnL (jeśli mamy), czas w pozycji
To pozwala później robić offline analizy: “dlaczego wchodził”, “gdzie przegrywa”, “jak dobrać progi”.