Skill: kun-wang-0717/wh8-mylang-developer (version 1.0.0)

# WT8Skill 文华财经WT8麦语言量化交易助手 ## 功能定位 专注量化交易模型编写、回测、运行 ## 核心能力 - 量化模型编写 - 历史回测分析 - 参数优化定参 - 策略运行管理 - 头寸风险管理 - 跨周期跨合约 ## 文件结构 ``` WT8Skill/ ├── skill.md # 本文件 ├── skill.yaml # 元数据 ├── README.md # 使用指南 ├── HOW_TO_USE.md # 使用方法 ├── SYSTEM_PROMPT.md # AI提示词 ├── SYNTAX.md # 语法规范 ├── CLASSIFICATION.md # 需求分类 ├── FUNCTIONS/ │ ├── INDEX.md # 函数索引 │ ├── signals.md # 信号指令 │ ├── indicators.md # 技术指标 │ ├── position.md # 持仓资金 │ ├── backtest.md # 回测函数 │ ├── optimization.md # 优化函数 │ ├── cross.md # 跨周期合约 │ └── execution.md # 运行优化 ├── EXAMPLES/ │ ├── basic_model.md # 基础模型 │ ├── stop_loss.md # 止损止盈 │ ├── position_management.md # 头寸管理 │ ├── batch_entry.md # 分批进出 │ └── cross_cycle.md # 跨周期 ├── EDGE_CASES/ │ └── common_mistakes.md # 常见错误 └── TEMPLATES/ └── model_template.md # 模型模板 ``` ## 快速开始 ### 编写量化模型 ``` 请帮我编写一个WT8模型： 1. 双均线金叉买，死叉卖 2. 止损15跳 3. 日线周期 ``` ### 核心信号 ```mql // 开平仓 BK/SK // 买开/卖开 BP/SP // 买平/卖平 // 止损 CLOSE<=BKPRICE-15*MINPRICE,SP // 必须 AUTOFILTER; ``` ## 官方文档 - 麦语言教程：https://wt8.wenhua.com.cn/#/download/download/2 - 语法说明：https://www.wenhua.com.cn/guide/views41a3.htm

path: CLASSIFICATION.md
content: # WT8需求分类指南

## 快速分类决策树

```
用户输入
   │
   ▼
┌─────────────────────────────────────────────────────────────┐
│ 关键词检测                                                  │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │行情/价格│ │历史/数据│ │账户/资金│ │买卖/BK  │ │回测/收益│ │
│ │  OPEN   │ │  K线    │ │  资金   │ │  SP/SK  │ │  胜率   │ │
│ │  HIGH   │ │  CLOSE  │ │  权益   │ │  买入   │ │  回撤   │ │
│ │  LOW    │ │  收盘   │ │  持仓   │ │  卖出   │ │  亏损   │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│      │           │           │           │           │       │
│      ▼           ▼           ▼           ▼           ▼       │
│   【行情】     【历史】     【账户】     【下单】     【回测】 │
│                                                             │
│                     ┌─────────┐                              │
│                     │模拟/监测│                              │
│                     │页面盒子│                              │
│                     │信号监测│                              │
│                     └────┬────┘                              │
│                          │                                   │
│                          ▼                                   │
│                      【模拟】                                │
└─────────────────────────────────────────────────────────────┘
```

## 六大类型详细说明

---

## 类型1：行情查询

### 识别关键词
- "当前价格"、"现在多少钱"
- "行情"、"实时行情"
- "开盘价"、"最高价"、"最低价"
- "成交量"、"持仓量"
- "买一"、"卖一"

### 相关变量
| 变量 | 说明 | 示例 |
|------|------|------|
| CLOSE | 当前收盘价 | `CLOSE > 5000` |
| OPEN | 当前开盘价 | `REF(OPEN,1)` |
| HIGH | 当前最高价 | `HIGH > REF(HIGH,1)` |
| LOW | 当前最低价 | `LOW < REF(LOW,1)` |
| VOL | 成交量 | `VOL > 10000` |
| OI | 持仓量 | `OI > 50000` |

### 典型问题
```
Q: 螺纹钢现在多少钱？
Q: 沪铜今天的成交量是多少？
Q: 帮我查一下IF300的行情
```

### 回答要点
- 直接提供价格或数据获取方式
- 说明数据来源和更新频率

---

## 类型2：历史数据

### 识别关键词
- "历史K线"
- "收盘价序列"
- "过去N天的数据"
- "补充数据"
- "数据从哪里开始"

### 相关变量
| 变量 | 说明 | 示例 |
|------|------|------|
| CLOSE | 收盘价序列 | `MA(CLOSE,20)` |
| HIGH | 最高价序列 | `HHV(HIGH,10)` |
| LOW | 最低价序列 | `LLV(LOW,10)` |
| OPEN | 开盘价序列 | `REF(OPEN,5)` |
| VOL | 成交量序列 | `MA(VOL,5)` |

### 典型问题
```
Q: 如何获取过去一年的日线数据？
Q: 怎么写一个基于历史收盘价的策略？
Q: 数据不够怎么补充？
```

### 回答要点
- 说明数据范围设置方法
- 介绍K线周期选择
- 提示信号计算起始时间

---

## 类型3：账户查询

### 识别关键词
- "账户资金"
- "当前权益"
- "持仓盈亏"
- "浮动盈亏"
- "平仓盈亏"
- "保证金占用"

### 相关变量
| 变量 | 说明 | 示例 |
|------|------|------|
| MONEYTOT | 当前权益 | `MONEYTOT <= INITMONEY*0.9` |
| INITMONEY | 初始资金 | `INITMONEY + 10000` |
| BKVOL | 多头持仓手数 | `BKVOL > 0` |
| SKVOL | 空头持仓手数 | `SKVOL > 0` |
| BKPRICE | 多头开仓价 | `CLOSE < BKPRICE - 10` |
| SKPRICE | 空头开仓价 | `CLOSE > SKPRICE + 10` |

### 典型问题
```
Q: 怎么查询当前的账户权益？
Q: 如何根据权益变化做风控？
Q: 持仓盈亏怎么计算？
```

### 回答要点
- 区分理论持仓和实际持仓
- 说明权益计算方式
- 介绍资金管理函数

---

## 类型4：下单交易

### 识别关键词
- "买开"、"卖开"
- "买平"、"卖平"
- "BK"、"SK"、"BP"、"SP"
- "做多"、"做空"
- "开仓"、"平仓"

### 信号指令
| 信号 | 含义 | 语法 |
|------|------|------|
| BK | 买开 | `条件, BK;` |
| SK | 卖开 | `条件, SK;` |
| BP | 买平 | `条件, BP;` |
| SP | 卖平 | `条件, SP;` |
| BPK | 反手买 | `条件, BPK;` |
| SPK | 反手卖 | `条件, SPK;` |

### 加减仓指令
| 指令 | 含义 | 语法 |
|------|------|------|
| ADD_LONG | 多头加仓 | `条件, ADD_LONG(N);` |
| LOWER_LONG | 多头减仓 | `条件, LOWER_LONG(N);` |
| ADD_SHORT | 空头加仓 | `条件, ADD_SHORT(N);` |
| LOWER_SHORT | 空头减仓 | `条件, LOWER_SHORT(N);` |

### 典型问题
```
Q: 怎么写一个均线金叉买开的模型？
Q: 止损怎么写？亏损N跳止损
Q: 如何实现盈利加仓？
```

### 回答要点
- 说明信号必须带条件
- 说明加减仓必须带手数
- 强调AUTOFILTER的必要性

---

## 类型5：模拟运行

### 识别关键词
- "模拟交易"
- "页面盒子"
- "信号监测"
- "实盘运行"
- "自动下单"

### 使用场景
- 多周期多合约信号监测
- 策略信号验证
- 自动下单测试（无需真金白银）

### 页面盒子限制
| 支持 | 不支持 |
|------|--------|
| 信号语句 | 运行优化函数（SIGCHECK） |
| 基础模型 | 资金管理函数 |
| | 指定交易合约（TRADE_OTHER） |
| | 头寸管理函数 |

### 典型问题
```
Q: 怎么用页面盒子监测信号？
Q: 页面盒子支持哪些函数？
Q: 如何设置自动下单？
```

### 回答要点
- 说明页面盒子使用方法
- 列出不支持的函数
- 介绍信号预警配置

---

## 类型6：回测分析

### 识别关键词
- "回测"
- "测试收益"
- "夏普比率"
- "胜率"、"盈亏比"
- "最大回撤"
- "敏感性测试"

### 相关设置
| 项目 | 说明 |
|------|------|
| 初始资金 | 回测起始资金 |
| 保证金率 | 合约保证金比例 |
| 手续费率 | 交易手续费 |
| 信号计算起始时间 | 从何时开始计算信号 |

### 回测报告指标
| 指标 | 说明 |
|------|------|
| 收益率 | 总收益/本金 |
| 夏普比率 | (年化收益-无风险利率)/收益标准差 |
| 权益最大回撤 | 权益从高点到低点的最大跌幅 |
| 胜率 | 盈利次数/总交易次数 |
| 盈亏比 | 平均盈利/平均亏损 |

### 典型问题
```
Q: 怎么设置回测参数？
Q: 怎么解读回测报告？
Q: 如何做敏感性测试？
```

### 回答要点
- 说明回测参数配置
- 解读关键指标含义
- 介绍参数优化方法

---

## 分类准确度检查

### 易混淆类型

#### 行情 vs 历史数据
- 行情 = 当前这一刻的数据
- 历史数据 = 过去一段时间的数据序列

#### 账户查询 vs 下单交易
- 账户查询 = 读取数据（MONEYTOT、BKVOL）
- 下单交易 = 发送指令（BK、SP）

#### 回测 vs 模拟
- 回测 = 基于历史数据测试
- 模拟 = 实时信号监测和下单

---

## 快速参考卡片

```
┌────────────────────────────────────────────────────────┐
│                     一眼判断类型                        │
├────────────────────────────────────────────────────────┤
│ 价格/OPEN/HIGH/LOW/VOL       →  行情                   │
│ CLOSE序列/REF/MA/K线数据     →  历史数据               │
│ MONEYTOT/权益/持仓/盈亏      →  账户查询               │
│ BK/SK/BP/SP/买卖/开仓        →  下单交易               │
│ 页面盒子/信号监测/自动下单    →  模拟                   │
│ 回测/胜率/回撤/夏普比率      →  回测分析               │
└────────────────────────────────────────────────────────┘
```


path: HOW_TO_USE.md
content: # WT8麦语言策略编写通用框架

> 💡 **核心发现**：双均线策略揭示了一个**万能策略编写公式**，适用于所有策略！

---

## 万能公式：6步编写任何策略

```
步骤1：定义参数
   ↓
步骤2：计算指标
   ↓
步骤3：构建条件
   ↓
步骤4：开仓信号
   ↓
步骤5：平仓/止损信号
   ↓
步骤6：AUTOFILTER
```

---

## 步骤详解

### 步骤1：定义参数（赋值用 :=）
```mql
// 所有策略都需要参数
止损 := 15;      // 止损跳数
N1 := 10;        // 短期周期
N2 := 20;        // 长期周期
```

### 步骤2：计算指标（赋值用 :=）
```mql
// 均线、MACD、布林带...
MA_S := MA(C, N1);
MA_L := MA(C, N2);
DIF := EMA(C,12) - EMA(C,26);
```

### 步骤3：构建条件（赋值用 :=）
```mql
// 交叉、背离、突破...
金叉 := CROSSUP(MA_S, MA_L);
多头 := DIF > DEA;
突破 := CLOSE > HHV(HIGH,20);
```

### 步骤4：开仓信号（条件,信号;）
```mql
// BK=买开，SK=卖开
金叉, BK;
突破, SK;
```

### 步骤5：平仓/止损信号（条件,信号;）
```mql
// SP=卖平，BP=买平
死叉, SP;
止损条件, SP;

// 止损写法
CLOSE <= BKPRICE - 止损*MINPRICE, SP;
CLOSE >= SKPRICE + 止损*MINPRICE, BP;

// 权益止损
MONEYTOT <= INITMONEY*0.9, SP;
```

### 步骤6：信号过滤（必须写！）
```mql
AUTOFILTER;
```

---

## 通用模板

```mql
// ============================================
// [策略名称]
// ============================================

// 步骤1：参数
参数1 := 值1;
参数2 := 值2;

// 步骤2：指标
指标A := 函数(参数);
指标B := 函数(参数);

// 步骤3：条件
条件A := 指标A > 指标B;           // 比较
条件B := CROSSUP(指标A, 指标B);  // 交叉
条件C := CLOSE > HHV(HIGH,20);   // 突破

// 步骤4：开仓
条件A, BK;   // 买开
条件B, SK;   // 卖开

// 步骤5：平仓/止损
条件B, SP;   // 平空
条件A, BP;   // 平多
止损条件, SP;
止损条件, BP;

// 步骤6：过滤
AUTOFILTER;
```

---

## 信号类型速查表

### 开仓信号
| 信号 | 含义 | 何时用 |
|------|------|--------|
| BK | 买开 | 做多开仓 |
| SK | 卖开 | 做空开仓 |

### 平仓信号
| 信号 | 含义 | 何时用 |
|------|------|--------|
| SP | 卖平 | 平多仓/止损 |
| BP | 买平 | 平空仓/止损 |

### 反手信号
| 信号 | 含义 | 等价于 |
|------|------|--------|
| BPK | 反手买 | BP + BK |
| SPK | 反手卖 | SP + SK |

### 加减仓指令
| 指令 | 含义 | 注意 |
|------|------|------|
| ADD_LONG(N) | 多头加仓 | 必须带手数 |
| LOWER_LONG(N) | 多头减仓 | 必须带手数 |

---

## 常见策略类型

### 1. 趋势策略（均线、MACD）
```mql
// 突破类
CLOSE > MA(C,20), BK;
CLOSE < MA(C,20), SK;

// 交叉类
CROSSUP(DIF,DEA), BK;
CROSSDOWN(DIF,DEA), SK;
```

### 2. 突破策略（高低点）
```mql
// 布林带
CLOSE > TOP, BK;
CLOSE < BOTTOM, SK;

// 区间突破
CLOSE > HHV(HIGH,20), BK;
CLOSE < LLV(LOW,20), SK;
```

### 3. 震荡策略（RSI、布林中轨）
```mql
// 超买超卖
RSI < 30, BK;
RSI > 70, SK;

// 布林中轨
CLOSE > MID, BK;
CLOSE < MID, SK;
```

### 4. 止损类型
```mql
// 固定止损
CLOSE <= BKPRICE-15*MINPRICE, SP;

// 百分比止损
CLOSE <= BKPRICE*0.95, SP;

// 权益止损
MONEYTOT <= INITMONEY*0.9, SP;
```

---

## 语法检查清单

写完代码后对照检查：

- [ ] 参数定义用 `:=`？ (`N := 10;` 不是 `N = 10;`)
- [ ] 指标计算用 `:=`？ (`MA_S := MA(C,10);`)
- [ ] 条件构建用 `:=`？ (`金叉 := CROSSUP(A,B);`)
- [ ] 信号格式 `条件, 信号;`？ (`金叉, BK;`)
- [ ] 加减仓带手数？ (`ADD_LONG(2);`)
- [ ] 写了 `AUTOFILTER;`？
- [ ] 没有 `{}` 大括号？
- [ ] 没有 `IF ()` 语句？

---

## 关键原则

### 1. 赋值用 := ，比较用 =
```mql
// ✅ 赋值
N := 10;
MA10 := MA(C,N);

// ✅ 比较
CLOSE > MA10
```

### 2. 条件在前，信号在后
```mql
// ✅ 正确
CLOSE > MA10, BK;

// ❌ 错误
BK, CLOSE > MA10;
```

### 3. 信号必须有条件
```mql
// ✅ 正确
金叉, BK;

// ❌ 错误
BK;  // 不能单独用！
```

### 4. 一开必须一平
```mql
// ✅ 完整
金叉, BK;   // 开多
死叉, SP;   // 平多

// ❌ 不完整
金叉, BK;   // 只有开仓
```


