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

Pine Script单策略净利润计算异常:未统计最后一笔交易

问题原因

你遇到的统计遗漏,核心是Pine Script的交易状态更新时机问题:

  • 当你在当前bar执行strategy.close时,这笔交易不会立刻被加入strategy.closedtrades集合,要等到当前bar结束后才会更新该集合。
  • 所以在调用strategy.close的同一bar内,strategy.closedtrades - 1指向的是上一笔已平仓的交易,而非刚执行平仓的这笔。如果最后一笔平仓发生在历史最后一个bar,就没有下一个bar来统计这笔交易的利润,导致遗漏。
解决方案

直接在平仓前从当前持仓(strategy.opentrades)中计算利润,不用依赖延迟更新的strategy.closedtrades,这样能实时获取当前待平仓交易的利润,避免时机差问题。

修改后的代码示例

替换原平仓逻辑

把你原来的平仓代码改成下面这样:

if conditionExit and strategy.opentrades != 0 
    // 获取当前持仓的利润(平仓前直接计算)
    current_trade_profit = strategy.opentrades.profit(strategy.opentrades - 1)
    // 匹配入场注释,累加对应策略的净利润
    if strategy.opentrades.entry_comment(strategy.opentrades - 1) == "Entrata S #1"
        net_profit_trigger1_s += current_trade_profit
    // 执行平仓操作
    strategy.close("trigger_1_s", comment="Uscita S #1")

保留原表格展示逻辑

表格部分代码不需要修改,依然可以在最后bar展示统计结果:

if barstate.islastconfirmedhistory or barstate.isrealtime
    table.cell(tbl, 0, 0, "Strategy",  bgcolor = #aaaaaa)
    table.cell(tbl, 1, 0, "Net Profit", bgcolor = #aaaaaa)
     
    table.cell(tbl, 0, 1, "Strategy 1",  bgcolor = color.green)
    table.cell(tbl, 1, 1, str.tostring(net_profit_trigger1_l,  "#.##"), bgcolor = color.red)

    table.cell(tbl, 0, 2, "Strategy 2",  bgcolor = color.green)
    table.cell(tbl, 1, 2, str.tostring(net_profit_trigger1_s, "#.##"), bgcolor = color.red)
补充说明

如果一定要用strategy.closedtrades来统计,也可以通过标记需要统计的交易,在下一个bar进行处理,但这种方式不如直接从持仓计算简洁可靠,容易出现边界遗漏(比如最后一个bar的交易)。

内容的提问来源于stack exchange,提问作者Damiano Dotto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:22:27