Pine Script基于前14根K线高低点计算止损止盈错误排查
问题根源
你的代码计算结果不符合预期,核心是3个逻辑错误:
ta.highest(high,14)、ta.lowest(low,14)默认包含当前未走完的K线,实时行情中当前K线的高低点会一直变动,导致计算基准飘移。你需要的是前置14根已收盘K线,必须做1个周期的偏移。- 止损、止盈的差值是每根K线基于最新收盘价、最新高低点实时计算的,开仓后不会锁定数值,持仓过程中SL/TP会跟着新K线一直变,和你开仓时的计算基准完全脱节。
- 多余的
float()转换没有实际作用,不会影响计算结果,但会干扰代码逻辑排查。
修正后可直接运行的代码
//@version=5 strategy("14周期前置K线SL/TP计算", overlay=true) // 可调整参数 lookback_len = input.int(14, title="前置K线根数", minval=1) tp1_multiplier = input.float(1.5, title="第一止盈倍率") tp2_multiplier = input.float(3.0, title="第二止盈倍率") // 计算不含当前K线的前N根K线高低点 prev_14_high = ta.highest(high, lookback_len)[1] prev_14_low = ta.lowest(low, lookback_len)[1] // 示例开仓条件:上破前14根高点做多,下破前14根低点做空,可替换为你自己的开仓逻辑 long_entry_sig = ta.crossover(close, prev_14_high) short_entry_sig = ta.crossunder(close, prev_14_low) // 开仓时锁定止损宽度,持仓期间不重新计算 var float long_sl_offset = na var float short_sl_offset = na if long_entry_sig // 按你原逻辑取开仓价到前14根高点的差值作为多单止损宽度 long_sl_offset := prev_14_high - close if short_entry_sig // 按你原逻辑取开仓价到前14根低点的差值作为空单止损宽度 short_sl_offset := close - prev_14_low // 计算固定SL/TP价格 long_sl_price = strategy.position_avg_price - long_sl_offset long_tp1_price = strategy.position_avg_price + long_sl_offset * tp1_multiplier long_tp2_price = strategy.position_avg_price + long_sl_offset * tp2_multiplier short_sl_price = strategy.position_avg_price + short_sl_offset short_tp1_price = strategy.position_avg_price - short_sl_offset * tp1_multiplier short_tp2_price = strategy.position_avg_price - short_sl_offset * tp2_multiplier // 下单逻辑 if long_entry_sig strategy.entry("多单", strategy.long) strategy.exit("多单出场", "多单", stop=long_sl_price, limit=long_tp1_price) if short_entry_sig strategy.entry("空单", strategy.short) strategy.exit("空单出场", "空单", stop=short_sl_price, limit=short_tp1_price) // 绘图核对基准位 plot(prev_14_high, color=color.red, title="前14根高点", style=plot.style_linebr) plot(prev_14_low, color=color.green, title="前14根低点", style=plot.style_linebr) plot(strategy.position_size > 0 ? long_sl_price : na, color=color.orange, title="多单止损", linewidth=2, style=plot.style_linebr) plot(strategy.position_size < 0 ? short_sl_price : na, color=color.orange, title="空单止损", linewidth=2, style=plot.style_linebr)
调整说明
- 如果你实际需要的多单止损基准是前14根低点(即多单止损放在前低下方,这是更通用的逻辑),只需要把开仓时
long_sl_offset的赋值改为close - prev_14_low即可;对应空单止损放在前高上方的话,把short_sl_offset赋值改为prev_14_high - close。 - 代码中加了高低点、止损位的绘图,加载到图表后可以直接逐根K线核对数值,确认计算逻辑和你的预期一致。
- 如果你需要分批次止盈(比如TP1平一半仓位,TP2平剩余仓位),可以在
strategy.exit里增加对应仓位参数即可。
内容的提问来源于stack exchange,提问作者Pham Tan
相关产品推荐
相关产品推荐

