运行回测
DSL(领域特定语言)回测是 Deepcoin 提供的高级交易功能,允许用户通过 JSON 定义复杂的市场触发策略,并针对历史数据进行回测。
1. API 信息
- 接口名称: DSL 回测运行(Backtest Run)
- 请求方法:
POST - 请求 URL:
/deepcoin/trade/backtest-run - Content-Type:
application/json
2. 整体请求架构
请求体由两个核心对象组成:策略逻辑定义(dsl)和历史数据配置(data_source):
{
"dsl": {...},// 定义:策略逻辑、指标、执行动作、风险控制
"data_source": {...}// 定义:哪个交易对?什么时间段进行回测?
}
3. 详细参数定义
3.1 策略逻辑层(dsl)
| 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|
version | 否 | String | DSL 版本,例如 "1.0" |
indicators | 是 | Array | 技术指标及其触发条件数组(详见 3.1.1) |
then | 是 | Object | 条件满足后的执行动作:开仓/平仓(详见 3.1.2) |
risk | 否 | Object | 订单自带的止盈止损保护:stop_loss(止损)、take_profit(止盈)(详见 3.1.3) |
execution | 否 | Object | 执行配置(可选,见 3.1.4) |
3.1.1 技术指标(indicators)
系统会根据 indicators 中定义的条件进行逻辑评估(多个指标默认为 AND 逻辑)。
| 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|
name | 是 | String | 指标唯一标识名 (如:ma5, boll) |
type | 是 | String | 指标类型:BOLL, MA, EMA, KDJ, RSI, WR |
params | 是 | Object | 指标计算参数(详见 3.1.1.1) |
condition | 是 | Object | 触发阈值(详见 3.1.1.2) |
scope | 是 | String | 作用范围:entry(入场/开仓判断), exit(出场/平仓判断) |
3.1.1.1 指标计算参数(params)
| 指标类型 | params 包含的参数 | 备注 |
|---|---|---|
| 通用 | interval | 必填。K 线周期:1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w |
| BOLL | period, std ,interval | std 为布林带标准差倍数 |
| MA / EMA | period,interval | - |
| KDJ | n, k_smoothing, d_smoothing,interval | nKDJ 参数,k_smoothingK 平滑,d_smoothingd 平滑 |
| RSI / WR | period,interval | - |
3.1.1.2 触发条件字段&示例(condition)
condition 对象通过组合不同字段来定义精确的触发逻辑。
| 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|
ref | 是 | String | 指标引用字段(例如:boll.lower) |
op | 是 | String | 比较运算符(<,>) |
right | 否 | Number | 比较值(当指标类型为 KDJ、RSI、WR 时必填) |
diff_price | 否 | Number | 当前价格与指标值的价差 |
| 场景 | condition 示例 | 业务含义 |
|---|---|---|
| 指标与价格比较 ( boll省略 right仅支持市价比较) | {"ref": "boll.lower", "op": "<"} | 当前市价高于布林带下轨。 |
| 指标与固定值比较 (使用 right) | {"ref": "kdj.k", "op": ">", "right": 80} | KDJ 指标的 K 值大于 80。 |
| 指标与价差比较 (使用 diff_price) | {"ref": "ma5.value", "op": ">", "diff_price": 100} | MA 均 线值高于当前价格 100 点。 |
3.1.2 执行动作(then)
包含 entry (入场) 或 exit (出场) 逻辑块。
动作分支 (on_true):
| 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|
action | 否 | String | 动作:open(开仓), close(平仓) |
side | 否 | String | 方向:long(多头), short(空头) |
volume | 是 | Number | 下单张数 |
3.1.3 风险控制(risk)
| 参数名 | 必填 | 类型 | 描述 |
|---|---|---|---|
stop_loss | 否 | Object | 止损配置。{"value": 0.1} 表示 10% |
take_profit | 否 | Object | 止盈配置。{"value": 0.2} 表示 20% |
3.1.4 执行配置(execution)
| 参数 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
fee_bps | 否 | Number | 手续费(基点,例如:5 表示 0.05%) |
3.2 数据源配置(data_source)
| 参数 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
symbol | 是 | String | 交易对标识(例如:BTC-USDT-SWAP) |
from_ts | 是 | Integer | 开始时间戳(Unix 时间戳,秒级) |
to_ts | 是 | Integer | 结束时间戳(Unix 时间戳,秒级) |
4. 响应参数
4.1 基础响应
| 字段 | 类型 | 描述 |
|---|---|---|
code | Integer | 业务状态码。0:成功;其他:失败 |
msg | String | 错误或提示信息 |
data | Object | 回测结果数据(见 4.2) |
4.2 回测结果数据
| 字段 | 类型 | 描述 |
|---|---|---|
summary | Object | 回测汇总统计(见 4.2.1) |
trades | Array | 交易记录数组(见 4.2.2) |
4.2.1 回测汇总
| 字段 | 类型 | 描述 |
|---|---|---|
realized_pnl | Number | 实际盈亏 |
symbol | String | 交易对符号 |
total_fee | Number | 总手续费 |
trades | Integer | 交易次数 |
4.2.2 交易记录
| 字段 | 类型 | 描述 |
|---|---|---|
fee | Number | 该笔交易的手续费 |
order_id | String | 订单 ID |
price | Number | 成交 价格 |
qty | Number | 成交数量 |
reason | String | 交易原因 |
side | String | 交易方向:buy,sell |
ts | Integer | 交易时间戳 |
5. 典型应用示例
5.1 完整请求示例
展示 BOLL 策略回测的所有可用参数的综合示例。
{
"dsl": {
"version": "1.0",
"indicators": [
{
"name": "boll",
"type": "BOLL",
"scope": "entry",
"params": {
"period": 15,
"std": 2,
"interval": "1m"
},
"condition": {
"ref": "boll.lower",
"op": "<",
"right": "price.close",
"diff_price": 10
}
}
],
"then": {
"entry": {
"on_true": {
"action": "open",
"side": "long",
"volume": 0.1
},
"on_false": {
"action": "none",
"side": "long",
"volume": 0
}
},
"exit": {
"on_true": {
"action": "close",
"side": "long",
"volume": 100
},
"on_false": {
"action": "none",
"side": "long",
"volume": 0
}
}
},
"execution": {
"fee_bps": 5
},
"risk": {
"stop_loss": {
"value": 0.1
},
"take_profit": {
"value": 0.1
}
}
},
"data_source": {
"symbol": "BTC-USDT-SWAP",
"from_ts": 1772054911,
"to_ts": 1772090911
}
}
5.2 组合指标(BOLL + KDJ)回测
回测当价格跌破布林带下轨且KDJ 的 K 值低于 30 时开多的策略。
{
"dsl": {
"version": "1.0",
"indicators": [
{
"name": "boll",
"type": "BOLL",
"scope": "entry",
"params": {
"period": 20,
"std": 2,
"interval": "1m"
},
"condition": {
"ref": "boll.lower",
"op": "<",
"right": "price.close"
}
},
{
"name": "kdj",
"type": "KDJ",
"scope": "entry",
"params": {
"n": 9,
"k_smoothing": 3,
"d_smoothing": 3,
"interval": "1m"
},
"condition": {
"ref": "kdj.k",
"op": "<",
"right": 30
}
}
],
"then": {
"entry": {
"on_true": {
"action": "open",
"side": "long",
"volume": 100
},
"on_false": {
"action": "none",
"side": "long",
"volume": 0
}
},
"exit": {
"on_true": {
"action": "close",
"side": "long",
"volume": 0
},
"on_false": {
"action": "none",
"side": "long",
"volume": 0
}
}
},
"risk": {
"stop_loss": {
"value": 0.1
},
"take_profit": {
"value": 0.5
}
}
},
"data_source": {
"symbol": "BTC-USDT-SWAP",
"from_ts": 1704067200,
"to_ts": 1706745600
}
}
5.3 MA 交叉策略带完整风控
回测使用 MA 交叉作为进出场信号的策略。
{
"dsl": {
"version": "1.0",
"indicators": [
{
"name": "ma5",
"type": "MA",
"scope": "entry",
"params": {
"period": 5,
"interval": "1h"
},
"condition": {
"ref": "ma5.value",
"op": "<",
"right": "price.close"
}
},
{
"name": "ma20",
"type": "MA",
"scope": "exit",
"params": {
"period": 20,
"interval": "1h"
},
"condition": {
"ref": "ma20.value",
"op": ">",
"right": "price.close"
}
}
],
"then": {
"entry": {
"on_true": {
"action": "open",
"side": "long",
"volume": 50
},
"on_false": {
"action": "none",
"side": "long",
"volume": 0
}
},
"exit": {
"on_true": {
"action": "close",
"side": "long",
"volume": 50
},
"on_false": {
"action": "none",
"side": "long",
"volume": 0
}
}
},
"execution": {
"fee_bps": 5
},
"risk": {
"stop_loss": {
"value": 0.05
},
"take_profit": {
"value": 0.15
}
}
},
"data_source": {
"symbol": "ETH-USDT-SWAP",
"from_ts": 1704067200,
"to_ts": 1706745600
}
}
6. 使用注意事项
- 指标逻辑:所有
scope: "entry"的指标必须同时满足才 会触发then.entry动作。 - 出场逻辑:同样,所有
scope: "exit"的指标必须满足才会触发then.exit动作。 - 数据范围:确保
from_ts和to_ts覆盖足够的历史数据以获得有意义的回测结果。 - 风险管理:始终配置适当的止损和止盈水平以管理策略风险。
- 回测局限性:过往表现不保证未来结果。将回测作为策略验证的众多工具之一。