"""策略通用技术指标工具测试。""" import pytest from strategy.indicators import calculate_ema, calculate_kdj, calculate_ma, calculate_macd def test_6_1_calculate_ma() -> None: """ 功能说明:验证简单移动平均线会在样本不足时返回 None。 参数说明:无。 返回值说明:无返回值。 注意事项:用例编号 6-1。 """ assert calculate_ma([1, 2, 3, 4], 3) == [None, None, 2.0, 3.0] def test_6_2_calculate_ema() -> None: """ 功能说明:验证指数移动平均线按首个值初始化并递推。 参数说明:无。 返回值说明:无返回值。 注意事项:用例编号 6-2。 """ assert calculate_ema([1, 2, 3], 2) == pytest.approx([1.0, 1.6666666667, 2.5555555556]) def test_6_3_calculate_macd() -> None: """ 功能说明:验证 MACD 返回 DIF、DEA 和柱值三个等长序列。 参数说明:无。 返回值说明:无返回值。 注意事项:用例编号 6-3。 """ dif, dea, macd = calculate_macd([1, 2, 3, 4], fast_period=2, slow_period=3, signal_period=2) assert len(dif) == 4 assert len(dea) == 4 assert len(macd) == 4 assert dif == pytest.approx([0.0, 0.1666666667, 0.3055555556, 0.3935185185]) assert dea == pytest.approx([0.0, 0.1111111111, 0.2407407407, 0.3425925926]) assert macd == pytest.approx([0.0, 0.1111111111, 0.1296296296, 0.1018518519]) def test_6_4_calculate_kdj() -> None: """ 功能说明:验证 KDJ 在样本足够后计算 K、D、J 值。 参数说明:无。 返回值说明:无返回值。 注意事项:用例编号 6-4。 """ k_values, d_values, j_values = calculate_kdj([3, 4, 5], [1, 1, 1], [2, 3, 4], period=3) assert k_values[:2] == [None, None] assert d_values[:2] == [None, None] assert j_values[:2] == [None, None] assert k_values[2] == pytest.approx(58.3333333333) assert d_values[2] == pytest.approx(52.7777777778) assert j_values[2] == pytest.approx(69.4444444444) def test_6_5_indicator_period_validation() -> None: """ 功能说明:验证通用指标工具会拒绝非法周期参数。 参数说明:无。 返回值说明:无返回值。 注意事项:用例编号 6-5。 """ with pytest.raises(ValueError): calculate_ma([1], 0)