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

Pine Script中strategy.exit未按预期工作:高低点止盈止损问题

问题分析与修正方案

核心问题分析

你的代码出现“本该盈利的交易立即平仓”的情况,主要是以下几个逻辑错误导致:

  1. 摆动高低点定义错误
    你用ta.lowest(close, 10)和ta.highest(close, 10)获取的是最近10根K线收盘价的极值,这不是真正的摆动高低点。摆动高低点需要满足“某根K线的高低价比前后N根K线的高低价都更极端”的结构,简单的极值可能出现在当前K线,导致止损/止盈价格与开仓价逻辑矛盾。

  2. 止损/止盈价格与开仓价不匹配

    • 你用close[1](上一根K线收盘价)计算风险和止盈,但strategy.entry默认以市价(回测中为当前K线收盘价)成交,两者可能存在偏差,导致止盈或止损价格设置在不合理区间(比如多单止损高于开仓价,触发即时平仓)。
    • 没有锁定开仓时的摆动高低点,后续K线的新极值会动态修改止损/止盈价格,引发意外平仓。
  3. 缺少合理性校验
    没有判断止损价格是否符合交易逻辑(多单止损必须低于开仓价,空单止损必须高于开仓价),如果摆动高低点计算错误,会直接触发即时止损。

修正后的代码

//@version=5
strategy("Swing SL/TP Strategy", overlay=true)

// 识别摆动高低点:前后各5根K线确认,可根据需求调整参数
swing_low = ta.pivotlow(5, 5)
swing_high = ta.pivothigh(5, 5)

// 示例信号(替换为你实际的多空信号逻辑)
long_signal = ta.crossover(ta.sma(close,5), ta.sma(close,20))
short_signal = ta.crossunder(ta.sma(close,5), ta.sma(close,20))

// 开仓时锁定关键价格变量
var float entry_long_price = na
var float long_stop = na
var float long_tp = na

var float entry_short_price = na
var float short_stop = na
var float short_tp = na

// 多单开仓与止损止盈设置
if (long_signal)
    strategy.entry("Long", strategy.long)
    entry_long_price := strategy.position_avg_price
    // 锁定开仓瞬间的摆动低点
    long_stop := ta.valuewhen(long_signal, swing_low, 0)
    
    // 确保止损价格合理(低于开仓价)才设置止损止盈
    if (not na(long_stop) and long_stop < entry_long_price)
        risk = entry_long_price - long_stop
        long_tp = entry_long_price + risk  // 1:1风险回报比
        strategy.exit("Long Exit", "Long", stop=long_stop, limit=long_tp)

// 空单开仓与止损止盈设置
if (short_signal)
    strategy.entry("Short", strategy.short)
    entry_short_price := strategy.position_avg_price
    // 锁定开仓瞬间的摆动高点
    short_stop := ta.valuewhen(short_signal, swing_high, 0)
    
    // 确保止损价格合理(高于开仓价)才设置止损止盈
    if (not na(short_stop) and short_stop > entry_short_price)
        risk = short_stop - entry_short_price
        short_tp = entry_short_price - risk
        strategy.exit("Short Exit", "Short", stop=short_stop, limit=short_tp)

关键修正说明

  • 正确识别摆动高低点:使用ta.pivotlow()和ta.pivothigh()函数,参数(5,5)表示当前K线的低点需比前5根、后5根K线的低点都低,确保是真正的摆动结构。
  • 锁定开仓时的价格:用ta.valuewhen()获取开仓信号触发时的摆动高低点,避免后续K线的新极值覆盖原有设置;用strategy.position_avg_price获取实际开仓均价,保证风险计算准确。
  • 添加合理性校验:判断止损价格是否符合交易逻辑,避免因错误的摆动点导致即时平仓。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:05:18