# TideView 回测引擎完整知识库

> 本文档面向脚本开发者，全面介绍 TideView 回测引擎的架构、API、配置参数与执行流程。
> 基于源码版本：2026-07（TradingView Broker Emulator 对齐版）

---

1. [架构总览](#1-架构总览)
2. [TradingView 对齐语义](#2-tradingview-对齐语义)
3. [策略脚本声明](#3-策略脚本声明)
4. [策略 API 完整参考](#4-策略-api-完整参考)
5. [订单类型与执行语义](#5-订单类型与执行语义)
6. [回测执行流程](#6-回测执行流程)
7. [回测配置参数](#7-回测配置参数)
8. [费用、滑点与保证金](#8-费用滑点与保证金)
9. [市场制度规则：引擎不内置](#9-市场制度规则引擎不内置)
10. [风控系统](#10-风控系统)
11. [绩效指标](#11-绩效指标)
12. [高级功能](#12-高级功能)
13. [策略运行时变量](#13-策略运行时变量)
14. [常见问题与注意事项](#14-常见问题与注意事项)
15. [完整示例](#15-完整示例)
16. [技术指标标准库 (ta.*)](#16-技术指标标准库-ta)
17. [多周期引用 (request.security)](#17-多周期引用-requestsecurity)
18. [兼容性与限制](#18-兼容性与限制)
19. [内置策略模板](#19-内置策略模板)

---

## 目录

- [1. 架构总览](#1-架构总览)
  - [核心模块](#核心模块)
  - [数据流](#数据流)
- [2. TradingView 对齐语义](#2-tradingview-对齐语义)
  - [核心原则](#核心原则)
  - [引擎默认行为](#引擎默认行为)
  - [已从引擎移除的规则（2026-07）](#已从引擎移除的规则2026-07)
- [3. 策略脚本声明](#3-策略脚本声明)
  - [strategy() 声明参数](#strategy-声明参数)
    - [已声明但引擎暂不支持的参数](#已声明但引擎暂不支持的参数)
    - [佣金类型常量](#佣金类型常量)
    - [下单量类型常量](#下单量类型常量)
- [4. 策略 API 完整参考](#4-策略-api-完整参考)
  - [4.1 strategy.entry() — 入场](#41-strategyentry--入场)
  - [4.2 strategy.close() — 按 ID 平仓](#42-strategyclose--按-id-平仓)
  - [4.3 strategy.close_all() — 全部平仓](#43-strategyclose_all--全部平仓)
  - [4.4 strategy.exit() — 挂出场条件](#44-strategyexit--挂出场条件)
  - [4.5 strategy.order() — 通用下单](#45-strategyorder--通用下单)
  - [4.6 strategy.cancel() / strategy.cancel_all() — 撤单](#46-strategycancel--strategycancel_all--撤单)
  - [4.7 strategy.risk. — 风控函数](#47-strategyrisk--风控函数)
- [5. 订单类型与执行语义](#5-订单类型与执行语义)
  - [5.1 内部订单类型](#51-内部订单类型)
  - [5.2 OHLC 路径模型](#52-ohlc-路径模型)
  - [5.3 回测执行模式 (BacktestMode)](#53-回测执行模式-backtestmode)
  - [5.4 processOrdersOnClose 语义](#54-processordersonclose-语义)
- [6. 回测执行流程](#6-回测执行流程)
  - [6.1 Pine 侧 BrokerEmulator 流程](#61-pine-侧-brokeremulator-流程)
  - [6.2 主回测引擎（BacktestEngine）流程](#62-主回测引擎backtestengine流程)
  - [6.3 BrokerEmulator 单 K 线处理流程](#63-brokeremulator-单-k-线处理流程)
- [7. 回测配置参数](#7-回测配置参数)
  - [BacktestConfig 完整字段](#backtestconfig-完整字段)
  - [ExecutionPolicy 字段（Pine 侧）](#executionpolicy-字段pine-侧)
- [8. 费用、滑点与保证金](#8-费用滑点与保证金)
  - [8.1 佣金计算 (FeeCalculator)](#81-佣金计算-feecalculator)
  - [8.2 滑点模型 (SlippageModel)](#82-滑点模型-slippagemodel)
  - [8.3 保证金与强平 (marginlong / marginshort)](#83-保证金与强平-marginlong--marginshort)
  - [8.4 限价单成交验证 (backtestfilllimitsassumption)](#84-限价单成交验证-backtestfilllimitsassumption)
- [9. 市场制度规则：引擎不内置](#9-市场制度规则引擎不内置)
  - [9.1 设计原则（TradingView 对齐）](#91-设计原则tradingview-对齐)
  - [9.2 在 Pine 脚本中自行实现市场规则](#92-在-pine-脚本中自行实现市场规则)
  - [9.3 保留的产品级能力](#93-保留的产品级能力)
- [10. 风控系统](#10-风控系统)
  - [10.1 脚本级风控 (strategy.risk.)](#101-脚本级风控-strategyrisk)
  - [10.2 配置级风控 (BacktestConfig)](#102-配置级风控-backtestconfig)
  - [10.3 入场被拒原因](#103-入场被拒原因)
  - [10.4 平仓被拒原因](#104-平仓被拒原因)
- [11. 绩效指标](#11-绩效指标)
  - [BacktestMetrics 指标说明](#backtestmetrics-指标说明)
  - [barsPerYear 计算](#barsperyear-计算)
  - [基准对比指标 (BenchmarkCalculator)](#基准对比指标-benchmarkcalculator)
  - [策略综合评分 (StrategyScorer)](#策略综合评分-strategyscorer)
- [12. 高级功能](#12-高级功能)
  - [12.1 前推优化 (WalkForwardOptimizer)](#121-前推优化-walkforwardoptimizer)
  - [12.2 组合回测 (PortfolioBacktest)](#122-组合回测-portfoliobacktest)
  - [12.3 回撤分析 (DrawdownAnalyzer)](#123-回撤分析-drawdownanalyzer)
- [13. 策略运行时变量](#13-策略运行时变量)
  - [仓位与资金](#仓位与资金)
  - [盈亏统计](#盈亏统计)
  - [交易统计](#交易统计)
  - [当前持仓详情 (strategy.opentrades.)](#当前持仓详情-strategyopentrades)
  - [历史交易查询 (strategy.closedtrades.)](#历史交易查询-strategyclosedtrades)
  - [方向常量](#方向常量)
- [14. 常见问题与注意事项](#14-常见问题与注意事项)
  - [Q1: 为什么我的策略没有产生任何交易？](#q1-为什么我的策略没有产生任何交易)
  - [Q2: 回测结果和 TradingView 完全一致吗？](#q2-回测结果和-tradingview-完全一致吗)
  - [Q3: strategy.entry 和 strategy.order 有什么区别？](#q3-strategyentry-和-strategyorder-有什么区别)
  - [Q4: processOrdersOnClose 对策略有什么影响？](#q4-processordersonclose-对策略有什么影响)
  - [Q5: calcOnEveryTick 和 calcOnOrderFills 是做什么的？](#q5-calconeverytick-和-calconorderfills-是做什么的)
  - [Q6: OHLC 路径模式（intrabarPathMode）关闭和开启有什么区别？](#q6-ohlc-路径模式intrabarpathmode关闭和开启有什么区别)
  - [Q7: 最小资金要求如何计算？](#q7-最小资金要求如何计算)
  - [Q8: 移动止损（Trailing Stop）如何工作？](#q8-移动止损trailing-stop如何工作)
- [15. 完整示例](#15-完整示例)
  - [15.1 双均线交叉策略](#151-双均线交叉策略)
  - [15.2 带止盈止损的突破策略](#152-带止盈止损的突破策略)
  - [15.3 使用移动止损](#153-使用移动止损)
  - [15.4 使用风控函数](#154-使用风控函数)
  - [15.5 利用运行时变量做仓位管理](#155-利用运行时变量做仓位管理)
- [附录 A：与 TradingView 的语义对照表](#附录-a与-tradingview-的语义对照表)
- [附录 B：回测结果数据结构](#附录-b回测结果数据结构)
- [附录 C：支持的时间级别](#附录-c支持的时间级别)
- [16. 技术指标标准库 (ta.)](#16-技术指标标准库-ta)
  - [16.1 移动平均线](#161-移动平均线)
  - [16.2 波动率与通道](#162-波动率与通道)
  - [16.3 振荡器与动量](#163-振荡器与动量)
  - [16.4 趋势指标](#164-趋势指标)
  - [16.5 成交量指标](#165-成交量指标)
  - [16.6 统计函数](#166-统计函数)
  - [16.7 条件与查找](#167-条件与查找)
- [16.x AI 扩展函数 (ai.) — TideView 专有](#16x-ai-扩展函数-ai--tideview-专有)
- [17. 多周期引用 (request.security)](#17-多周期引用-requestsecurity)
  - [17.1 基本用法](#171-基本用法)
  - [17.2 支持的目标周期](#172-支持的目标周期)
  - [17.3 gaps 参数](#173-gaps-参数)
  - [17.4 lookahead 参数](#174-lookahead-参数)
  - [17.5 表达式限制](#175-表达式限制)
  - [17.6 低周期引用](#176-低周期引用)
  - [17.7 其他特性](#177-其他特性)
- [18. 兼容性与限制](#18-兼容性与限制)
  - [18.1 兼容性预检 (compatChecker)](#181-兼容性预检-compatchecker)
  - [18.2 已知限制](#182-已知限制)
  - [18.3 支持的全局变量](#183-支持的全局变量)
- [19. 内置策略模板](#19-内置策略模板)
  - [Pine Script 策略模板](#pine-script-策略模板)
  - [Pine Script 指标模板](#pine-script-指标模板)


## 1. 架构总览

### 核心模块

```
src/shared/scripting/languages/pine/
├── interpreter.ts                       # Pine 解释器（含策略指令收集）
├── StrategyRuntime.ts                   # 策略运行时状态定义
├── stdlib/strategy.ts                   # strategy.* API 实现
└── strategy/                            # 策略执行核心模块
    ├── BrokerEmulator.ts                # 券商模拟器（撮合、风控、报告）
    ├── PositionLedger.ts                # 持仓与权益管理
    ├── StrategyCommandNormalizer.ts     # 策略指令 → 内部订单转换
    ├── FillModel.ts                     # 成交判定（OHLC 路径 + 限价穿越验证）
    ├── BarReplayEngine.ts               # K 线回放引擎
    ├── ExecutionPolicy.ts               # 执行策略配置
    └── OrderTypes.ts                    # 内部订单类型定义

src/renderer/scripting/
├── languages/pine/
│   └── PineEngine.ts                    # Pine 脚本执行引擎（renderer 侧入口）
├── backtest/                            # 回测引擎与分析模块
│   ├── BacktestEngine.ts               # 主回测引擎（TradingView Broker Emulator 语义）
│   ├── backtestTypes.ts                # 共享类型与默认配置
│   ├── marketBacktestRuleResolver.ts   # 市场元数据解析（tickSize / 周期支持 / 方向过滤）
│   ├── BacktestOrderProcessor.ts       # 订单处理（入场/出场/挂单/保证金）
│   ├── BacktestStopLoss.ts             # 止损引擎
│   ├── FeeCalculator.ts                # 佣金计算器（TV 三型佣金）
│   ├── SlippageModel.ts                # 滑点模型（tick 滑点）
│   ├── MetricsCalculator.ts            # 绩效指标计算
│   ├── DrawdownAnalyzer.ts             # 回撤分析器
│   ├── BenchmarkCalculator.ts          # 基准对比（α/β/IR）
│   ├── StrategyScorer.ts              # 策略综合评分
│   ├── PortfolioBacktest.ts            # 组合回测
│   └── WalkForwardOptimizer.ts         # 前推优化
└── types.ts                            # 策略指令类型定义
```

### 数据流

```
┌─────────────────────────────────────────────────────────────┐
│ 脚本编辑器 RunConfigDialog / OverviewPanel                   │
│   配置：初始资金、佣金、时间级别、TradingView 撮合参数...        │
└───────────────────────┬─────────────────────────────────────┘
                        ▼
┌─────────────────────────────────────────────────────────────┐
│ PineEngine.executeStrategy()                                │
│   1. buildExecutionPolicy() → 构建 ExecutionPolicy           │
│   2. new BrokerEmulator(policy)                             │
│   3. 逐 K 线执行脚本 → 收集 StrategyCommand[]                │
│   4. broker.processBar() → 撮合订单                          │
│   5. broker.buildExecutionReport() → StrategyExecutionReport │
└───────────────────────┬─────────────────────────────────────┘
                        ▼
┌─────────────────────────────────────────────────────────────┐
│ BacktestEngine（TradingView Broker Emulator 语义）            │
│   消费 ScriptResult → 计算绩效指标 → 输出 BacktestResult      │
└───────────────────────┬─────────────────────────────────────┘
                        ▼
┌─────────────────────────────────────────────────────────────┐
│ BacktestResultsPanel / OverviewPanel                        │
│   资金曲线、回撤图、月度热力图、交易列表、评分等                  │
└─────────────────────────────────────────────────────────────┘
```

---

## 2. TradingView 对齐语义

自 2026-07 起，TideView 回测引擎只有**一套**撮合语义，与 TradingView Broker Emulator 1:1 对齐
（规格来源：TradingView Pine Script 官方文档 Strategies 章节）。
历史版本中的"TradingView 兼容模式 / A 股增强模式"双模式切换（`compatibilityMode` 参数）已移除。

### 核心原则

- **引擎只做撮合，不做市场制度模拟。** 市场（A 股 / 港股 / 美股 / 期货 / 外汇）只向引擎提供元数据
  （最小价格步长 `tickSize`、支持的周期、产品级方向过滤），不注入任何交易制度规则。
- **需要市场限制时，与 TradingView 一致——在 Pine 脚本内自行实现**（示例见第 9 章）。

### 引擎默认行为

| 特性 | 值 |
|------|-----|
| 最小交易单位 `lotSize` | 1 股/合约（可手动改，如 A 股设 100） |
| T+1 规则 | 无（引擎不检查） |
| 涨跌停限制 | 无（引擎不检查） |
| 停牌/零成交量拒单 | 无（引擎不检查） |
| 允许做空 `allowShort` | 是（默认；仅保留产品级方向过滤开关） |
| 佣金 | `commission_type` 三型，默认 0 |
| 滑点 | tick 数，默认 0 |
| 订单成交时点 | 默认下一根 K 线开盘（`process_orders_on_close=false`） |
| 保证金 | `margin_long` / `margin_short`，默认 100（全额、无杠杆） |

### 已从引擎移除的规则（2026-07）

以下市场制度规则在旧版本中由引擎强制执行，现已**全部移除**：

- T+1 规则（当日买入禁止当日卖出）
- 涨跌停拒单（±10%/±20% 封板不可成交）
- 整手数强制（100 股/手；现默认 `lotSize=1`）
- 停牌（volume=0）拒单
- 做空禁止（`allowShort` 现默认 `true`，仅剩产品级方向过滤器）
- A 股增强模式（`aShareEnhanced` / `boardType` / ST 差异化参数）
- 印花税 / 过户费 / 最低佣金 / 各市场费率 profile
- 融券利率（`shortBorrowRate`）与昨收参考价（`prevDayClose`）

旧持久化配置中的这些字段会在加载时被自动清洗剔除，不会影响新引擎。

---

## 3. 策略脚本声明

使用 `@strategy` 标记声明一个策略脚本（而非普通指标）：

```pine
//@version=5
strategy("我的策略", overlay=true, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.025, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
```

### strategy() 声明参数

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `title` | string | 必填 | 策略标题 |
| `overlay` | bool | `true` | 是否叠加在主图上 |
| `initial_capital` | number | `100000` | 初始资金（元） |
| `commission_type` | string | `strategy.commission.percent` | 佣金类型（TV 三型） |
| `commission_value` | number | `0` | 佣金值 |
| `slippage` | int | `0` | 滑点 tick 数（成交价 = 价格 ± slippage × tickSize） |
| `pyramiding` | int | `1` | 同方向最大加仓次数 |
| `default_qty_type` | string | `strategy.fixed` | 默认下单量类型 |
| `default_qty_value` | number | `1` | 默认下单量 |
| `process_orders_on_close` | bool | `false` | 收盘时处理订单 |
| `calc_on_every_tick` | bool | `false` | 每个 tick 重新计算 |
| `calc_on_order_fills` | bool | `false` | 成交时重新计算 |
| `margin_long` | number | `100` | 做多保证金百分比（<100 时放大购买力并启用强平检查） |
| `margin_short` | number | `100` | 做空保证金百分比，语义同上 |
| `backtest_fill_limits_assumption` | int | `0` | 限价单成交验证 tick 数（见 8.4 节） |

#### 已声明但引擎暂不支持的参数

以下 `strategy()` 参数可以写在声明里（不会报错），但引擎会**忽略并在回测警告中显式提示**，
回测结果可能与 TradingView 存在差异：

| 参数 | 触发告警的条件 |
|------|--------------|
| `currency` | 设置为 `currency.NONE` 以外的值（账户货币换算未实现） |
| `close_entries_rule` | 设置为 `FIFO` 以外的值（非 FIFO 平仓顺序未实现） |
| `use_bar_magnifier` | 设置为 `true`（低周期数据放大镜未实现） |

#### 佣金类型常量

| 常量 | 值 | 说明 |
|------|-----|------|
| `strategy.commission.percent` | `'percent'` | 按百分比收取 |
| `strategy.commission.cash_per_order` | `'cash_per_order'` | 每笔订单固定金额 |
| `strategy.commission.cash_per_contract` | `'cash_per_contract'` | 每合约/每股固定金额 |

#### 下单量类型常量

| 常量 | 值 | 说明 |
|------|-----|------|
| `strategy.fixed` | `'fixed'` | 固定股数/合约数 |
| `strategy.percent_of_equity` | `'percent_of_equity'` | 权益的百分比 |
| `strategy.cash` | `'cash'` | 现金金额 |

---

## 4. 策略 API 完整参考

### 4.1 strategy.entry() — 入场

```pine
strategy.entry(id, direction, qty, limit, stop, oca_name, oca_type, when)
```

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `id` | string | 是 | 信号标识符（相同 id + 方向 + 同根 K 线会自动去重） |
| `direction` | int | 是 | `strategy.long` (1) 或 `strategy.short` (-1) |
| `qty` | number | 否 | 数量，省略则使用 `default_qty` |
| `limit` | number | 否 | 限价。设置后变为限价单 |
| `stop` | number | 否 | 止损触发价。设置后变为止损单；与 `limit` 同时设置则为止损限价单 |
| `oca_name` | string | 否 | OCA 组名（One-Cancels-All） |
| `oca_type` | string | 否 | OCA 类型：`strategy.oca.cancel` / `strategy.oca.reduce` / `strategy.oca.none` |
| `when` | bool | 否 | 条件为 `false` 时跳过此指令 |

**订单类型映射规则：**

| limit | stop | 实际订单类型 |
|-------|------|-------------|
| 无 | 无 | 市价单 (market) |
| 有 | 无 | 限价单 (limit) |
| 无 | 有 | 止损单 (stop) |
| 有 | 有 | 止损限价单 (stop_limit) |

**反转行为：** 当持有反方向仓位时，`strategy.entry` 会先平掉旧仓位再建立新仓位。例如持有多头时调用 `strategy.entry("short", strategy.short, ...)` 会先平多再开空。

**Pyramiding：** 同方向加仓次数受 `pyramiding` 参数限制（默认 1，即不允许加仓）。

### 4.2 strategy.close() — 按 ID 平仓

```pine
strategy.close(id, immediately)
```

| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | string | 要平仓的入场信号 ID，省略或空字符串则平掉全部仓位 |
| `immediately` | bool | 是否在当前 tick 立即成交（默认 `false`） |

### 4.3 strategy.close_all() — 全部平仓

```pine
strategy.close_all(immediately)
```

平掉所有方向的全部仓位。

### 4.4 strategy.exit() — 挂出场条件

```pine
strategy.exit(id, from_entry, qty, qty_percent, profit, loss, limit, stop, profit_pct, loss_pct, trail_points, trail_price, trail_offset)
```

| 参数 | 类型 | 说明 |
|------|------|------|
| `id` | string | 出场信号标识符 |
| `from_entry` | string | 绑定的入场信号 ID（默认等于 `id`） |
| `qty` | number | 平仓数量（绝对值） |
| `qty_percent` | number | 平仓比例 (0-100) |
| `profit` | number | 止盈点数（每单位利润，绝对金额） |
| `loss` | number | 止损点数（每单位亏损，绝对金额） |
| `limit` | number | 止盈价格（绝对价位） |
| `stop` | number | 止损价格（绝对价位） |
| `profit_pct` | number | 止盈百分比（相对入场价） |
| `loss_pct` | number | 止损百分比（相对入场价） |
| `trail_points` | number | 移动止损激活偏移（以 tick 为单位） |
| `trail_price` | number | 移动止损激活绝对价格 |
| `trail_offset` | number | 移动止损跟踪偏移（以 tick 为单位） |

**ExitGroup 机制：** `strategy.exit` 不会立即下单，而是创建一个「出场条件组」（ExitGroup），挂在指定的入场订单上。每根 K 线都会检查这些条件是否满足。

**无触发条件 = noop（Pine 官方语义）：** 如果 `strategy.exit()` 没有声明 `profit` / `loss` / `limit` / `stop` / `trail_*` 中任何一个触发条件（哪怕带了 `qty`），该指令**不产生任何成交**。引擎与 Pine 原义对齐按 noop 处理，并发出警告建议改用 `strategy.close()` 按信号平仓。

**止盈止损优先级：** 同一根 K 线内，引擎通过 OHLC 路径模型判定哪个条件先触发。

**移动止损（Trailing Stop）：**
1. 价格达到 `trail_points` / `trail_price` 指定的激活水位后，移动止损被激活
2. 激活后，引擎持续跟踪最高价（多头）或最低价（空头）
3. 当价格从最高/最低点回撤超过 `trail_offset` 个 tick 时触发平仓

### 4.5 strategy.order() — 通用下单

```pine
strategy.order(id, direction, qty, limit, stop)
```

与 `strategy.entry` 类似，但有关键区别：
- **不受 pyramiding 限制**
- **不触发仓位反转**（持有反方向仓位时不会自动平仓）
- 适用于需要灵活控制仓位的场景

### 4.6 strategy.cancel() / strategy.cancel_all() — 撤单

```pine
strategy.cancel(id)        // 撤销指定 ID 的挂单
strategy.cancel_all()      // 撤销全部挂单
```

### 4.7 strategy.risk.* — 风控函数

本引擎共支持以下 4 个 `strategy.risk.*` 函数（其余 TradingView 风控函数如 `max_cons_loss_days` / `allow_entry_in` 之外的方向限制等暂未实现）。
这 4 条规则在 **Pine 侧 BrokerEmulator 与主回测引擎（BacktestEngine）中同时生效**，两条链路使用同一套语义：

```pine
// 最大回撤限制（达到后停止交易）
strategy.risk.max_drawdown(value, type)
// value: 数值
// type: strategy.percent_of_equity 或 strategy.cash

// 限制入场方向
strategy.risk.allow_entry_in(value)
// value: strategy.direction.long / strategy.direction.short / strategy.direction.all

// 最大持仓量
strategy.risk.max_position_size(value)

// 日内最大亏损
strategy.risk.max_intraday_loss(value, type)
```

---

## 5. 订单类型与执行语义

### 5.1 内部订单类型

| 类型 | 创建方式 | 成交条件 |
|------|---------|---------|
| `market` | entry/order 无 limit/stop | 下一根 K 线开盘价成交 |
| `limit` | entry/order 设置 limit | 价格触及或穿越限价时成交 |
| `stop` | entry/order 设置 stop | 价格触及或穿越止损触发价时成交 |
| `stop_limit` | entry/order 同时设置 stop+limit | 价格先触及 stop 激活，再触及 limit 成交 |

**挂单持续有效（working order，TV 语义）：** 限价/止损挂单在成交或被撤销前持续有效，不是"当根 K 线未触及即作废"。未成交的限价单会留在挂单队列，等待后续 K 线触发；`strategy.cancel()` / `strategy.cancel_all()` 或同 ID 新指令可以移除它。
若开启 `backtest_fill_limits_assumption`，限价单还需满足穿越验证（见 8.4 节）。

### 5.2 OHLC 路径模型

引擎使用 OHLC 路径模型来模拟同一根 K 线内的价格运动顺序，规则采用 **TradingView 官方启发式**——按"开盘价离最高价还是最低价更近"判断（**不再**按阳线/阴线判断）：

**若 high − open < open − low（开盘离最高价更近）：** O → H → L → C
**否则（开盘离最低价更近或等距）：** O → L → H → C

这个路径决定了当同一根 K 线上有多个止盈/止损条件时，哪个先触发。

```
high - open < open - low（开盘更靠近最高价）
→ 价格先冲高（H）再回落（L）
顺序: O(0) → H(1) → L(2) → C(3)

其余情况（开盘更靠近最低价，或两边等距）
→ 价格先探底（L）再冲高（H）
顺序: O(0) → L(1) → H(2) → C(3)
```

### 5.3 回测执行模式 (BacktestMode)

| 模式 | 说明 | 精度 | 性能 |
|------|------|------|------|
| `ohlc_approx` | 使用 OHLC 路径近似模拟（默认） | 中等 | 快 |
| `replay` | 使用低周期 K 线逐笔回放 | 高 | 慢 |
| `close_only` | 仅使用收盘价 | 低 | 最快 |

**`ohlc_approx` 模式（推荐）：**
- 每根 K 线按 O→L→H→C 或 O→H→L→C 路径检查订单
- 在 `calcOnEveryTick` 开启时，将一根 K 线拆为 4 个单价 tick 分别执行脚本

**`replay` 模式：**
- 需要提供 `ReplayDataProvider` 接口获取低周期 K 线
- 父周期每根 K 线用多根子 K 线逐一回放

**`close_only` 模式：**
- 所有订单仅在收盘价判定成交
- 适合快速验证逻辑

### 5.4 processOrdersOnClose 语义

| 值 | 成交时点 | 说明 |
|----|---------|------|
| `false`（默认，与 TV 一致） | 下一根 K 线开盘 | 信号产生在 bar N，订单在 bar N+1 的开盘价成交 |
| `true` | 当前 K 线收盘 | 信号产生在 bar N，订单在 bar N 的收盘价成交（更激进，引擎会发出提示） |

---

## 6. 回测执行流程

### 6.1 Pine 侧 BrokerEmulator 流程

```
PineEngine.executeStrategy()
    │
    ├─ 1. buildExecutionPolicy()
    │      从 strategy() 声明 + strategyConfig 合并参数
    │
    ├─ 2. new BrokerEmulator(policy)
    │
    ├─ 3. 逐 K 线循环（bar 0 → bar N）
    │      │
    │      ├─ interpreter.executeSingleBarWithOptions()
    │      │    → 执行脚本，收集 StrategyCommand[]
    │      │
    │      ├─ broker.processBar(candle, commands)
    │      │    │
    │      │    ├─ StrategyCommandNormalizer.normalize()
    │      │    │    → 转换为 InternalOrder[] + ExitGroup[]
    │      │    │
    │      │    ├─ attemptFills()  （处理已有挂单）
    │      │    │    → FillModel.tryFillOrder() 判定成交
    │      │    │    → PositionLedger.applyFill() 更新仓位
    │      │    │
    │      │    ├─ 新订单排队 / 替换同 signalId 旧挂单
    │      │    │
    │      │    ├─ 处理 closeTick / deferred 订单
    │      │    │
    │      │    └─ ledger.updateMark() 更新权益
    │      │
    │      └─ calcOnOrderFills 循环（最多 8 次）
    │           → 成交后重新执行脚本，处理新指令
    │
    └─ 4. broker.buildExecutionReport()
           → StrategyExecutionReport (fills, closedTrades, barSnapshots)
```

### 6.2 主回测引擎（BacktestEngine）流程

```
BacktestEngine.run(candles, scriptResult)
    │
    ├─ 校验会员权限
    ├─ 清洗 K 线（过滤无效数据）
    ├─ 透传 Pine strategy.risk.* 规则（与 BrokerEmulator 同一套语义）
    │
    ├─ 逐 K 线循环
    │    │
    │    ├─ 止损检查（BacktestStopLoss）
    │    │    → intrabar OHLC 路径近似判定
    │    │
    │    ├─ 挂单处理（checkPendingOrders）
    │    │    → stop / limit / stop-limit 挂单触发判定
    │    │    → 限价单穿越验证（backtest_fill_limits_assumption）
    │    │
    │    ├─ 执行策略指令（BacktestOrderProcessor）
    │    │    ├─ entry/order → 风控检查 + 下单（含保证金放大）
    │    │    ├─ close/exit → 平仓 / 挂出场条件
    │    │    └─ cancel → 撤单
    │    │
    │    ├─ 佣金计算（FeeCalculator，TV 三型）
    │    ├─ tick 滑点（SlippageModel）
    │    ├─ 权益与风控更新
    │    │
    │    └─ 保证金强平检查（margin < 100 时，TV 4 倍补亏算法）
    │
    ├─ 收尾强平（最后一根 K 线平掉剩余仓位）
    │
    └─ 计算绩效指标 → BacktestResult
```

### 6.3 BrokerEmulator 单 K 线处理流程

```
processBar(candle, commands)
    │
    ├─ 1. 日内风控重置 (checkIntradayReset)
    │
    ├─ 2. attemptFills()
    │      处理上一根 K 线遗留的挂单和 ExitGroup
    │      使用 replayBar() 按回测模式决定回放方式
    │
    ├─ 3. normalize(commands)
    │      StrategyCommandNormalizer 转换新指令
    │      → orders[]: InternalOrder
    │      → exitGroups[]: ExitGroup
    │      → cancels[]: 待撤单 ID
    │
    ├─ 4. 撤单处理
    │      按 cancel 列表移除挂单
    │
    ├─ 5. 合并 ExitGroup
    │      新 exit 覆盖同 fromEntryId 的旧条件组
    │
    ├─ 6. initializeOrderQty()
    │      解析 percent_of_equity / cash → 实际股数
    │
    ├─ 7. 新订单入队
    │      同 signalId 的新单替换旧挂单
    │
    ├─ 8. 分流处理
    │      ├─ processOrdersOnClose = true → closeTick 成交
    │      └─ deferred 市价单 → 下 bar 开盘成交
    │
    ├─ 9. [可选] attemptCloseTickExitGroups()
    │
    └─ 10. recordBarSnapshot()
           记录当前 bar 的权益/仓位/盈亏快照
```

---

## 7. 回测配置参数

### BacktestConfig 完整字段

自 2026-07 起只有一套默认值（TradingView Broker Emulator 默认值），
旧的 `compatibilityMode` / `t1Rule` / `priceLimit` / `aShareEnhanced` / `boardType` / `feeProfile` 等字段已删除。

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `initialCapital` | number | `100000` | 初始资金（元） |
| `commission` | number | `0` | 佣金值（含义由 `commissionType` 决定） |
| `commissionType` | `'percent' \| 'cash_per_order' \| 'cash_per_contract'` | `'percent'` | TV 三型佣金 |
| `slippage` | number | `0` | 滑点 tick 数（成交价 = 价格 ± slippage × tickSize） |
| `processOrdersOnClose` | bool | `false` | 收盘时处理订单（默认下一根开盘成交，与 TV 一致） |
| `lotSize` | number | `1` | 最小交易单位（TV 无整手限制；用户可手动设 100 模拟 A 股整手） |
| `positionSizePct` | number | `0.95` | 仓位占比（95%） |
| `allowShort` | bool | `true` | 产品级方向过滤：false 时忽略做空 entry |
| `riskFreeRate` | number | `0.02` | 无风险利率（用于夏普计算） |
| `maxVolumeParticipation` | number | `0` | 最大成交量参与率（0=不限） |
| `maxDrawdownStop` | number | `0` | 最大回撤停损线（0=不启用） |
| `maxDailyLoss` | number | `0` | 日内最大亏损（0=不启用） |
| `forceCloseOnRisk` | bool | - | 风控触发时是否当根收盘强平 |
| `intrabarPathMode` | `'off' \| 'ohlc'` | `'ohlc'` | OHLC 路径模式 |
| `tickSize` | number | `0.01` | 最小价格步长（按标的元数据注入，对齐 TV syminfo.mintick；外汇 0.0001） |
| `marginLong` | number | `100` | 做多保证金百分比（<100 时启用杠杆与强平，见 8.3 节） |
| `marginShort` | number | `100` | 做空保证金百分比，语义同上 |
| `fillLimitsAssumptionTicks` | number | `0` | 限价单成交验证 tick 数（见 8.4 节） |
| `market` | string | - | 标的所属市场（仅元数据/展示用途，不触发任何规则注入） |

### ExecutionPolicy 字段（Pine 侧）

| 参数 | 默认值 | 说明 |
|------|--------|------|
| `initialCapital` | `100000` | 初始资金 |
| `commission` | `0` | 佣金值 |
| `commissionType` | `'percent'` | 佣金类型（TV 三型） |
| `slippage` | `0` | 滑点 tick 数 |
| `tickSize` | `0.01` | 最小价格变动 |
| `pyramiding` | `1` | 同方向最大加仓次数 |
| `defaultQtyType` | `'fixed'` | 默认下单量类型 |
| `defaultQtyValue` | `1` | 默认下单量 |
| `processOrdersOnClose` | `false` | 收盘处理订单 |
| `calcOnEveryTick` | `false` | 每 tick 计算 |
| `calcOnOrderFills` | `false` | 成交时重算 |
| `backtestMode` | `'ohlc_approx'` | 回测执行模式 |
| `marginLong` | `100` | 做多保证金百分比 |
| `marginShort` | `100` | 做空保证金百分比 |
| `fillLimitsAssumptionTicks` | `0` | 限价单成交验证 tick 数 |
| `risk` | `{ allowedDirection: 'all' }` | strategy.risk.* 风控规则 |

---

## 8. 费用、滑点与保证金

### 8.1 佣金计算 (FeeCalculator)

佣金完全对齐 TradingView 的 `commission_type` / `commission_value`，共三种类型，默认 `0`（不收费）：

| 类型 | 计算方式 | 示例 |
|------|---------|------|
| `percent` | `成交金额 × commission_value`（小数比例，`0.001` = 0.1%） | `commission_value=0.00025` ≈ 万 2.5 |
| `cash_per_order` | 每笔订单固定金额 | `commission_value=5` = 每笔 5 元 |
| `cash_per_contract` | `commission_value × 成交数量`（每合约/每股固定金额） | `commission_value=0.01` = 每股 1 分 |

要点：

- 买卖双边佣金**相同**（方向无关，TV 语义）。
- 印花税、过户费、最低佣金、市场费率 profile 等交易所制度费用**不再内置**——与 TradingView 一致，
  用户可把这类成本折算进 `commission_value`（例如 A 股卖出印花税万 5 可近似摊进 percent 佣金）。
- 部分平仓时，入场费按平仓数量比例摊销（建仓时记账，避免重算偏差）。

### 8.2 滑点模型 (SlippageModel)

滑点只有一种模型，对齐 TradingView `strategy(slippage=N)` 的 **tick 语义**（不再是价格比例）：

```
实际成交价 = 价格 ± slippage × tickSize
```

- 方向永远对交易者**不利**：买入加价、卖出减价
- `slippage` 单位是 **tick 数**（整数），默认 `0`
- `tickSize` 按标的元数据注入（对齐 TV `syminfo.mintick`，A股/港股/美股 0.01，外汇 0.0001）

示例：`slippage=2`、`tickSize=0.01` 时，买单在 10.00 触发则按 10.02 成交。

旧版本的"滑点比例（千 1）"与"成交量感知滑点（VolumeSlippageModel）"已移除。

### 8.3 保证金与强平 (margin_long / margin_short)

`strategy()` 声明的 `margin_long` / `margin_short` 会被解析并透传给引擎：

**仓位放大：** 保证金百分比 <100 时，购买力按 `100 / marginPct` 倍放大。
例如 `margin_long=50` = 2 倍杠杆，`margin_long=25` = 4 倍杠杆；`100`（默认）= 全额、无杠杆；`<=0` = 不启用保证金检查。

**保证金强平（margin call）：** 主引擎实现了 TradingView 官方 4 倍补亏算法。每根 K 线收盘后检查：

```
Margin Ratio     = Margin Percent / 100
Margin           = 持仓市值 × Margin Ratio
Available Funds  = Equity − Margin

当 Available Funds < 0 时触发强平：
Money Lost       = Available Funds / Margin Ratio
Cover Amount     = TRUNCATE(|Money Lost| / 当前价格)
强平数量          = Cover Amount × 4      ← 补亏所需数量的 4 倍
```

强平按持仓顺序执行，以当根收盘价（含滑点）成交，并写入回测警告，交易的 `exitReason` 记为 `close_all`。

### 8.4 限价单成交验证 (backtest_fill_limits_assumption)

对齐 TradingView 的 `strategy(backtest_fill_limits_assumption=N)`：

- `N > 0` 时，限价单要求市场价**穿越挂单价至少 N 个 tick** 才允许成交（模拟真实排队深度）；
  成交价仍为挂单价本身，不是穿越后的价格。
- `N = 0`（默认）：价格首次触及限价即成交。
- 未通过验证的限价单**不会被取消**，继续留在挂单队列（working order），等待后续 K 线满足条件。

---

## 9. 市场制度规则：引擎不内置

### 9.1 设计原则（TradingView 对齐）

引擎撮合语义与 TradingView Broker Emulator 保持 1:1 兼容：**引擎不模拟任何市场交易制度**。
市场只向引擎提供元数据（`tickSize`、支持的周期、产品级方向过滤），下列规则均**不会**由引擎检查或拒单：

| 规则 | 引擎行为 | 如需模拟 |
|------|---------|---------|
| T+1（当日买入禁当日卖出） | 不检查 | Pine 脚本内自行实现（见 9.2） |
| 涨跌停（±10%/±20%/±30% 封板） | 不检查 | Pine 脚本内自行实现 |
| 整手数（100 股/手） | 默认 `lotSize=1`，不强制 | 手动把 `lotSize` 设为 100，或脚本内取整 |
| 停牌 / 零成交量 | 不拒单 | 脚本内判断 `volume == 0` 跳过信号 |
| 做空禁止 | 默认允许做空 | 关闭产品级 `allowShort` 开关，或 `strategy.risk.allow_entry_in` |
| 印花税 / 过户费 / 最低佣金 | 不内置 | 折算进 `commission_value`（见 8.1） |

这样做的好处：TradingView 上验证过的脚本移植到 TideView 时行为一致；
制度性约束交给脚本层，规则透明、可配置、可关闭。

### 9.2 在 Pine 脚本中自行实现市场规则

与 TradingView 一致，需要 T+1、整手数等约束时在脚本内实现。示例（T+1 + 100 股整手取整）：

```pine
//@version=5
strategy("A股规则自实现示例", overlay=true, initial_capital=100000)

var int entryDay = na          // 记录买入交易日

ma20 = ta.sma(close, 20)

// 买入：数量向下取整到 100 股整手
if ta.crossover(close, ma20) and strategy.position_size == 0
    qty = math.floor(strategy.equity * 0.95 / close / 100) * 100
    if qty >= 100
        strategy.entry("多", strategy.long, qty=qty)
        entryDay := dayofmonth(time)

// 卖出：T+1 —— 仅在非买入当日才允许平仓
if ta.crossunder(close, ma20) and dayofmonth(time) != entryDay
    strategy.close("多")
```

### 9.3 保留的产品级能力

- **方向过滤**：回测面板可选"仅多 / 仅空 / 多空"，`allowShort=false` 时做空 entry 指令被直接忽略（不计入拒单）。
- **市场元数据**：`tickSize` 按标的市场注入（外汇 0.0001，其余 0.01），影响滑点、trail tick 换算与价格对齐。
- **周期支持能力**：不支持分钟级数据的市场会自动回退到日/周/月周期。

---

## 10. 风控系统

### 10.1 脚本级风控 (strategy.risk.*)

在脚本中声明，运行时由 **Pine 侧 BrokerEmulator 与主回测引擎（BacktestEngine）同时执行**（两条链路同一套语义）：

```pine
// 最大回撤达到初始资金的 20% 时停止交易
strategy.risk.max_drawdown(20, strategy.percent_of_equity)

// 只允许做多
strategy.risk.allow_entry_in(strategy.direction.long)

// 最大持仓 10000 股
strategy.risk.max_position_size(10000)

// 日内最大亏损 5000 元
strategy.risk.max_intraday_loss(5000, strategy.cash)
```

### 10.2 配置级风控 (BacktestConfig)

| 参数 | 说明 |
|------|------|
| `maxDrawdownStop` | 最大回撤停损线（百分比），达到后停止所有交易 |
| `maxDailyLoss` | 日内最大亏损（百分比），达到后当日停止交易 |
| `maxVolumeParticipation` | 最大成交量参与率，限制单笔订单不超过 K 线成交量的指定比例 |
| `forceCloseOnRisk` | 风控触发时是否当根收盘价强平所有持仓 |
| `allowShort` | 产品级方向过滤：false 时忽略做空 entry（不计入拒单统计） |

### 10.3 入场被拒原因

市场制度类拒单原因（`t1_blocked` / `price_limit_locked` / `suspended_or_zero_volume` / `short_not_allowed`）
已随 TradingView 对齐改造移除。当前完整集合：

| 原因代码 | 说明 |
|---------|------|
| `risk_drawdown_stop` | 触及最大回撤停损线（config 级或 strategy.risk.max_drawdown） |
| `risk_daily_loss` | 触及日内最大亏损限制 |
| `risk_direction_blocked` | strategy.risk.allow_entry_in 方向限制拦截 |
| `risk_position_size` | strategy.risk.max_position_size 持仓量限制拦截 |
| `existing_position_id` | 已有同 ID 反方向仓位 |
| `limit_price_unreachable` | 限价单价格不可达（或未通过限价成交验证） |
| `invalid_entry_price` | 无效入场价格 |
| `qty_below_lot` | 数量不足最小交易单位 |
| `volume_limit_reduced_to_zero` | 成交量参与率限制后数量归零 |
| `insufficient_cash` | 资金不足 |
| `pyramiding_limit` | 超过加仓次数限制 |

### 10.4 平仓被拒原因

| 原因代码 | 说明 |
|---------|------|
| `no_position` | 无持仓可平 |
| `qty_below_lot` | 数量不足最小交易单位 |
| `invalid_exit_price` | 无效出场价格（异常数据防御兜底） |

---

## 11. 绩效指标

### BacktestMetrics 指标说明

| 指标 | 字段名 | 计算方式 |
|------|--------|---------|
| **总交易次数** | `totalTrades` | 已平仓交易总数 |
| **盈利次数** | `winTrades` | PnL > 0 的交易次数 |
| **亏损次数** | `lossTrades` | PnL < 0 的交易次数 |
| **平手次数** | `flatTrades` | PnL = 0 的交易次数 |
| **胜率** | `winRate` | 盈利次数 / 总交易次数 |
| **总收益（元）** | `totalReturn` | 期末权益 - 初始资金 |
| **总收益率（%）** | `totalReturnPct` | (期末权益 - 初始资金) / 初始资金 × 100 |
| **年化收益率** | `annualizedReturn` | (1 + 总收益率)^(barsPerYear/总bars) - 1 |
| **总手续费** | `totalFees` | 所有交易的手续费总和 |
| **毛利润** | `grossProfit` | 所有盈利交易的利润总和 |
| **毛亏损** | `grossLoss` | 所有亏损交易的亏损总和（负值） |
| **最大回撤（元）** | `maxDrawdown` | 权益峰值到谷值的最大跌幅 |
| **最大回撤（%）** | `maxDrawdownPct` | 最大回撤 / 峰值权益 × 100 |
| **夏普比率** | `sharpeRatio` | (年化收益 - 无风险利率) / 年化波动率 |
| **索提诺比率** | `sortinoRatio` | (年化收益 - 无风险利率) / 年化下行波动率 |
| **卡尔玛比率** | `calmarRatio` | 年化收益 / 最大回撤百分比 |
| **平均盈利** | `avgWin` | 毛利润 / 盈利次数 |
| **平均亏损** | `avgLoss` | 毛亏损 / 亏损次数 |
| **盈亏比** | `profitFactor` | 毛利润 / |毛亏损| |
| **期望值** | `expectancy` | 胜率 × 平均盈利 + (1-胜率) × 平均亏损 |
| **平均持仓K线数** | `avgHoldingBars` | 所有交易持仓周期的平均值 |
| **最大连胜** | `maxConsecutiveWins` | 连续盈利交易的最大次数 |
| **最大连亏** | `maxConsecutiveLosses` | 连续亏损交易的最大次数 |
| **年化换手率** | `annualTurnover` | 交易金额 / 平均权益 × (barsPerYear/总bars) |
| **月均交易次数** | `tradesPerMonth` | 总交易次数 / 月数 |
| **买入持有收益** | `buyHoldReturnPct` | 买入并持有的收益率（基准） |
| **超额收益** | `excessReturn` | 策略收益 - 买入持有收益 |

### barsPerYear 计算

引擎 `MetricsCalculator.calculateBarsPerYear` **从实际数据时间跨度动态推算**，而不是按时间级别查表：

```
barsPerYear = 自然年毫秒数（365.25 × 24 × 3600 × 1000）/ 平均 K 线毫秒数
其中 平均 K 线毫秒数 = (lastTime - firstTime) / (count - 1)
```

数据点不足 2 时，回退到默认值 `TRADING_DAYS_PER_YEAR = 252`（A 股年均交易日）。

这种动态推算的好处：
- 自动兼容分钟线 / 日线 / 周线 / tick 不同采样
- 自动处理节假日缺口（实际跨度小，平均周期会更短）
- 无需维护"时间级别 → barsPerYear"的硬编码表

### 基准对比指标 (BenchmarkCalculator)

| 指标 | 说明 |
|------|------|
| β (Beta) | 策略收益相对基准的系统性风险 |
| Jensen α | 风险调整后的超额收益 |
| 信息比率 (IR) | 超额收益 / 跟踪误差 |
| 相关系数 | 策略与基准收益的相关性 |

### 策略综合评分 (StrategyScorer)

评分维度：
1. **全样本绩效**：总收益、夏普、回撤等
2. **分 Regime 切片**：牛市/震荡/熊市分别评估
3. **样本内/样本外对比**：70% IS / 30% OOS 切分，检测过拟合风险

---

## 12. 高级功能

### 12.1 前推优化 (WalkForwardOptimizer)

将数据分为多个滚动窗口（样本内 + 样本外），在样本内优化参数，在样本外验证，避免过拟合。

**流程：**
1. `generateWindows`：按 IS/OOS 比例生成滚动窗口
2. `optimizeWindowInternal`：每个窗口内参数搜索
3. 样本外权益拼接
4. 一致性评分与参数稳定性分析

### 12.2 组合回测 (PortfolioBacktest)

支持多标的组合回测，提供多种权重分配方案：

| 方案 | 说明 |
|------|------|
| `fixed` | 固定权重 |
| `equal_weight` | 等权 |
| `risk_parity` | 风险平价 |
| `min_variance` | 最小方差 |
| `max_sharpe` | 最大夏普 |

支持再平衡：按时间或阈值触发。

### 12.3 回撤分析 (DrawdownAnalyzer)

- 水下曲线计算
- 回撤事件状态机（识别回撤开始、最低点、恢复）
- Top N 回撤排名

---

## 13. 策略运行时变量

在策略脚本中可以实时读取以下变量：

### 仓位与资金

| 变量 | 说明 |
|------|------|
| `strategy.position_size` | 当前持仓量（正=多头，负=空头，0=空仓） |
| `strategy.position_avg_price` | 当前持仓均价 |
| `strategy.equity` | 当前总权益 (初始资金 + 已实现盈亏 + 浮动盈亏) |
| `strategy.cash` | 可用现金 |
| `strategy.initial_capital` | 初始资金 |

### 盈亏统计

| 变量 | 说明 |
|------|------|
| `strategy.netprofit` | 已平仓交易总盈亏 |
| `strategy.openprofit` | 当前持仓的浮动盈亏 |
| `strategy.grossprofit` | 所有盈利交易的利润总和 |
| `strategy.grossloss` | 所有亏损交易的亏损总和（负值） |
| `strategy.max_drawdown` | 最大回撤金额 |

### 交易统计

| 变量 | 说明 |
|------|------|
| `strategy.closedtrades` | 已完成交易次数 |
| `strategy.wintrades` | 盈利交易次数 |
| `strategy.losstrades` | 亏损交易次数 |
| `strategy.opentrades` | 当前未平仓交易数 |

### 当前持仓详情 (strategy.opentrades.*)

| 变量 | 说明 |
|------|------|
| `strategy.opentrades.entry_price` | 当前持仓的入场价 |
| `strategy.opentrades.entry_bar_index` | 入场 K 线索引 |
| `strategy.opentrades.size` | 持仓绝对数量 |
| `strategy.opentrades.profit` | 当前持仓浮动盈亏 |

### 历史交易查询 (strategy.closedtrades.*)

通过 `trade_num` 参数索引访问：

| 变量 | 说明 |
|------|------|
| `strategy.closedtrades.entry_price(trade_num)` | 第 N 笔交易的入场价 |
| `strategy.closedtrades.exit_price(trade_num)` | 第 N 笔交易的出场价 |
| `strategy.closedtrades.entry_bar_index(trade_num)` | 入场 K 线索引 |
| `strategy.closedtrades.exit_bar_index(trade_num)` | 出场 K 线索引 |
| `strategy.closedtrades.profit(trade_num)` | 盈亏金额 |
| `strategy.closedtrades.size(trade_num)` | 交易数量 |
| `strategy.closedtrades.commission(trade_num)` | 手续费 |
| `strategy.closedtrades.entry_time(trade_num)` | 入场时间戳 |
| `strategy.closedtrades.exit_time(trade_num)` | 出场时间戳 |
| `strategy.closedtrades.max_drawdown(trade_num)` | 该笔交易最大回撤 |
| `strategy.closedtrades.max_runup(trade_num)` | 该笔交易最大浮盈 |

### 方向常量

| 常量 | 值 | 说明 |
|------|-----|------|
| `strategy.long` | `1` | 做多方向 |
| `strategy.short` | `-1` | 做空方向 |

---

## 14. 常见问题与注意事项

### Q1: 为什么我的策略没有产生任何交易？

**可能原因：**
1. 脚本是 `indicator` 类型，不是 `strategy` 类型 — 确认使用 `strategy()` 声明
2. 初始资金不足以买入 1 个最小交易单位 — 检查 `initialCapital` 是否足够（拒单原因 `qty_below_lot` / `insufficient_cash`）
3. 信号条件从未满足 — 检查入场逻辑
4. 限价单价格始终未触及（或未通过 `backtest_fill_limits_assumption` 穿越验证），挂单一直处于 working 状态
5. 触发了 strategy.risk.* 或配置级风控（查看拒单统计中的 `risk_*` 原因）

### Q2: 回测结果和 TradingView 完全一致吗？

撮合语义（成交时点、OHLC 路径、佣金、滑点、保证金）与 TradingView Broker Emulator 对齐。仍可能产生差异的来源：
- 数据源不同（K 线本身有差异，结果必然不同）
- 脚本声明了引擎暂不支持的参数（`currency` 非 NONE、`close_entries_rule` 非 FIFO、`use_bar_magnifier`），引擎会忽略并告警
- `request.*` 系列部分函数为占位实现（见 18.2 节）

### Q3: strategy.entry 和 strategy.order 有什么区别？

| 特性 | strategy.entry | strategy.order |
|------|---------------|----------------|
| Pyramiding 限制 | 受限 | 不受限 |
| 仓位反转 | 持有反方向仓位时先平后开 | 不触发反转 |
| 适用场景 | 标准入场 | 灵活仓位管理 |

### Q4: processOrdersOnClose 对策略有什么影响？

- `false`（默认，与 TV 一致）：下一根 K 线开盘价成交，避免未来函数，更保守
- `true`：信号产生的 K 线收盘价成交，更激进；开启后引擎会在回测警告中提示该假设

### Q5: calcOnEveryTick 和 calcOnOrderFills 是做什么的？

- `calcOnEveryTick`：在 `ohlc_approx` 模式下，将一根 K 线拆为 O/L/H/C 四个 tick，每个 tick 都重新执行脚本。适合需要精确模拟实时计算的场景。
- `calcOnOrderFills`：每次订单成交后重新执行脚本（最多 8 次/bar），允许策略根据成交结果立即调整仓位。

### Q6: OHLC 路径模式（intrabarPathMode）关闭和开启有什么区别？

- `'ohlc'`（开启）：使用 OHLC 路径近似判定同 K 线内止盈/止损触发顺序
- `'off'`（关闭）：不做 intrabar 止损检查，仅在 K 线完成时判定

建议保持开启，以获得更精确的止损模拟。

### Q7: 最小资金要求如何计算？

```
最小资金 ≈ 最新收盘价 × lotSize / positionSizePct
```

默认 `lotSize=1`，几乎不会有门槛。若手动把 `lotSize` 设为 100（模拟 A 股整手）：股价 50 元、仓位比例 95% 时
```
最小资金 ≈ 50 × 100 / 0.95 ≈ 5,263 元
```

### Q8: 移动止损（Trailing Stop）如何工作？

1. **激活条件**：浮动盈利达到 `trail_points`（tick 单位）或价格达到 `trail_price`
2. **跟踪过程**：持续更新最高价（多头）/ 最低价（空头）的 watermark
3. **触发条件**：从 watermark 回撤超过 `trail_offset` 个 tick 时触发平仓

```pine
// 当浮盈达到 50 个 tick 时激活，回撤 20 个 tick 时止损
strategy.exit("TS", "long", trail_points=50, trail_offset=20)
```

---

## 15. 完整示例

### 15.1 双均线交叉策略

```pine
//@version=5
strategy("双均线交叉", overlay=true, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

fast_len = input.int(10, "快线周期")
slow_len = input.int(30, "慢线周期")

fast_ma = ta.sma(close, fast_len)
slow_ma = ta.sma(close, slow_len)

// 金叉买入
if ta.crossover(fast_ma, slow_ma)
    strategy.entry("多", strategy.long)

// 死叉卖出
if ta.crossunder(fast_ma, slow_ma)
    strategy.close("多")

plot(fast_ma, "快线", color=color.blue)
plot(slow_ma, "慢线", color=color.orange)
```

### 15.2 带止盈止损的突破策略

```pine
//@version=5
strategy("通道突破", overlay=true, initial_capital=200000, pyramiding=0)

length = input.int(20, "回看周期")
atr_mult = input.float(2.0, "ATR 倍数")

upper = ta.highest(high, length)
lower = ta.lowest(low, length)
atr = ta.atr(14)

// 突破上轨买入
if close > upper[1]
    strategy.entry("突破多", strategy.long)
    // 止盈 3 倍 ATR，止损 1.5 倍 ATR
    strategy.exit("出场", "突破多", profit=atr * 3, loss=atr * 1.5)

plot(upper, "上轨", color=color.green)
plot(lower, "下轨", color=color.red)
```

### 15.3 使用移动止损

```pine
//@version=5
strategy("移动止损示例", overlay=true, initial_capital=100000)

rsi = ta.rsi(close, 14)

// RSI 超卖买入
if rsi < 30
    strategy.entry("RSI多", strategy.long)

// 移动止损：浮盈 5% 后激活，回撤 2% 止损
strategy.exit("移动止损", "RSI多", trail_points=50, trail_offset=20)

// RSI 超买平仓
if rsi > 70
    strategy.close("RSI多")
```

### 15.4 使用风控函数

```pine
//@version=5
strategy("风控示例", overlay=true, initial_capital=100000)

// 风控：最大回撤 15%，只允许做多，日内亏损不超过 3%
strategy.risk.max_drawdown(15, strategy.percent_of_equity)
strategy.risk.allow_entry_in(strategy.direction.long)
strategy.risk.max_intraday_loss(3, strategy.percent_of_equity)

ma20 = ta.sma(close, 20)

if close > ma20
    strategy.entry("趋势多", strategy.long)

if close < ma20
    strategy.close("趋势多")
```

### 15.5 利用运行时变量做仓位管理

```pine
//@version=5
strategy("仓位管理", overlay=true, initial_capital=200000, pyramiding=3)

ma = ta.sma(close, 20)

// 根据已有仓位决定是否加仓
if close > ma and strategy.opentrades < 3
    qty = strategy.equity * 0.3 / close
    strategy.entry("加仓", strategy.long, qty=qty)

// 亏损超过初始资金 5% 时全部平仓
if strategy.netprofit < -strategy.initial_capital * 0.05
    strategy.close_all()

// 显示当前持仓信息
plot(strategy.position_size, "持仓量", display=display.status_line)
plot(strategy.equity, "权益", display=display.status_line)
```

---

## 附录 A：与 TradingView 的语义对照表

| 特性 | TradingView | TideView |
|------|------------|----------|
| T+1 / 涨跌停 / 停牌等市场制度 | 不内置（脚本内自行实现） | 不内置（脚本内自行实现，见第 9 章） |
| 做空 | 支持 | 支持（默认；可用产品级方向过滤关闭） |
| 最小交易单位 | 1 | 1（`lotSize` 可手动改） |
| 佣金 | commission_type 三型，默认 0 | 相同 |
| 滑点 | tick 数，默认 0 | 相同 |
| 保证金与 4 倍补亏强平 | margin_long / margin_short | 相同算法 |
| backtest_fill_limits_assumption | 支持 | 支持 |
| 收盘挂单 process_orders_on_close | 默认关闭 | 默认关闭 |
| OHLC 路径启发式 | 按开盘价距离 H/L 判定 | 相同 |
| currency / close_entries_rule(非FIFO) / use_bar_magnifier | 支持 | 暂不支持（忽略 + 显式告警） |

## 附录 B：回测结果数据结构

```typescript
interface BacktestResult {
  trades: Trade[];              // 所有已平仓交易
  equity: number[];             // 逐 K 线权益序列
  drawdownSeries: number[];     // 逐 K 线回撤序列
  monthlyReturns: MonthlyReturn[];  // 月度收益
  yearlyReturns: YearlyReturn[];    // 年度收益
  positionState: number[];      // 逐 K 线持仓状态
  signals: TradeSignal[];       // 交易信号（图表标记）
  metrics: BacktestMetrics;     // 绩效指标汇总
  config: BacktestConfig;       // 回测配置
  warnings: string[];           // 回测警告
  interactionStats: BacktestInteractionStats; // 拒单统计
  robustness?: {                // 稳健性分析（可选）
    inSample?: { ... };
    outOfSample?: { ... };
    overfitRiskScore?: number;
    paramSensitivity?: number;
    notes?: string[];
  };
  backtestBarCount?: number;    // 回测 K 线数
  dataMeta?: BacktestDataMeta;  // 数据源元信息
}
```

## 附录 C：支持的时间级别

| 代码 | 说明 |
|------|------|
| `1m` | 1 分钟 |
| `5m` | 5 分钟 |
| `15m` | 15 分钟 |
| `30m` | 30 分钟 |
| `60m` | 60 分钟 |
| `2h` | 2 小时 |
| `4h` | 4 小时 |
| `6h` | 6 小时 |
| `8h` | 8 小时 |
| `12h` | 12 小时 |
| `1D` | 日线 |
| `1W` | 周线 |
| `1M` | 月线 |

不同市场支持的时间级别可能有所不同，通过 `isTimeframeSupportedForSymbol()` 判定。

---

## 16. 技术指标标准库 (ta.*)

TideView 内置了完整的 Pine Script 技术指标标准库，以下是全部支持的 `ta.*` 函数。

### 16.1 移动平均线

| 函数 | 别名 | 说明 |
|------|------|------|
| `ta.sma(source, length)` | `sma` | 简单移动平均 |
| `ta.ema(source, length)` | `ema` | 指数移动平均 |
| `ta.wma(source, length)` | `wma` | 加权移动平均 |
| `ta.vwma(source, length)` | `vwma` | 成交量加权移动平均 |
| `ta.rma(source, length)` | `rma` | 递归移动平均（Wilder） |
| `ta.swma(source)` | `swma` | 对称加权移动平均 |
| `ta.hma(source, length)` | `hma` | Hull 移动平均 |
| `ta.alma(source, length, offset, sigma)` | `alma` | Arnaud Legoux 移动平均 |
| `ta.dema(source, length)` | `dema` | 双重指数移动平均 |
| `ta.tema(source, length)` | `tema` | 三重指数移动平均 |
| `ta.kama(source, length)` | `kama` | Kaufman 自适应移动平均 |
| `ta.vidya(source, length)` | `vidya` | 可变指数动态平均 |
| `ta.vwap(source)` | `vwap` | 成交量加权平均价格 |

### 16.2 波动率与通道

| 函数 | 说明 |
|------|------|
| `ta.bb(source, length, mult)` | 布林带 → `[middle, upper, lower]` |
| `ta.bbw(source, length, mult)` | 布林带宽度 |
| `ta.kc(source, length, mult, useTrueRange)` | 肯特纳通道 → `[middle, upper, lower]`<br>⚠ 第 4 参数是布尔/0-1 开关（是否用 TR 计算通道宽度），不是 ATR 周期 |
| `ta.donchian(length)` | 唐奇安通道 → `[middle, upper, lower]`<br>⚠ 与 TradingView 不同：本引擎额外返回中轨，共 3 元素 |
| `ta.tr(handleNa)` | 真实波幅 |
| `ta.atr(length)` | 平均真实波幅 |
| `ta.stdev(source, length)` | 标准差 |
| `ta.variance(source, length)` | 方差 |
| `ta.dev(source, length)` | 平均绝对偏差 |
| `ta.range(source, length)` | 极差 (最高-最低) |

### 16.3 振荡器与动量

| 函数 | 别名 | 说明 |
|------|------|------|
| `ta.rsi(source, length)` | `rsi` | 相对强弱指数 |
| `ta.stoch(close, high, low, length)` | `stoch` | 随机振荡器 |
| `ta.stochrsi(source, rsiLen, stochLen, smoothK, smoothD)` | - | 随机 RSI → `[k, d]`<br>⚠ 默认值 `rsiLen=14, stochLen=14, smoothK=3, smoothD=3` |
| `ta.macd(source, fast, slow, signal)` | `macd` | MACD → `[macdLine, signalLine, hist]` |
| `ta.cci(source, length)` | `cci` | 商品通道指数 |
| `ta.mfi(series, length)` | `mfi` | 资金流量指数 |
| `ta.willr(length)` | `willr` / `wpr` | 威廉指标<br>⚠ 仅 1 个参数 length；source 固定为 close，不可自定义 |
| `ta.cmo(source, length)` | `cmo` | Chande 动量振荡器 |
| `ta.cog(source, length)` | `cog` | 重心振荡器 |
| `ta.fisher(length)` | `fisher` | Fisher 变换 → `[fisher, trigger]` |
| `ta.tsi(source, shortLen, longLen)` | - | 真实强弱指数<br>⚠ 与 TradingView 参数顺序相反（TV 是 longLen 在前），本引擎默认 `shortLen=13, longLen=25` |
| `ta.mom(source, length)` | `mom` | 动量 |
| `ta.roc(source, length)` | `roc` | 变化率 |
| `ta.change(source, length)` | - | 变化值 |

### 16.4 趋势指标

| 函数 | 说明 |
|------|------|
| `ta.adx(diLen)` | 平均趋向指数 |
| `ta.dmi(diLen, adxSmoothing)` | 方向运动指标 → `[diPlus, diMinus, adx]` |
| `ta.sar(start, increment, maximum)` | 抛物线 SAR（别名 `ta.psar` / `psar`） |
| `ta.supertrend(factor, atrLen)` | 超级趋势 → `[supertrend, direction]` |
| `ta.linreg(source, length, offset)` | 线性回归 |

### 16.5 成交量指标

| 函数 | 说明 |
|------|------|
| `ta.obv()` | `obv` | 能量潮 |
| `ta.wvad()` | - | Williams 可变累积分配 |
| `ta.accdist()` | - | 累积/分配线 |

### 16.6 统计函数

| 函数 | 说明 |
|------|------|
| `ta.correlation(source1, source2, length)` | 相关系数 |
| `ta.covariance(source1, source2, length)` | 协方差 |
| `ta.median(source, length)` | 中位数 |
| `ta.mode(source, length)` | 众数 |
| `ta.percentrank(source, length)` | 百分位排名 |
| `ta.percentile_nearest_rank(source, length, pct)` | 百分位（最近邻） |
| `ta.percentile_linear_interpolation(source, length, pct)` | 百分位（线性插值） |

### 16.7 条件与查找

| 函数 | 说明 |
|------|------|
| `ta.crossover(source1, source2)` | 上穿（金叉） |
| `ta.crossunder(source1, source2)` | 下穿（死叉） |
| `ta.cross(source1, source2)` | 交叉（金叉或死叉） |
| `ta.highest(source, length)` | 最高值 |
| `ta.lowest(source, length)` | 最低值 |
| `ta.highestbars(source, length)` | 距最高值的 K 线数 |
| `ta.lowestbars(source, length)` | 距最低值的 K 线数 |
| `ta.pivothigh(source, leftBars, rightBars)` | 枢轴高点 |
| `ta.pivotlow(source, leftBars, rightBars)` | 枢轴低点 |
| `ta.rising(source, length)` | 连续上升 |
| `ta.falling(source, length)` | 连续下降 |
| `ta.cum(source)` | 累积求和 |
| `ta.barssince(condition)` | 距条件成立的 K 线数 |
| `ta.valuewhen(condition, source, occurrence)` | 条件成立时的值 |

> **无前缀别名**：大部分 `ta.*` 函数支持无前缀直接调用（如 `sma(close, 20)` 等同于 `ta.sma(close, 20)`），兼容旧版 Pine Script。

---

## 16.x AI 扩展函数 (ai.*) — TideView 专有

让脚本能读取观潮 AI 分析模块的最新结论，实现「AI 信号 → Pine 策略」的数据通道。所有 `ai.*` 函数均为只读查询，不会触发新的 AI 分析。

| 函数 | 返回值 | 说明 |
|------|--------|------|
| `ai.sentiment()` | `1` (看涨) / `-1` (看跌) / `0` (中性或无信号) | 当前标的最新 AI 情绪评分 |
| `ai.score()` | `0-100`（无信号时返回 `50`） | 综合融合评分（本地 + LLM 加权） |
| `ai.risk()` | `1` (低) / `2` (中) / `3` (高) / `0` (无信号) | AI 风险等级评估 |
| `ai.hasSignal()` | `true` / `false` | 是否有有效（未过期）的 AI 信号 |

**使用示例：**

```pine
//@version=5
strategy("AI 加持策略", overlay=true)

ma20 = ta.sma(close, 20)
aiBullish = ai.sentiment() == 1 and ai.score() >= 60

// AI 看涨 + 突破均线时入场
if aiBullish and ta.crossover(close, ma20)
    strategy.entry("AI多", strategy.long)

// AI 转空或 score 跌破 40 时平仓
if ai.sentiment() == -1 or ai.score() < 40
    strategy.close("AI多")
```

**注意**：
- `ai.*` 函数只在桌面 App 的用户分析上下文中运行；无 AI 运行时的服务端或离线环境会降级返回空值（`sentiment=0, score=50, risk=0, hasSignal=false`）。
- 信号源自用户手动触发或定时刷新的 AI 分析结果，无信号时返回中性默认值不会让脚本崩溃。

---

## 17. 多周期引用 (request.security)

### 17.1 基本用法

```pine
// 同品种：获取日线收盘价 / 周线 RSI
daily_close = request.security(syminfo.tickerid, "D", close)
weekly_rsi = request.security(syminfo.tickerid, "W", ta.rsi(close, 14))

// 跨品种：字面量代码（失败返回 na，不会静默换成当前品种）
ref_close = request.security("000001.SZ", "D", close)
```

### 17.2 支持的目标周期

| 代码 | 说明 |
|------|------|
| `"1"` / `"3"` / `"5"` / `"15"` / `"30"` / `"60"` / `"120"` / `"240"` | 分钟级别 |
| `"D"` / `"1D"` | 日线 |
| `"W"` / `"1W"` | 周线 |
| `"M"` / `"1M"` | 月线 |

**注意**：不在此列表中的周期字符串（如 `"2D"`, `"3W"`）兼容性检查器会报 unsupported。

### 17.3 gaps 参数

控制高周期数据在低周期 K 线上的填充行为：

| 值 | 行为 |
|----|------|
| `barmerge.gaps_off`（默认） | 用前值填充，每根低周期 K 线都有数据 |
| `barmerge.gaps_on` | 仅在高周期 K 线收盘对应的低周期位置有数据，其余为 `na` |

### 17.4 lookahead 参数

控制数据前瞻行为（对回测准确性影响极大）：

| 值 | 行为 | 回测影响 |
|----|------|---------|
| `barmerge.lookahead_off`（默认） | 使用上一根已完成的高周期值 | 无前瞻偏差，推荐用于回测 |
| `barmerge.lookahead_on` | 使用当前高周期值（含未完成） | 存在前瞻偏差，仅用于非策略场景 |

**回测重要提醒**：在策略脚本中使用 `lookahead_on` 会导致前瞻偏差（look-ahead bias），回测结果会不切实际地好。除非你明确知道自己在做什么，否则请始终使用 `lookahead_off`。

### 17.5 表达式限制

`request.security` 的 `expression` 参数支持以下类型（可嵌套）：

**价格与合成：** `close`, `open`, `high`, `low`, `volume`, `time`, `hl2`, `hlc3`, `ohlc4`, `hlcc4`, `bar_index`

**均线 / 波动：**
- `ta.sma` / `ta.ema` / `ta.rma` / `ta.wma` / `ta.hma`
- `ta.highest` / `ta.lowest` / `ta.stdev` / `ta.atr` / `ta.linreg`

**动量 / 成交量：**
- `ta.rsi` / `ta.cci` / `ta.mfi` / `ta.mom` / `ta.roc` / `ta.change` / `ta.vwap`

**交叉与元组：**
- `ta.crossover` / `ta.crossunder`
- `ta.macd` → `[macd, signal, hist]`
- `ta.bb` / `ta.bbands` → `[basis, upper, lower]`

**数学：** `math.abs` / `math.floor` / `math.ceil` / `math.round` 及常见算术、比较；可写 `ta.sma(ta.rsi(close, 14), 5)` 一类嵌套。

**不支持的表达式会抛出运行时错误**：`request.security 暂不支持的表达式: ...`（用户自定义函数体、白名单外的复杂调用）

**延迟表达式（PineDeferredExpression）：** 由引擎内部自动处理。

### 17.6 低周期引用

当目标周期**低于**主图周期时，应使用 `request.security_lower_tf`（返回数组系列；支持跨品种字面量）：

```pine
// 在日线图上获取 1 小时 K 线数据
hourly_data = request.security_lower_tf(syminfo.tickerid, "60", close)

// 跨品种低周期
refLtf = request.security_lower_tf("000001.SZ", "60", close)
```

如果错误地在 `request.security` 中使用低周期，引擎会发出警告并建议改用 `request.security_lower_tf`。

### 17.7 其他特性

- **跨品种引用**：支持字面量代码，如 `"000001.SZ"`、`"SZ:000001"`、`"600000.SH"`；引擎按图表时间窗预取，失败返回 `na`（不会静默换成当前品种）
- **同品种跨周期**：优先 `syminfo.tickerid`，走同品种多周期路径
- **Heikin Ashi**：使用 `__HA__:` 前缀获取 Heikin Ashi 数据
- **动态请求上限**：单脚本最多 200 次动态 `request.security` 调用
- **预算降级**：跨品种 auxiliary 超预算时该品种降级为 `na`，整脚本仍可执行
- **动态 symbol/TF**：非常量表达式无法静态预取，跨品种场景可能得到 `na`

---

## 18. 兼容性与限制

### 18.1 兼容性预检 (compatChecker)

TideView 提供兼容性预检器，在运行前分析脚本中使用的函数和变量是否受支持。

**检查内容：**
- 函数调用是否在标准库注册表中
- `request.security` 的周期参数是否在支持列表内
- `import` 语句：可解析的内置库 / 本地已保存脚本会放行并注册 `alias.fn`；无法解析的路径记为不支持

### 18.2 已知限制

| 限制 | 说明 |
|------|------|
| `import` 语句 | 支持内置 `MathUtils` / `SignalUtils`，以及用户已保存在观潮中的脚本（按标题或 id）。**不支持** TradingView 云端 CDN（`import username/Library/version`）。缺库时可内联代码，或先把库保存到观潮再 import |
| `request.financial` | 基础财务指标查询有占位实现，多数高级字段返回 `na`（不会让脚本崩溃，但拿不到真实数据）|
| `request.quandl` / `request.dividends` / `request.earnings` / `request.economic` / `request.seed` / `request.currency_rate` | 全部为占位实现，调用返回 `na`（脚本不报错，但无真实数据） |
| 非标准 K 线 | `ticker.renko`, `ticker.kagi`, `ticker.pointfigure`, `ticker.linebreak` 为占位实现（返回带前缀的 tickerid 字符串） |
| 复杂 security 表达式 | 支持嵌套 ta.* / 元组白名单（见 17.5 节）；白名单外仍报暂不支持 |
| `request.splits` | 引擎未实现此函数，调用会报"未知函数" |

### 18.3 支持的全局变量

以下全局变量在脚本中可直接使用：

**价格系列**：`open`, `high`, `low`, `close`, `volume`, `time`, `hl2`, `hlc3`, `ohlc4`

**K 线状态 (barstate.*)**：
- `barstate.isfirst` — 是否第一根 K 线
- `barstate.islast` — 是否最后一根 K 线
- `barstate.ishistory` — 是否历史 K 线
- `barstate.isrealtime` — 是否实时 K 线
- `barstate.isconfirmed` — K 线是否已确认
- `barstate.isnew` — 是否新 K 线
- `barstate.islastconfirmedhistory` — 是否最后一根确认的历史 K 线

**标的信息 (syminfo.*)**：
- `syminfo.ticker` — 股票代码
- `syminfo.tickerid` — 完整代码标识
- `syminfo.prefix` — 市场前缀
- `syminfo.currency` — 计价货币
- `syminfo.type` — 标的类型
- `syminfo.description` — 描述
- `syminfo.mintick` — 最小价格变动

**时间级别 (timeframe.*)**：
- `timeframe.period` — 当前周期
- `timeframe.multiplier` — 周期倍数
- `timeframe.isdaily` / `isweekly` / `ismonthly` — 时间级别判断
- `timeframe.isintraday` / `isdwm` / `isseconds` / `isminutes`

**索引**：`bar_index`, `last_bar_index`

**布尔与空值**：`true`, `false`, `na`

---

## 19. 内置策略模板

TideView 内置了丰富的策略模板（位于 `src/renderer/scripting/templates/`），脚本开发者可在编辑器中直接选用。

### Pine Script 策略模板

| 模板 | 说明 |
|------|------|
| `pine-ma-crossover-strategy` | 均线交叉策略 |
| `pine-rsi-strategy` | RSI 超买超卖策略 |
| `pine-bollinger-bands-strategy` | 布林带突破策略 |
| `pine-macd-strategy` | MACD 策略 |
| `pine-kdj-strategy` | KDJ 策略 |
| 更多... | 见编辑器「新建脚本」→「策略模板」 |

### Pine Script 指标模板

| 模板 | 说明 |
|------|------|
| `pine-macd` | MACD 指标 |
| `pine-bollinger-bands` | 布林带指标 |
| `pine-rsi` | RSI 指标 |
| 更多... | 见编辑器「新建脚本」→「指标模板」 |

模板结构包含 `id`、`title`、`description`、`kind`（`'strategy'` 或 `'indicator'`）、`language`（始终为 `'pine'`）、`tags`、`timeframe`、`code`（完整可运行的源码）。

### 19.1 可直接复制给外部 AI 的精简模板

更完整的 A–G 模板（多周期 RSI、跨品种对照、MathUtils、日线过滤策略、跨品种确认、MACD+SignalUtils 等）以客户端「下载函数知识库」为准。下面给两段最短可跑示例：

**指标 — 多周期 RSI**

```pine
//@version=5
indicator("观潮-多周期RSI", overlay=false)
len = input.int(14, "RSI周期", minval=2)
rsiVal = ta.rsi(close, len)
htfRsi = request.security(syminfo.tickerid, "D", ta.rsi(close, len), lookahead=barmerge.lookahead_off)
plot(rsiVal, "RSI", color.blue)
plot(htfRsi, "日线RSI", color.orange)
hline(70, "超买", color.red)
hline(30, "超卖", color.green)
```

**策略 — 日线过滤 + 均线交叉**

```pine
//@version=5
strategy("观潮-日线过滤交叉", overlay=true, initial_capital=100000,
     commission_type=strategy.commission.percent, commission_value=0.1,
     default_qty_type=strategy.percent_of_equity, default_qty_value=10, pyramiding=1)
htfEma = request.security(syminfo.tickerid, "D", ta.ema(close, 20), lookahead=barmerge.lookahead_off)
fast = ta.ema(close, 12)
slow = ta.ema(close, 26)
longCond = close > htfEma and ta.crossover(fast, slow)
exitCond = ta.crossunder(fast, slow) or close < htfEma
if longCond
    strategy.entry("做多", strategy.long)
if exitCond
    strategy.close("做多")
plot(fast, "快线", color.blue)
plot(slow, "慢线", color.orange)
```

---

> **版本说明**：本文档基于 TideView 2026-07 版本源码编写（TradingView Broker Emulator 对齐版）。随着引擎迭代，部分 API 或参数可能会有变化，请以实际代码为准。
