Ошибка добавления сценария Pine в диаграмму. Причина: в сценарии слишком много локальных областей: 521. предел составляет 500 - PullRequest
0 голосов
/ 10 апреля 2020

Я создаю индикатор с использованием Pine-скрипта. Куда я хочу поместить условия, основанные на каждом тикере (Symbol), число которых превышает 500. Мой скрипт содержит более 500 операторов if, как показано в следующем коде.

//@version=4
study("PineTest", "", true)
srcHi = 0.00
srcLo = 0.00
if syminfo.ticker == "AMZN" 
    srcHi:=2000.00 
    srcLo:=1670.00 
if syminfo.ticker == "SPY" 
    srcHi:=300.00 
    srcLo:=210.00 
if syminfo.ticker == "AAPL" 
    srcHi:=300.00 
    srcLo:=170.00 
if syminfo.ticker == "MSFT"
    srcHi:=210.00 
    srcLo:=50.00 `

diff = srcHi - srcLo 

p1=plot(diff, title = "diff", color = #000000, transp= 0, offset=0, 
trackprice = true, linewidth = 2) 

Я просто добавил 4 оператора if в приведенном выше коде. Если я попытаюсь добавить более 500 операторов if, аналогичным образом я получу вышеуказанную ошибку: скрипт имеет слишком много локальных областей действия. Как я могу решить эту ошибку, не уменьшая количество если условия? Если для этой цели нужно использовать функцию, скажите, пожалуйста, как это сделать с этим кодом?

1 Ответ

1 голос
/ 10 апреля 2020

Версия 1

Использование функций для распределения операторов if по нескольким группам.

Версия 2

[2020.04.28 12:34 - LucF]

Используется эксклюзивная if структура, которая будет быстрее. Он также предоставляет механизм для использования нескольких троичных операторов в функции, чтобы вы могли иметь общее количество тестов, превышающих ограничение троичного.

//@version=4
study("PineTest", "", true)
srcHi = 0.00
srcLo = 0.00

f_Hi(_previousValue) =>
    float _result = na
    // Should be able to use ~500 conditions here.
    _result := 
      syminfo.ticker == "AMZN"  ? 2000.00 :
      syminfo.ticker == "SPY"   ?  300.00 :
      syminfo.ticker == "AAPL"  ?  301.00 :
      syminfo.ticker == "MSFT"  ?  210.00 : na
    // Should be able to use another ~500 conditions here.
    _result := 
      not na(_result) ? _result :
      syminfo.ticker == "TDY"   ? 3000.00 :
      syminfo.ticker == "DB"    ?  400.00 :
      syminfo.ticker == "TSLA"  ?  401.00 :
      syminfo.ticker == "AMD"   ?  310.00 : na
    na(_result) ? _previousValue : _result

srcHi := f_Hi(srcHi)

plot(srcHi)

Функция также разработана таким образом, чтобы при возникновении ограничений внутри функции Вы могли бы умножить количество функций, разделив больше тестов в каждой, и сделать к ним последовательные вызовы, используя что-то вроде:

srcHi := f_Hi1(srcHi)
srcHi := f_Hi2(srcHi)

Вам потребуется c, необходимо скопировать функциональность для srcLo.

...