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)
我正在尝试编写一个脚本来帮助自动更改“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)