# 突破交易策略

## 基础概念
- 平台：MQL5
- 品种：XAU黄金
- 1美金：4100与4101之间相差1美金
- 1美金 = 100点

## 辅助指标
- 移动平均线（Moving Average）
- 周期默认设置为：14

## 核心概念
- 突破K线：开盘价在均线下方，收盘价在均线上方，称之为多单突破K线，反之亦然
- 极值点：相邻两根突破K线之间所有K线(包括突破K线)中的最高价或最低价称之为极值点
- 有效波段：相邻两个极值点的价差达到波段阈值点数时，期间的所有K线(包含突破K线本身)组成的行情，称之为有效波段

## 开仓逻辑
- 价格突破有效波段的高点开多单，价格突破有效波点的低点开空单
- 该开仓逻辑仅适用最新的一个有效波段
- 止损和止盈基于开仓价的百分比计算，止盈 = 止损金额 × 盈亏比
- 浮盈达到止损金额后，即可将止损移动至成本价
- 已经开仓后，继续监控新的有效波段突破，每单开仓后就与有效波段无关了

## 参数设置

### 波段识别参数
- K线周期：支持参数设置，不跟随图表，默认 **1 Minute**
- MA周期：默认 **14**
- **最小波段阈值百分比：默认 0.1%**（波段必须 >= 此值才可能是有效波段）
- **最大波段阈值百分比：默认 1.0%**（波段必须 <= 此值才可能是有效波段）
- **有效波段范围：0.1% - 1.0%**（只交易此范围内的波段）
- **反向突破容忍度：默认0.0%（新功能 - 详见下方说明）**

### 风险管理参数
- 止损百分比：默认 **0.05%**（基于开仓价计算，最小1美元/100点）
- 盈亏比：默认 **1.5**（止盈 = 止损金额 × 盈亏比）
- 使用移动止损：默认 **false**（禁用移动止损功能）
- 最大持仓时间：默认 **5分钟**

### 仓位管理参数
- 使用复利模式：默认 **true**（启用复利模式）
- 固定手数：默认 **0.01手**
- 每500$开仓手数：默认 **0.05手**（复利模式有效）
- 最大开仓手数：默认 **99手**
- 单方向最多持有一单：默认 **true**（每个方向最多持有1单）

### 连续亏损保护参数
- 连续亏损次数触发冷冻：默认 **3**（设为0可禁用该功能）
- 冷冻K线根数：默认 **60**（设为0可禁用该功能）

### 手工单管理参数
- 禁止手工单：默认 **true**（自动平掉所有手工单）

## 补充说明

### 突破K线处理
- 如果出现多个多单突破K线，仅保留最低价更低的那个K线，反之亦然
- 多头有效波段之间，仅允许出现一个多单突破K线和一个空单突破K线，反之亦然

### 有效波段规则
- 一个有效波段只能开一单（无论是高点还是低点）
- 开仓后该波段立即失效
- 必须等新的有效波段形成才能再次开仓

### 单方向持仓限制
此参数用于控制同一方向的持仓数量，避免单边风险过大。

**参数说明：**
- **false（默认）**：允许同方向开多单，仅受"最大开仓手数"限制
  - 例如：最大开仓手数=3时，可以同时持有3个多单，或3个空单，或2多1空等
- **true**：每个方向最多持有1单
  - 多单方向：最多持有1个多单
  - 空单方向：最多持有1个空单
  - 最多同时持有1多+1空=2单

**使用场景：**
- **保守型交易者**：建议设置为 **true**
  - 严格控制风险敞口
  - 避免单边持仓过重
  - 适合波动较大的行情

- **激进型交易者**：可设置为 **false**
  - 允许同方向加仓
  - 在强趋势行情中获取更多盈利
  - 但需要配合"最大开仓手数"参数控制总风险

**示例：**
```
设置：单方向最多持有一单 = true

场景1：当前持有1个多单
- 新的多单信号出现 → ❌ 被忽略（已有多单）
- 新的空单信号出现 → ✅ 可以开仓（空单方向无持仓）

场景2：当前持有1个多单 + 1个空单
- 新的多单信号出现 → ❌ 被忽略（已有多单）
- 新的空单信号出现 → ❌ 被忽略（已有空单）
```