path: README.md
content: # WT8麦语言量化交易助手 - 快速入门

## 简介

这是一个基于文华财经WT8软件的麦语言量化交易AI助手。它可以帮助你：

- 🔍 **快速分类需求**：自动识别是行情查询、历史数据、账户查询、下单交易、模拟运行还是回测分析
- 📝 **生成正确代码**：使用真实存在的函数和示例，避免泛化错误
- ⚠️ **避开陷阱**：明确标注边界条件和常见错误
- 📤 **即取即用**：可直接分发给其他AI使用

## 目录结构

```
WT8Skill/
├── skill.yaml              # 元数据配置
├── SYSTEM_PROMPT.md        # 系统级提示词（必读）
├── CLASSIFICATION.md       # 需求分类指南
├── FUNCTIONS/              # 函数参考文档
│   ├── INDEX.md           # 函数索引
│   ├── signals.md         # 信号和指令
│   ├── indicators.md      # 技术指标
│   ├── position.md        # 持仓资金管理
│   ├── backtest.md        # 回测函数
│   ├── optimization.md     # 优化函数
│   ├── cross.md           # 跨周期跨合约
│   └── execution.md        # 运行优化
├── EXAMPLES/               # 示例代码
├── EDGE_CASES/             # 边界条件和常见错误
└── TEMPLATES/              # 模型模板
```

## 快速开始

### 1. 判断需求类型

当你提出问题时，AI会自动判断属于哪种类型：

| 类型 | 关键词 | 说明 |
|------|--------|------|
| 行情 | 价格、行情、当前价、开盘、最高、最低 | 获取实时行情数据 |
| 历史数据 | 历史、K线数据、收盘价、成交量 | 获取历史K线数据 |
| 账户查询 | 账户、资金、权益、持仓、盈亏 | 查询账户信息 |
| 下单 | 买开、卖开、买平、卖平、BK、SK | 交易指令 |
| 模拟 | 模拟、下单、信号、页面盒子 | 模拟实盘运行 |
| 回测 | 回测、测试、收益、回撤、胜率 | 历史数据回测 |

### 2. 常用函数速查

```mql
// 开平仓信号
BK/SK      // 买开/卖开
BP/SP      // 买平/卖平
BPK/SPK    // 反手下单

// 加减仓
ADD_LONG/LOWER_LONG    // 多头加仓/减仓
ADD_SHORT/LOWER_SHORT  // 空头加仓/减仓

// 头寸管理
SETDEALPERCENT(fPercent, N)    // 按资金比例下单
T_COMMAND(N)                    // 设置开仓手数

// 止损止盈
BKPRICE/SKPRICE     // 开仓价格
BKHIGH/SKLOW        // 开仓后最高/最低价
MONEYTOT            // 当前权益
INITMONEY           // 初始资金
```

### 3. 基础模型框架

```mql
// 条件A，买开
条件A, BK;
// 多头止损
条件B, SP;
// 条件C，卖平，结束本次交易
条件C, SP;
// 条件A1，卖开
条件A1, SK;
// 条件B1，空头止损
条件B1, BP;
// 条件C1，买平，结束本次交易
条件C1, BP;
AUTOFILTER;  // 必须写，过滤信号
```

## 常见问题

### Q: 为什么模型没有执行信号？
A: 检查是否写了 `AUTOFILTER;`，这是必须的。

### Q: 为什么信号忽闪？
A: K线走完前满足条件出信号，K线走完条件不满足信号消失。使用 `SIGCHECK` 函数可以进行信号复核。

### Q: 如何避免过度拟合？
A: 参数优化时追求"参数高原"而非"参数孤岛"，选择收益稳定、适合多种趋势场景的参数。

## 获取更多帮助

- 查看 `CLASSIFICATION.md` 了解如何快速分类需求
- 查看 `FUNCTIONS/INDEX.md` 浏览所有可用函数
- 查看 `EXAMPLES/` 目录获取示例代码
- 查看 `EDGE_CASES/` 了解边界条件和常见错误


path: skill.yaml
content: # WT8Skill 元数据配置
name: WT8麦语言量化交易助手
version: "1.0.0"
description: 文华财经WT8麦语言量化交易软件AI助手，支持行情查询、历史数据、回测分析、下单交易、模拟运行等功能
author: SKILL Team
tags:
  - 量化交易
  - WT8
  - 麦语言
  - 文华财经
  - 期货
  - 回测

# 依赖项
dependencies: []

# 权限要求
permissions:
  - read_files
  - write_files

# 配置
config:
  # 默认回测参数
  default:
    initial_capital: 100000
    commission_rate: 0.0002
    slippage: 2
    
  # 支持的合约类型
  contract_types:
    - 期货
    - 股票
    - 期权
    
  # 支持的K线周期
  periods:
    - 分钟
    - 5分钟
    - 15分钟
    - 30分钟
    - 小时
    - 日线
    - 周线

# 文件索引（用于按需加载）
file_index:
  classification: CLASSIFICATION.md
  functions:
    index: FUNCTIONS/INDEX.md
    signals: FUNCTIONS/signals.md
    indicators: FUNCTIONS/indicators.md
    position: FUNCTIONS/position.md
    backtest: FUNCTIONS/backtest.md
    optimization: FUNCTIONS/optimization.md
    cross: FUNCTIONS/cross.md
    execution: FUNCTIONS/execution.md
  examples:
    basic: EXAMPLES/basic_model.md
    stop_loss: EXAMPLES/stop_loss.md
    position: EXAMPLES/position_management.md
    batch: EXAMPLES/batch_entry.md
    cross: EXAMPLES/cross_cycle.md
  edge_cases: EDGE_CASES/common_mistakes.md
  templates: TEMPLATES/model_template.md


path: SYNTAX.md
content: # WT8麦语言语法格式规范（重要！）

> 📖 **官方文档参考**：
> - 操作符语法：https://www.wenhua.com.cn/guide/views41a.htm
> - 基本语法：https://www.wenhua.com.cn/guide/views41a3.htm

## ⚠️ 格式对比：错误 vs 正确

### ❌ 错误格式（Python/C风格）
```python
# 大括号、IF语句、函数定义
INIT {
    T_COMMAND(2);
    AUTOFILTER;
}

FUNCTION main() {
    IF (CLOSE > MA(C,10)) {
        BK;
    }
}
```

### ✅ 正确格式（麦语言）
```mql
# 无大括号、无IF语句、无函数定义
# 条件, 信号;  写在同一行

T_COMMAND(2);        # 设置开仓手数
AUTOFILTER;          # 必须写最后一行

MA10:=MA(C,10);      # 赋值用 :=

CLOSE>MA10, BK;     # 条件在前，信号在后，逗号分隔
```

---

## 运算符说明（最重要！）

| 运算符 | 含义 | 示例 |
|--------|------|------|
| `:=` | **赋值**（定义变量） | `MA10:=MA(C,10);` |
| `=` | **比较**（等于判断） | `CLOSE=OPEN` |
| `<>` | **不等于** | `CLOSE<>OPEN` |
| `>` | 大于 | `CLOSE>MA10` |
| `<` | 小于 | `CLOSE<MA10` |
| `>=` | 大于等于 | `CLOSE>=MA10` |
| `<=` | 小于等于 | `CLOSE<=MA10` |
| `AND` | 逻辑与 | `CLOSE>MA AND CROSS` |
| `OR` | 逻辑或 | `CLOSE>MA OR CLOSE>MA2` |
| `NOT` | 逻辑非 | `NOT 多头` |

```mql
# ✅ 正确：赋值用 :=
MA10 := MA(C,10);
N := 20;
条件 := CROSS(MA5,MA10);

# ✅ 正确：比较用 =
CLOSE > MA10;         # 大于
CLOSE < MA10;         # 小于
CLOSE >= MA10;        # 大于等于
CLOSE <= MA10;        # 小于等于
CLOSE = OPEN;         # 等于（比较）
CLOSE <> OPEN;        # 不等于

# ✅ 逻辑运算
多头 AND CROSS(MA5,MA10);     # AND
空头 OR CROSS(MA10,MA20);     # OR
NOT 多头;                       # NOT

# ❌ 错误：混淆赋值和比较
MA10 = MA(C,10);      # 错！这是比较，不是赋值
```

---

## 麦语言核心语法

### 1. 指标定义
```mql
# ✅ 正确：变量名 := 指标函数(参数);
MA10 := MA(C,10);
MA20 := MA(C,20);
DIF := EMA(C,12) - EMA(C,26);

# ❌ 错误：使用 = 而不是 :=
MA10 = MA(C,10);    # 这是比较，不是赋值！
N = 20;              # 错！
```

### 2. 条件表达式
```mql
# ✅ 正确：直接写条件（用比较运算符）
CLOSE > MA10              # 价格大于均线
CLOSE < MA10              # 价格小于均线
BKVOL > 0                 # 有多头持仓
MONEYTOT < INITMONEY*0.9  # 权益回撤

# ✅ 多条件组合
多头 := MA5>MA20;
金叉 := CROSS(MA5,MA20);
多头 AND 金叉, BK;         # AND组合
```

### 3. 交易信号（最关键！）
```mql
# ✅ 正确格式：条件, 信号;
# 金叉买开
CROSS(MA5,MA10), BK;

# 死叉卖平
CROSSDOWN(MA5,MA10), SP;

# 止损
CLOSE <= BKPRICE-10*MINPRICE, SP;

# ❌ 错误格式：多种错误
IF (CLOSE > MA10) { BK; }        # 不能用IF
CLOSE > MA10 THEN BK;            # 不能用THEN
```

### 4. 变量引用
```mql
# ✅ 正确（全大写）
CLOSE       # 当前收盘价
OPEN        # 当前开盘价
HIGH        # 当前最高价
LOW         # 当前最低价
MINPRICE    # 最小变动价位
BKVOL       # 多头持仓手数
SKVOL       # 空头持仓手数
MONEYTOT    # 当前权益

# ❌ 错误
c            # 不能用小写
close        # 不能用小写
```

### 5. 函数参数
```mql
# ✅ 正确：MA(数据, 周期)
MA(C,10)           # 收盘价的10日均线
EMA(C,12)          # 12日指数均线
HHV(HIGH,20)       # 20周期最高价
LLV(LOW,20);       # 20周期最低价

# ❌ 错误：参数顺序或数量不对
MA(10,C)           # 参数顺序错误
```

### 6. 加减仓指令
```mql
# ✅ 正确：必须带手数
ADD_LONG(2);        # 加仓2手
LOWER_LONG(1);      # 减仓1手
ADD_SHORT(BKVOL/2); # 加仓一半持仓

# ❌ 错误：不带手数
ADD_LONG;           # 缺少手数！
```

---

## 完整示例对比

### ❌ 错误代码
```python
# 用户提供的错误代码
INIT {
    T_COMMAND(2);
    AUTOFILTER;
}

FUNCTION main() {
    CLOSE_S = MA(CLOSE, MA_SHORT, S);
    HOLONG = BKVOL;
    
    IF (CROSS(CLOSE_SHORT, MA_LONG, S) == 0) {
        BKPRICE;
    }
}
```

### ✅ 正确代码
```mql
# 麦语言正确格式
# 参数
MA_SHORT := 10;     # 赋值用 :=
MA_LONG := 20;
止损 := 15;

# 指标
MA_S := MA(C,MA_SHORT);
MA_L := MA(C,MA_LONG);

# 金叉买开
CROSS(MA_S,MA_L), BK;

# 死叉卖开
CROSSDOWN(MA_S,MA_L), SK;

# 止损
CLOSE <= BKPRICE-止损*MINPRICE, SP;
CLOSE >= SKPRICE+止损*MINPRICE, BP;

# 必须写最后一行
AUTOFILTER;
```

---

## 麦语言 vs 其他语言

| 特性 | 麦语言 | Python/C |
|------|--------|----------|
| 赋值运算符 | `:=` | `=` 或 `let` |
| 比较运算符 | `=` | `==` |
| 不等于 | `<>` | `!=` |
| 逻辑与 | `AND` | `and` 或 `&&` |
| 逻辑或 | `OR` | `or` 或 `\|\|` |
| 条件语句 | 无IF，直接写条件 | `if () {}` |
| 信号语法 | `条件,信号;` | 函数调用 |
| 函数定义 | 无FUNCTION | `def/function` |

---

## 快速检查清单

写完代码后检查：

- [ ] **赋值用 `:=` 而不是 `=`**？ (`N := 10;` 不是 `N = 10;`)
- [ ] **没有** `{}` 大括号？
- [ ] **没有** `IF ()` 语句？
- [ ] **没有** `FUNCTION main()` 定义？
- [ ] 条件都直接写在信号前面？
- [ ] 信号前有逗号？
- [ ] 加减仓带了手数？
- [ ] 写了 `AUTOFILTER;`？

---

## 正确的双均线策略

```mql
# ============================================
# 正确的双均线策略
# ============================================

# 参数（赋值用 :=）
N1 := 10;   # 短周期
N2 := 20;   # 长周期

# 指标计算（赋值用 :=）
MA_S := MA(C,N1);   # 短期均线
MA_L := MA(C,N2);   # 长期均线

# 开仓条件
金叉 := CROSS(MA_S,MA_L);      # 短上穿长
死叉 := CROSSDOWN(MA_S,MA_L);  # 短下穿长

# 交易信号（条件,信号;）
金叉, BK;      # 金叉买开
死叉, SP;      # 死叉卖平（多头持仓时）
金叉, SK;      # 金叉卖开
死叉, BP;      # 死叉买平（空头持仓时）

# 止损（比较用 =）
CLOSE <= BKPRICE-15*MINPRICE, SP;
CLOSE >= SKPRICE+15*MINPRICE, BP;

# 必须写最后一行
AUTOFILTER;
```


path: SYSTEM_PROMPT.md
content: # WT8麦语言量化交易助手 - 系统提示词

## ⚠️ 最重要的语法格式警告！

**麦语言使用独特的"条件,信号;"格式，与Python/C完全不同！**

### 核心格式规则

```mql
// ✅ 正确：条件, 信号;（同一行，分号结束）
CLOSE > MA(C,10), BK;
CROSS(MA5,MA10), BK;

// ❌ 错误：Python/C风格（绝对禁止！）
IF (CLOSE > MA(C,10)) {
    BK;
}
FUNCTION main() { ... }
{ ... }
```

### 格式检查清单（每次生成代码前必须检查）

- [ ] **没有** `{}` 大括号
- [ ] **没有** `IF ()` 语句
- [ ] **没有** `FUNCTION main()` 定义
- [ ] **没有** `return` 语句
- [ ] 指标定义用 `:=`（不是 `=`）
- [ ] 信号格式为 `条件, 信号;`
- [ ] 加减仓必须带手数：`ADD_LONG(2);`
- [ ] 最后一行必须是 `AUTOFILTER;`

### 变量引用

```mql
// ✅ 正确（全大写）
CLOSE, OPEN, HIGH, LOW, MINPRICE, MONEYTOT, BKVOL

// ❌ 错误（小写或其他）
c, close, Close, C
```

---

## 角色定义

你是文华财经WT8麦语言量化交易软件的专业AI助手。你需要：

1. **快速分类需求**：准确判断用户需求属于6大类型中的哪一种
2. **提供精准代码**：使用仓库中真实存在的函数和示例
3. **明确边界条件**：标注容易出错的场景和注意事项
4. **模块化响应**：长说明拆分成文件，只在需要时读取具体参考
5. **严格语法格式**：确保生成的代码是麦语言格式，不是Python/C格式

---

## 6大需求类型分类

### 类型1：行情查询
- **关键词**：当前价、开盘价、最高价、最低价、成交量、持仓量、行情
- **使用变量**：`CLOSE`, `OPEN`, `HIGH`, `LOW`, `VOL`, `OI`
- **回答重点**：直接给出数据获取方式

### 类型2：历史数据
- **关键词**：历史K线、收盘价序列、成交量数据、数据补充
- **使用变量**：`CLOSE`, `HIGH`, `LOW`, `OPEN`, `VOL`
- **回答重点**：数据范围、周期选择

