XQuant 的 DSL 策略语言,Pine Script 风格,用于编写单标的交易策略并回测。在量化研究页面的「DSL 回测」中使用。
基本结构
每个策略以 strategy("名称") 开头,然后写变量定义和交易逻辑:
行情变量
| 变量 | 说明 |
|---|
| close | 当前收盘价 |
| open | 当前开盘价 |
| high | 当前最高价 |
| low | 当前最低价 |
| volume | 当前成交量 |
| bar_index | 当前 K 线序号 |
持仓状态
| 变量 | 说明 |
|---|
| strategy.position_size | 当前持仓数量(0 表示空仓) |
| strategy.position_avg_price | 当前持仓平均成本 |
技术指标(ta.*)
| 函数 | 说明 | 示例 |
|---|
| ta.sma(source, length) | 简单移动平均 | ta.sma(close, 5) |
| ta.lowest(source, length) | N 周期最低值 | ta.lowest(low, 20) |
| ta.highest(source, length) | N 周期最高值 | ta.highest(high, 20) |
| ta.rsi(source, length) | RSI 指标 | ta.rsi(close, 14) |
| ta.crossover(a, b) | a 上穿 b(金叉) | ta.crossover(fast, slow) |
| ta.crossunder(a, b) | a 下穿 b(死叉) | ta.crossunder(fast, slow) |
交易函数(strategy.*)
| 函数 | 说明 | 示例 |
|---|
| strategy.entry(id, direction, qty) | 开仓信号 | strategy.entry(id="long", direction=strategy.long, qty=0) |
| strategy.close(id) | 平仓信号 | strategy.close(id="long") |
| strategy.exit(id) | 平仓信号(同 close) | strategy.exit(id="long") |
qty=0 表示用 95% 可用资金全仓买入。
其他内置函数
| 函数 | 说明 |
|---|
| plot(series, title=...) | 输出序列(调试/绘图) |
| nz(value, default) | 把 NaN 替换为默认值 |
| na(value) | 判断是否为 NaN |
| math.min(a, b) | 取最小值 |
| math.max(a, b) | 取最大值 |
| limit.up(close) | 是否涨停(主板 10%,创业板/科创板 20%,北交所 30%) |
| limit.down(close) | 是否跌停 |
| limit.up_price(close) | 涨停价 |
| limit.down_price(close) | 跌停价 |
基本面因子(factor.*)
从特征数据读取基本面因子(需特征数据,缺失返回 NaN,可用 nz() 处理):
| 函数 | 说明 |
|---|
| factor.pe_ttm | 市盈率(TTM) |
| factor.pb | 市净率 |
| factor.ps_ttm | 市销率(TTM) |
| factor.market_cap | 总市值 |
| factor.momentum_5d / 20d / 60d | 5/20/60 日动量 |
| factor.rsi_14 | RSI(14) |
| factor.macd | MACD |
| factor.hv10 / 20 / 60 | 10/20/60 日历史波动率 |
| factor.atr_14 | ATR(14) |
注意事项
- 单标的:DSL 回测只针对一个标的(如 sh600519)
- 全仓进出:
qty=0 表示用 95% 可用资金全仓买入 - 缩进:
if 语句块用缩进表示,不要用 { } - 语法校验:页面有「校验语法」按钮,可先校验再回测
- 历史记录:回测结果会保存,可回看 DSL 源码和交易明细