用DolphinScript实现趋势跟踪与ATR止损的交易策略

本页为一篇文章页面,包含标题信息,并展示作者署名与发布日期等文章元信息。

Source: https://dolphindb.cn/blogs/189

What this page covers

技能认证特训营第二期正式开启(限时报名)

页面顶部包含活动报名促销信息,并提供链接入口。

用DolphinScript实现趋势跟踪与ATR止损的交易策略(作者与日期)

该部分呈现文章标题,并给出作者署名与发布日期信息。

目录

该部分列出文章的章节与小节结构,用于导航。

数据分析的准备工作:建库建表与导入数据

本节说明按日期分区并使用TSDB引擎创建数据库与表,并通过loadTextEx从CSV导入数据。

stockTB表数据示例(浦发银行600000,前复权日线)

本节给出示例数据的标的、时间范围与字段示意说明。

趋势跟踪交易策略:策略介绍与信号规则

本节描述基于价格突破的趋势信号规则,给出DolphinScript实现,并说明交易信号开始月份设置原因。

Kelly公式:定义、参数与计算实现思路

本节介绍Kelly公式的含义与参数,说明胜率/败率与平均盈利的历史计算方法,并给出实现与结果解读及半Kelly用法。

融入ATR跟踪止损策略:ATR计算、仓位管理与交易指令触发条件

本节定义ATR与止盈止损倍数,给出仓位计算方式,并列出开仓、调仓、反转、平仓及冷静期等触发条件。

策略实现代码:tradeRecord函数流程与回测交易记录示例

本节给出tradeRecord函数流程,包括变量初始化、下单指令判定、仓位与资产更新、ATR信号生成与记录表输出,并展示示例说明。

度量策略表现:年化收益率与最大回撤公式及计算结果

本节通过年化收益率与回撤指标评估策略,给出筛选区间条件,并展示最终的数值结果。

完整脚本代码

本节汇总从数据准备到回测与绩效计算的完整DolphinScript脚本。

Facts Index

