如何在Pine Script中实现价格触及Pivot高低线时自动下单?
问题:Pivot高低线触发下单仅部分生效,如何实现价格触及自动下单
尝试使用以下Pine Script脚本在每一条pivotHigh和pivotLow线上下达买入和卖出订单,但仅能成功生成部分订单。需要实现价格触及这些线时自动下单。
原脚本代码
//variable declartions plotPivots = true hih = pivothigh(high, pivotLookup, pivotLookup) lol = pivotlow (low , pivotLookup, pivotLookup) top = valuewhen(hih, high[pivotLookup], 0) bottom = valuewhen(lol, low [pivotLookup], 0) plot(top, offset=-pivotLookup, linewidth=2, color=(top != top[1] ? na : (plotPivots ? color.silver : na)), title="pivotTop") plot(bottom, offset=-pivotLookup, linewidth=2, color=(bottom != bottom[1] ? na : (plotPivots ? color.silver : na)), title="pivotBottom") if crossover(close, top) box.new(left=bar_index, top=top, right=bar_index+boxLength, bottom=bottom, bgcolor=color.new(color.green, boxTransparency), border_color=color.new(color.green, 80)) strategy.entry("BUY", strategy.long, comment="BUY STOP", alert_message="BUY") if crossunder(close, bottom) box.new(left=bar_index, top=top, right=bar_index+boxLength, bottom=bottom, bgcolor=color.new(color.red, boxTransparency), border_color=color.new(color.red, 80)) strategy.entry("SELL", strategy.short, comment="SELL STOP", alert_message="SELL")
问题原因
- 仅监控最新Pivot水平:原脚本中
top和bottom仅存储最新的pivot高低点,新的pivot生成后会覆盖旧值,导致之前的pivot线不再被监控,自然无法触发订单。 - 订单类型错误:代码注释写的是"BUY STOP",但实际用
strategy.entry默认生成市价单,而非止损触发单,无法实现“价格触及线时下单”的逻辑。 - 触发条件局限:仅用
crossover(close, top)判断,若价格在K线内部触及pivot线但收盘价未上穿,不会触发订单。
解决方案代码
//@version=5 strategy("Pivot触发生成订单", overlay=true, default_qty_type=strategy.cash, default_qty_value=1000, initial_capital=10000) // 参数设置 pivotLookup = input.int(2, title="Pivot查找范围") boxLength = input.int(5, title="标记框长度") boxTransparency = input.int(90, title="标记框透明度") // 存储历史Pivot水平的数组 var float[] pivotHighs = array.new_float() var float[] pivotLows = array.new_float() // 识别新的Pivot并添加到数组 hih = ta.pivothigh(high, pivotLookup, pivotLookup) lol = ta.pivotlow(low, pivotLookup, pivotLookup) if hih pivotLevel = ta.valuewhen(hih, high[pivotLookup], 0) array.push(pivotHighs, pivotLevel) // 绘制Pivot高线 plot(pivotLevel, offset=-pivotLookup, linewidth=2, color=color.silver, title="Pivot High") if lol pivotLevel = ta.valuewhen(lol, low[pivotLookup], 0) array.push(pivotLows, pivotLevel) // 绘制Pivot低线 plot(pivotLevel, offset=-pivotLookup, linewidth=2, color=color.silver, title="Pivot Low") // 遍历所有未触发的Pivot High,触发多单 for i = 0 to array.size(pivotHighs) - 1 pivotLevel = array.get(pivotHighs, i) // 检查价格是否触及Pivot High,且未持有多单 if high >= pivotLevel and strategy.position_size <= 0 box.new(left=bar_index, top=pivotLevel, right=bar_index+boxLength, bottom=ta.lowest(low, pivotLookup*2), bgcolor=color.new(color.green, boxTransparency), border_color=color.new(color.green, 80)) strategy.entry("BUY_" + str.tostring(i), strategy.long, stop=pivotLevel, comment="BUY STOP", alert_message="BUY at " + str.tostring(pivotLevel)) // 触发后移除该Pivot水平,避免重复下单 array.remove(pivotHighs, i) break // 遍历所有未触发的Pivot Low,触发空单 for i = 0 to array.size(pivotLows) - 1 pivotLevel = array.get(pivotLows, i) // 检查价格是否触及Pivot Low,且未持有空单 if low <= pivotLevel and strategy.position_size >= 0 box.new(left=bar_index, top=ta.highest(high, pivotLookup*2), bottom=pivotLevel, right=bar_index+boxLength, bgcolor=color.new(color.red, boxTransparency), border_color=color.new(color.red, 80)) strategy.entry("SELL_" + str.tostring(i), strategy.short, stop=pivotLevel, comment="SELL STOP", alert_message="SELL at " + str.tostring(pivotLevel)) // 触发后移除该Pivot水平,避免重复下单 array.remove(pivotLows, i) break // 可选:反向Pivot触发时平仓 if hih strategy.close_all(comment="Close on new Pivot High") if lol strategy.close_all(comment="Close on new Pivot Low")
关键修改说明
- 存储历史Pivot:用
var数组保存所有生成的pivot高低水平,确保每条线都被监控。 - 止损触发订单:使用
strategy.entry的stop参数,设置触发价格为pivot线水平,实现价格触及自动下单。 - 宽范围触发判断:用
high >= pivotLevel(多单)和low <= pivotLevel(空单),覆盖K线内部触及的情况。 - 避免重复下单:订单触发后从数组中移除对应的pivot水平,并用唯一ID(如
BUY_0)区分订单。
内容的提问来源于stack exchange,提问作者Sarotobi
相关产品推荐
相关产品推荐

