Pine Script如何统计持仓总天数及持仓天数占比?
在Pine Script中计算策略持仓天数占比的方法
核心思路
要算出持仓天数占回测总天数的百分比,只需三步:
- 统计累计持仓天数
- 计算回测总天数
- 用「累计持仓天数 ÷ 回测总天数 × 100」得到占比
具体实现代码(新手友好版)
下面是完整的示例代码,你可以直接把自己的策略逻辑替换进去:
//@version=5 strategy("持仓占比计算示例", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000) // 初始化变量:累计持仓天数、回测起始bar索引(var只初始化一次) var int total_holding_days = 0 var int first_bar_idx = bar_index // 每日判断是否持仓,持仓则累加天数 if strategy.position_size != 0 total_holding_days += 1 // 计算回测总天数:当前bar索引 - 起始bar索引 + 1 total_backtest_days = bar_index - first_bar_idx + 1 // 计算持仓占比(保留两位小数) holding_percentage = total_holding_days / total_backtest_days * 100 // 在最后一根bar上显示结果 if barstate.islast label.new(bar_index, high, str.format( "持仓占比: {0:.2f}%\n累计持仓: {1}天\n回测总天数: {2}天", holding_percentage, total_holding_days, total_backtest_days ), color=color.new(color.blue, 0), textcolor=color.white, style=label.style_label_down) // ------------------- 替换成你的策略逻辑 ------------------- // 示例策略:50日均线金叉200日均线做多,死叉平仓 long_signal = ta.crossover(ta.sma(close, 50), ta.sma(close, 200)) short_signal = ta.crossunder(ta.sma(close, 50), ta.sma(close, 200)) if long_signal strategy.entry("多单", strategy.long) if short_signal strategy.close("多单")
关键代码说明
var关键字:用来定义只初始化一次的变量,避免每次bar刷新都重置计数strategy.position_size != 0:判断当前是否处于持仓状态(大于0是多单,小于0是空单)bar_index:Pine Script内置的bar索引值,用来计算回测的总天数barstate.islast:只在最后一根bar上显示结果,避免图表上出现重复标签
注意事项
如果你的回测用的不是日线图(比如4小时、1小时),需要把持仓bar数转换成天数:
比如4小时bar的话,1天=6个bar,那么累计持仓天数 = 累计持仓bar数 ÷ 6,回测总天数 = 总bar数 ÷ 6,再计算占比即可。
内容的提问来源于stack exchange,提问作者Ralph Winters
相关产品推荐
相关产品推荐

