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

Pine Script策略异常:不同ID的退出订单错误关联交易

问题根源

你的代码出现不同交易类型互相平仓的核心原因是使用了重复的entry ID,且未给每笔独立开仓绑定专属exit订单,导致Pine Script的订单匹配逻辑出现混淆:

  1. 所有TA开仓共用同一个"TA" entry ID,TB开仓共用同一个"TB" entry ID,当同一类型有多笔持仓时,strategy.exit无法精准定位到特定开仓,在频繁更新exit订单的场景下,可能错误匹配到其他类型的持仓。
  2. TB的strategy.exit在每根K线都会执行,即便没有TB持仓也会尝试创建订单,进一步加剧了订单匹配的混乱。
解决方案

为每一笔独立开仓分配唯一的entry ID,让exit订单绑定到对应唯一entry ID,确保平仓操作精准对应目标持仓:

1. 修改TA的开仓与平仓逻辑

为每笔TA开仓生成唯一entry ID,并绑定专属exit订单:

st_long_start and orders_TA<4 =>
    var int ta_counter = 0
    ta_counter += 1
    ta_entry_id = "TA_" + str.tostring(ta_counter)
    strategy.entry(ta_entry_id, strategy.long, qty = 2)
    // 为该笔TA开仓创建专属exit订单
    strategy.exit("A_exit_" + str.tostring(ta_counter), ta_entry_id, qty = 1, limit = (na(st_lower) ? high + price_atr : st_lower + 2.5 * price_atr))

2. 修改TB的开仓与持仓价格跟踪逻辑

为每笔TB开仓生成唯一entry ID,并用数组跟踪每笔持仓的平仓价格:

// 新增数组存储每笔TB持仓的平仓价格
var tb_sell_prices = array.new_float()

st_trade and orders_TB<4 =>
    var int tb_counter = 0
    tb_counter += 1
    tb_entry_id = "TB_" + str.tostring(tb_counter)
    strategy.entry(tb_entry_id, strategy.long, qty = 2)
    current_sell_price = st_lower + 3 * price_atr
    array.push(tb_sell_prices, current_sell_price)

3. 更新持仓统计逻辑

由于entry ID变为唯一标识,修改统计逻辑识别TA/TB类型持仓:

orders_TA := 0
orders_TB := 0
for tradeNumber = 0 to (strategy.opentrades>0 ? strategy.opentrades - 1 : na)
    entry_id = strategy.opentrades.entry_id(tradeNumber)
    if str.startswith(entry_id, "TA_")
        orders_TA += 1
    else if str.startswith(entry_id, "TB_")
        orders_TB += 1

4. 精准更新TB的exit订单

遍历所有TB持仓,为每笔未平仓的TB持仓更新对应exit订单:

// 遍历TB持仓,更新exit订单
for i = 0 to array.size(tb_sell_prices) - 1
    tb_entry_id = "TB_" + str.tostring(i + 1)
    // 检查该笔持仓是否仍在持仓中
    is_open = false
    for tradeNumber = 0 to (strategy.opentrades>0 ? strategy.opentrades - 1 : na)
        if strategy.opentrades.entry_id(tradeNumber) == tb_entry_id
            is_open = true
            break
    if is_open
        current_sell_price = array.get(tb_sell_prices, i)
        // 更新该笔持仓的平仓价格
        current_sell_price := na(st_lower) ? low : math.max(current_sell_price, st_lower + 1.5*price_atr)
        array.set(tb_sell_prices, i, current_sell_price)
        // 为该笔持仓创建/更新exit订单
        strategy.exit("B_exit_" + str.tostring(i + 1), tb_entry_id, qty = 1, limit = current_sell_price)

5. 清理无效的TB持仓价格记录

当TB持仓平仓后,从数组中移除对应价格记录,避免冗余:

// 移除已平仓的TB持仓价格
var int last_closed_tb = 0
for tradeNumber = 0 to (strategy.closedtrades>0 ? strategy.closedtrades - 1 : na)
    entry_id = strategy.closedtrades.entry_id(tradeNumber)
    if str.startswith(entry_id, "TB_") and strategy.closedtrades.close_index(tradeNumber) > last_closed_tb
        tb_idx = tonumber(str.split(entry_id, "_")[1]) - 1
        if tb_idx >= 0 and tb_idx < array.size(tb_sell_prices)
            array.remove(tb_sell_prices, tb_idx)
        last_closed_tb := strategy.closedtrades.close_index(tradeNumber)
关键说明
  • 唯一entry ID确保每笔开仓是独立交易单元,strategy.exit只会平仓对应目标持仓,彻底避免跨类型平仓问题。
  • 针对TB的持仓价格跟踪,确保每笔持仓的平仓价格独立更新,不会互相干扰。
  • 清理已平仓的价格记录,避免数组冗余影响策略性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 13:32:03