test_run_crash_follow_short_observer.py 1.2 KB

12345678910111213141516171819202122232425262728293031
  1. import math
  2. from okx_codex_trader.models import Candle
  3. from scripts.run_crash_follow_short_observer import frame_from_candles, latest_signal, load_pair_frame
  4. def test_latest_signal_detects_crash_follow_short() -> None:
  5. eth = []
  6. btc = []
  7. for index in range(800):
  8. eth_price = 100.0 + math.sin(index / 9.0)
  9. btc_price = 100.0
  10. if index >= 760:
  11. btc_price = 96.0
  12. if index == 799:
  13. eth_price = 95.0
  14. btc_price = 94.0
  15. ts = 1_700_000_000_000 + (index * 3_600_000)
  16. high = eth_price + (10.0 if index == 799 else 2.0)
  17. low = eth_price - (10.0 if index == 799 else 2.0)
  18. eth.append(Candle("ETH-USDT-SWAP", ts, eth_price, high, low, eth_price, 1_000.0))
  19. btc.append(Candle("BTC-USDT-SWAP", ts, btc_price, btc_price, btc_price, btc_price, 1_000.0))
  20. eth_frame = frame_from_candles(eth)
  21. btc_frame = frame_from_candles(btc)[["ts", "close"]].rename(columns={"close": "btc_close"})
  22. frame = eth_frame.merge(btc_frame, on="ts", how="inner").sort_values("ts").reset_index(drop=True)
  23. signal = latest_signal(frame)
  24. assert signal["signal"] == "entry_short"
  25. assert signal["target_side"] == "short"
  26. assert signal["indicators"]["btc_riskoff_gate"] is True