81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
|
|
from option_mcp_common.indicators import adx, atr, macd, rsi, sma
|
|
|
|
|
|
def test_rsi_simple():
|
|
closes = [44, 44.34, 44.09, 44.15, 43.61, 44.33, 44.83, 45.10, 45.42, 45.84,
|
|
46.08, 45.89, 46.03, 45.61, 46.28]
|
|
r = rsi(closes, period=14)
|
|
assert r is not None
|
|
# Known textbook RSI value ballpark
|
|
assert 65.0 < r < 75.0
|
|
|
|
|
|
def test_rsi_insufficient_data():
|
|
assert rsi([1, 2, 3], period=14) is None
|
|
|
|
|
|
def test_sma_simple():
|
|
assert sma([1, 2, 3, 4, 5], period=5) == 3.0
|
|
assert sma([1, 2, 3], period=5) is None
|
|
|
|
|
|
def test_atr_simple():
|
|
# highs, lows, closes
|
|
highs = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
|
|
lows = [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
|
|
closes = [9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5,17.5,18.5,19.5,20.5,21.5,22.5,23.5]
|
|
a = atr(highs, lows, closes, period=14)
|
|
assert a is not None
|
|
assert 0.9 < a <= 1.5
|
|
|
|
|
|
def test_macd_trend_up():
|
|
# monotonic uptrend → MACD > 0, histogram > 0
|
|
closes = [float(i) for i in range(1, 60)]
|
|
m = macd(closes)
|
|
assert m["macd"] is not None
|
|
assert m["signal"] is not None
|
|
assert m["hist"] is not None
|
|
assert m["macd"] > 0
|
|
assert m["hist"] >= 0
|
|
|
|
|
|
def test_macd_insufficient_data():
|
|
m = macd([1.0, 2.0, 3.0])
|
|
assert m == {"macd": None, "signal": None, "hist": None}
|
|
|
|
|
|
def test_macd_trend_down():
|
|
closes = [float(i) for i in range(60, 1, -1)]
|
|
m = macd(closes)
|
|
assert m["macd"] < 0
|
|
assert m["hist"] <= 0
|
|
|
|
|
|
def test_adx_insufficient_data():
|
|
a = adx([1.0] * 10, [0.5] * 10, [0.7] * 10, period=14)
|
|
assert a == {"adx": None, "+di": None, "-di": None}
|
|
|
|
|
|
def test_adx_strong_uptrend():
|
|
highs = [float(i) + 1.0 for i in range(1, 40)]
|
|
lows = [float(i) for i in range(1, 40)]
|
|
closes = [float(i) + 0.5 for i in range(1, 40)]
|
|
a = adx(highs, lows, closes, period=14)
|
|
assert a["adx"] is not None
|
|
assert a["+di"] is not None and a["-di"] is not None
|
|
# strong uptrend → +DI >> -DI, ADX high
|
|
assert a["+di"] > a["-di"]
|
|
assert a["adx"] > 50.0
|
|
|
|
|
|
def test_adx_flat_market():
|
|
highs = [10.0] * 40
|
|
lows = [9.0] * 40
|
|
closes = [9.5] * 40
|
|
a = adx(highs, lows, closes, period=14)
|
|
# no directional movement → ADX near 0
|
|
assert a["adx"] is not None
|
|
assert a["adx"] < 5.0
|