Files
Ai/trade_web/test_trading_engine.py
2026-05-24 09:33:20 +02:00

68 lines
2.5 KiB
Python

import math
from trading_engine import TradingAnalyzer, correlation, ema, macd, performance, returns, rsi, sma
def test_indicator_basics():
assert sma([1, 2, 3, 4, 5], 3) == 4
assert ema([5] * 20, 10) == 5
assert rsi(list(range(1, 40))) == 100
assert rsi(list(range(40, 1, -1))) == 0
assert rsi([100] * 40) == 50
macd_data = macd(list(range(1, 80)))
assert set(macd_data) == {"macd", "signal", "hist"}
assert macd_data["macd"] is not None
def test_math_helpers():
assert returns([100, 110, 99]) == [0.10000000000000009, -0.09999999999999998]
assert correlation([1, 2, 3], [1, 2, 3]) == 1
assert math.isclose(performance([100, 120]), 20)
def test_signal_risk_reward_matches_output():
analyzer = TradingAnalyzer()
config = {
"symbol": "BTCUSDT",
"timeframes": ["15m", "30m", "4h", "1d"],
"benchmark_assets": ["ETHUSDT"],
"signal_mode": "balanced",
}
result = analyzer.analyze(config, use_demo_data=True)
signal = result["signal"]
expected = 0
if signal["side"] == "SELL" and signal["stop_loss"] > signal["entry_price"] > signal["target"]:
expected = (signal["entry_price"] - signal["target"]) / (signal["stop_loss"] - signal["entry_price"])
elif signal["entry_price"] > signal["stop_loss"]:
expected = (signal["target"] - signal["entry_price"]) / (signal["entry_price"] - signal["stop_loss"])
assert math.isclose(signal["risk_reward"], expected)
def test_bearish_setup_becomes_short_signal():
analyzer = TradingAnalyzer()
params = analyzer._signal_params()
frames = {}
for timeframe in ["15m", "30m", "4h", "1d"]:
frames[timeframe] = {
"price": 76676.41,
"indicators": {
"close": 76676.41,
"support": 74289.6,
"resistance": 78200,
"rsi": 45,
"macd": {"hist": -10},
},
"statuses": {
"RSI": {"status": "red"},
"MACD": {"status": "red"},
"MA_Setup": {"status": "red"},
"Volumen": {"status": "orange"},
"Trend": {"status": "red"},
"Support/Resist": {"status": "red"},
},
}
signal = analyzer._signal(frames, {"pattern_detected": False}, {"score": 0, "label": "neutral"}, "lux_style", params)
assert signal["signal_type"] == "STRONG_SELL"
assert signal["side"] == "SELL"
assert math.isclose(signal["risk_reward"], 1.5664, rel_tol=0.01)