Trading View策略问题:非指定K线触发多空订单求助
问题排查与代码修正
核心问题分析
- 订单触发时机混乱:开启
calc_on_every_tick = true会导致每根K线的每个报价tick都计算信号,未等K线收盘确认就下单,容易产生虚假信号。 - 多空信号逻辑偏离策略规则:
- 多单在**挤压持续状态(sqzOn)**下触发,而标准Squeeze Momentum策略应在挤压结束(sqzOff)且动量向上反转时开多。
- 空单的动量判断逻辑模糊(与7周期前的动量值比较),未结合动量反转的核心方向,导致信号触发错误。
- 缺失仓位管理:未设置反向平仓逻辑,可能出现重复开仓、持仓冲突的问题。
修正后的完整代码
//@version=5 strategy(title='Squeeze Momentum strategy PSv5', overlay=true, margin_long=100, margin_short=100) length = input(20, title='BB Length') mult = input(2.0, title='BB MultFactor') source = close lengthKC = input(20, title='KC Length') multKC = input(1.5, title='KC MultFactor') useTrueRange = input(true, title='Use TrueRange (KC)') // Defining MA ma = ta.sma(source, length) // Calculate BB basis = ma dev = mult * ta.stdev(source, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC range_1 = useTrueRange ? ta.tr : high - low rangema = ta.sma(range_1, lengthKC) upperKC = ma + rangema * multKC lowerKC = ma - rangema * multKC // SqzON | SqzOFF | noSqz sqzOn = lowerBB > lowerKC and upperBB < upperKC sqzOff = lowerBB < lowerKC and upperBB > upperKC noSqz = not sqzOn and not sqzOff // 挤压结束的交叉信号(从sqzOn转为sqzOff的瞬间) sqzOffCross = ta.crossover(sqzOff, true) // Momentum val = ta.linreg(source - math.avg(math.avg(ta.highest(high, lengthKC), ta.lowest(low, lengthKC)), ta.sma(close, lengthKC)), lengthKC, 0) // Plots iff_1 = val > nz(val[1]) ? #00FF00 : #008000 iff_2 = val < nz(val[1]) ? #FF0000 : #800000 bcolor = val > 0 ? iff_1 : iff_2 scolor = noSqz ? color.blue : sqzOn ? color.yellow : color.green plot(val, color=bcolor, style=plot.style_histogram,linewidth=4, transp=50) plot(0, color=scolor, style=plot.style_circles, linewidth=4) sqzGREY = ta.crossunder(lowerBB, lowerKC) and ta.crossover(upperBB, upperKC) plotshape(sqzGREY, style=shape.circle, location=location.bottom, size=size.tiny) // 修正后的信号逻辑 // 多单:挤压结束 + 动量线向上反转且为正 longCondition = sqzOffCross and val > nz(val[1]) and val > 0 // 空单:挤压结束 + 动量线向下反转且为负 shortCondition = sqzOffCross and val < nz(val[1]) and val < 0 // 订单触发(仅在K线收盘确认后执行) if (longCondition and barstate.isconfirmed) // 先平空单再开多单,避免持仓冲突 strategy.close("Short") strategy.entry("Long", strategy.long, alert_message = 'Open Long') if (shortCondition and barstate.isconfirmed) // 先平多单再开空单,避免持仓冲突 strategy.close("Long") strategy.entry("Short", strategy.short, alert_message = 'Open Short')
关键修正点说明
- 稳定信号触发时机:移除
calc_on_every_tick = true,配合barstate.isconfirmed确保只在K线收盘确认后执行订单,避免虚假信号。 - 对齐策略核心逻辑:
- 用
sqzOffCross(挤压结束的交叉信号)作为开仓前提,确保只在震荡结束、行情启动的瞬间触发信号。 - 多单要求动量线向上且为正,空单要求动量线向下且为负,严格遵循“挤压后跟随动量方向开仓”的策略规则。
- 用
- 添加仓位管理:开仓前反向平仓,避免同一方向重复开仓或多空持仓冲突。
- 简化代码逻辑:将
sqzOn == false and sqzOff == false简化为not sqzOn and not sqzOff,提升代码可读性。
内容的提问来源于stack exchange,提问作者Rock Strongo
相关产品推荐
相关产品推荐