### 连续亏损保护功能 ⭐

此功能用于在连续亏损后自动暂停交易，避免在不利行情中持续亏损。

**核心机制：**
- 实时监控每笔交易的盈亏结果（通过 `OnTradeTransaction` 事件）
- 当连续亏损达到设定次数时，自动进入"冷冻期"
- 冷冻期内禁止开新仓，直到指定数量的K线走完
- 冷冻期结束后自动解除，连续亏损计数器重置为0

**参数说明：**

1. **连续亏损次数触发冷冻**：默认 `3`
   - 设置为 `0`：功能完全禁用
   - 设置为 `3`：连续亏损3笔后触发冷冻（推荐值）
   - 任何盈利单都会将计数器归零

2. **冷冻K线根数**：默认 `60`
   - 设置为 `0`：功能完全禁用
   - 设置为 `60`：冷冻期间禁止开仓，直到60根K线走完（M1周期约1小时）
   - K线周期取决于"K线周期"参数设置

**工作流程：**

```
步骤1：监控交易结果
- 订单平仓后，检测盈亏（包含手续费和隔夜利息）
- 亏损 → 连续亏损计数器 +1
- 盈利 → 连续亏损计数器归零

步骤2：触发冷冻条件
- 当连续亏损计数器 >= 设定次数时
- 记录当前K线数量
- 计算冷冻结束K线数 = 当前K线数 + 冷冻K线根数
- 打印冷冻提示信息

步骤3：冷冻期检查
- 每次开仓前检查是否处于冷冻期
- 如果当前K线数 < 冷冻结束K线数 → 拒绝开仓
- 如果当前K线数 >= 冷冻结束K线数 → 解除冷冻，重置计数器

步骤4：冷冻解除
- 自动打印解除提示
- 连续亏损计数器重置为0
- 恢复正常交易
```

**使用场景：**

1. **震荡行情保护**（默认配置）
   - 设置：连续亏损3次 + 冷冻60根K线
   - 效果：在频繁假突破的震荡行情中，连续亏损3次后暂停1小时（M1周期）
   - 避免在不利行情中持续开仓亏损

2. **回测优化**
   - 通过历史数据测试不同参数组合
   - 找到最佳的连续亏损阈值和冷冻时长
   - 提高策略整体盈利能力

3. **风险控制**
   - 配合"最大开仓手数"和"单方向持仓限制"
   - 多层次控制交易风险
   - 保守型交易者建议启用

**示例：**

```
参数设置：
- 连续亏损次数触发冷冻 = 3
- 冷冻K线根数 = 10
- K线周期 = M1

交易流程：
时间 09:00 → 开仓多单 → 止损平仓（亏损）→ 连续亏损计数 = 1
时间 09:05 → 开仓空单 → 止损平仓（亏损）→ 连续亏损计数 = 2
时间 09:10 → 开仓多单 → 止损平仓（亏损）→ 连续亏损计数 = 3

触发冷冻！
- 当前K线数：150
- 冷冻至K线数：160（150 + 10）
- 打印：=== 触发交易冷冻 ===

冷冻期内（09:10 - 09:20）：
- 所有开仓信号被忽略
- 调试模式下打印：交易冷冻中 - 剩余K线数: X

时间 09:20（K线数达到160）：
- 自动解除冷冻
- 打印：=== 交易冷冻解除 ===
- 连续亏损计数器重置为0
- 恢复正常交易
```

**注意事项：**

1. **功能启用条件**
   - 两个参数都必须 > 0 才会启用
   - 任一参数为 0，功能完全禁用

2. **计数逻辑**
   - 仅统计"净亏损"（盈亏 + 手续费 + 隔夜利息）
   - 盈亏持平（净盈利约等于0）不会重置计数器
   - 任何盈利单（净盈利 > 0）立即重置计数器

3. **冷冻期计算**
   - 基于K线根数，不是绝对时间
   - 周末或节假日市场休市时，K线不增加，冷冻期相应延长
   - 建议根据具体交易品种和周期调整参数

