Files
trade-doc/economic-markers-k3s.md

8.9 KiB

Economic Markers In K3s

Cel

Chcemy dodawac markery ekonomiczne i tradingowe jako osobne komponenty runtime na mevnode_bot, bez mieszania ich z samym orderbookiem i bez bezposredniego odpytywania kazdego markera z frontendu.

Docelowy model:

worker -> Postgres -> Hasura/API -> visualizer

To ma byc warstwa:

  • szybka do rozwijania
  • niezalezna per marker
  • latwa do obserwacji i debugowania
  • bez ryzyka, ze jeden eksperymentalny marker psuje caly runtime

Zasada architektoniczna

Markery liczymy w osobnych kontenerach na k3s, ale nie wystawiamy ich bezposrednio do UI.

Kazdy marker:

  1. czyta dane z juz istniejacego runtime:

    • Hasura
    • Postgres
    • Redis
    • opcjonalnie trade-api
    • opcjonalnie bezposrednio mevnode_sol RPC, jesli marker naprawde tego potrzebuje
  2. liczy wlasny sygnal

  3. zapisuje wynik do Postgresa

  4. Hasura trackuje tabele markerow

  5. visualizer rysuje:

    • overlay na chart
    • osobny panel pod chartem
    • badge / regime / warning nad marketem

Frontend nie powinien znac topologii workerow.

Dlaczego osobne kontenery

To daje kilka korzysci:

  • izolacja awarii
  • latwe rollouty
  • rozne cadence per marker
  • mozliwosc wlaczania / wylaczania markerow niezaleznie
  • prostszy profiling CPU i memory
  • latwiejszy eksperyment workflow

Dobry podzial:

  • fast markers

    • 200-500 ms
    • mikrostruktura
    • imbalance
    • orderbook slope
    • spread regime
  • medium markers

    • 1-5 s
    • funding pressure
    • basis
    • depth depletion
    • oracle divergence
  • slow markers

    • 10-60 s
    • volatility regime
    • realized vol
    • trend regime
    • event calendars

Rekomendowany model danych

Nie robimy osobnej tabeli per kazdy marker.

Na start lepszy jest wspolny model:

1. market_markers_latest

Jedna tabela z najnowsza wartoscia markera.

Przyklad kolumn:

  • source
  • market_name
  • marker_name
  • ts
  • value_num
  • value_text
  • value_bool
  • band
  • confidence
  • severity
  • meta jsonb
  • updated_at

Klucz logiczny:

(source, market_name, marker_name)

To jest warstwa pod:

  • karty market details
  • badge typu risk on, thin book, high dislocation
  • ostatni stan markera

2. market_markers_ts

Historia timeseries dla markerow.

Przyklad kolumn:

  • event_ts
  • id
  • source
  • market_name
  • marker_name
  • value_num
  • value_text
  • value_bool
  • band
  • confidence
  • severity
  • meta jsonb
  • inserted_at

To jest warstwa pod:

  • overlaye na chart
  • osobne panele
  • replay
  • debug
  • porownanie markerow w czasie

3. market_marker_events

Opcjonalna tabela tylko dla zmian stanu i alertow.

Przyklad:

  • event_ts
  • source
  • market_name
  • marker_name
  • event_type
  • prev_value
  • next_value
  • severity
  • meta

To jest pod:

  • timeline alertow
  • debug strategy
  • feed zdarzen na UI

Typy markerow

Najlepiej od razu rozdzielic markery na klasy.

Overlay markers

To sa serie rysowane bezposrednio na wykresie ceny:

  • fair value
  • local VWAP
  • short-term imbalance line
  • oracle divergence bands
  • liquidation zones
  • micro support / resistance

Dane:

  • value_num
  • opcjonalnie band
  • opcjonalnie meta.upper, meta.lower

Panel markers

To sa osobne serie pod wykresem:

  • spread bps
  • imbalance
  • depth asymmetry
  • book velocity
  • trade aggression
  • realized vol

State markers

To sa dyskretne stany:

  • trend_up
  • range
  • high_risk
  • thin_liquidity
  • event_window

Tu zwykle:

  • value_text
  • value_bool
  • severity
  • confidence

Rekomendowane markery na start

Pierwszy pakiet powinien byc maly i praktyczny.

Marker 1. oracle_dislocation_bps

Liczy:

(mark - oracle) / oracle * 10_000

Cel:

  • pokazac odklejenie od oracle
  • ostrzegac, kiedy orderbook/mark zaczyna byc sztucznie przesuniety

Prezentacja:

  • panel pod chartem
  • badge nad marketem po przekroczeniu progow

Marker 2. top12_imbalance

Liczy:

(bid_usd - ask_usd) / (bid_usd + ask_usd)

na poziomach zblizonych do tego, co pokazuje orderbook UI

Cel:

  • prosty sygnal przewagi strony
  • zgodnosc z tym, co trader widzi na ekranie

Prezentacja:

  • panel
  • opcjonalnie mini sparkline obok orderbooka

Marker 3. spread_regime

Liczy stan:

  • tight
  • normal
  • wide

na bazie spread_bps

Cel:

  • szybki filtr, czy rynek nadaje sie do wejscia

Prezentacja:

  • badge w market details

Marker 4. depth_depletion

Liczy:

  • spadek plynnosci top-of-book vs rolling baseline

Cel:

  • wykrywanie, ze ksiazka staje sie pusta zanim ruch przyspieszy

