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))
关键修复说明
- 精准判断交易结果:用
strategy.closedtrades判断是否有新完成的交易,结合strategy.closedtradesprofit判断交易是亏/盈/平,避免误触发。 - 全面处理连续亏损结束场景:不管是盈利还是平局,只要连续亏损中断就统计对应长度,还新增了5次以上的统计项。
- 完整的时间范围限制:所有交易逻辑都包裹在
inTimeRange判断内,时间范围外直接重置streakLen,避免干扰统计。 - 新增可视化统计:用表格在右上角显示所有统计结果,方便查看。
内容的提问来源于stack exchange,提问作者Ruslan Ali-zade
相关产品推荐
相关产品推荐