4. **与其他功能的关系**
   - 冷冻期内不影响已有持仓的管理（止损、止盈、移动止损仍正常工作）
   - 仅阻止新开仓，不会强制平仓现有持仓
   - 可配合"单方向持仓限制"等功能使用

### 禁止手工单功能说明 ⭐

**问题背景：**
在EA自动交易过程中，手工开单可能会干扰EA的整体策略逻辑和风险管理，导致：
- 破坏EA的仓位管理计划
- 影响资金管理和风险控制
- 与EA策略产生冲突

**功能说明：**
- 启用后，EA会自动检测并平掉所有手工单（magic number = 0的订单）
- 仅处理当前品种（_Symbol）的手工单
- 平仓后会在日志中打印详细信息

**识别原理：**
在MQL5中，订单都有一个magic number（魔术号）属性：
- **手工单**：magic number = 0（默认值）
- **EA开单**：magic number = EA设定的值（本策略默认20260516）

**参数说明：**
- **true（默认）**：启用保护，自动平掉手工单
  - 每个Tick检查一次
  - 发现手工单立即平仓
  - 打印平仓日志：`【禁止手工单】已平掉手工单 - Ticket:xxx 类型:多单/空单`

- **false**：允许手工单与EA单共存
  - 手工单和EA单可以同时存在
  - 手工单不会被EA管理（不会移动止损等）
  - 适合需要手工干预的场景

**使用场景：**

1. **完全自动化交易**（推荐设置：true）
   - 避免误操作影响EA策略
   - 确保严格执行EA逻辑
   - 防止情绪化交易

2. **半自动化交易**（设置：false）
   - 允许手工单和EA单并存
   - 可以手工补仓或对冲
   - 需要手动管理手工单的风险

**示例：**

```
参数设置：禁止手工单 = true

情况1：用户在MT5手动开了1个多单
- EA在下一个Tick检测到该订单的magic=0
- 自动平掉该订单
- 打印：【禁止手工单】已平掉手工单 - Ticket:12345 类型:多单

情况2：EA自动开了1个多单（magic=20260516）
- EA检测到magic != 0，确认是EA自己开的单
- 不会平仓，正常管理（移动止损等）

情况3：其他EA开的单（magic=99999）
- EA检测到magic != 0，确认不是手工单
- 不会平仓，但也不会管理
```

**注意事项：**

1. **仅处理当前品种**
   - 只平掉当前EA运行品种的手工单
   - 不会影响其他品种的手工单

2. **实时检测**
   - 每个Tick都会检查
   - 手工单会在极短时间内被平掉

3. **与其他功能的关系**
   - 不影响EA自身的开仓逻辑
   - 不影响EA的风险管理功能
   - 可配合所有其他参数使用

4. **平仓失败处理**
   - 如果平仓失败（网络问题等），会打印错误日志
   - 下一个Tick会继续尝试平仓

### 反向突破容忍度（新功能）⭐

**问题背景：**
在趋势行情中，可能会出现反向突破K线（回调），导致原本完整的波段被"切断"，使策略无法识别出肉眼可见的有效波段。

**示例：**
```
价格从2600上涨到2650（涨幅50点）
中间出现一根空单突破K线（回调到2640）

原有逻辑：
- 波段被切断为：2600→2640 和 2640→2650
- 每段都不足1000点，无法识别为有效波段 ✗

容忍模式（设置30%）：
- 回调10点 ÷ 波段50点 = 20% < 30%
- 回撤在容忍范围内，继续计算完整波段
- 识别出2600→2650的有效波段 ✓
```

**参数说明：**
- **0%（默认）**：不容忍任何反向突破，保持原有逻辑
- **10-20%**：容忍小幅回调，适合短期趋势
- **30-40%**：容忍中等回调，适合日内波段
- **50%以上**：容忍大幅回调，可能识别出更大的波段（但也可能误判）

**推荐设置：**
- 保守型：0-10%
- 标准型：20-30%
- 激进型：30-50%

**注意事项：**
1. 设置为0时，完全保持原有逻辑，不影响现有回测结果
2. 容忍度越高，识别的波段越大，但也可能包含更多噪音
3. 建议先回测不同容忍度，找到最适合的数值
4. 容忍度只影响波段识别，不影响止损止盈等其他逻辑