Prezentacja:

  • panel
  • alert event

Marker 5. micro_vol_regime

Liczy:

  • rolling realized volatility na 1s / 5s / 1m

Cel:

  • odroznic spokojny market od marketu o zbyt duzym noise

Prezentacja:

  • panel pod chartem

K3s deployment model

Na start proponuje namespace trade.

Kazdy marker to osobny Deployment, ale z tym samym kontraktem runtime.

Przyklad nazw:

  • marker-oracle-dislocation
  • marker-top12-imbalance
  • marker-spread-regime
  • marker-depth-depletion
  • marker-micro-vol

Kazdy deployment:

  • replicas: 1
  • ConfigMap dla parametrow
  • Secret tylko jesli musi czytac cos wrazliwego
  • write tylko do Postgresa / Hasury

Nie robimy dla nich publicznych Service, jesli nie maja HTTP health/debug endpointu.

Jesli worker ma HTTP:

  • tylko ClusterIP
  • endpointy:
    • /healthz
    • /metrics
    • /debug/state

Read path dla markerow

Na start marker powinien czytac glownie z durable read modelu:

  • dlob_hot_snapshot_latest
  • dlob_hot_derived_latest
  • dlob_hot_derived_ts
  • dlob_all_derived_latest
  • dlob_all_derived_ts
  • dlob_stats_latest
  • dlob_depth_bps_latest
  • dlob_slippage_latest

To daje:

  • prostszy kod
  • mniej zaleznosci
  • zgodnosc z tym, co widzi UI

Bezposredni odczyt z mevnode_sol RPC ma sens tylko wtedy, gdy:

  • marker potrzebuje point read accountow
  • marker potrzebuje szybszego feedu niz Postgres
  • marker ma byc trading-critical, a nie tylko UI/debug

Write path dla markerow

Najbezpieczniejszy model:

  • worker liczy marker
  • worker robi upsert do market_markers_latest
  • worker robi insert do market_markers_ts

Opcjonalnie:

  • worker emituje event do market_marker_events, gdy zmienia sie band albo severity

Hasura

Hasura powinna trackowac:

  • market_markers_latest
  • market_markers_ts
  • market_marker_events

Public read:

  • tylko wybrane kolumny
  • filtr po market_name
  • opcjonalnie filtr po marker_name

To pozwala frontendowi robic:

  • subskrypcje latest
  • query historii per marker
  • timeline eventow

Visualizer

Visualizer powinien miec trzy tryby prezentacji markerow.

1. Overlay na chart

Dla markerow typu line / band:

  • fair value
  • oracle dislocation bands
  • micro support

UI:

  • toggle per marker
  • wspolny selector Indicators / Markers

2. Panele pod chartem

Dla markerow oscylatorowych:

  • imbalance
  • spread bps
  • micro vol

UI:

  • jeden panel moze pokazywac kilka serii
  • albo osobne male panele

3. Market badges

Dla stanow:

  • thin book
  • wide spread
  • high dislocation
  • event risk

UI:

  • nad chartem
  • nad orderbookiem
  • w market details

Co jest trading-critical, a co research-only

Trzeba to rozdzielic od poczatku.

Trading-critical

Markery, ktore moga wejsc do decyzji runtime:

  • dislocation
  • spread regime
  • top book depletion
  • aggressive imbalance

Dla nich:

  • niski latency
  • jasne SLA
  • monitoring
  • alerting

Research-only

Markery, ktore sa glownie dla obserwacji:

  • eksperymentalne composite scores
  • event overlays
  • egzotyczne oscylatory

Dla nich:

  • moga byc liczone wolniej
  • moga siedziec w osobnych workerach
  • nie powinny blokowac runtime

Rekomendowany rollout

Etap 1

Zrobic wspolne tabele:

  • market_markers_latest
  • market_markers_ts

oraz trackowanie w Hasurze.

Etap 2

Uruchomic 2 pierwsze markery:

  • oracle_dislocation_bps
  • top12_imbalance

Etap 3

Dorysowac to w visualizerze:

  • 1 overlay
  • 1 panel
  • 1 badge

Etap 4

Dopiero potem dodawac kolejne markery.

Nie zaczynac od 10 workerow naraz.

Kontrakt implementacyjny workerow

Kazdy worker powinien miec:

  • jeden glowny loop
  • czytelny input set
  • czytelny output set
  • idempotentny write
  • logging per cycle
  • proste metryki Prometheus

Minimum metryk:

  • marker_compute_duration_ms
  • marker_last_success_ts
  • marker_rows_written_total
  • marker_failures_total
  • marker_input_staleness_ms

Moja rekomendacja dla tego projektu

Na teraz najlepszy model to:

  1. osobne workery markerow w k3s
  2. wspolne tabele latest + ts
  3. Hasura jako read layer
  4. visualizer jako warstwa renderu
  5. mevnode_sol RPC tylko dla markerow, ktore naprawde musza wyjsc poza aktualny read model

To jest wystarczajaco porzadne pod trade, a jednoczesnie nadal lekkie i szybkie do rozwijania.

Co warto zrobic jutro

  1. Dodac SQL dla market_markers_latest i market_markers_ts.
  2. Doliczyc pierwszy marker oracle_dislocation_bps.
  3. Doliczyc drugi marker top12_imbalance.
  4. Wystawic obie serie przez Hasure.
  5. Narysowac je w visualizerze jako proof of workflow.