Pine Script中strategy.exit止损订单未执行问题求助
问题分析与解决方案
核心问题
你的代码中止损价格计算时机错误,导致strategy.exit无法正确获取有效止损价:
- 在执行
strategy.entry的同一根K线中,strategy.opentrades还未完成更新,此时strategy.opentrades - 1会得到-1,调用strategy.opentrades.entry_price(-1)返回的是na(无效值)。 - 最终传入
strategy.exit的stop参数为无效值,直接导致止损订单无法生效,追踪止盈同理。
修复方案
直接基于开仓时的真实入场价格计算止损价,以下是两种可行的修改方式:
方式1:开仓时直接用当前K线价格计算止损
// 多单止损百分比 long_stop_percentage = input.float(title = "多单止损(%)", minval=0.0, step=0.001, defval=1.0) // 空单止损百分比 short_stop_percentage = input.float(title="空单止损(%)", minval=0.0, step=0.001, defval=1.0) // ------------------------------ // 交易入场逻辑 // ------------------------------ // 多单入场 if ta.crossover(bb_src, bb_lower) and strategy.position_size == 0 and entry_date_constraint // 用当前收盘价作为入场价计算止损(市价单场景下准确) long_stop_loss_price = close * (1 - long_stop_percentage / 100) strategy.entry("EL", strategy.long, comment = long_enter_comment) // 若需追踪止盈,可添加trail_points/trail_offset参数,例:trail_points=50 strategy.exit("xSL", from_entry="EL", stop = long_stop_loss_price) // 空单入场 if ta.crossunder(bb_src, bb_upper) and strategy.position_size == 0 and entry_date_constraint // 用当前收盘价作为入场价计算止损(市价单场景下准确) short_stop_loss_price = close * (1 + short_stop_percentage / 100) strategy.entry("ES", strategy.short, comment = short_enter_comment) // 若需追踪止盈,可添加trail_points/trail_offset参数,例:trail_offset=0.5 strategy.exit("xSS", from_entry="ES", stop = short_stop_loss_price)
方式2:独立维护持仓入场价(适合需持续跟踪的场景)
如果需要长期跟踪当前持仓的初始入场价,可以用变量存储该值,后续基于此计算止损:
// 定义变量存储当前持仓的初始入场价 var float current_entry_price = na // 多单止损百分比 long_stop_percentage = input.float(title = "多单止损(%)", minval=0.0, step=0.001, defval=1.0) // 空单止损百分比 short_stop_percentage = input.float(title="空单止损(%)", minval=0.0, step=0.001, defval=1.0) // ------------------------------ // 交易入场逻辑 // ------------------------------ // 多单入场 if ta.crossover(bb_src, bb_lower) and strategy.position_size == 0 and entry_date_constraint current_entry_price := close long_stop_loss_price = current_entry_price * (1 - long_stop_percentage / 100) strategy.entry("EL", strategy.long, comment = long_enter_comment) strategy.exit("xSL", from_entry="EL", stop = long_stop_loss_price) // 空单入场 if ta.crossunder(bb_src, bb_upper) and strategy.position_size == 0 and entry_date_constraint current_entry_price := close short_stop_loss_price = current_entry_price * (1 + short_stop_percentage / 100) strategy.entry("ES", strategy.short, comment = short_enter_comment) strategy.exit("xSS", from_entry="ES", stop = short_stop_loss_price)
额外注意事项
- 若使用限价单入场,需将
close替换为你的限价价格变量,确保止损计算基于真实入场价。 - 添加追踪止盈时,需确保
trail_points或trail_offset参数为有效数值(非0/na),否则追踪逻辑不会生效。
内容的提问来源于stack exchange,提问作者Evi1975
相关产品推荐
相关产品推荐