### 类型3：账户查询
- **关键词**：账户资金、权益、持仓、浮动盈亏、平仓盈亏
- **使用变量**：`MONEYTOT`, `BKVOL`, `SKVOL`, `BKPRICE`, `SKPRICE`
- **回答重点**：查询方式和相关函数

### 类型4：下单交易
- **关键词**：买开、卖开、买平、卖平、BK、SK、BP、SP
- **信号指令**：BK, SK, BP, SP, BPK, SPK, ADD_LONG, LOWER_LONG, ADD_SHORT, LOWER_SHORT
- **回答重点**：交易指令语法和执行机制

### 类型5：模拟运行
- **关键词**：模拟交易、页面盒子、信号监测、实盘运行
- **使用场景**：策略信号监测、自动下单测试
- **回答重点**：页面盒子使用限制和配置方法

### 类型6：回测分析
- **关键词**：回测、收益、回撤、胜率、盈亏比、夏普比率
- **使用函数**：`AUTOFILTER`, `SETDEALPERCENT`, `SIGCHECK`
- **回答重点**：回测参数设置和报告解读

---

## 核心执行原则

### 1. 信号优先级
- **信号**（SIGNAL）：BK, SK, BP, SP, BPK, SPK → 优先级最高
- **指令**（COMMAND）：ADD_LONG, LOWER_LONG, ADD_SHORT, LOWER_SHORT → 优先级次之

### 2. 信号过滤机制
- 必须使用 `AUTOFILTER;` 过滤重复信号
- 一开一平：开仓后不再出开仓信号，平仓后不再出平仓信号
- 加减仓过滤：同一行加减仓指令一轮只出一次

### 3. K线执行机制
- 默认：K线最后一笔价格确定信号，下一根K线开始下单
- 优化：使用 `SIGCHECK` 函数可在K线走完前下单

---

## 函数使用规范

### 开平仓信号（必须带条件）
```mql
条件, BK;    // 买开
条件, SK;    // 卖开
条件, BP;    // 买平
条件, SP;    // 卖平
条件, BPK;   // 反手买（买平+等量买开）
条件, SPK;   // 反手卖（卖平+等量卖开）
```

### 加减仓指令（必须带手数）
```mql
ADD_LONG(N);     // 多头加仓N手
LOWER_LONG(N);   // 多头减仓N手
ADD_SHORT(N);    // 空头加仓N手
LOWER_SHORT(N);  // 空头减仓N手
```

### 头寸管理函数
```mql
SETDEALPERCENT(fPercent, N);  // 按资金比例下单
T_COMMAND(N);                  // 设置开仓手数
```

### 价格获取
```mql
BKPRICE;   // 多头开仓价格
SKPRICE;   // 空头开仓价格
BKHIGH;    // 多头持仓期间最高价
SKLOW;     // 空头持仓期间最低价
```

### 资金查询
```mql
MONEYTOT;      // 当前权益
INITMONEY;     // 初始资金
BKVOL;         // 多头持仓手数
SKVOL;         // 空头持仓手数
```

---

## 常见错误警告

### ❌ 错误0：语法格式错误（最常见！必须避免）

```mql
// ❌ 错误：Python/C风格
INIT {
    T_COMMAND(2);
}
FUNCTION main() {
    IF (CLOSE > MA(C,10)) {
        BK;
    }
}

// ✅ 正确：麦语言格式
T_COMMAND(2);
CLOSE>MA(C,10), BK;
AUTOFILTER;
```

### ❌ 错误1：信号不写条件
```mql
// 错误写法
BK;  // 信号不能单独使用

// 正确写法
CLOSE > MA(C,10), BK;
```

### ❌ 错误2：加减仓不带手数
```mql
// 错误写法
CLOSE > BKPRICE + 10, ADD_LONG;  // 缺少手数

// 正确写法
CLOSE > BKPRICE + 10, ADD_LONG(2);  // 加仓2手
```

### ❌ 错误3：忘记写AUTOFILTER
```mql
// 错误写法
CLOSE > MA(C,10), BK;
CLOSE < MA(C,10), SP;

// 正确写法
CLOSE > MA(C,10), BK;
CLOSE < MA(C,10), SP;
AUTOFILTER;  // 必须写！
```

### ❌ 错误4：没有持仓时出加减仓
```mql
// 错误场景
// 假设当前没有持仓
ADD_LONG(1);  // 无效！必须先BK开仓
```

---

## 边界条件说明

### 1. 信号复核（SIGCHECK）
- K线走完前出信号，K线走完条件不满足 → 信号消失
- 使用 `SIGCHECK(MODE, TIME)` 进行信号复核
- 消失的信号会被恢复持仓

### 2. 主连链回测
- 使用月份合约K线数据计算信号
- 主力切换时旧合约清仓，新合约重新计算信号
- 换月时新旧合约趋势可能相反

### 3. 参数优化
- 追求"参数高原"而非"参数孤岛"
- 避免过度拟合
- 综合考虑长期和短期数据

---

## 响应模板

当用户提问时，按以下格式响应：

```
## 需求分类
[判断类型：行情/历史数据/账户查询/下单/模拟/回测]

## 相关函数
[列出本问题涉及的真实函数]

## 代码示例
[使用真实语法的代码 - 注意必须是条件,信号;格式]

## 注意事项
[边界条件和容易出错的地方]

## 相关文件
[可进一步查阅的文档路径]
```

---

## 文档索引

当你需要深入了解某个主题时，请查阅对应文件：

| 主题 | 文件路径 |
|------|----------|
| **语法格式** | `SYNTAX.md` |
| 完整函数列表 | `FUNCTIONS/INDEX.md` |
| 信号指令详情 | `FUNCTIONS/signals.md` |
| 技术指标函数 | `FUNCTIONS/indicators.md` |
| 持仓资金管理 | `FUNCTIONS/position.md` |
| 回测函数 | `FUNCTIONS/backtest.md` |
| 优化函数 | `FUNCTIONS/optimization.md` |
| 跨周期跨合约 | `FUNCTIONS/cross.md` |
| 运行优化 | `FUNCTIONS/execution.md` |
| 基础模型示例 | `EXAMPLES/basic_model.md` |
| 止损止盈示例 | `EXAMPLES/stop_loss.md` |
| 头寸管理示例 | `EXAMPLES/position_management.md` |
| 分批进出示例 | `EXAMPLES/batch_entry.md` |
| 跨周期示例 | `EXAMPLES/cross_cycle.md` |
| 常见错误 | `EDGE_CASES/common_mistakes.md` |
| 模型模板 | `TEMPLATES/model_template.md` |


path: TEMPLATES/model_template.md
content: # WT8麦语言模型模板

## 模板1：基础趋势策略

```mql
// ============================================
// 基础趋势策略模板
// 适用于：初学者
// 特点：简单、易懂、有止损
// ============================================

// 参数
N1:=10;   // 短周期
N2:=20;   // 长周期
止损:=15; // 止损跳数

// 指标
MA1:MA(C,N1);
MA2:MA(C,N2);

// 开仓条件
金叉:=CROSS(MA1,MA2);    // 短上穿长
死叉:=CROSSDOWN(MA1,MA2); // 短下穿长

// 开仓
金叉, BK;   // 金叉买开
死叉, SK;   // 死叉卖开

// 止损
CLOSE<=BKPRICE-止损*MINPRICE, SP;
CLOSE>=SKPRICE+止损*MINPRICE, BP;

// 过滤
AUTOFILTER;
```

---

## 模板2：带止盈止损的策略

```mql
// ============================================
// 带止盈止损的策略模板
// 适用于：追求完整风控
// 特点：止损+止盈+保本
// ============================================

// 参数
MA周期:=20;     // 均线周期
止损N:=15;      // 止损跳数
止盈M:=40;      // 止盈跳数
保本N2:=20;     // 保本开启跳数
保本M2:=5;      // 保本回撤跳数

// 指标
MA20:MA(C,MA周期);

// 开仓
CLOSE>MA20, BK;
CLOSE<MA20, SK;

// 1. 固定止损
CLOSE<=BKPRICE-止损N*MINPRICE, SP;
CLOSE>=SKPRICE+止损N*MINPRICE, BP;

// 2. 固定止盈
CLOSE>=BKPRICE+止盈M*MINPRICE, SP;
CLOSE<=SKPRICE-止盈M*MINPRICE, BP;

// 3. 保本止损
BKHIGH>BKPRICE+保本N2*MINPRICE && CLOSE<=BKPRICE+保本M2*MINPRICE, SP;
SKLOW<SKPRICE-保本N2*MINPRICE && CLOSE>=SKPRICE-保本M2*MINPRICE, BP;

AUTOFILTER;
```

---

## 模板3：分批进出策略

```mql
// ============================================
// 分批进出策略模板
// 适用于：追求精确持仓管理
// 特点：分批建仓+分批平仓
// ============================================

// 参数
开仓手数:=5;
加仓盈利:=0.02;   // 2%
减仓亏损:=0.01;   // 1%
止盈比例:=0.08;   // 8%

// 头寸管理
T_COMMAND(开仓手数);
TRADE_AGAIN(3);   // 允许加减仓3次

// 均线
MA20:MA(C,20);
MA60:MA(C,60);

// ========== 开仓 ==========
CLOSE>MA20 && CLOSE>MA60, BK;

// ========== 加减仓 ==========
CLOSE>BKPRICE*(1+加仓盈利) && BKVOL<15, ADD_LONG(2);
CLOSE<BKPRICE*(1-减仓亏损) && BKVOL>开仓手数, LOWER_LONG(2);

// ========== 分批平仓 ==========
CLOSE>BKPRICE*(1+0.04), LOWER_LONG(开仓手数);
CLOSE>BKPRICE*(1+止盈比例), SP;

// ========== 止损 ==========
CLOSE<BKPRICE*(1-0.03), SP;

AUTOFILTER;
```

---

## 模板4：头寸管理策略

```mql
// ============================================
// 头寸管理策略模板
// 适用于：资金管理严格的组合
// 特点：按资金比例下单+权益风控
// ============================================

// ========== 头寸管理 ==========
// 按资金比例下单
SETDEALPERCENT(25, 10);  // 25%资金，最大10手

// 权益止损
HM:=HHV(MONEYTOT,BARPOS);
QY:=(HM-MONEYTOT)/HM;
QY>0.15, SP;    // 回撤15%止损
QY>0.15, BP;

// ========== 交易策略 ==========
MA10:MA(C,10);
MA20:MA(C,20);

// 开仓
CROSS(MA10,MA20), BK;
CROSSDOWN(MA10,MA20), SK;

// 止损
CLOSE<=BKPRICE*0.98, SP;
CLOSE>=SKPRICE*1.02, BP;

AUTOFILTER;
```

---

## 模板5：跨周期策略

```mql
// ============================================
// 跨周期策略模板
// 适用于：多周期共振交易
// 特点：日线方向+分钟信号
// ============================================

// 首先建立日线指标（保存为 DAY_IND）
// DAY_IND
// MA5:MA(C,5);
// MA20:MA(C,20);
// DAYUP:MA5>MA20;
// DAYDN:MA5<MA20;

// ========== 引用日线 ==========
#IMPORT[DAY,1,DAY_IND] AS D

DAYUP:D.DAYUP;
DAYDN:D.DAYDN;

// ========== 分钟周期条件 ==========
MA5:MA(C,5);
MA10:MA(C,10);

MINUP:CROSS(MA5,MA10);
MINDN:CROSSDOWN(MA5,MA10);

// ========== 综合信号 ==========
DAYUP && MINUP, BPK;   // 日线多头+分钟金叉→做多
DAYDN && MINDN, SPK;   // 日线空头+分钟死叉→做空

// 止损
CLOSE<=BKPRICE-20*MINPRICE, SP;
CLOSE>=SKPRICE+20*MINPRICE, BP;

AUTOFILTER;
```

---

## 模板6：运行优化策略

```mql
// ============================================
// 运行优化策略模板
// 适用于：短线精准入场
// 特点：K线走完前下单
// ============================================

// 运行优化
SIGCHECK('B', 15);  // K线走完前15秒下单

// 下单价格
SETSIGPRICETYPE(BK, 2);   // 开仓用对手价
SETSIGPRICETYPE(SP, 4);   // 止损用市价
SETSIGPRICETYPE(SK, 2);
SETSIGPRICETYPE(BP, 4);

// 参数
N:=20;   // 止损
M:=30;   // 止盈

// 突破策略
HH20:=HHV(HIGH,20);
LL20:=LLV(LOW,20);

// 开仓
CLOSE>HH20, BK;
CLOSE<LL20, SK;

// 止损止盈
CLOSE<=BKPRICE-N*MINPRICE, SP;
CLOSE>=BKPRICE+M*MINPRICE, SP;
CLOSE>=SKPRICE+N*MINPRICE, BP;
CLOSE<=SKPRICE-M*MINPRICE, BP;

AUTOFILTER;
```

---

## 模板7：完整生产策略

```mql
// ============================================
// 完整生产策略模板
// 适用于：实盘运行
// 特点：完整的风控和头寸管理
// ============================================

// ============================================
// 第一部分：头寸管理
// ============================================

// 1. 按资金比例下单
SETDEALPERCENT(20, 8);

// 2. 权益风控
HM:=HHV(MONEYTOT,BARPOS);
QY:=(HM-MONEYTOT)/HM;
QY>0.2, SP;    // 权益回撤20%止损
QY>0.2, BP;

// 3. 最大持仓控制
// （通过SETDEALPERCENT的第二个参数控制）

// ============================================
// 第二部分：交易条件
// ============================================

// 参数
MA短期:=10;
MA长期:=20;
止损:=15;
止盈:=50;

// 均线
MA10:MA(C,MA短期);
MA20:MA(C,MA长期);

// 趋势判断
趋势多头:=MA10>MA20;
趋势空头:=MA10<MA20;

// 信号
金叉:=CROSS(MA10,MA20);
死叉:=CROSSDOWN(MA10,MA20);

// ============================================
// 第三部分：交易执行
// ============================================

// 开仓
趋势多头 AND 金叉, BPK;
趋势空头 AND 死叉, SPK;

// 止损
CLOSE<=BKPRICE-止损*MINPRICE, SP;
CLOSE>=SKPRICE+止损*MINPRICE, BP;

// 止盈
CLOSE>=BKPRICE+止盈*MINPRICE, SP;
CLOSE<=SKPRICE-止盈*MINPRICE, BP;

// 趋势反转平仓
趋势空头 AND SKVOL>0, SPK;
趋势多头 AND BKVOL>0, BPK;

// 过滤
AUTOFILTER;
```

---

## 模板使用说明

### 如何使用这些模板：

1. **选择模板**：根据策略需求选择合适的模板
2. **修改参数**：调整参数值
3. **测试回测**：先在小周期、小数据量上测试
4. **优化参数**：使用枚举/遗传优化参数
5. **实盘运行**：验证后再实盘

### 模板优先级：

```
初学者          → 模板1（基础趋势）
追求风控        → 模板2（带止盈止损）
精细持仓        → 模板3（分批进出）
资金管理        → 模板4（头寸管理）
多周期共振      → 模板5（跨周期）
短线交易        → 模板6（运行优化）
实盘生产        → 模板7（完整生产）
```


path: FUNCTIONS/backtest.md
content: # WT8回测函数和配置

> 📖 **官方文档参考**：
> - 操作符语法：https://www.wenhua.com.cn/guide/views41a.htm
> - 基本语法：https://www.wenhua.com.cn/guide/views41a3.htm
> - 信号过滤明细：https://www.wenhua.com.cn/popwin/guolvmx3.htm
> - 信号计算起始时间：https://www.wenhua.com.cn/popwin/xhjsqzsj.html