Entity Attribute Value Confidence
技能认证特训营第二期状态正式开启(限时报名,享专属福利优惠)medium
限时报名链接urlhttps://www.qingsuyun.com/h5/e/217471/5/high
文章发布日期date2025-05-23high
作者署名name海豚_325754868high
stockDB数据库分区partitioning按日期值分区,每天一个分区(VALUE(2024.04.01..2025.04.01);按date列分区)high
stockDB数据库存储引擎engineTSDB(时间序列数据库)引擎high
TSDB引擎capability支持高效的时间范围查询和聚合操作(针对时间序列数据优化)medium
数据导入函数function使用loadTextEx从CSV文件导入数据,并按分区规则分布到不同分区high
stockTB表结构columnsdate(DATE), Open(DOUBLE), High(DOUBLE), Low(DOUBLE), Close(DOUBLE), Volume(INT)high
stockTB表设置sortColumnssortColumns=[`date]high
stockTB表设置keepDuplicateskeepDuplicates=ALLhigh
示例数据标的security浦发银行 600000high
示例数据时间范围range2024-04-01 至 2025-04-01(日线数据)high
示例数据价格处理adjustment前复权处理,避免分红配股导致的股价变化high
趋势跟踪策略类型strategy基于价格突破的趋势跟踪交易策略,结合凯利公式进行仓位管理high
买入信号条件(文中描述)rule当收盘价低于过去15日最低价(不包括当日)触发买入信号high
卖出信号条件(文中描述)rule当收盘价高于过去5日最高价(不包括当日)触发卖出信号high
交易信号开始时间constraint从2024年8月开始产生交易信号(为Kelly公式估计提供足够历史数据)high
trendSignal函数output返回包含date、Open、High、Low、Close及Signal列的表high
Signal取值含义(代码)mapping卖出信号为-1;买入信号为1high
买入信号条件(代码)ruleClose < Low.prev().mmin(15).bfill!() 且 month(date) >= 2024.08M → Signal=1high
卖出信号条件(代码)ruleClose > High.prev().mmax(5).bfill!() 且 month(date) >= 2024.08M → Signal=-1high
单次投资盈亏公式formula(当前价格 - 平均成本价格)x sgn(仓位)high
Kelly公式用途purpose确定最优投注或投资比例,旨在最大化长期资本增长并避免破产风险medium
Kelly公式参数fdefinition投入资产占当前总资产的最优比例;正值代表多头,负值代表空头;不允许杠杆时绝对值应小于1high
Kelly公式参数Pwindefinition做多胜率high
Kelly公式参数Plossdefinition做多败率,也是做空胜率high
Kelly公式参数rwdefinition每次做多胜利时的平均盈利high
Kelly公式参数rldefinition每次做空胜利时的平均盈利high
Pwin/Ploss计算思路method通过每天价格在历史序列中的排名与累加得到做多/做空胜利总次数,再计算胜率与败率medium
历史胜率与败率关系formulaPloss = 1 - Pwinhigh
平均盈利计算思路methodlong_profit(v)/short_profit(v) 计算每时刻潜在做多/做空盈利;累加得到总盈利并除以胜利次数得到平均盈利medium
Kelly(v)实现components使用cumrank与cumsum得到累计多头/空头计数;计算long_rate与short_rate;计算累计利润与平均利润并代入公式high
Kelly值回测结果区间(图示解读)range从2024年8月开始Kelly值稳定在0.7~0.8之间medium
仓位管理中的Kelly用法rule由于Kelly偏激进,策略采用半Kelly值用于仓位管理high
ATR定义(文中描述)formula取以下三个值的最大值并做15日移动平均:当日最高-最低;当日最高-次日收盘绝对值;次日收盘-当日最低绝对值high
ATR止盈触发condition止盈倍数 × ATR值 > 单次投资的盈利时触发止盈信号high
ATR止损触发condition止损倍数 × ATR值 > 单次投资的亏损时触发止损信号high
止盈倍数value3.5high
止损倍数value1.8high
ATR代码实现expressionmatrix(High-Low, abs(High-Close.next()), abs(Close.next()-Low)).rowMax().mavg(15)high
仓位比例公式formula仓位比例 = (趋势信号方向 × Kelly值) / 2high
持仓量公式formula持仓量 = 仓位比例 × 本金 / 当日股价(当日交易价格取当日收盘价)high
趋势信号方向取值mapping1代表买入信号,-1代表卖出信号high
仓位符号说明rule若卖出信号为负且Kelly值为负,则实际仓位为正,代表多头头寸high
交易周期指令类型setopen、adjust、reverse、close(其他情况为hold)high
开仓触发条件conditionsPosition[i-1]==0.0 且 atrSignal[(i-5):i].isValid().sum()==0 且 trendSignalTB[Signal][i-1].isValid()high
调仓触发条件conditionsPosition[i-1]*trendSignalTB[Signal][i-1]>0 且 atrSignal[(i-5):i].isValid().sum()==0 且 trendSignalTB[Signal][i-1].isValid()high
多空转换触发条件conditionsPosition[i-1]*trendSignalTB[Signal][i-1]<0 且 atrSignal[(i-5):i].isValid().sum()==0 且 trendSignalTB[Signal][i-1].isValid()high
平仓触发条件conditionsatrSignal[i-1].isValid(),之后清空持仓;并设置冷静期:接下来5天忽略趋势信号,保持空仓high
回测初始资金cash[0]100000.0high
持仓数量Position计算(实现)formula当order为open/adjust/reverse时:Position[i]=(capital[i-1]*Signal[i-1]*Kelly(Close)[i]/2)/Close[i];close时为0;否则沿用high
平均成本价costPrice计算(实现)ruleopen/reverse取当日Close;adjust按加权平均公式;close置0;否则沿用high
资产更新(实现)formulascash[i]=cash[i-1]+(Position[i-1]-Position[i])*Close[i];capital[i]=cash[i]+Position[i]*Close[i]high
ATR信号生成(实现)conditions无持仓(costPrice==0)为NULL;3.5*ATR < (Close-costPrice)*signum(Position) 为止盈信号;-1.8*ATR > (Close-costPrice)*signum(Position) 为止损信号;否则NULLhigh
performMetrics函数输出fieldsdate、returnRate(log(capital/capital[0])*365/(date-date[0]))、drawdown(capital.cummdd())high
绩效计算筛选条件wherewhere month(date) >= 2024.08Mhigh
策略表现结果annualized_return6.48%high
策略表现结果max_drawdown1.56%high