## 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** 避免因数据不足导致的错误信号
