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

Pine Script技术求助:指定时间范围内亏损连续次数统计异常

修复Pine Script连续亏损次数统计代码

你的代码主要存在这几个问题:

  • 连续亏损触发逻辑不准确:用strategy.losstrades > strategy.losstrades[1]判断新亏损,但这个变量是累计值,可能在非当前交易结束的周期也会触发(比如跨周期回测时),而且没验证是否是当前周期刚完成的亏损交易。
  • 连续亏损结束的统计逻辑太局限:只有当连续亏损长度刚好是3、4、5,且出现盈利交易时才计数,忽略了平局结束连续亏损的情况,也没处理连续亏损长度超过5或者不足3的场景。
  • 时间范围限制不全面:仅在触发新亏损时判断时间范围,导致时间范围外的交易仍会修改streakLen,干扰统计结果。
  • streakLen重置逻辑缺失:出现平局交易时,连续亏损应该被中断,但原代码没处理这种情况。

修复后的代码如下:

//@version=5
strategy("连续亏损统计", overlay=true)

// 定义时间范围(示例:2023年1月1日到2023年12月31日)
backtestStartDate = timestamp("2023-01-01T00:00")
backtestEndDate = timestamp("2023-12-31T23:59")

// 判断当前周期是否完成了一笔亏损/盈利/平局交易
isNewLoss = strategy.closedtrades > strategy.closedtrades[1] and strategy.closedtradesprofit[strategy.closedtrades] < 0
isNewWin = strategy.closedtrades > strategy.closedtrades[1] and strategy.closedtradesprofit[strategy.closedtrades] > 0
isNewEven = strategy.closedtrades > strategy.closedtrades[1] and strategy.closedtradesprofit[strategy.closedtrades] == 0

// 初始化统计变量
var int streakLen = 0
var int longestStreak = 0
var int three_losses = 0
var int four_losses = 0
var int five_losses = 0
var int over_five_losses = 0

// 仅在指定时间范围内处理交易
inTimeRange = time >= backtestStartDate and time <= backtestEndDate

if inTimeRange
    if isNewLoss
        streakLen += 1
        // 更新最长连续亏损记录
        if streakLen > longestStreak
            longestStreak := streakLen
    else if isNewWin or isNewEven
        // 连续亏损结束,统计对应长度的次数
        if streakLen == 3
            three_losses += 1
        elif streakLen == 4
            four_losses += 1
        elif streakLen == 5
            five_losses += 1
        elif streakLen > 5
            over_five_losses += 1
        // 重置连续亏损长度
        streakLen := 0
else
    // 时间范围外,重置streakLen避免干扰
    streakLen := 0

// 输出统计结果
var table statsTable = table.new(position.top_right, 2, 6, border_width=1)
if barstate.islast
    table.cell(statsTable, 0, 0, "连续亏损次数统计")
    table.cell(statsTable, 1, 0, "次数")
    table.cell(statsTable, 0, 1, "3次连续亏损")
    table.cell(statsTable, 1, 1, str.tostring(three_losses))
    table.cell(statsTable, 0, 2, "4次连续亏损")
    table.cell(statsTable, 1, 2, str.tostring(four_losses))
    table.cell(statsTable, 0, 3, "5次连续亏损")
    table.cell(statsTable, 1, 3, str.tostring(five_losses))
    table.cell(statsTable, 0, 4, "5次以上连续亏损")
    table.cell(statsTable, 1, 4, str.tostring(over_five_losses))
    table.cell(statsTable, 0, 5, "最长连续亏损")
    table.cell(statsTable, 1, 5, str.tostring(longestStreak))

关键修复说明

  1. 精准判断交易结果:用strategy.closedtrades判断是否有新完成的交易,结合strategy.closedtradesprofit判断交易是亏/盈/平,避免误触发。
  2. 全面处理连续亏损结束场景:不管是盈利还是平局,只要连续亏损中断就统计对应长度,还新增了5次以上的统计项。
  3. 完整的时间范围限制:所有交易逻辑都包裹在inTimeRange判断内,时间范围外直接重置streakLen,避免干扰统计。
  4. 新增可视化统计:用表格在右上角显示所有统计结果,方便查看。

内容的提问来源于stack exchange,提问作者Ruslan Ali-zade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:55:18