You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pine Script如何统计持仓总天数及持仓天数占比?

在Pine Script中计算策略持仓天数占比的方法

核心思路

要算出持仓天数占回测总天数的百分比,只需三步:

  1. 统计累计持仓天数
  2. 计算回测总天数
  3. 用「累计持仓天数 ÷ 回测总天数 × 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:07:15