【问题标题】:Tradingview pine script is a piece of poop: Cannot use a mutable variable as an argument of the security functionTradingview pine 脚本是一个大便:不能使用可变变量作为安全函数的参数
【发布时间】:2020-04-18 12:38:06
【问题描述】:

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

【问题讨论】:

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

标签: syntax pine-script technical-indicator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 2020-11-14
    • 2017-01-20
    • 2013-12-01
    相关资源
    最近更新 更多