## 目录
1. [AUTOFILTER](#一autofilter)
2. [回测参数设置](#二回测参数设置)
3. [回测报告指标](#三回测报告指标)
4. [主连链回测](#四主连链回测)

---

## 一、AUTOFILTER

### 基本语法
```mql
AUTOFILTER;
```
**必须写！** 放在模型最后一行。

### 作用
- 过滤重复信号
- 保证一开一平机制

### 示例
```mql
MA5:=MA(C,5);
MA10:=MA(C,10);

CROSS(MA5,MA10), BK;
CROSSDOWN(MA5,MA10), SP;

AUTOFILTER;  // 必须写！
```

---

## 二、回测参数设置

### 设置入口
- 菜单：【量化】→【设置保证金/手续费的量化交易参数】
- 回测K线图工具条按钮：临时调整初始资金

### 主要参数

| 参数 | 说明 | 设置位置 |
|------|------|----------|
| 初始资金 | 回测起始资金 | 模组设置/回测工具条 |
| 保证金率 | 合约保证金比例 | 量化交易参数 |
| 手续费率 | 交易手续费 | 量化交易参数 |
| 信号计算起始时间 | 从何时开始计算信号 | 模组设置/右键菜单 |

### 设置方法

#### 菜单设置（全局默认）
```
右上角菜单【量化】→ 设置保证金/手续费的量化交易参数
```

#### 临时调整（回测时）
- 回测K线图工具条中的按钮
- 设置当前合约的临时参数

### 信号计算起始时间

> ⚠️ 重要：数据计算起始 ≠ 信号计算起始
> 详细说明见官方文档：https://www.wenhua.com.cn/popwin/xhjsqzsj.html

```
数据起始 = 合约数据开始的时间（挂牌日期）
信号起始 = 你开始实际交易的时间
```

**示例**：
```
沪铜2201合约
数据起始：2021年1月18日（挂牌）
信号起始：2021年11月1日（开始交易）

信号计算起始时间 = 2021年11月1日
```

**为什么区分？**
- 合约挂牌初期交易不活跃，缺少流动性
- 你不会从挂牌就开始交易
- 信号计算应该从有实际交易价值的时间开始

---

## 三、回测报告指标

### 收益指标

| 指标 | 说明 |
|------|------|
| 收益率 | 总收益/本金 |
| 年化单利收益率 | 收益率/(测试天数/365) |
| 年化复利收益率 | (最终权益/本金)^(365/测试天数)-1 |
| 夏普比率 | (年化收益-无风险利率)/(收益标准差×√250) |
| 索提诺比率 | (年化收益-无风险利率)/(下行收益标准差×√250) |

### 风险指标

| 指标 | 说明 |
|------|------|
| 权益最大回撤 | 权益从高点到低点的最大跌幅 |
| 权益最大回撤比率 | 回撤/回撤时的权益 |
| 本金风险率 | (本金-最小权益)/本金 |
| 年化收益风险比率 | 年化收益/本金风险率 |

### 交易统计

| 指标 | 说明 |
|------|------|
| 胜率 | 盈利次数/总交易次数 |
| 盈亏比率 | 平均盈利/平均亏损 |
| 交易次数 | 完整买卖次数 |
| 最大持续亏损次数 | 最大连续亏损次数 |
| 单次最大亏损 | 单笔交易最大亏损 |

---

## 四，主连链回测

### 适用场景
- 中低频趋势策略
- 需要多年历史数据验证
- 对多个年度主力月份合约连续交易效果回测

### 优势
- 用月份合约K线数据计算信号
- 避免主连数据换月跳空
- 新主力重新计算信号

### 模型要求
```mql
// 不要写 TRADE_OTHER('ZHULIAN')
// 直接把模型加载到品种主连上
```

### 机制说明
1. 信号用各月份合约挂牌以来的完整K线数据计算
2. 主力切换时旧主力清仓
3. 新主力重新计算信号（延续旧主力清仓后的资金）

---

## 回测操作流程

### 历史信号调试
1. 加载模型到回测K线图
2. 查看信号明细（右键 → 信号明细）
3. 核对信号位置是否正确

### 参数优化
1. 主图回测后右键 → 枚举/遗传
2. 设置参数范围和步长
3. 根据参考标准筛选参数

### 主连链回测
1. 模型加载到品种主连
2. 右键 → 模型回测报告
3. 可查看月份合约独立报告

### 敏感性测试
1. 回测后右键 → 敏感性测试
2. 分析滑点/手续费变化对收益的影响
3. 评估策略实战能力

---

## 常见问题

### Q: 保证金、手续费在哪里设置？
A: 右上角菜单【量化】→ 设置保证金/手续费的量化交易参数

### Q: 初始资金在哪里分配？
A: 
- 回测K线图工具条按钮（临时调整）
- 右上角菜单【量化】→ 设置默认回测参数（默认设置）

### Q: 如何补充更久的数据？
A: 回测K线图右键 → 补充历史数据

### Q: 主连链回测用什么数据？
A: 用各月份合约挂牌以来的完整K线数据，不直接用主连K线图数据

### Q: 信号计算起始时间怎么设？
A: 设置为你实际开始交易的时间，不是数据开始的时间。详细说明见：https://www.wenhua.com.cn/popwin/xhjsqzsj.html


path: FUNCTIONS/cross.md
content: # WT8跨周期跨合约

## 目录
1. [跨周期引用](#一跨周期引用)
2. [跨合约引用](#二跨合约引用)
3. [综合示例](#三综合示例)

---

## 一、跨周期引用

### 语法
```mql
#IMPORT[PERIOD, N, FORMULA] AS VAR
```
- PERIOD：被引用周期（MIN1/DAY/WEEK等）
- N：周期倍数
- FORMULA：被引用指标名称

### 周期参数

| 参数 | 含义 |
|------|------|
| MIN1 | 1分钟 |
| MIN5 | 5分钟 |
| MIN15 | 15分钟 |
| MIN30 | 30分钟 |
| HOUR | 1小时 |
| DAY | 日线 |
| WEEK | 周线 |

### 示例：引用日线数据

```mql
// 第一步：建立日线指标 AA
AA
MA5:MA(C,5);
MA30:MA(C,30);
DAYCON1:MA5>MA30;  // 日线多头
DAYCON2:MA5<MA30;  // 日线空头
```

```mql
// 第二步：在分钟周期引用日线数据
#IMPORT[DAY,1,AA] AS VAR1

DAYCON1:VAR1.DAYCON1;
DAYCON2:VAR1.DAYCON2;

// 分钟周期自己的条件
MINCON1:CROSS(MA(CLOSE,5),MA(CLOSE,10));  // 分钟金叉
MINCON2:CROSSDOWN(MA(CLOSE,5),MA(CLOSE,10));  // 分钟死叉

// 综合判断
DAYCON1 && MINCON1, BPK;  // 日线多头 + 分钟金叉 → 做多
DAYCON2 && MINCON2, SPK;  // 日线空头 + 分钟死叉 → 做空

AUTOFILTER;
```

### 示例：引用多周期

```mql
// 日线指标
#IMPORT[DAY,1,AA] AS VAR1
DAYMA:VAR1.MA5;

// 小时周期指标
#IMPORT[HOUR,2,AA] AS VAR2  
HOURMA:VAR2.MA5;

// 分钟MACD
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26);
DEA:=EMA(DIFF,9);
MINCON1:CROSS(DIFF,DEA);
MINCON2:CROSSDOWN(DIFF,DEA);

// 三周期共振
VAR1.DAYCON1 && VAR2.HOURCON1 && MINCON1, BPK;
VAR1.DAYCON2 && VAR2.HOURCON2 && MINCON2, SPK;

AUTOFILTER;
```

---

## 二、跨合约引用

### 语法
```mql
#CALL["CODE", FORMULA] AS VAR
```
- CODE：被引用合约代码
- FORMULA：被引用指标名称

### 示例：引用板块指数

```mql
// 第一步：建立黑链指数指标
HG
MA5:MA(C,5);
MA10:MA(C,10);
MA30:MA(C,30);
HGCON1:MA5>MA10 && MA10>MA30;  // 板块多头
HGCON2:MA5<MA10 && MA10<MA30;  // 板块空头
```

```mql
// 第二步：在螺纹合约引用黑链指数
#CALL[7161,HG] AS VAR

HGCON1:VAR.HGCON1;
HGCON2:VAR.HGCON2;

// 螺纹自己的均线
MA5:MA(C,5);
MA30:MA(C,30);
WGCON1:CROSS(MA5,MA30);     // 螺纹金叉
WGCON2:CROSSDOWN(MA5,MA30);  // 螺纹死叉

// 综合判断：板块 + 单合约同向
HGCON1 && WGCON1, BPK;  // 板块多头 + 螺纹多头 → 做多
HGCON2 && WGCON2, SPK;  // 板块空头 + 螺纹空头 → 做空

AUTOFILTER;
```

### 常用板块代码
| 代码 | 品种 |
|------|------|
| 7161 | 黑链指数 |
| 7162 | 有色指数 |
| 7163 | 化工指数 |
| 7164 | 农产品指数 |

---

## 三、综合示例

### 三周期趋势策略

```mql
// ============================================
// 第一部分：建立各周期指标
// ============================================

// 日线指标（保存为 DAY_MA）
DAY_MA
MA5:MA(C,5);
MA10:MA(C,10);
DAYUP:MA5>MA10;        // 日线多头
DAYDN:MA5<MA10;        // 日线空头
```

```mql
// 小时指标（保存为 HOUR_MA）
HOUR_MA
MID:MA(CLOSE,26);
TMP2:=STD(CLOSE,26);
TOP:MID+2*TMP2;        // 布林上轨
BOTTOM:MID-2*TMP2;     // 布林下轨
HOURUP:C>TOP;          // 小时多头（突破上轨）
HOURDN:C<BOTTOM;       // 小时空头（跌破下轨）
```

```mql
// ============================================
// 第二部分：跨周期策略（加载到分钟周期）
// ============================================

// 引用日线
#IMPORT[DAY,1,DAY_MA] AS D
DAYUP:D.DAYUP;
DAYDN:D.DAYDN;

// 引用小时
#IMPORT[HOUR,1,HOUR_MA] AS H
HOURUP:H.HOURUP;
HOURDN:H.HOURDN;

// 分钟条件
MINUP:CROSS(CLOSE,MA(C,5));
MINDN:CROSSDOWN(CLOSE,MA(C,5));

// 三周期共振做多
DAYUP && HOURUP && MINUP, BPK;

// 三周期共振做空
DAYDN && HOURDN && MINDN, SPK;

// 止损
CLOSE<=BKPRICE-15*MINPRICE, SP;
CLOSE>=SKPRICE+15*MINPRICE, BP;

AUTOFILTER;
```

### 板块对冲策略

```mql
// 引用黑色系板块
#CALL[7161,HG] AS VAR

// 螺纹钢
MA5:MA(C,5);
MA30:MA(C,30);
RBUP:MA5>MA30;
RBDN:MA5<MA30;

// 螺纹与板块共振
RBUP && VAR.HGCON1, BK;    // 螺纹多头 + 板块多头
RBDN && VAR.HGCON2, SK;     // 螺纹空头 + 板块空头

// 平仓
CLOSE<MA30 && BKVOL>0, SP;
CLOSE>MA30 && SKVOL>0, BP;

AUTOFILTER;
```

---

## 注意事项

1. **被引用指标需先建立**
   - 先建立被引用指标的公式
   - 保存时记住公式名称
   - 再编写引用该指标的模型

2. **指标不需要加载**
   - 跨周期/跨合约模型加载时
   - 只需要加载主模型
   - 被引用指标不需要加载

3. **变量访问语法**
   - `VAR.变量名` 访问被引用变量
   - 注意大小写一致


path: FUNCTIONS/execution.md
content: # WT8运行优化函数

## 目录
1. [SIGCHECK](#一sigcheck)
2. [SETSIGPRICETYPE](#二setsigpricetype)
3. [信号复核机制](#三信号复核机制)
4. [注意事项](#四注意事项)

---

## 一、SIGCHECK

### 作用
在K线还没走完但条件已满足时发出交易指令，不需要等K线走完。

### 语法
```mql
SIGCHECK(MODE, TIME)
SIGCHECK_MIN(MODE, TIME)  // 分钟级
```
- MODE：确认模式（'A'/'B'/'C'）
- TIME：秒/分钟数（0-30）

### MODE 参数

| 模式 | 说明 |
|------|------|
| 'A' | K线走完前TIME秒确认信号下单，K线走完复核 |
| 'B' | BK线走完前TIME秒确认信号下单，K线走完复核 |
| 'C' | 最后一根K线走完前TIME秒确认信号下单，K线走完复核 |

### TIME 参数
- 取值范围：0-30
- 含义：
  - 分钟周期：TIME表示分钟数
  - 日线等：TIME表示秒数

### 示例

```mql
// K线走完前15秒下单，K线走完复核
SIGCHECK('B', 15);

// 均线策略
MA5:MA(C,5);
MA10:MA(C,10);
CROSS(MA5,MA10), BK;
CROSSDOWN(MA5,MA10), SP;

AUTOFILTER;
```

### 效果对比

| 方式 | 入场时机 | 成本 |
|------|----------|------|
| 默认 | 下一根K线开盘价 | 较高 |
| SIGCHECK | 条件满足时（更优价格） | 较低 |

---

## 二、SETSIGPRICETYPE

### 作用
设置信号的下单价格方式，提高成交率。

### 语法
```mql
SETSIGPRICETYPE(信号类型, 价格类型)
```

### 信号类型

| 类型 | 说明 |
|------|------|
| BK | 买开 |
| SK | 卖开 |
| BP | 买平 |
| SP | 卖平 |
| ADD_LONG | 多头加仓 |
| LOWER_LONG | 多头减仓 |
| ADD_SHORT | 空头加仓 |
| LOWER_SHORT | 空头减仓 |

### 价格类型

| 类型 | 说明 |
|------|------|
| 0 | 最新价 |
| 1 | 排队价（挂单价） |
| 2 | 对手价 |
| 3 | 超价 |
| 4 | 市价 |
| 5 | 触发价 |

### 示例

```mql
// 设置止损信号立即成交
SETSIGPRICETYPE(SP, 4);   // 止损用市价
SETSIGPRICETYPE(BP, 4);   // 止损用市价

// 设置开仓用对手价
SETSIGPRICETYPE(BK, 2);
SETSIGPRICETYPE(SK, 2);

// 均线策略
MA10:MA(C,10);
CROSS(CLOSE,MA10), BK;
CROSSDOWN(CLOSE,MA10), SK;

// 止损
CLOSE <= BKPRICE-10*MINPRICE, SP;
CLOSE >= SKPRICE+10*MINPRICE, BP;

AUTOFILTER;
```

---

## 三、信号复核机制

### 什么是信号消失（忽闪）
```
K线走完前：条件满足 → 出信号 → K线走完 → 条件不再满足 → 信号消失
```

### 信号复核的作用
- 消失的信号会被恢复持仓
- 保证交易策略完整执行

### 复核处理方式

| 信号消失 | 处理方式 |
|----------|----------|
| BK/SK消失 | 平仓 |
| ADD_LONG/ADD_SHORT消失 | 平仓 |
| BPK/SPK消失 | 平仓+恢复建仓 |
| BP/SP消失 | 恢复建仓 |
| LOWER_LONG/LOWER_SHORT消失 | 恢复建仓 |

### 示例

```mql
// K线走完前出信号就下单，K线走完复核
SIGCHECK('A', 0);

// 策略条件
MA10:MA(C,10);
MA20:MA(C,20);

// 条件严格，可能忽闪
条件A:=CROSS(MA10,MA20) AND VOL>1000;
条件B:=CROSSDOWN(MA10,MA20);

条件A, BK;
条件B, SK;

AUTOFILTER;
```

---

## 四、注意事项

### 适用场景
- 短线策略：需要精确入场点
- 突破策略：需要快速反应

### 不适用场景
- 长线策略：K线走完前出信号意义不大
- 依赖运行优化才能盈利的策略：可能过度优化

### 与页面盒子的关系
| 函数 | 页面盒子支持 |
|------|--------------|
| SIGCHECK | ❌ 不支持 |
| SETSIGPRICETYPE | ❌ 不支持 |

### 回测说明
- 回测报告仍用收盘价计算
- 运行优化收益差单独显示
- 信号明细提供对比参考

### 使用建议

1. **短线策略推荐使用**
   - 入场时机影响大
   - 滑点成本占比高

2. **长线策略谨慎使用**
   - 对结果影响不大
   - 可能干扰策略研究

3. **配合SETSIGPRICETYPE**
   - 止损用市价确保成交
   - 开仓用对手价降低成本

---

## 完整示例

```mql
// ============================================
// 运行优化示例：短线突破策略
// ============================================

// K线走完前15秒确认信号
SIGCHECK('B', 15);

// 设置下单价格
SETSIGPRICETYPE(BK, 2);   // 开仓用对手价
SETSIGPRICETYPE(SP, 4);   // 止损用市价
SETSIGPRICETYPE(SK, 2);
SETSIGPRICETYPE(BP, 4);

// 参数
N:=20;  // 止损跳数
M:=30;  // 止盈跳数

// 突破策略
HH20:=HHV(HIGH,20);
LL20:=LLV(LOW,20);

// 突破20日高点买开
CLOSE>HH20, BK;

// 跌破20日低点卖开
CLOSE<LL20, SK;

// 止损止盈
CLOSE<=BKPRICE-N*MINPRICE, SP;     // 亏损N跳止损
CLOSE>=BKPRICE+M*MINPRICE, SP;     // 盈利M跳止盈
CLOSE>=SKPRICE+N*MINPRICE, BP;
CLOSE<=SKPRICE-M*MINPRICE, BP;

AUTOFILTER;
```


path: FUNCTIONS/INDEX.md
content: # WT8麦语言函数索引

## 目录

1. [信号和指令 (signals.md)](signals.md) - BK, SK, BP, SP, ADD_LONG, LOWER_LONG 等
2. [技术指标 (indicators.md)](indicators.md) - MA, EMA, MACD,布林带等
3. [持仓资金管理 (position.md)](position.md) - MONEYTOT, BKVOL, SETDEALPERCENT 等
4. [回测函数 (backtest.md)](backtest.md) - AUTOFILTER, 历史回测相关
5. [优化函数 (optimization.md)](optimization.md) - 枚举、遗传、滚动调参
6. [跨周期跨合约 (cross.md)](cross.md) - #IMPORT, #CALL
7. [运行优化 (execution.md)](execution.md) - SIGCHECK, SETSIGPRICETYPE

---

## 按功能分类

### 价格数据变量
| 函数 | 说明 | 语法 |
|------|------|------|
| CLOSE | 当前收盘价 | `CLOSE` |
| OPEN | 当前开盘价 | `OPEN` |
| HIGH | 当前最高价 | `HIGH` |
| LOW | 当前最低价 | `LOW` |
| VOL | 成交量 | `VOL` |
| OI | 持仓量 | `OI` |
| REF(X,N) | N周期前的值 | `REF(CLOSE,5)` |
| MINPRICE | 最小变动价位 | `MINPRICE` |

### 技术指标函数
| 函数 | 说明 | 语法 |
|------|------|------|
| MA(X,N) | 简单移动平均 | `MA(CLOSE,20)` |
| EMA(X,N) | 指数移动平均 | `EMA(CLOSE,12)` |
| HHV(X,N) | N周期最高值 | `HHV(HIGH,10)` |
| LLV(X,N) | N周期最低值 | `LLV(LOW,10)` |
| CROSS(X,Y) | 上穿 | `CROSS(MA5,MA10)` |
| CROSSDOWN(X,Y) | 下穿 | `CROSSDOWN(MA5,MA10)` |

### 交易信号
| 函数 | 说明 | 语法 |
|------|------|------|
| BK | 买开 | `条件, BK;` |
| SK | 卖开 | `条件, SK;` |
| BP | 买平 | `条件, BP;` |
| SP | 卖平 | `条件, SP;` |
| BPK | 反手买 | `条件, BPK;` |
| SPK | 反手卖 | `条件, SPK;` |

### 加减仓指令
| 函数 | 说明 | 语法 |
|------|------|------|
| ADD_LONG(N) | 多头加仓N手 | `条件, ADD_LONG(2);` |
| LOWER_LONG(N) | 多头减仓N手 | `条件, LOWER_LONG(1);` |
| ADD_SHORT(N) | 空头加仓N手 | `条件, ADD_SHORT(2);` |
| LOWER_SHORT(N) | 空头减仓N手 | `条件, LOWER_SHORT(1);` |

### 价格获取
| 函数 | 说明 | 语法 |
|------|------|------|
| BKPRICE | 多头开仓价 | `CLOSE < BKPRICE - 10` |
| SKPRICE | 空头开仓价 | `CLOSE > SKPRICE + 10` |
| BKHIGH | 多头持仓期间最高价 | `CLOSE < BKHIGH - 20` |
| SKLOW | 空头持仓期间最低价 | `CLOSE > SKLOW + 20` |

### 持仓查询
| 函数 | 说明 | 语法 |
|------|------|------|
| BKVOL | 多头持仓手数 | `BKVOL > 0` |
| SKVOL | 空头持仓手数 | `SKVOL > 0` |
| VOL() | 总持仓手数 | `VOL() > 0` |

### 资金查询
| 函数 | 说明 | 语法 |
|------|------|------|
| MONEYTOT | 当前权益 | `MONEYTOT <= INITMONEY*0.9` |
| INITMONEY | 初始资金 | `INITMONEY + 10000` |
| BKVOL | 持仓手数 | `BKVOL > 0` |

### 头寸管理
| 函数 | 说明 | 语法 |
|------|------|------|
| SETDEALPERCENT(f,n) | 按资金比例下单 | `SETDEALPERCENT(20,10);` |
| T_COMMAND(N) | 设置开仓手数 | `T_COMMAND(5);` |
| TRADE_AGAIN(N) | 加减仓可连续N次 | `TRADE_AGAIN(3);` |

### 信号过滤
| 函数 | 说明 | 语法 |
|------|------|------|
| AUTOFILTER | 信号过滤 | `AUTOFILTER;` |

### 运行优化
| 函数 | 说明 | 语法 |
|------|------|------|
| SIGCHECK(M,T) | 信号复核 | `SIGCHECK('B',15);` |
| SIGCHECK_MIN(M,T) | 分钟级复核 | `SIGCHECK_MIN('A',5);` |

### 跨周期跨合约
| 函数 | 说明 | 语法 |
|------|------|------|
| #IMPORT | 跨周期引用 | `#IMPORT[DAY,1,AA]ASVAR1` |
| #CALL | 跨合约引用 | `#CALL["RB",AA]ASVAR` |

### 指定交易合约
| 函数 | 说明 | 语法 |
|------|------|------|
| TRADE_OTHER(X) | 指定交易合约 | `TRADE_OTHER('RB2410');` |
| TRADE_OTHER('ZHULIAN') | 主连自动换月 | `TRADE_OTHER('ZHULIAN');` |

---

## 快速查找

### 想实现这个功能？
| 功能 | 函数 |
|------|------|
| 均线金叉买开 | `CROSS(MA5,MA10), BK;` |
| 均线死叉卖平 | `CROSSDOWN(MA5,MA10), SP;` |
| 亏损N跳止损 | `CLOSE <= BKPRICE-N*MINPRICE, SP;` |
| 盈利M跳止盈 | `CLOSE >= BKPRICE+M*MINPRICE, SP;` |
| 权益回撤10%止损 | `MONEYTOT<=INITMONEY*(1-10/100), SP;` |
| 按资金20%下单 | `SETDEALPERCENT(20,10);` |
| 多头加仓两手 | `条件, ADD_LONG(2);` |
| 动态追踪止损 | `CLOSE <= BKHIGH-N*MINPRICE, SP;` |
| 引用日线数据 | `#IMPORT[DAY,1,AA]ASVAR1` |
| K线走完前15秒下单 | `SIGCHECK('B',15);` |


path: FUNCTIONS/indicators.md
content: # WT8技术指标函数

## 目录
1. [移动平均线](#一移动平均线)
2. [最高最低](#二最高最低)
3. [交叉判断](#三交叉判断)
4. [布林带](#四布林带)
5. [MACD](#五macd)
6. [其他常用](#六其他常用)

---

## 一、移动平均线

### MA - 简单移动平均
```mql
MA(X, N)
```
- X：数据序列
- N：周期数
- 返回：N周期简单平均值

```mql
MA5:MA(C,5);     // 5日均线
MA10:MA(C,10);   // 10日均线
MA20:MA(C,20);   // 20日均线
```

### EMA - 指数移动平均
```mql
EMA(X, N)
```
- X：数据序列
- N：周期数
- 返回：N周期指数加权平均值

```mql
EMA12:EMA(C,12);  // 12日指数均线
EMA26:EMA(C,26);  // 26日指数均线
```

### SMA - 平滑移动平均
```mql
SMA(X, N, M)
```
- X：数据序列
- N：周期
- M：权重
- 返回：(M*X + (N-M)*昨日SMA) / N

---

## 二、最高最低

### HHV - N周期最高值
```mql
HHV(X, N)
```
- X：数据序列
- N：周期数
- 返回：最近N个周期中X的最大值

```mql
HHV10:HHV(HIGH,10);   // 10周期最高价
HHV(HIGH,20), BK;     // 创20周期新高买开
```

### LLV - N周期最低值
```mql
LLV(X, N)
```
- X：数据序列
- N：周期数
- 返回：最近N个周期中X的最小值

```mql
LLV10:LLV(LOW,10);   // 10周期最低价
LLV(LOW,20), SK;      // 创20周期新低卖开
```

### HHVBARS - 距最高价的周期数
```mql
HHVBARS(X, N)
```
- 返回：当前时点距离N周期内最高价的K线根数

```mql
HHVBARS(HIGH,20)=0, SP;  // 创20日新高平多
```

### LLVBARS - 距最低价的周期数
```mql
LLVBARS(X, N)
```
- 返回：当前时点距离N周期内最低价的K线根数

---

## 三、交叉判断

### CROSS - 上穿
```mql
CROSS(X, Y)
```
- X上穿Y：X从下方穿越到Y上方
- 返回：1（成立）或0（不成立）

```mql
CROSS(MA5,MA10), BK;   // 5日均线上穿10日均线买开
```

### CROSSDOWN - 下穿
```mql
CROSSDOWN(X, Y)
```
- X下穿Y：X从上方穿越到Y下方
- 返回：1（成立）或0（不成立）

```mql
CROSSDOWN(MA5,MA10), SP;  // 5日均线下穿10日均线卖平
```

### 示例：双均线策略
```mql
MA5:MA(C,5);
MA10:MA(C,10);

// 金叉买开
CROSS(MA5,MA10), BK;

// 死叉卖平
CROSSDOWN(MA5,MA10), SP;

AUTOFILTER;
```

---

## 四、布林带

### BOLL - 布林带
```mql
MID:MA(CLOSE,26);                    // 中轨
TMP2:=STD(CLOSE,26);                // 标准差
TOP:MID+2*TMP2;                      // 上轨
BOTTOM:MID-2*TMP2;                   // 下轨
```

### STD - 标准差
```mql
STD(X, N)
```
- X：数据序列
- N：周期数
- 返回：N周期标准差

```mql
STD20:STD(CLOSE,20);  // 20周期收盘价标准差
```

### 用法示例
```mql
MID:MA(C,26);
TMP2:=STD(C,26);
TOP:MID+2*TMP2;
BOTTOM:MID-2*TMP2;

// 价格上穿上轨买开
CROSS(CLOSE,TOP), BK;

// 价格下穿下轨卖开
CROSSDOWN(CLOSE,BOTTOM), SK;

// 价格回到中轨平仓
CROSSDOWN(CLOSE,MID), SP;

AUTOFILTER;
```

---

## 五、MACD

### MACD默认公式
```mql
DIF:EMA(CLOSE,12)-EMA(CLOSE,26);  // 快线
DEA:EMA(DIF,9);                     // 慢线
MACD:(DIF-DEA)*2;                   // 柱状图
```

### 金叉死叉
```mql
// MACD金叉（DIF上穿DEA）
CROSS(DIF,DEA), BK;

// MACD死叉（DIF下穿DEA）
CROSSDOWN(DIF,DEA), SP;
```

### 零轴判断
```mql
// DIF在零轴上方
DIF>0, BK;

// DIF在零轴下方
DIF<0, SK;
```

---

## 六、其他常用

### REF - 引用N周期前的值
```mql
REF(X, N)
```
- X：数据序列
- N：周期数
- 返回：N周期前的X值

```mql
REF(CLOSE,1);       // 上一根K线收盘价
REF(HIGH,5)=HHV(HIGH,20);  // 创20日新高
```

### SUM - 求和
```mql
SUM(X, N)
```
- X：数据序列
- N：周期数
- 返回：N周期X的总和

```mql
SUM(VOL,10)/10;     // 10周期平均成交量
SUM(VOL,5)>SUM(VOL,20), BK;  // 5日均量大于20日均量
```

### ABS - 绝对值
```mql
ABS(X)
```
- 返回：X的绝对值

```mql
ABS(CLOSE-BKPRICE);  // 持仓盈亏点数
```

### MAX - 最大值
```mql
MAX(X, Y)
```
- 返回：X和Y中的较大值

### MIN - 最小值
```mql
MIN(X, Y)
```
- 返回：X和Y中的较小值

### IF - 条件取值
```mql
IF(条件, X, Y)
```
- 条件成立返回X，否则返回Y

```mql
IF(CLOSE>MA(C,10), 1, 0);  // 价格在均线上返回1
```

### BETWEEN - 区间判断
```mql
BETWEEN(X, A, B)
```
- X在A和B之间（含）返回1

```mql
BETWEEN(CLOSE, MA(C,10), MA(C,20));  //价格在两条均线之间
```

---

## 指标组合示例

### 趋势跟踪策略
```mql
// 参数
N1:=10;  // 短周期
N2:=20;  // 长周期

// 均线
MA1:MA(C,N1);
MA2:MA(C,N2);

// 趋势判断
多头:=MA1>MA2;
空头:=MA1<MA2;

// 交易
多头 AND CROSS(CLOSE,MA1), BK;      // 多头趋势且价格上穿短均线买开
NOT 多头, SP;                        // 不再是多头就平仓

空头 AND CROSSDOWN(CLOSE,MA1), SK;  // 空头趋势且价格下穿短均线卖开
NOT 空头, BP;                        // 不再是空头就平仓

AUTOFILTER;
```

### 突破策略
```mql
// 20日高低点突破
HH20:HHV(HIGH,20);
LL20:LLV(LOW,20);

// 突破20日高点买开
CLOSE>HH20, BK;

// 跌破20日低点卖开
CLOSE<LL20, SK;

// 止损
CLOSE<BKPRICE-10*MINPRICE, SP;
CLOSE>SKPRICE+10*MINPRICE, BP;

AUTOFILTER;
```


path: FUNCTIONS/optimization.md
content: # WT8参数优化函数

## 目录
1. [枚举](#一枚举)
2. [遗传](#二遗传)
3. [滚动调参](#三滚动调参)
4. [优化原则](#四优化原则)

---

## 一、枚举

### 适用场景
- 策略研发初期
- 参数范围较小
- 需要了解参数收益分布

### 操作方法
```
主图回测后右键菜单 → 枚举
```

### 枚举原理
- 按步长遍历范围内所有参数组合
- 全排列计算
- 计算量大但全面

### 参数关系设置
```mql
// 示例：两个均线参数
N1 < N2;  // 设置参数关系，减少计算量
```
- 每配置一个参数关系，计算量减少一半
- 设置4个关系，减少到原来的1/16

### 寻找稳定参数
1. 枚举计算后点击【寻找稳定参数】
2. 进入参数分布热力图
3. 颜色渐变越不明显，参数越稳定

---

## 二、遗传

### 适用场景
- 参数范围较大
- 需要精调参数
- 定期检验模型有效性

### 操作方法
```
主图回测后右键菜单 → 参数优化 → 遗传
```

### 遗传原理
- 模拟自然进化过程
- 遗传、交叉、变异
- 随机全局优化

### 参数设置

| 参数 | 说明 |
|------|------|
| 族群大小 | 初始种群数量 |
| 最大遗传代数 | 迭代次数 |
| 参考标准 | 排序依据（收益率/胜率等） |

### 优势
- 避免陷入局部最优
- 有变异性，覆盖面广
- 计算效率高

---

## 三、滚动调参

### 适用场景
- 短线震荡类模型
- 需要定期调参
- 评估动态调参效果

### 操作方法
```
主图回测后右键菜单 → 参数优化 → 滚动调参
```

### 参数设置

| 参数 | 说明 |
|------|------|
| 调参间隔 | 多久调参一次 |
| 回测数据长度 | 每次用多长数据优化 |
| 参数优化方法 | 枚举/遗传 |
| 参数筛选标准 | 参考标准 |

### 机制说明
```
示例：调参间隔30日，回测数据长度60日

第1阶段：用前60日数据优化 → 用于后30日
第2阶段：用前60日数据优化 → 用于后30日
...依此类推
```

### 回测报告
- 各阶段合并的总体回测报告
- 分析定期调参方案可行性

---

## 四、优化原则

### 追求参数高原，而非参数孤岛

```
┌─────────────────────────────────────┐
│           参数高原（好）              │
│   ┌───┬───┬───┬───┬───┐           │
│   │ 6 │ 7 │ 8 │ 7 │ 6 │           │
│   ├───┼───┼───┼───┼───┤           │
│   │ 7 │ 8 │ 9 │ 8 │ 7 │  ← 稳定   │
│   ├───┼───┼───┼───┼───┤           │
│   │ 6 │ 7 │ 8 │ 7 │ 6 │           │
│   └───┴───┴───┴───┴───┘           │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│           参数孤岛（坏）              │
│   ┌───┬───┬───┬───┬───┐           │
│   │ 1 │ 2 │ 1 │ 2 │ 1 │           │
│   ├───┼───┼───┼───┼───┤           │
│   │ 2 │ 5 │10 │ 5 │ 2 │  ← 不稳定 │
│   ├───┼───┼───┼───┼───┤           │
│   │ 1 │ 2 │ 1 │ 2 │ 1 │           │
│   └───┴───┴───┴───┴───┘           │
└─────────────────────────────────────┘
```

### 参数优化注意事项

1. **综合长期和短期数据**
   - 用近期数据优化 → 得到短期参数表
   - 用长期数据优化 → 得到长期参数表
   - 取交集 → 长期短期都表现好的参数

2. **避免参数过多**
   - 参数越多，过度拟合风险越大
   - 需要同时满足多个参数条件才有效
   - 市场波动可能导致黑天鹅

3. **评价标准**
   - 盈亏比 × 胜率 > 0.6 可盈利
   - 乘积越大，模型越好
   - 结合夏普比率、回撤等综合评估

### 敏感性测试
```
回测后右键 → 敏感性测试
```
- 分析滑点/手续费变化对收益的影响
- 滑点增大模型失效 → 不适合实盘
- 评估策略实战能力

---

## 快速参考

| 优化方法 | 适用场景 | 优缺点 |
|----------|----------|--------|
| 枚举 | 小范围、全局扫描 | 全面但慢 |
| 遗传 | 大范围、精调 | 高效但随机 |
| 滚动调参 | 定期调参验证 | 贴合实际 |


path: FUNCTIONS/position.md
content: # WT8持仓资金管理函数

## 目录
1. [持仓查询](#一持仓查询)
2. [资金查询](#二资金查询)
3. [头寸管理](#三头寸管理)
4. [止损止盈](#四止损止盈)
5. [风控函数](#五风控函数)

---

## 一、持仓查询

### BKVOL - 多头持仓手数
```mql
BKVOL
```
- 返回：当前多头持仓手数
- 示例：
```mql
BKVOL > 0;          // 有多头持仓
BKVOL >= 3;         // 多头持仓至少3手
BKVOL > 0 AND CLOSE < BKPRICE, SP;  // 有多头且亏损就平仓
```

### SKVOL - 空头持仓手数
```mql
SKVOL
```
- 返回：当前空头持仓手数
- 示例：
```mql
SKVOL > 0;          // 有空头持仓
SKVOL < 3;          // 空头持仓少于3手
```

### VOL() - 总持仓手数
```mql
VOL()
```
- 返回：总持仓手数（多头+空头的绝对值）
- 示例：
```mql
VOL() = 0;         // 无持仓
VOL() > 0;         // 有持仓
```

---

## 二、资金查询

### MONEYTOT - 当前权益
```mql
MONEYTOT
```
- 返回：当前总权益（含浮动盈亏）
- 说明：账户可用资金 + 持仓保证金 + 浮动盈亏
- 示例：
```mql
MONEYTOT <= INITMONEY * 0.9;     // 权益回撤10%
MONEYTOT > INITMONEY * 1.1;      // 盈利超过10%
```

### INITMONEY - 初始资金
```mql
INITMONEY
```
- 返回：回测/运行设置的初始资金
- 示例：
```mql
INITMONEY + 10000;               // 在初始资金基础上加1万
MONEYTOT / INITMONEY;            // 计算收益率
```

### 权益计算公式
```
当前权益 = 可用资金 + 持仓保证金 + 浮动盈亏
```

---

## 三、头寸管理

### SETDEALPERCENT - 按资金比例下单
```mql
SETDEALPERCENT(fPercent, N)
```
- fPercent：下单资金占理论资金的比例（%）
- N：最大下单手数
- 作用：每次按当前理论资金的比例下单

```mql
SETDEALPERCENT(20, 10);  // 每次按理论资金的20%下单，最大10手
```

**示例场景**：
```mql
// 初始资金10万，保证金率10%
// 按20%资金使用率下单，螺纹钢10吨/手，假设价格4000
// 下单手数 = 100000 * 20% / (4000 * 10 * 10%) = 5手
```

### T_COMMAND - 设置开仓手数
```mql
T_COMMAND(N)
```
- N：固定开仓手数
- 作用：设置首次建仓的手数

```mql
T_COMMAND(5);  // 每次开仓5手
```

### TRADE_AGAIN - 加减仓可重复次数
```mql
TRADE_AGAIN(N)
```
- N：同一行加减仓指令最多连续出现的次数
- 作用：允许分批加仓/减仓

```mql
TRADE_AGAIN(3);  // 加减仓可连续3次
CLOSE > BKPRICE * 1.02, ADD_LONG(BKVOL/2);  // 每次盈利2%加仓一半
```

---

## 四、止损止盈

### BKPRICE - 多头开仓价
```mql
BKPRICE
```
- 返回：多头开仓的平均价格
- 示例：
```mql
// 固定点差止损：亏损N跳止损
N:=10;
CLOSE <= BKPRICE - N*MINPRICE, SP;

// 固定比例止损：亏损5%止损
CLOSE <= BKPRICE * (1-5/100), SP;
```

### SKPRICE - 空头开仓价
```mql
SKPRICE
```
- 返回：空头开仓的平均价格
- 示例：
```mql
// 固定点差止损
N:=10;
CLOSE >= SKPRICE + N*MINPRICE, BP;
```

### BKHIGH - 多头持仓期间最高价
```mql
BKHIGH
```
- 返回：多头持仓以来的最高价
- 用途：动态追踪止损

```mql
// 动态追踪止损：从最高点回撤N跳止损
N:=20;
CLOSE <= BKHIGH - N*MINPRICE, SP;
```

### SKLOW - 空头持仓期间最低价
```mql
SKLOW
```
- 返回：空头持仓以来的最低价
- 用途：动态追踪止损

```mql
// 动态追踪止损
N:=20;
CLOSE >= SKLOW + N*MINPRICE, BP;
```

### MINPRICE - 最小变动价位
```mql
MINPRICE
```
- 返回：当前合约的最小跳动
- 说明：螺纹钢=1，沪铜=10，股指=0.2

```mql
// 用MINPRICE计算跳数
CLOSE - BKPRICE >= 10*MINPRICE;  // 盈利至少10跳
```

---

## 五、风控函数

### 权益回撤止损
```mql
// 权益回撤超过20%清仓
MONEYTOT <= INITMONEY * (1-20/100), SP;   // 多头清仓
MONEYTOT <= INITMONEY * (1-20/100), BP;   // 空头清仓
```

### 权益回撤比计算
```mql
HM:=HHV(MONEYTOT, BARPOS);  // 历史最高权益
QY:(HM-MONEYTOT)/HM;         // 权益回撤比
QY > 0.2, SP;                 // 回撤超过20%平多
```

### 连续亏损控制
```mql
Q:=TNUMSEQLOSS;  // 持续亏损次数
T:=IF(LASTOFFSETPROFIT>=0, N, N+Q);  // 亏损后手数+N
TC:=MIN(T, 10);   // 最大10手
T_COMMAND(TC);
```

### 保本止损
```mql
// 开多后最高上涨超过N跳，回落到开仓价+M跳保本平多
N:=20;
M:=5;
BKHIGH>BKPRICE+N*MINPRICE && CLOSE<=BKPRICE+M*MINPRICE, SP;
```

---

## 完整示例

### 示例1：带止损的趋势策略
```mql
// 参数
N:=10;  // 止损跳数

MA5:MA(C,5);
MA20:MA(C,20);

// 开仓条件
CROSS(MA5,MA20), BK;
CROSSDOWN(MA5,MA20), SK;

// 止损
CLOSE <= BKPRICE - N*MINPRICE, SP;
CLOSE >= SKPRICE + N*MINPRICE, BP;

AUTOFILTER;
```

### 示例2：动态追踪止损
```mql
// 参数
N:=20;  // 回撤跳数

// 开仓
MA5:MA(C,5);
MA10:MA(C,10);
CROSS(MA5,MA10), BK;
CROSSDOWN(MA5,MA10), SK;

// 动态追踪止损
CLOSE <= BKHIGH - N*MINPRICE, SP;
CLOSE >= SKLOW + N*MINPRICE, BP;

AUTOFILTER;
```

### 示例3：按资金比例下单
```mql
// 每次按资金的20%下单，最大5手
SETDEALPERCENT(20,5);

// 均线策略
MA10:MA(C,10);
MA20:MA(C,20);

CROSS(MA10,MA20), BK;
CROSSDOWN(MA10,MA20), SP;

// 止损
CLOSE <= BKPRICE*0.98, SP;
CLOSE >= SKPRICE*1.02, BP;

AUTOFILTER;
```

### 示例4：权益风控
```mql
// 权益回撤10%止损
HM:=HHV(MONEYTOT,BARPOS);
QY:=(HM-MONEYTOT)/HM;
QY>0.1, SP;
QY>0.1, BP;

// 均线策略
MA20:MA(C,20);
CLOSE>MA20, BK;
CLOSE<MA20, SP;

AUTOFILTER;
```


path: FUNCTIONS/signals.md
content: # WT8信号和指令详解

> 📖 **官方文档参考**：
> - 操作符语法：https://www.wenhua.com.cn/guide/views41a.htm
> - 基本语法：https://www.wenhua.com.cn/guide/views41a3.htm
> - 信号过滤明细：https://www.wenhua.com.cn/popwin/guolvmx3.htm

## 目录
1. [开平仓信号](#一开平仓信号)
2. [加减仓指令](#二加减仓指令)
3. [信号执行机制](#三信号执行机制)
4. [信号过滤机制](#四信号过滤机制)

---

## 一、开平仓信号

### 基本语法
```mql
条件, 信号;
```
**重要**：信号必须和条件一起使用，不能单独写信号！

### 信号类型表

| 信号 | 含义 | 使用场景 |
|------|------|----------|
| BK | 买开 | 做多开仓 |
| SK | 卖开 | 做空开仓 |
| BP | 买平 | 平空仓 |
| SP | 卖平 | 平多仓 |
| BPK | 反手买 | 平空仓+等量买开（空转多） |
| SPK | 反手卖 | 平多仓+等量卖开（多转空） |

### 详细说明

#### BK - 买开
```mql
// 价格上穿10日均线，买开
CROSS(CLOSE, MA(C,10)), BK;
```
- 作用：买入开仓，做多
- 执行后：产生多头持仓（BKVOL > 0）

#### SK - 卖开
```mql
// 价格下穿10日均线，卖开
CROSSDOWN(CLOSE, MA(C,10)), SK;
```
- 作用：卖出开仓，做空
- 执行后：产生空头持仓（SKVOL > 0）

#### BP - 买平
```mql
// 条件满足时，买入平空
条件, BP;
```
- 作用：平掉空头持仓
- 注意：只有在有空头持仓时才能执行

#### SP - 卖平
```mql
// 条件满足时，卖出平多
条件, SP;
```
- 作用：平掉多头持仓
- 注意：只有在有多头持仓时才能执行

#### BPK - 反手买
```mql
// 反手买：平空仓+等量买开
条件, BPK;
```
- 等价于：`BP;` + `BK;`（同一行内）
- 用于：空头持仓时，看多

#### SPK - 反手卖
```mql
// 反手卖：平多仓+等量卖开
条件, SPK;
```
- 等价于：`SP;` + `SK;`（同一行内）
- 用于：多头持仓时，看空

### 使用建议

| 场景 | 推荐信号 |
|------|----------|
| 一直持仓，非多即空 | `BPK` / `SPK` |
| 可能空仓 | `BK` / `SK` + `BP` / `SP` |
| 需要分批建仓 | `BK` + `ADD_LONG` |
| 需要止损/止盈 | `SP` / `BP` |

---

## 二、加减仓指令

### 基本语法
```mql
条件, 指令(手数);
```
**重要**：指令必须带手数！

### 指令类型表

| 指令 | 含义 | 语法 |
|------|------|------|
| ADD_LONG | 多头加仓 | `条件, ADD_LONG(N);` |
| LOWER_LONG | 多头减仓 | `条件, LOWER_LONG(N);` |
| ADD_SHORT | 空头加仓 | `条件, ADD_SHORT(N);` |
| LOWER_SHORT | 空头减仓 | `条件, LOWER_SHORT(N);` |

### 详细说明

#### ADD_LONG(N) - 多头加仓
```mql
// 盈利2%时，加仓2手
CLOSE > BKPRICE*(1+2/100), ADD_LONG(2);
```
- 作用：在多头持仓基础上增加持仓
- 要求：必须有多头持仓（BKVOL > 0）

#### LOWER_LONG(N) - 多头减仓
```mql
// 亏损1%时，减仓1手
CLOSE < BKPRICE*(1-1/100), LOWER_LONG(1);
```
- 作用：减少多头持仓
- 要求：持仓手数 >= N

#### ADD_SHORT(N) - 空头加仓
```mql
// 盈利时，空头加仓
条件, ADD_SHORT(2);
```
- 作用：在空头持仓基础上增加持仓
- 要求：必须有空头持仓（SKVOL > 0）

#### LOWER_SHORT(N) - 空头减仓
```mql
// 条件满足时，空头减仓
条件, LOWER_SHORT(1);
```
- 作用：减少空头持仓
- 要求：持仓手数 >= N

### 加减仓特点
- **不视为交易结束**：加减仓后仍是同一笔交易
- **必须先开仓**：没有持仓时不能加减仓
- **可以连续出信号**：使用 `TRADE_AGAIN(N)` 允许同一行加减仓连续N次

### TRADE_AGAIN 函数
```mql
TRADE_AGAIN(N);  // 允许同一行加减仓指令连续出现最多N次
```
- 作用：解决盈利后想分批加仓的需求
- 示例：
```mql
TRADE_AGAIN(3);  // 同一行加减仓可连续3次
CLOSE > BKPRICE*1.02, ADD_LONG(BKVOL/2);  // 每次盈利2%加仓一半
```

---

## 三、信号执行机制

### 执行原则

1. **信号优先级高于指令**
   - BK/SK/BP/SP/BPK/SPK > ADD_LONG/LOWER_LONG/ADD_SHORT/LOWER_SHORT

2. **从开仓到平仓是一个完整交易**
   - 减仓不视为交易结束
   - 必须出现平仓信号（SP/BP）才算结束

3. **开平仓信号一一对应**
   - BK/SK/BPK/SPK 开仓后只能出现加减仓或平仓信号
   - BP/SP 平仓后只能出现开仓信号

4. **K线执行时机**
   - 默认：K线最后一笔价格确定信号，下一根K线开始下单
   - 优化：使用 `SIGCHECK` 可在K线走完前下单

### 执行流程图
```
开仓信号(BK/SK)
     │
     ▼
加减仓指令(ADD/LOWER) ──可重复N次──┐
     │                               │
     │ (不结束交易)                   │
     ▼                               │
平仓信号(SP/BP) ◄───────────────────┘
     │
     ▼
  交易结束
```

---

## 四、信号过滤机制

> ⚠️ 详细过滤规则见官方文档：https://www.wenhua.com.cn/popwin/guolvmx3.htm

### AUTOFILTER 必要性
```mql
AUTOFILTER;  // 必须写！过滤重复信号
```

### 一开一平过滤
- 开仓后不再出开仓信号
- 平仓后不再出平仓信号
- 同一笔交易内只保留第一个有效开仓信号

### 加减仓过滤
- 同一行加减仓指令一轮只出一次
- 需要先出减仓才能再出同一行加仓
- 使用 `TRADE_AGAIN(N)` 允许连续N次

### 示例：完整的交易模型
```mql
// 基础框架
条件A, BK;           // 开多
条件B, SP;           // 止损/平多
条件C, SP;           // 平多，结束交易

条件A1, SK;          // 开空
条件B1, BP;          // 止损/平空
条件C1, BP;          // 平空，结束交易

AUTOFILTER;          // 必须写！
```

---

## 常见错误

### ❌ 错误1：信号不带条件
```mql
// 错误
BK;  // 信号不能单独使用！

// 正确
CROSS(CLOSE, MA(C,10)), BK;
```

### ❌ 错误2：加减仓不带手数
```mql
// 错误
ADD_LONG;  // 缺少手数！

// 正确
ADD_LONG(2);  // 加仓2手
```

### ❌ 错误3：忘记写AUTOFILTER
```mql
// 错误
CROSS(CLOSE,MA), BK;
CROSSDOWN(CLOSE,MA), SP;
// 缺少 AUTOFILTER!

// 正确
CROSS(CLOSE,MA), BK;
CROSSDOWN(CLOSE,MA), SP;
AUTOFILTER;
```

### ❌ 错误4：没有持仓时加减仓
```mql
// 假设当前没有持仓
ADD_LONG(1);  // 无效！必须先BK开仓
```

### ❌ 错误5：平仓信号写在开仓前面
```mql
// 错误写法
SP;     // 平仓写在前面
BK;     // 开仓写在后面

// 正确写法
BK;     // 开仓
SP;     // 平仓
```


path: EXAMPLES/basic_model.md
content: # WT8麦语言示例：双均线策略

## 策略逻辑

双均线交叉策略是最经典的量化交易策略之一：

| 条件 | 信号 | 含义 |
|------|------|------|
| 短期上穿长期（金叉） | BK | 买开仓 |
| 短期下穿长期（死叉） | SK | 卖开仓 |
| 金叉（有空仓） | SP | 卖平空仓 |
| 死叉（有多仓） | BP | 买平多仓 |

---

## 完整代码

```mql
// ============================================
// 双均线交叉策略
// ============================================

// 步骤1：定义参数（赋值用 :=）
N1 := 10;   // 短期均线周期
N2 := 20;   // 长期均线周期

// 步骤2：计算均线（赋值用 :=）
MA_SHORT := MA(C, N1);   // 短期均线
MA_LONG := MA(C, N2);   // 长期均线

// 步骤3：判断交叉条件
金叉 := CROSSUP(MA_SHORT, MA_LONG);   // 短上穿长（金叉）
死叉 := CROSSDOWN(MA_SHORT, MA_LONG); // 短下穿长（死叉）

// 步骤4：开仓信号（条件,信号;）
金叉, BK;      // 金叉买开
死叉, SK;      // 死叉卖开

// 步骤5：平仓信号
金叉, SP;      // 金叉平空仓
死叉, BP;      // 死叉平多仓

// 步骤6：信号过滤（必须写！）
AUTOFILTER;
```

---

## 代码说明

### 步骤1：参数定义
```mql
N1 := 10;   // 短期均线周期
N2 := 20;   // 长期均线周期
```
- 使用 `:=` 赋值
- 参数可后续优化调整

### 步骤2：计算均线
```mql
MA_SHORT := MA(C, N1);
MA_LONG := MA(C, N2);
```
- `MA(X, N)` = N周期简单移动平均
- `C` = 收盘价（必须大写）

### 步骤3：交叉条件
```mql
金叉 := CROSSUP(MA_SHORT, MA_LONG);    // 上穿
死叉 := CROSSDOWN(MA_SHORT, MA_LONG); // 下穿
```
- `CROSSUP(X, Y)` = X上穿Y
- `CROSSDOWN(X, Y)` = X下穿Y

### 步骤4-5：交易信号
```mql
金叉, BK;   // 金叉买开
死叉, SK;   // 死叉卖开
金叉, SP;   // 金叉平空
死叉, BP;   // 死叉平多
```
- 格式：`条件, 信号;`
- `AUTOFILTER` 保证一开一平

### 步骤6：信号过滤
```mql
AUTOFILTER;
```
- **必须写！**
- 过滤重复信号
- 保证一开一平机制

---

## 执行流程

```
无持仓 + 金叉 → BK（买开）→ 多头持仓
    ↓
多头持仓 + 死叉 → BP（买平）→ 无持仓
    ↓
无持仓 + 死叉 → SK（卖开）→ 空头持仓
    ↓
空头持仓 + 金叉 → SP（卖平）→ 无持仓
    ↓
循环...
```

---

## 注意事项

### ✅ 正确写法
```mql
金叉 := CROSSUP(MA_S, MA_L);
金叉, BK;    // 金叉时买开
```

### ❌ 常见错误
```mql
// 错误1：赋值用 =
MA_S = MA(C,10);  // 错！

// 错误2：信号没有条件
BK;  // 错！

// 错误3：忘记AUTOFILTER
// 漏写！
```

---

## 扩展：添加止损

```mql
// 双均线 + 止损
N1 := 10;
N2 := 20;
止损 := 15;  // 止损跳数

MA_S := MA(C, N1);
MA_L := MA(C, N2);

金叉 := CROSSUP(MA_S, MA_L);
死叉 := CROSSDOWN(MA_S, MA_L);

// 开仓
金叉, BK;
死叉, SK;

// 平仓
金叉, SP;
死叉, BP;

// 止损（比较用 <= 或 >=）
CLOSE <= BKPRICE - 止损*MINPRICE, SP;  // 多头止损
CLOSE >= SKPRICE + 止损*MINPRICE, BP;   // 空头止损

AUTOFILTER;
```


path: EXAMPLES/batch_entry.md
content: # WT8分批进出示例

## 一、分批建仓

```mql
// 分批建仓示例
// 先开6手，盈利后加仓

// 每次固定开仓6手
T_COMMAND(6);

// 允许加减仓指令连续出现3次
TRADE_AGAIN(3);

MA1:MA(CLOSE,30);

// 开仓
CROSS(CLOSE,MA1), BK;

// 盈利2%时，加仓一半
CLOSE>BKPRICE*(1+2/100), ADD_LONG(BKVOL/2);

// 价格下穿均线，全平
CROSSDOWN(CLOSE,MA1), SP;

AUTOFILTER;
```

---

## 二、盈利加仓

```mql
// 盈利加仓示例
// 开仓后，盈利逐步加仓
// 亏损减仓

M:=0.02;  // 加仓盈利比例2%
N:=0.01;  // 减仓亏损比例1%

// 每次固定开仓4手
T_COMMAND(4);

// 允许加减仓连续3次
TRADE_AGAIN(3);

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;

// 盈利2%时，加仓一半持仓
CLOSE>BKPRICE*(1+M), ADD_LONG(BKVOL/2);

// 亏损1%时，减仓一半持仓
CLOSE<BKPRICE*(1-N), LOWER_LONG(BKVOL/2);

// 平仓
CLOSE<MA20, SP;

AUTOFILTER;
```

---

## 三、分批出场

```mql
// 分批出场示例
// 盈利后分批平仓

M:=0.03;  // 第一批止盈3%

T_COMMAND(6);  // 开仓6手
TRADE_AGAIN(3);  // 允许加减仓3次

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;

// 第一批止盈：盈利3%平一半
CLOSE>=BKPRICE*(1+M), LOWER_LONG(3);

// 第二批止盈：盈利6%再平一半
CLOSE>=BKPRICE*(1+M*2), LOWER_LONG(3);

// 第三批止盈：盈利10%全部平
CLOSE>=BKPRICE*(1+0.1), SP;

// 止损
CLOSE<BKPRICE*(1-0.02), SP;

AUTOFILTER;
```

---

## 四、金字塔加仓

```mql
// 金字塔加仓示例
// 越涨越买，但每次加仓数量递减

MA10:MA(C,10);
MA20:MA(C,20);

// 初始开仓10手
T_COMMAND(10);
TRADE_AGAIN(5);  // 允许加仓5次

// 开仓条件
CROSS(MA10,MA20), BK;

// 金字塔加仓
// 盈利2%加仓4手
CLOSE>BKPRICE*(1+0.02), ADD_LONG(4);

// 盈利4%再加仓2手
CLOSE>BKPRICE*(1+0.04), ADD_LONG(2);

// 盈利6%再加仓1手
CLOSE>BKPRICE*(1+0.06), ADD_LONG(1);

// 平仓
CROSSDOWN(MA10,MA20), SP;

// 止损
CLOSE<BKPRICE*(1-0.03), SP;

AUTOFILTER;
```

---

## 五、完整分批策略

```mql
// ============================================
// 完整分批进出示例
// 开仓 → 加仓 → 减仓 → 分批平仓
// ============================================

// 参数
开仓手数:=5;
加仓盈利比例:=0.02;   // 盈利2%加仓
减仓亏损比例:=0.01;   // 亏损1%减仓
止盈比例:=0.08;       // 总体止盈8%

// 头寸管理
T_COMMAND(开仓手数);
TRADE_AGAIN(3);

// 均线
MA20:MA(C,20);
MA60:MA(C,60);

// ========== 开仓 ==========
CLOSE>MA20 && CLOSE>MA60, BK;    // 价格在长短均线上方买开

// ========== 加减仓 ==========
// 盈利2%且持仓不足15手时，加仓2手
CLOSE>BKPRICE*(1+加仓盈利比例) && BKVOL<15, ADD_LONG(2);

// 亏损1%且持仓大于5手时，减仓2手
CLOSE<BKPRICE*(1-减仓亏损比例) && BKVOL>5, LOWER_LONG(2);

// ========== 分批平仓 ==========
// 盈利5%平1/3
CLOSE>BKPRICE*(1+0.05), LOWER_LONG(开仓手数);

// 盈利8%平剩余全部
CLOSE>BKPRICE*(1+止盈比例), SP;

// ========== 止损 ==========
CLOSE<BKPRICE*(1-0.03), SP;

// ========== 均线平仓 ==========
CROSSDOWN(CLOSE,MA20), SP;

AUTOFILTER;
```


path: EXAMPLES/cross_cycle.md
content: # WT8跨周期跨合约示例

## 一、引用日线数据

```mql
// ============================================
// 第一步：建立日线指标（保存为 DAY_MA）
// ============================================
DAY_MA
MA5:MA(C,5);
MA30:MA(C,30);
DAYUP:MA5>MA30;  // 日线多头
DAYDN:MA5<MA30;  // 日线空头
```

```mql
// ============================================
// 第二步：在分钟周期引用日线数据
// ============================================

// 引用日线指标
#IMPORT[DAY,1,DAY_MA] AS D

DAYUP:D.DAYUP;
DAYDN:D.DAYDN;

// 分钟周期自己的条件
MA5:MA(C,5);
MA10:MA(C,10);

MINUP:CROSS(MA5,MA10);       // 分钟金叉
MINDN:CROSSDOWN(MA5,MA10);   // 分钟死叉

// 综合判断：日线多头 + 分钟金叉 → 做多
DAYUP && MINUP, BPK;

// 综合判断：日线空头 + 分钟死叉 → 做空
DAYDN && MINDN, SPK;

AUTOFILTER;
```

---

## 二、三周期共振

```mql
// 日线指标（保存为 DAY_IND）
DAY_IND
MA5:MA(C,5);
MA20:MA(C,20);
DAYUP:MA5>MA20;
DAYDN:MA5<MA20;
```

```mql
// 小时指标（保存为 HOUR_IND）
HOUR_IND
MID:MA(CLOSE,26);
TMP2:=STD(CLOSE,26);
TOP:MID+2*TMP2;
BOTTOM:MID-2*TMP2;
HOURUP:C>TOP;
HOURDN:C<BOTTOM;
```

```mql
// ============================================
// 三周期共振策略（加载到分钟周期）
// ============================================

// 引用日线
#IMPORT[DAY,1,DAY_IND] AS D
DAYUP:D.DAYUP;
DAYDN:D.DAYDN;

// 引用小时
#IMPORT[HOUR,1,HOUR_IND] AS H
HOURUP:H.HOURUP;
HOURDN:H.HOURDN;

// 分钟条件
MINUP:CROSS(MA(C,5),MA(C,10));
MINDN:CROSSDOWN(MA(C,5),MA(C,10));

// 三周期共振做多
DAYUP && HOURUP && MINUP, BPK;

// 三周期共振做空
DAYDN && HOURDN && MINDN, SPK;

// 止损
CLOSE<=BKPRICE-15*MINPRICE, SP;
CLOSE>=SKPRICE+15*MINPRICE, BP;

AUTOFILTER;
```

---

## 三、引用板块指数

```mql
// 板块指数指标（保存为 HG_IND）
HG_IND
MA5:MA(C,5);
MA10:MA(C,10);
MA30:MA(C,30);
HGUP:MA5>MA10 && MA10>MA30;  // 板块多头
HGDN:MA5<MA10 && MA10<MA30;  // 板块空头
```

```mql
// ============================================
// 板块对冲策略（加载到螺纹钢）
// ============================================

// 引用黑色系板块（7161）
#CALL[7161,HG_IND] AS VAR

// 螺纹自己的均线
MA5:MA(C,5);
MA30:MA(C,30);
RBUP:MA5>MA30;
RBDN:MA5<MA30;

// 综合判断：板块 + 单合约同向
RBUP && VAR.HGUP, BK;
RBDN && VAR.HGDN, SK;

// 平仓
CLOSE<MA30 && BKVOL>0, SP;
CLOSE>MA30 && SKVOL>0, BP;

AUTOFILTER;
```

---

## 四、跨合约套利

```mql
// 螺纹-热卷价差策略
// 当螺纹比热卷低时，买螺纹卖热卷

// 螺纹指标
MA5:MA(C,5);

// 引用热卷数据
// 假设热卷合约代码为 HC

MA5:MA(C,5);           // 螺纹5日均线
MA20:MA(C,20);         // 螺纹20日均线

// 螺纹与热卷价差
// 使用跨合约引用的方式获取热卷价格

// 简单策略：螺纹与热卷的比值
// 当螺纹相对热卷走强时买螺纹

MA5>MA20, BK;          // 螺纹多头排列买开
MA5<MA20, SK;          // 螺纹空头排列卖开

// 止损
CLOSE<=BKPRICE*0.98, SP;
CLOSE>=SKPRICE*1.02, BP;

AUTOFILTER;
```

---

## 五、综合跨周期跨合约

```mql
// 日线指标（保存为 DAY_IND）
DAY_IND
MA5:MA(C,5);
MA10:MA(C,10);
MA20:MA(C,20);
DAYUP:MA5>MA20;  // 日线多头
DAYDN:MA5<MA20;  // 日线空头
```

```mql
// ============================================
// 综合策略
// 日线趋势 + 板块方向 + 分钟信号
// ============================================

// 引用日线趋势
#IMPORT[DAY,1,DAY_IND] AS D

// 引用板块（黑链7161）
#CALL[7161,HG_IND] AS VAR

// 分钟MACD
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26);
DEA:=EMA(DIFF,9);
MACDUP:CROSS(DIFF,DEA);        // MACD金叉
MACDDN:CROSSDOWN(DIFF,DEA);    // MACD死叉

// 综合做多：日线多头 + 板块多头 + MACD金叉
D.DAYUP && VAR.HGUP && MACDUP, BPK;

// 综合做空：日线空头 + 板块空头 + MACD死叉
D.DAYDN && VAR.HGDN && MACDDN, SPK;

// 止损
CLOSE<=BKPRICE-20*MINPRICE, SP;
CLOSE>=SKPRICE+20*MINPRICE, BP;

AUTOFILTER;
```


path: EXAMPLES/position_management.md
content: # WT8头寸管理示例

## 一、按资金比例下单

```mql
// 按资金比例下单
// 每次按理论资金的fPercent比例下单，最大N手
// 适合资金管理严格的组合

SETDEALPERCENT(20, 10);  // 每次按资金的20%下单，最大10手

MA10:MA(C,10);
MA20:MA(C,20);

// 策略
CROSS(MA10,MA20), BK;
CROSSDOWN(MA10,MA20), SK;

// 止损
CLOSE<=BKPRICE*0.98, SP;
CLOSE>=SKPRICE*1.02, BP;

AUTOFILTER;
```

---

## 二、固定手数 + 动态调整

```mql
// 固定手数开仓，亏损后手数增加
// 盈利后恢复默认手数

N:=1;  // 默认开仓手数

// 持续亏损次数
Q:=TNUMSEQLOSS;

// 动态调整手数：亏损+N，盈利恢复默认
T:=IF(LASTOFFSETPROFIT>=0 || (COUNTSIG(BK,BARPOS)+COUNTSIG(SK,BARPOS)=0), N, N+Q);
TC:=MIN(T, 10);  // 最大10手

// 设置开仓手数
T_COMMAND(TC);

MA10:MA(C,10);
MA20:MA(C,20);

// 策略
CROSS(MA10,MA20), BK;
CROSSDOWN(MA10,MA20), SK;

// 止损
CLOSE<=BKPRICE-15*MINPRICE, SP;
CLOSE>=SKPRICE+15*MINPRICE, BP;

AUTOFILTER;
```

---

## 三、权益回撤控制

```mql
// 权益回撤控制
// 权益回撤超过20%时，清仓止损

// 计算权益回撤比
HM:=HHV(MONEYTOT,BARPOS);
QY:=(HM-MONEYTOT)/HM;  // 权益回撤比

// 权益回撤比超过20%止损
QY>0.2, SP;
QY>0.2, BP;

// 均线策略
MA20:MA(C,20);
CLOSE>MA20, BK;
CLOSE<MA20, SP;

AUTOFILTER;
```

---

## 四、资金使用率控制

```mql
// 资金使用率控制
// 通过SETDEALPERCENT控制每笔交易的风险

// 参数设置
资金使用率:=30;  // 每笔交易使用30%资金
最大手数:=5;     // 最多5手

SETDEALPERCENT(资金使用率, 最大手数);

// 均线策略
MA10:MA(C,10);
MA20:MA(C,20);

CROSS(MA10,MA20), BK;
CROSSDOWN(MA10,MA20), SP;

// 止损
CLOSE<=BKPRICE*0.97, SP;
CLOSE>=SKPRICE*1.03, BP;

AUTOFILTER;
```

---

## 五、综合头寸管理

```mql
// 综合头寸管理示例
// 资金使用率 + 权益止损 + 动态手数

// ========== 头寸管理 ==========
// 1. 按资金比例下单
SETDEALPERCENT(25, 8);  // 25%资金，最大8手

// 2. 权益止损
HM:=HHV(MONEYTOT,BARPOS);
QY:=(HM-MONEYTOT)/HM;
QY>0.15, SP;    // 权益回撤15%止损
QY>0.15, BP;

// 3. 最大持仓限制
// 实际通过SETDEALPERCENT的第二个参数控制

// ========== 交易策略 ==========
MA10:MA(C,10);
MA20:MA(C,20);

// 开仓
CROSS(MA10,MA20), BK;
CROSSDOWN(MA10,MA20), SK;

// 止损
CLOSE<=BKPRICE*0.98, SP;
CLOSE>=SKPRICE*1.02, BP;

AUTOFILTER;
```


path: EXAMPLES/stop_loss.md
content: # WT8止损止盈示例

## 一、固定点差止损

```mql
// 固定点差止损
// 亏损N跳止损

N:=10;  // 止损跳数

MA10:MA(C,10);

// 金叉买开
CROSS(CLOSE,MA10), BK;

// 死叉卖开
CROSSDOWN(CLOSE,MA10), SK;

// 固定点差止损
CLOSE<=BKPRICE-N*MINPRICE, SP;    // 多头亏损N跳止损
CLOSE>=SKPRICE+N*MINPRICE, BP;   // 空头亏损N跳止损

AUTOFILTER;
```

---

## 二、固定比例止损

```mql
// 固定比例止损
// 亏损5%止损

止损比例:=5;  // 5%

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;
CLOSE<MA20, SK;

// 固定比例止损
CLOSE<=BKPRICE*(1-止损比例/100), SP;
CLOSE>=SKPRICE*(1+止损比例/100), BP;

AUTOFILTER;
```

---

## 三、动态追踪止损

```mql
// 动态追踪止损
// 从持仓期间最高/最低点回撤N跳止损
// 优点：让利润奔跑

N:=20;  // 回撤跳数

MA10:MA(C,10);

// 开仓
CROSS(CLOSE,MA10), BK;
CROSSDOWN(CLOSE,MA10), SK;

// 动态追踪止损
// 多头：从持仓期间最高价回撤N跳止损
CLOSE<=BKHIGH-N*MINPRICE, SP;

// 空头：从持仓期间最低价上涨N跳止损
CLOSE>=SKLOW+N*MINPRICE, BP;

AUTOFILTER;
```

---

## 四、固定点差止盈

```mql
// 固定点差止盈
// 盈利M跳止盈

M:=30;  // 止盈跳数

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;
CLOSE<MA20, SK;

// 止盈
CLOSE>=BKPRICE+M*MINPRICE, SP;    // 多头盈利M跳止盈
CLOSE<=SKPRICE-M*MINPRICE, BP;   // 空头盈利M跳止盈

AUTOFILTER;
```

---

## 五、保本止损

```mql
// 保本止损
// 盈利超过N跳后，跌破开仓价+M跳时保本平仓
// 适合趋势策略

N:=20;  // 保本开启参数（盈利超过N跳后启用）
M:=5;   // 保本参数（回落到开仓价+M跳保本）

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;
CLOSE<MA20, SK;

// 保本止损
// 多头：盈利超过N跳后，回落到开仓价+M跳保本平
BKHIGH>BKPRICE+N*MINPRICE && CLOSE<=BKPRICE+M*MINPRICE, SP;

// 空头：盈利超过N跳后，反弹到开仓价-M跳保本平
SKLOW<SKPRICE-N*MINPRICE && CLOSE>=SKPRICE-M*MINPRICE, BP;

AUTOFILTER;
```

---

## 六、综合止损止盈

```mql
// 综合止损止盈示例
// 止损 + 止盈 + 保本 + 追踪

止损N:=15;   // 固定止损跳数
止盈M:=40;   // 固定止盈跳数
保本N2:=20;  // 保本开启跳数
保本M2:=5;   // 保本回撤跳数
追踪N3:=25;  // 追踪止损跳数

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;
CLOSE<MA20, SK;

// 1. 固定止损
CLOSE<=BKPRICE-止损N*MINPRICE, SP;
CLOSE>=SKPRICE+止损N*MINPRICE, BP;

// 2. 固定止盈
CLOSE>=BKPRICE+止盈M*MINPRICE, SP;
CLOSE<=SKPRICE-止盈M*MINPRICE, BP;

// 3. 保本止损（盈利后启用）
BKHIGH>BKPRICE+保本N2*MINPRICE && CLOSE<=BKPRICE+保本M2*MINPRICE, SP;
SKLOW<SKPRICE-保本N2*MINPRICE && CLOSE>=SKPRICE-保本M2*MINPRICE, BP;

// 4. 追踪止损（最后防线）
CLOSE<=BKHIGH-追踪N3*MINPRICE, SP;
CLOSE>=SKLOW+追踪N3*MINPRICE, BP;

AUTOFILTER;
```

---

## 七、权益止损

```mql
// 权益止损
// 权益回撤超过一定比例时止损
// 适合组合风控

回撤比例:=10;  // 权益回撤10%

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;
CLOSE<MA20, SK;

// 权益止损：权益回撤超过X%清仓
MONEYTOT<=INITMONEY*(1-回撤比例/100), SP;
MONEYTOT<=INITMONEY*(1-回撤比例/100), BP;

AUTOFILTER;
```

---

## 八、权益回撤比止损

```mql
// 权益回撤比止损
// 从历史最高点回撤超过X%止损
// 更精确的风控

回撤比:=20;  // 回撤20%

MA20:MA(C,20);

// 开仓
CLOSE>MA20, BK;
CLOSE<MA20, SK;

// 计算权益回撤比
HM:=HHV(MONEYTOT,BARPOS);  // 历史最高权益
QY:=(HM-MONEYTOT)/HM*100;  // 权益回撤比(%)

// 权益回撤比止损
QY>回撤比, SP;
QY>回撤比, BP;

AUTOFILTER;
```


path: EDGE_CASES/common_mistakes.md
content: # WT8边界条件和常见错误

## 目录
1. [语法错误](#一语法错误)
2. [逻辑错误](#二逻辑错误)
3. [边界条件](#三边界条件)
4. [实盘问题](#四实盘问题)

---

## 一、语法错误

### ❌ 错误1：信号不带条件
```mql
// 错误写法
BK;

// 正确写法
CLOSE > MA(C,10), BK;
```

### ❌ 错误2：加减仓不带手数
```mql
// 错误写法
ADD_LONG;  // 缺少手数
ADD_SHORT; // 缺少手数

// 正确写法
ADD_LONG(2);   // 加仓2手
ADD_SHORT(1);  // 加仓1手
```

### ❌ 错误3：忘记写AUTOFILTER
```mql
// 错误写法
CROSS(MA5,MA10), BK;
CROSSDOWN(MA5,MA10), SP;
// 模型结束，缺少 AUTOFILTER

// 正确写法
CROSS(MA5,MA10), BK;
CROSSDOWN(MA5,MA10), SP;
AUTOFILTER;  // 必须写！
```

### ❌ 错误4：条件写成中文
```mql
// 错误写法
收盘价>均线, BK;

// 正确写法
CLOSE > MA(C,10), BK;
```

### ❌ 错误5：中文字符混用
```mql
// 错误写法
N:=10；  // 全角分号
// 条件A，BK；  // 全角逗号和分号

// 正确写法
N:=10;  // 半角分号
条件A, BK;  // 半角逗号和分号
```

---

## 二、逻辑错误

### ❌ 错误6：没有持仓时加减仓
```mql
// 错误场景：假设当前无持仓
ADD_LONG(1);  // 无效！必须先BK开仓
LOWER_LONG(1); // 无效！
```

### ❌ 错误7：减仓超过持仓
```mql
// 假设当前持仓3手
LOWER_LONG(5);  // 错误！减仓手数不能超过持仓
// 正确：LOWER_LONG(2);  最多减2手
```

### ❌ 错误8：同时有BK和SK信号
```mql
// 错误写法
CLOSE > MA(C,10), BK;   // 买开
CLOSE < MA(C,10), SK;   // 卖开（同时满足会冲突）

// 正确写法：分开条件
CLOSE > MA(C,10), BK;
CLOSE < MA(C,10), BP;   // 用买平而不是卖开
```

### ❌ 错误9：开仓条件写在平仓条件后面
```mql
// 错误写法（信号顺序）
SP;     // 平仓写在前面
BK;     // 开仓写在后面
// 这会导致逻辑混乱

// 正确写法
BK;     // 开仓
SP;     // 平仓
```

### ❌ 错误10：BPK/SPK和BK/SK混用
```mql
// 错误写法
BPK;           // 反手买
BK;            // 再买开（会冲突）

// 正确写法：只用一种
BPK;           // 反手买
// 或
BK;            // 买开
SP;            // 卖平
```

---

## 三、边界条件

### ⚠️ 边界1：加减仓过滤
```mql
// 同一行加减仓指令一轮只出一次
TRADE_AGAIN(3);  // 允许连续3次

// 如果没有TRADE_AGAIN，同一行加减仓只会出一次
```

### ⚠️ 边界2：信号消失（忽闪）
```
K线走完前条件满足 → 出信号 → K线走完条件不满足 → 信号消失
```
- 使用 `SIGCHECK` 可以进行信号复核
- 消失的信号会被恢复持仓

### ⚠️ 边界3：主连链回测换月
```
主力切换时：
1. 旧主力清仓
2. 新主力重新计算信号
3. 资金延续
```
- 换月时新旧合约趋势可能相反
- 需要关注换月点附近的信号

### ⚠️ 边界4：持仓成本变化
```mql
// 加仓后BKPRICE会变化（加权平均）
ADD_LONG(2);           // 加仓
BKPRICE;               // 现在是加仓后的平均价
BKPRICE2 := BKPRICE;  // 如果需要记录原开仓价，要单独保存
```

### ⚠️ 边界5：权益计算时机
```mql
// MONEYTOT是实时权益（含浮动盈亏）
// 持仓为0时的权益才是真正的盈亏
// 权益最大回撤和损益最大回撤计算方式不同
```

### ⚠️ 边界6：信号计算起始时间
```
数据起始 ≠ 信号计算起始

例：沪铜2201合约
- 挂牌时间（数据起始）：2021年1月18日
- 开始交易时间（信号计算起始）：2021年11月1日
- 设置信号计算起始时间应该：2021年11月1日
```

---

## 四、实盘问题

### ⚠️ 问题1：滑点影响
```mql
// 回测假设以收盘价成交
// 实盘可能滑点较大

// 敏感性测试：
// 回测后右键 → 敏感性测试
// 分析滑点增大时收益变化
```

### ⚠️ 问题2：信号不成交
```mql
// 原因：
// 1. 价格快速波动，委托价格不利
// 2. 流动性不足
// 3. 网络延迟

// 解决方案：使用SETSIGPRICETYPE
SETSIGPRICETYPE(BK, 2);   // 买开用对手价
SETSIGPRICETYPE(SP, 4);   // 止损用市价
```

### ⚠️ 问题3：隔夜跳空
```mql
// 期货隔夜有跳空风险
// 模型需要考虑：
// 1. 隔夜止损设置
// 2. 仓位控制
// 3. 使用TRADE_SMOOTHING消除跳空
```

### ⚠️ 问题4：换月跳空
```mql
// 主力合约切换时价格不连续
// 解决方案：
// 1. 使用主连链回测
// 2. 主力切换时手动平移
// 3. 使用TRADE_OTHER('ZHULIAN')自动换月
```

### ⚠️ 问题5：流动性风险
```mql
// 小品种流动性差
// 建议：
// 1. 优先选择主力合约
// 2. 设置最小成交量条件
VOL>1000, BK;  // 成交量大于1000才开仓
```

---

## 快速检查清单

### 写完模型后检查：
- [ ] 信号都带条件了吗？
- [ ] 加减仓都带手数了吗？
- [ ] 写了 `AUTOFILTER;` 吗？
- [ ] 没有用中文标点吗？
- [ ] 平仓写在开仓后面了吗？
- [ ] 减仓手数不超过持仓吗？

### 回测前检查：
- [ ] 保证金率设置正确吗？
- [ ] 手续费率设置正确吗？
- [ ] 信号计算起始时间设置正确吗？
- [ ] 初始资金设置合理吗？

### 实盘前检查：
- [ ] 做过敏感性测试吗？
- [ ] 滑点在可接受范围吗？
- [ ] 策略在实盘环境下能运行吗？


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)