You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:40:23