Pine Script V5实现复选框互斥切换:勾选第二个时自动取消第一个
解决Pine Script中RSI策略复选框互斥问题
问题说明
我为RSI策略实现了看涨、看跌两组参数的切换功能,逻辑运行正常,但两个复选框无法实现互斥效果——勾选第二个时第一个不会自动取消。现有脚本如下:
//Switches switchBull = input.bool(defval = true, title = "Bullish", group = "Bullish/Bearish Market Settings") switchBear = input.bool(defval = false, title = "Bearish", group = "Bullish/Bearish Market Settings") // RSI Bullish Inputs bull_rsilength = input.int(defval = 12, title = "RSI Length", minval = 0, group = "RSI Bullish Settings") bull_buyLevel = input.float(defval = 30, title = "RSI Buy Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bullish Settings") bull_sellLevel = input.float(defval = 70, title = "RSI Sell Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bullish Settings") bull_rsiOffset = input.int(defval = 0, title = "RSI Offset", minval = 0, group = "RSI Bullish Settings") bull_rsi_src = input.source(defval = close, title = "Price Source", group = "RSI Bullish Settings") // RSI Bearish Inputs bear_rsilength = input.int(defval = 12, title = "RSI Length", minval = 0, group = "RSI Bearish Settings") bear_buyLevel = input.float(defval = 30, title = "RSI Buy Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bearish Settings") bear_sellLevel = input.float(defval = 70, title = "RSI Sell Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bearish Settings") bear_rsiOffset = input.int(defval = 0, title = "RSI Offset", minval = 0, group = "RSI Bearish Settings") bear_rsi_src = input.source(defval = close, title = "Price Source", group = "RSI Bearish Settings") //Switching variables var int rsilength = na var float buyLevel = na var float sellLevel = na var float rsiOffset = na var float rsi_src = na //Switching Logic if switchBull == true and switchBear == false rsilength := bull_rsilength buyLevel := bull_buyLevel sellLevel := bull_sellLevel rsiOffset := bull_rsiOffset rsi_src := bull_rsi_src else if switchBull == false and switchBear == true rsilength := bear_rsilength buyLevel := bear_buyLevel sellLevel:= bear_sellLevel rsiOffset := bear_rsiOffset rsi_src := bear_rsi_src
解决方案
方法1:使用下拉菜单实现原生单选(推荐)
Pine Script没有原生互斥复选框,但可以用input.string创建下拉菜单,天然支持单选,用户体验更直观:
// 用下拉菜单替代复选框 marketMode = input.string(defval = "Bullish", title = "Market Mode", options = ["Bullish", "Bearish"], group = "Bullish/Bearish Market Settings") // 转换为布尔变量方便后续逻辑 switchBull = marketMode == "Bullish" switchBear = marketMode == "Bearish" // RSI Bullish Inputs bull_rsilength = input.int(defval = 12, title = "RSI Length", minval = 0, group = "RSI Bullish Settings") bull_buyLevel = input.float(defval = 30, title = "RSI Buy Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bullish Settings") bull_sellLevel = input.float(defval = 70, title = "RSI Sell Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bullish Settings") bull_rsiOffset = input.int(defval = 0, title = "RSI Offset", minval = 0, group = "RSI Bullish Settings") bull_rsi_src = input.source(defval = close, title = "Price Source", group = "RSI Bullish Settings") // RSI Bearish Inputs bear_rsilength = input.int(defval = 12, title = "RSI Length", minval = 0, group = "RSI Bearish Settings") bear_buyLevel = input.float(defval = 30, title = "RSI Buy Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bearish Settings") bear_sellLevel = input.float(defval = 70, title = "RSI Sell Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bearish Settings") bear_rsiOffset = input.int(defval = 0, title = "RSI Offset", minval = 0, group = "RSI Bearish Settings") bear_rsi_src = input.source(defval = close, title = "Price Source", group = "RSI Bearish Settings") //Switching variables var int rsilength = na var float buyLevel = na var float sellLevel = na var int rsiOffset = na var source rsi_src = na // 修正类型为source,原代码float错误 //Switching Logic if switchBull rsilength := bull_rsilength buyLevel := bull_buyLevel sellLevel := bull_sellLevel rsiOffset := bull_rsiOffset rsi_src := bull_rsi_src else if switchBear rsilength := bear_rsilength buyLevel := bear_buyLevel sellLevel := bear_sellLevel rsiOffset := bear_rsiOffset rsi_src := bear_rsi_src
方法2:强制复选框互斥逻辑
如果坚持使用复选框,可以通过代码实时修正状态,确保同一时间只有一个复选框被勾选:
//Switches switchBull = input.bool(defval = true, title = "Bullish", group = "Bullish/Bearish Market Settings") switchBear = input.bool(defval = false, title = "Bearish", group = "Bullish/Bearish Market Settings") // 强制互斥逻辑:如果两个都勾选,默认保留看涨;如果都不勾选,默认切换到看涨 switchBull := switchBear ? false : na(switchBull) ? true : switchBull switchBear := switchBull ? false : switchBear // RSI Bullish Inputs bull_rsilength = input.int(defval = 12, title = "RSI Length", minval = 0, group = "RSI Bullish Settings") bull_buyLevel = input.float(defval = 30, title = "RSI Buy Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bullish Settings") bull_sellLevel = input.float(defval = 70, title = "RSI Sell Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bullish Settings") bull_rsiOffset = input.int(defval = 0, title = "RSI Offset", minval = 0, group = "RSI Bullish Settings") bull_rsi_src = input.source(defval = close, title = "Price Source", group = "RSI Bullish Settings") // RSI Bearish Inputs bear_rsilength = input.int(defval = 12, title = "RSI Length", minval = 0, group = "RSI Bearish Settings") bear_buyLevel = input.float(defval = 30, title = "RSI Buy Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bearish Settings") bear_sellLevel = input.float(defval = 70, title = "RSI Sell Level", minval = 0, maxval = 100, step = 0.1, group = "RSI Bearish Settings") bear_rsiOffset = input.int(defval = 0, title = "RSI Offset", minval = 0, group = "RSI Bearish Settings") bear_rsi_src = input.source(defval = close, title = "Price Source", group = "RSI Bearish Settings") //Switching variables var int rsilength = na var float buyLevel = na var float sellLevel = na var int rsiOffset = na var source rsi_src = na // 修正类型为source,原代码float错误 //Switching Logic if switchBull and not switchBear rsilength := bull_rsilength buyLevel := bull_buyLevel sellLevel := bull_sellLevel rsiOffset := bull_rsiOffset rsi_src := bull_rsi_src else if not switchBull and switchBear rsilength := bear_rsilength buyLevel := bear_buyLevel sellLevel := bear_sellLevel rsiOffset := bear_rsiOffset rsi_src := bear_rsi_src
额外修正说明
原代码中rsi_src的类型定义错误,应该是var source rsi_src = na而非float,因为input.source返回的是价格序列类型,修正后避免类型不匹配的报错。
内容的提问来源于stack exchange,提问作者silvermpx
相关产品推荐
相关产品推荐

