Pine Script v4 中大函数 IF 的简化

Simplification of large function IF in Pine Script v4

我正在尝试编写一个脚本来帮助自动更改“MASignalPeriod”的输入,具体取决于在指标操作期间查看的加密货币。我还希望能够通过菜单手动进行更改,因此我依赖于复选框“Settingmode”。一切正常,但指标开始 运行 很长时间了。为了让它工作,我需要为每 20 个加密货币编写 4 个这样的代码(代码中随机选择),这意味着加载时间会更长。

我的代码如下-

//------------- MASignalPeriod input -------------//
MASignalPeriod = if Settingmode == false and syminfo.ticker == "DYDXUSDTPERP" // 1
    MASignalPeriod = 15
else
    if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 2
        MASignalPeriod = 15
    else
        if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 3
            MASignalPeriod = 15
        else
            if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 4
                MASignalPeriod = 15
            else
                if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 5
                    MASignalPeriod = 15
                else
                    if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 6
                        MASignalPeriod = 15
                    else
                        if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 7
                            MASignalPeriod = 15
                        else
                            if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 8
                                MASignalPeriod = 15
                            else
                                if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 9
                                    MASignalPeriod = 15
                                else
                                    if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 10
                                        MASignalPeriod = 15
                                    else
                                        if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 11
                                            MASignalPeriod = 15
                                        else
                                            if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 12
                                                MASignalPeriod = 15
                                            else
                                                if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 13
                                                    MASignalPeriod = 15
                                                else
                                                    if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 14
                                                        MASignalPeriod = 15
                                                    else
                                                        if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 15
                                                            MASignalPeriod = 15
                                                        else
                                                            if Settingmode == false and syminfo.ticker == "ATOMUSDTPERP" // 16
                                                                MASignalPeriod = 15
                                                            else
                                                                if Settingmode == false and syminfo.ticker == "GALAUSDTPERP" // 17
                                                                    MASignalPeriod = 15
                                                                else
                                                                    if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 18
                                                                        MASignalPeriod = 15
                                                                    else
                                                                        if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 19
                                                                            MASignalPeriod = 15
                                                                        else
                                                                            if Settingmode == false and syminfo.ticker == "DOTUSDTPERP" // 20
                                                                                MASignalPeriod = 15
                                                                            else
                                                                                MASignalPeriod = input(15, title="MA Signal Period", group="Signals settings")

请帮我简化这个功能。

谢谢和问候。

可以提取Settingmode来简化结构:

MASignalPeriod = 0
if not Settingmode
    MASignalPeriod := syminfo.ticker == "DYDXUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "ATOMUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 15 : MASignalPeriod

这看起来很像 Pine 5 引入的 switch-case,你可以看看:https://www.tradingview.com/blog/en/say-hello-to-pine-script-v5-26900/

我稍微修改了@karatedog 推荐的代码并得到了结果,但它有一个错误 - 如果你 select 设置模式中的值“false”,那么 selected 值因为硬币仅在最后一枚硬币上被考虑,在之前的硬币上采用默认值,而不是 selected 的硬币。例如在 DYDXUSDTPERP 中我们收到值 15,并且有必要收到 100。虽然如果选择 DOTUSDTPERP 我们收到理想值 300:

MASignalPeriod = input(15, title="MA Signal Period", group="Signals settings")
if not Settingmode
    MASignalPeriod := syminfo.ticker == "DYDXUSDTPERP" ? 100 : 0
    MASignalPeriod := syminfo.ticker == "GALAUSDTPERP" ? 200 : 0
    MASignalPeriod := syminfo.ticker == "DOTUSDTPERP" ? 300 : 15
SMA = sma(open,MASignalPeriod)
plot(SMA)

修复了代码中的一个错误,也许这个功能会派上用场。 此脚本允许您在代码中保存每个硬币指标输入数据的唯一设置。 SMA 作为一个指标的示例,它可以在您需要的任何指标上看到。数字 100/200/300 作为每个硬币的变量。如果币种不同,默认设置为active 15.

MASignalPeriod = input(15, title="MA Signal Period", group="Signals settings")
if not Settingmode
    MASignalPeriod := 
     syminfo.ticker == "DYDXUSDTPERP" ? 100 : 
     syminfo.ticker == "GALAUSDTPERP" ? 200 : 
     syminfo.ticker == "DOTUSDTPERP" ? 300 : 
     MASignalPeriod
SMA = sma(open,MASignalPeriod)
plot(SMA)