### 波段阈值范围说明
本策略使用**波段范围筛选**机制，只交易特定大小的波段：

#### 为什么需要波段范围？
- **单一阈值的问题**：传统策略只设置最小阈值（如0.1%），导致0.1%的小波段和5%的大波段都交易，风险收益特征差异巨大
- **范围筛选的优势**：通过设置最小和最大阈值，只交易特定大小的波段，风险更可控

#### 计算方式
- 以前一个极值点价格为基准，按百分比计算阈值范围
- 动态适应不同价格水平

#### 示例说明
假设设置：
- 最小阈值：0.1%
- 最大阈值：1.0%
- 当前价格：2600

**价格2600时的阈值范围：**
- 最小阈值 = 2600 × 0.1% = 2.6美元（260点）
- 最大阈值 = 2600 × 1.0% = 26美元（2600点）

**波段筛选结果：**
- 波段 2.0美元（200点）：< 最小阈值 → ❌ 不交易（波段太小）
- 波段 5.2美元（520点）：在范围内 → ✅ 有效波段，可交易
- 波段 15美元（1500点）：在范围内 → ✅ 有效波段，可交易
- 波段 30美元（3000点）：> 最大阈值 → ❌ 不交易（波段太大）

**价格4700时的阈值范围：**
- 最小阈值 = 4700 × 0.1% = 4.7美元（470点）
- 最大阈值 = 4700 × 1.0% = 47美元（4700点）

#### 参数调整建议
- **保守型**：0.15% - 0.5%（只交易中小波段）
- **标准型**：0.1% - 1.0%（默认，覆盖大多数波段）
- **激进型**：0.08% - 2.0%（交易范围更广）

### 止损止盈说明
本策略使用**百分比模式**计算止损和止盈：

- **止损计算**：止损金额 = MAX(开仓价 × 止损百分比, 1美元)
  - 示例1（高价位）：开仓价2600，止损0.05%，计算值 = 2600 × 0.05% = 1.3美元 > 1美元，使用1.3美元
    - 多单止损价 = 2600 - 1.3 = 2598.7
    - 空单止损价 = 2600 + 1.3 = 2601.3
  - 示例2（低价位）：开仓价1500，止损0.05%，计算值 = 1500 × 0.05% = 0.75美元 < 1美元，使用最小值1美元
    - 多单止损价 = 1500 - 1 = 1499.0
    - 空单止损价 = 1500 + 1 = 1501.0

- **止盈计算**：止盈金额 = 止损金额 × 盈亏比
  - 示例1：止损金额1.3美元，盈亏比1.5，止盈金额 = 1.3 × 1.5 = 1.95美元
    - 多单止盈价 = 2600 + 1.95 = 2601.95
    - 空单止盈价 = 2600 - 1.95 = 2598.05
  - 示例2：止损金额1美元，盈亏比1.5，止盈金额 = 1 × 1.5 = 1.5美元
    - 多单止盈价 = 1500 + 1.5 = 1501.5
    - 空单止盈价 = 1500 - 1.5 = 1498.5

- **移动止损**（可选功能，默认启用）：
  - **触发条件**：当浮盈 >= 止损金额时触发
  - **移动目标**：将止损移至成本价（开仓价）
  - **移动次数**：仅移动一次（保本策略）
  - **示例**：开仓价2603.24，止损金额1.30美元
    - 当价格涨至2604.54（浮盈1.30）时，止损从2601.94移至2603.24
    - 之后价格无论涨到多高，止损都保持在2603.24
    - 即使回调至成本价，也能保本离场，不会亏损
  - **开关控制**：可通过参数"使用移动止损"关闭此功能

- **最小止损保护**：无论百分比设置多小，止损金额始终不低于1美元（100点），避免止损过小导致频繁触发

- **移动止损的作用**：
  - ✅ 启用时：浮盈达标后锁定盈亏平衡，避免盈利单变亏损
  - ❌ 禁用时：止损始终保持在初始位置，追求更高止盈，但风险更大
