from __future__ import annotations import pandas as pd from web_core.analytics import simulate_trend_trades from web_core.constants import TREND_BEAR, TREND_BULL, TREND_NEUTRAL def test_simulate_trend_trades_returns_empty_when_insufficient_rows() -> None: idx = pd.date_range("2025-01-01", periods=3, freq="D") df = pd.DataFrame( { "Close": [100.0, 101.0, 102.0], "trend_state": [TREND_NEUTRAL, TREND_BULL, TREND_BULL], }, index=idx, ) out = simulate_trend_trades(df) assert out.empty def test_simulate_trend_trades_closes_trade_on_opposite_signal() -> None: idx = pd.date_range("2025-01-01", periods=7, freq="D") df = pd.DataFrame( { "Close": [95.0, 98.0, 100.0, 102.0, 104.0, 110.0, 108.0], "trend_state": [ TREND_NEUTRAL, TREND_NEUTRAL, TREND_BULL, TREND_BULL, TREND_BULL, TREND_BEAR, TREND_BEAR, ], }, index=idx, ) out = simulate_trend_trades(df) assert len(out) == 1 trade = out.iloc[0] assert trade["direction"] == "LONG" assert trade["entry_timestamp"] == idx[2] assert trade["exit_timestamp"] == idx[5] assert trade["bars_held"] == 3 assert trade["pnl_pct"] == 10.0 assert trade["outcome"] == "Win" def test_simulate_trend_trades_handles_multiple_flips_and_max_examples() -> None: idx = pd.date_range("2025-01-01", periods=7, freq="D") df = pd.DataFrame( { "Close": [90.0, 100.0, 103.0, 95.0, 92.0, 80.0, 82.0], "trend_state": [ TREND_NEUTRAL, TREND_BULL, TREND_BULL, TREND_BEAR, TREND_BEAR, TREND_BULL, TREND_BULL, ], }, index=idx, ) out = simulate_trend_trades(df, max_examples=1) assert len(out) == 1 trade = out.iloc[0] assert trade["direction"] == "SHORT" assert trade["entry_timestamp"] == idx[3] assert trade["exit_timestamp"] == idx[5] assert trade["bars_held"] == 2 assert trade["pnl_pct"] == 15.79 assert trade["outcome"] == "Win"