Syntax Tradingview pine脚本是一个poop:不能使用可变变量作为安全函数的参数

Syntax Tradingview pine脚本是一个poop:不能使用可变变量作为安全函数的参数,syntax,pine-script,technical-indicator,Syntax,Pine Script,Technical Indicator,老实说,在脚本语言中实现没有后端问题的选项有多难。我得到以下错误“不能将可变变量用作安全函数的参数”,因为我一直传入在if语句中设置的变量。尝试了变量间接寻址,函数间接寻址,在各种排列方式中,甚至一些我知道的已经在这方面取得了成功,但问题仍然存在 我想要一种干净的方式来编写代码,而不必使用三元操作或函数。在重复问题中建议使用三元运算和函数解决方法,但并没有回答我要找的问题。任何编程语言脚本或面向对象都能够使用if语句来处理选项,而这种语言没有 // @version=4 study("multi

老实说,在脚本语言中实现没有后端问题的选项有多难。我得到以下错误“不能将可变变量用作安全函数的参数”,因为我一直传入在if语句中设置的变量。尝试了变量间接寻址,函数间接寻址,在各种排列方式中,甚至一些我知道的已经在这方面取得了成功,但问题仍然存在

我想要一种干净的方式来编写代码,而不必使用三元操作或函数。在重复问题中建议使用三元运算和函数解决方法,但并没有回答我要找的问题。任何编程语言脚本或面向对象都能够使用if语句来处理选项,而这种语言没有

// @version=4
study("multi_ma_pos", "multi_ma", overlay=true)

get_period(interval_input) =>
    period = ""
    if (timeframe.isintraday)
        interval = interval_input > timeframe.multiplier ? interval_input : timeframe.multiplier
        period := tostring(interval)
    else
        period := timeframe.period
    period

ma_opt = input(title="ma_opt", defval="13/34", options=["23/75/616", "13/34"])
ma_interval = input(title="ma_interval", type=input.integer, defval=240)

// Declare variables
shrt_term = close
midt_term = close
long_term = close
is_opt_selected = false

if (ma_opt == "23/75/616" and not is_opt_selected)
    shrt_term := sma(close, 23)
    midt_term := sma(close, 65)
    long_term := sma(close, 137)
    is_opt_selected := true

if (ma_opt == "13/34" and not is_opt_selected)
    shrt_term := ema(close, 13)
    midt_term := ema(close, 34)
    long_term := sma(close, 34)      
    is_opt_selected := true

shrt_term_out = security(syminfo.tickerid, get_period(ma_interval), shrt_term)
midt_term_out = security(syminfo.tickerid, get_period(ma_interval), midt_term)
long_term_out = security(syminfo.tickerid, get_period(ma_interval), long_term)

plot(shrt_term_out, title="shrt_term", color=#ffa726, linewidth=2)
plot(midt_term_out, title="midt_term", color=#ffa726, linewidth=4)
plot(long_term_out, title="long_term", color=#e65100, linewidth=4)

下面是一个基于此建议的答案。这远非理想,但也许对于有这个问题的人来说,他们可以从一个问题、一个建议到这个无能问题的解决方案的循环中获益。希望下面的解决方案有一些容易被阅读的编码风格。p>
// @version=4
study("multi_ma_pos", "multi_ma", overlay=true)

get_period(interval_input) =>
    period = ""
    if (timeframe.isintraday)
        interval = interval_input > timeframe.multiplier ? interval_input : timeframe.multiplier
        period := tostring(interval)
    else
        period := timeframe.period
    period

ma_opt = input(title="ma_opt", defval="13/34", options=["23/75/616", "13/34"])
ma_interval = input(title="ma_interval", type=input.integer, defval=240)

get_multi_ma(ma_opt, ma_interval) =>
    // delcare output variables
    shrt_term_out = float(na)
    midt_term_out = float(na)
    long_term_out = float(na)

    period = get_period(ma_interval)

    shrt_term_out := (ma_opt == "23/75/616")  ? security(syminfo.tickerid, period, ema(close, 23)) 
       : security(syminfo.tickerid, period, sma(close, 13))

    midt_term_out := (ma_opt == "23/75/616")  ? security(syminfo.tickerid, period, ema(close, 75)) 
       : security(syminfo.tickerid, period, sma(close, 34))

    long_term_out := (ma_opt == "23/75/616")  ? security(syminfo.tickerid, period, ema(close, 616)) : security(syminfo.tickerid, period, ema(close, 34))

    // out the output variables
    [shrt_term_out, midt_term_out, long_term_out]

[shrt_term_out, midt_term_out, long_term_out] = get_multi_ma(ma_opt, ma_interval)

plot(shrt_term_out, title="shrt_term", color=#ffa726, linewidth=2)
plot(midt_term_out, title="midt_term", color=#ffa726, linewidth=4)
plot(long_term_out, title="long_term", color=#e65100, linewidth=4)

这回答了你的问题吗?不是真的。这正是我试图避免的解决方案,这种内联条件的代码看起来更混乱,如果我添加两个以上的选项,代码就无法扩展。老实说,这篇文章更多的是为了让人们意识到tradingview Pinscript作为一种语言是缺乏的,而该语言的开发人员需要感受到来自社区的压力,即这些限制是荒谬的。禁止证券中的可变变量有一些根本原因。如果允许,用户最多可以获得8字节*10000条*10000个不同的值=800 MB的RAM。考虑到一个脚本可以有40个安全性,用户可以请求32GB的RAM。我想没有人会允许,这是有限制的。我看了你提供的链接,那是垃圾。大多数问题是,人们使用一个简单的工具,仅用于连接多个指标并得出结果,然后使用该工具计算登月。这些限制仍然可以得到遵守。我不明白你的意思,因为pine脚本编译器在抛出有关内存资源约束的错误时没有问题。我不能使用if语句,也不能传入长度不同的ema()函数,因为它会导致此脚本出现问题。我有另一个脚本,我可以将可变长度的ema传递给安全函数,我相信它的版本3和版本4是以问题为中心的。这并不是说人们试图计算登月,更像是人们在不使用绘图命令的情况下无法显示2+2。有趣的是,你提出了登月问题,因为它已经解决了,大约50多年前,当时它是一个开创性的问题。这些语言问题也在10年前得到了解决。倒退不是一个明智的论点。