Попытка создать индикатор RSI, который работает в разных временных масштабах в Pine script

#pine-script #trading

#pine-script #торговля

Вопрос:

Итак, мой код таков:

 rsilength = input(14, title="RSI Length", type=input.integer)
//200 SMA
sma = sma(close, input(200))
rsiset = rsi(close, rsilength)
rsiW = security(syminfo.tickerid, "W", rsiset)  // 1 Week
rsiD = security(syminfo.tickerid, "D", rsiset)  // 1 Day
rsi4h = security(syminfo.tickerid, "240", rsiset) // 4h

if rsi4h == rsiset
    sma := sma(close, input(1200))
if rsiD == rsiset
    sma := sma(close, input(200))
if rsiW == rsiset
    sma := sma(close, input(29))
 

Я пытаюсь корректно отобразить график sma на дневном, 4-часовом и недельном графиках.

Это работает. Линия SMA отлично отображается на всех 3 таймфреймах. Но я получаю предупреждение

Функция ‘sma’ должна вызываться при каждом вычислении для обеспечения согласованности. Рекомендуется извлечь вызов из этой области.

Есть ли способ написать то же самое и не получить предупреждение? RSI также работает просто отлично (я использую их далее по коду. Единственное, что меня беспокоит, это эти 3 предупреждения для каждого sma в ifs

Ответ №1:

 //@version=4
study("My Script")

var int     myInput = 1

rsilength   = input(14, title="RSI Length", type=input.integer)

sma         = sma(close, input(200))

rsiset      = rsi(close, rsilength)
rsiW        = security(syminfo.tickerid, "W",   rsiset) // 1 Week
rsiD        = security(syminfo.tickerid, "D",   rsiset) // 1 Day
rsi4h       = security(syminfo.tickerid, "240", rsiset) // 4h

if rsi4h == rsiset
    myInput := input(1200, "input rsi4h")
else if rsiD == rsiset
    myInput := input( 200, "input rsiD")
else if rsiW == rsiset
    myInput := input(  29, "input rsiW")

sma := sma(close, myInput)

plot(sma)
 

Комментарии:

1. Я вижу, что вы установили rsilength = input(20). Я настроил его выше и забыл добавить его в свой код. Извините за это. Сейчас это исправим.

2. Обновил мой ответ, чтобы отразить ваш rsilength входной параметр.