如何在Pine策略脚本中编写基于摆动高低点的动态止损订单?
Pine Script动态摆动高低点止损策略问题排查
我正在编写可自动将止损订单设置在各摆动低点/高点对应位置的交易策略,核心判断是基于固定百分比或固定跳数的静态止损订单在市场中失效概率更高,因此需要实现跟随价格结构调整的动态止损逻辑。
我检索了很久公开资源,始终没找到可实现动态止损的可用脚本,绝大多数相关脚本仅支持固定止损设置。之后我接触到ta.lowest(low,14) / ta.highest(high,14)函数,判断可以借助该函数识别特定区间内的K线极值价格,以此为基准叠加一定百分比偏移,即可实现基于摆动高低点的动态止损。但实际运行效果和预期不符,一直没定位到问题根源,发帖求助希望有人能指出代码中的错误。
当价格触及最近5根K线区间内最低价下浮0.1%位置时,交易应当触发止损离场。
效果参考截图:
异常代码段
// *************Entry orders************* if longCondition strategy.entry("Long", strategy.long) if shortCondition strategy.entry("Short", strategy.short) //*************Stop Loss Orders************* long_pos = strategy.position_size > 0 short_pos = strategy.position_size < 0 sl_perc = input.float(0.1, "Stop Loss Percentage under swing low/high") sl_long = ta.lowest(low, 5) - ta.lowest(low, 14)/100*sl_perc sl_short = ta.highest(high,5) + ta.lowest(low, 14)/100*sl_perc strategy.exit("LongExit", "SL Long", stop = sl_long ) strategy.exit("ShortExit", "SL Short",stop = sl_short )
核心错误点
- 止损价计算逻辑完全错误:多单止损的百分比偏移基数错用了14周期最低价,正确逻辑应该以选定的5周期摆动低点本身为基数计算下浮偏移;空单止损的偏移部分错用了
ta.lowest(low,14)计算,和空单需要基于摆动高点上浮的逻辑完全相悖。 strategy.exit入参不匹配:该函数第二个参数需要传入对应开仓订单的ID,代码中开多单ID为"Long"、开空单ID为"Short",传入的"SL Long"、"SL Short"和实际开仓ID不匹配,止损指令根本无法绑定到对应持仓上。- 未做止损价固定处理:每根K线都会重新计算
sl_long/sl_short值,会导致止损价随新K线更新不断漂移,出现回测回溯作弊问题,实盘运行也会出现止损单反复撤改的异常。
修正后核心代码参考
// *************Entry orders + Stop Loss Orders************* long_pos = strategy.position_size > 0 short_pos = strategy.position_size < 0 sl_perc = input.float(0.1, "Stop Loss Percentage under swing low/high", step=0.01) / 100 var float hold_long_sl = na // 用var声明,开仓后固定止损值不随新K线变动 var float hold_short_sl = na // 开多同时按规则计算并固定止损价 if longCondition and not long_pos hold_long_sl := ta.lowest(low, 5) * (1 - sl_perc) strategy.entry("Long", strategy.long) // 开空同时按规则计算并固定止损价 if shortCondition and not short_pos hold_short_sl := ta.highest(high,5) * (1 + sl_perc) strategy.entry("Short", strategy.short) // 仅在对应持仓存在时提交止损单,开仓ID与exit绑定ID完全匹配 if long_pos strategy.exit("LongExit", "Long", stop = hold_long_sl) if short_pos strategy.exit("ShortExit", "Short", stop = hold_short_sl)
内容的提问来源于stack exchange,提问作者Student Tom
相关产品推荐
相关产品推荐


