## ADDED Requirements ### Requirement: MACD趋势跟踪策略 系统应提供基于MACD指标的趋势跟踪交易策略,包括MACD计算、EMA200趋势过滤、以及基于金叉/死叉的交易信号生成。 #### Scenario: 策略文件加载 - **WHEN** 用户在命令行指定`--strategy-file strategies/macd_strategy.py` - **THEN** backtest.py成功加载策略文件并执行回测 - **AND** 策略类正确注册所有技术指标到backtesting框架 - **AND** 策略逻辑根据MACD金叉/死叉和EMA200位置生成交易信号 #### Scenario: MACD指标计算 - **WHEN** 调用`calculate_indicators(data)`函数,传入包含[Open, High, Low, Close, Volume, factor]的DataFrame - **THEN** 函数使用ta-lib计算以下指标并添加到DataFrame: - MACD线(DIF): 10日EMA - 20日EMA - MACD信号线(DEA): 9日EMA的MACD - MACD柱状图(Histogram): MACD线 - 信号线 - EMA200: 200日指数移动平均线 - **AND** 返回包含原始数据和所有新增指标的DataFrame - **AND** 指标名称使用ta-lib返回的默认列名(macd、macdsignal、macdhist) #### Scenario: 策略初始化 - **WHEN** backtesting框架初始化MacdTrendStrategy策略类 - **THEN** 调用`init()`方法 - **AND** 在`init()`中通过`self.I()`注册以下指标到backtesting框架: - MACD线(`self.data.MACD_10_20_9`) - MACD信号线(`self.data.MACDs_10_20_9`) - EMA200(`self.data.EMA_200`) - **AND** 所有参数(fast_period=10、slow_period=20、signal_period=9)在策略类中定义为类变量 - **AND** 注册的指标可直接在`next()`方法中访问 #### Scenario: MACD金叉买入信号 - **WHEN** 策略检测到MACD线上穿信号线(金叉) - **AND** 当前价格高于EMA200趋势线(确认上升趋势) - **AND** 当前无持仓或持仓方向与买入信号相反 - **THEN** 策略平掉现有仓位(如有) - **AND** 策略开多仓(`self.buy()`) - **AND** 在趋势市场下捕捉上涨机会 #### Scenario: EMA200跌破卖出信号 - **WHEN** 策略检测到当前价格跌破EMA200趋势线 - **AND** 当前持有多仓 - **THEN** 策略平掉多仓(`self.position.close()`) - **AND** 不开空仓(仅平仓,避免逆势交易) - **AND** 在趋势转向时及时止损保护利润 #### Scenario: MACD死叉卖出信号 - **WHEN** 策略检测到MACD线下穿信号线(死叉) - **AND** 当前持有多仓 - **THEN** 策略平掉多仓(`self.position.close()`) - **AND** 不开空仓 - **AND** 在动量减弱时退出持仓 #### Scenario: EMA200下方不开仓 - **WHEN** 当前价格低于EMA200趋势线 - **AND** 检测到MACD金叉信号 - **THEN** 策略不执行买入操作 - **AND** 避免在下跌趋势中逆势交易 - **AND** 等待价格回到EMA200上方再考虑入场 #### Scenario: 空仓状态处理 - **WHEN** 策略当前无持仓 - **AND** 检测到卖出信号(MACD死叉或EMA200跌破) - **THEN** 策略跳过卖出信号 - **AND** 避免重复平仓导致错误 #### Scenario: 震荡市场过滤 - **WHEN** 市场处于震荡状态(价格围绕EMA200波动) - **AND** MACD产生频繁的假金叉/死叉信号 - **THEN** EMA200趋势过滤减少交易频率 - **AND** 避免在无明确趋势时频繁交易 - **AND** 等待趋势明确后再入场 #### Scenario: 趋势市场顺势交易 - **WHEN** 市场处于明确上升趋势(价格持续在EMA200上方) - **AND** MACD金叉确认动量增强 - **THEN** 策略及时入场捕捉上涨机会 - **AND** 顺势交易提高胜率 - **AND** EMA200确保不在下跌趋势中买入 #### Scenario: 参数配置 - **WHEN** 用户查看策略代码 - **THEN** 策略参数清晰定义为类变量: - `fast_period = 10`(MACD快线周期) - `slow_period = 20`(MACD慢线周期) - `signal_period = 9`(MACD信号线周期) - **AND** 参数无需通过命令行传递 - **AND** 参数可直接在代码中修改以适配不同市场环境 #### Scenario: 依赖管理 - **WHEN** 安装项目依赖 - **THEN** ta-lib库已被正确安装(手动安装) - **AND** `uv run python -c "import talib"`成功执行 - **AND** 策略文件可正常运行 - **AND** 如ta-lib未安装,给出明确错误提示 #### Scenario: 回测兼容性 - **WHEN** 使用现有backtest.py框架 - **THEN** 框架通过`load_strategy()`函数成功加载macd_strategy.py - **AND** 调用`calculate_indicators()`预处理数据 - **AND** 初始化策略类并执行回测 - **AND** 回测流程与SMA策略完全一致 #### Scenario: 指标数据完整性 - **WHEN** backtesting调用`calculate_indicators(data)` - **THEN** 返回的DataFrame包含所有必需列: - 原始列:[Open, High, Low, Close, Volume, factor] - MACD指标列:[MACD_10_20_9, MACDh_10_20_9, MACDs_10_20_9] - EMA趋势线列:[EMA_200] - **AND** 无NaN值(除预热期外) - **AND** 指标数据可用于策略决策和图表展示 #### Scenario: 预热期处理 - **WHEN** 数据长度不足以计算完整指标(前200天) - **THEN** 指标值为NaN - **AND** backtesting框架会自动跳过预热期 - **AND** 策略逻辑在有足够数据后才执行 - **AND** 避免因数据不足导致的错误信号