Pine Script策略优化:解决布林带上轨平仓后重复开仓问题
解决Pine Script v5策略重复开仓问题
要解决布林带上轨平仓后立即重新开仓的问题,核心是添加一个状态标记,记录是否处于"等待重置"状态——即因触碰布林带上轨平仓后,必须等待价格跌破20 EMA或200 EMA后,才允许再次触发开仓。
修改后的完整代码如下:
//@version=5 strategy("My Script", overlay = true, calc_on_every_tick=true, process_orders_on_close = true) ema20Close = ta.ema(close, 20) ema200Close = ta.ema(close, 200) bblength = input.int(20, minval=1) bbsrc = input(close, title="Source") bbmult = input.float(2.0, minval=0.001, maxval=50, title="StdDev") bbbasis = ta.sma(bbsrc, bblength) bbdev = bbmult * ta.stdev(bbsrc, bblength) bbupper = bbbasis + bbdev bblower = bbbasis - bbdev // 新增状态变量:标记是否需要等待价格跌破EMA重置开仓权限 var bool waitForReset = false // 重置条件:价格跌破20EMA或200EMA时,解除等待状态 resetCondition = close < ema20Close or close < ema200Close if resetCondition waitForReset := false // 原始开仓条件加上"未处于等待重置状态"的限制 entryCondition = close > ema20Close and close > ema200Close and not waitForReset // 平仓条件拆分,区分触发原因 closeConditionByEma = close < ema20Close closeConditionByBB = close > bbupper closeCondition = closeConditionByEma or closeConditionByBB if entryCondition strategy.entry("Long", strategy.long) if closeCondition strategy.close("Long") // 如果是因布林带上轨平仓,设置等待重置标记 if closeConditionByBB waitForReset := true plot(ema20Close, color = color.new(color.red, 0), linewidth = 1) plot(ema200Close, color = color.new(color.blue, 0), linewidth = 1) plot(bbupper, color = color.new(color.green, 0), linewidth = 1)
关键修改说明
- 添加
var bool waitForReset = false:用var声明确保变量在脚本运行期间只初始化一次,记录当前是否需要等待价格跌破EMA才能重新开仓。 - 新增
resetCondition:当价格收盘价跌破20 EMA或200 EMA时,将waitForReset设为false,解除开仓限制。 - 修改
entryCondition:在原有开仓条件基础上,增加not waitForReset,确保只有不在等待重置状态时才能开仓。 - 拆分平仓条件:区分"跌破20EMA平仓"和"触碰布林带上轨平仓",仅当后者触发时才设置
waitForReset := true,避免因EMA平仓后不必要的限制。
内容的提问来源于stack exchange,提问作者Robert hue
相关产品推荐
相关产品推荐

