import os import numpy as np import pandas as pd import pytest os.environ.setdefault("KTRADE_DATABASE_URL", "postgresql://ktrade:ktrade@127.0.0.1:5432/ktrade_test") os.environ.setdefault("KTRADE_REDIS_URL", "redis://127.0.0.1:6379/15") os.environ.setdefault("KTRADE_SECRET_KEY", "test-secret") os.environ.setdefault("KTRADE_LOG_JSON", "false") def synthetic_candles(n: int = 2000, seed: int = 1, interval_min: int = 60, start_ts: int = 1_700_000_000, drift: float = 0.0002, vol: float = 0.01) -> pd.DataFrame: rng = np.random.default_rng(seed) r = rng.normal(drift, vol, n) close = 30000 * np.exp(np.cumsum(r)) open_ = np.concatenate([[close[0]], close[:-1]]) * (1 + rng.normal(0, 0.0005, n)) high = np.maximum(open_, close) * (1 + np.abs(rng.normal(0, 0.002, n))) low = np.minimum(open_, close) * (1 - np.abs(rng.normal(0, 0.002, n))) vol_ = np.abs(rng.normal(50, 10, n)) df = pd.DataFrame({"ts": start_ts + np.arange(n) * interval_min * 60, "open": open_, "high": high, "low": low, "close": close, "vwap": (high + low + close) / 3, "volume": vol_, "count": rng.integers(10, 500, n)}) df.attrs["interval_min"] = interval_min return df @pytest.fixture def candles() -> pd.DataFrame: return synthetic_candles()