Faza 2 — KlinesProvider

2026-05-20 infra

Cache-first čitanje klines-a u svim generatorima, sa Binance fallback-om. 5/5 determinizam test, 148x ubrzanje na kratkim upitima.

↑ Svi izveštaji ← Deploy per-generator slot_config Faza 3 — dnevni catchup i symbol churn →

Status: deploy gotov, validacija prošla

KlinesProvider je sad default put za kline reads u svim generatorima preko _build_context.get_klines. Cache-first sa Binance fallback-om za rupe.

Šta je deploy-ovano

1. src/klines_provider.py (novi modul, ~250 lines)

API:

provider = KlinesProvider(analyzer, db_path='database/klines_cache.db')
df = provider.get(symbol, interval, start_dt, end_dt)

Karakteristike:

2. src/generator_manager.py izmene

# __init__:
self.klines_provider: KlinesProvider | None = None
if os.environ.get('CRYPTO_KLINES_PROVIDER_DISABLE') != '1':
    self.klines_provider = KlinesProvider(self.analyzer)

# _build_context.get_klines:
def get_klines(symbol, tf, start_dt, end_dt):
    provider = self.klines_provider
    if provider is not None:
        df = provider.get(symbol, tf, start_dt, end_dt)
        if df is not None and not df.empty:
            return df
    return self._get_klines_range(symbol, tf, start_dt, end_dt)

Sigurnosni mehanizmi:

3. tools/history_cache/build_klines_cache.py fix

4. tools/history_cache/clean_stale_open_candles.py (one-shot cleanup)

Posle bulk fetch-a, otkriveno je 150 stale rows (svi koji su bili open-at-fetch):

Sve obrisano. Provider će ih ponovo povući iz Binance-a kad budu zatraženi.

Validacija

Test 1: Klines equivalence (tools/analysis/faza2_klines_equivalence.py)

Poredi KlinesProvider.get() vs _get_klines_range() (originalni Binance put) za 5 slučajeva:

SymbolTFDaysRowsResult
BTCUSDT4h60360OK identical
ETHUSDT1h7168OK identical
SOLUSDT15m3288OK identical
BTCUSDT1d365365OK identical
AAVEUSDT4h30180OK identical

5/5 PASS. Numerička greška < 1e-6 na svim OHLCV+volume kolonama.

Important: test koristi boundary - 1s da isključi tekući (još otvoren) candle. Otkrio je da open-at-fetch candles bili problematični → fix iznad.

Test 2: End-to-end performance benchmark (tools/analysis/faza2_benchmark.py)

SymbolTFDaysRowsProviderBinanceSpeedup
BTCUSDT4h301809.7ms1451ms148x
BTCUSDT4h36521901603ms1333ms0.8x
SOLUSDT1h30720413ms616ms1.5x
AAVEUSDT15m7672673ms605ms0.9x

Sve match-ovi rows (OK marker). Performance:

Operativni značaj

Za backtest scenarije (5y backfill)

Za live scenarije

Robustnost

Šta NIJE deploy-ovano (Faza 3, 4)

Pre-flight checks (sva tri ✅)

Provenance

Izvor: crypto_scanner/reports/analysis/2026-05-20_faza2_klines_provider.md