繁体   English   中英

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

[英]Tradingview pine script is a piece of poop: Cannot use a mutable variable as an argument of the security function

老实说,在脚本语言中实现没有后端问题的选项是多么困难。 我收到以下错误“不能使用可变变量作为安全函数的参数”,只是因为我一直传入在 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)

这是基于这篇文章的建议的答案。 它远非理想,但也许对于有这个问题的人来说,他们可以从问题、建议到解决这个无能问题的完整循环中受益。 希望以下解决方案具有一些人认为易于阅读的编码风格。

// @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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM