Проблема с самоссылающимися переменными Pine-Script

У меня проблемы с пониманием следующего фрагмента Pine-Script, пожалуйста, помогите.

//@version=4
study('test')
f = 0.0
d = 0.0
d := nz(f[1])
f := d+1
plot(d)
plot(f)

В приведенном выше коде значение переменной d равно «[0, 1, 2 ...]», f равно «[1, 2, 3 ...]», почему это так? Я ожидаю «d = [0, 0, 0 ...] f = [1, 1, 1]», пожалуйста, помогите объяснить, спасибо.

а у меня другой вопрос:

func(price)=>
    sum = 10.0
    sum := sum + price[1]

func(close)
func(open)

func вызывается бар за баром, но как сохранить предыдущую ценовую переменную. Реализовать функцию оператора ссылки на историю сценария Pine. любая помощь спасибо!


person junli    schedule 24.08.2019    source источник
comment
Просто примечание: это также поможет вам, если вы объясните, почему вы ожидаете таких результатов. Если вы проанализируете код шаг за шагом для каждого бара, вы можете увидеть что-то, что вам не хватает.   -  person Baris Yakut    schedule 24.08.2019


Ответы (1)


[] в pinescript называется Оператор ссылок на историю. Он ссылается на предыдущие значения переменной.

Когда вы произносите f[1], возвращается любое значение f один бар назад.

Хорошо, что вы используете nz() с [], потому что для самого первого бара ни одна переменная не имеет предыдущего значения. Итак, когда вы пытаетесь получить доступ к историческому значению переменной в первый раз, результат будет NaN, а nz() преобразует NaN в 0.

Еще одна вещь, которую нужно знать, это то, что ваш код будет выполняться для каждого бара.

Давайте теперь посмотрим на ваш код.

f = 0.0
d = 0.0

Вы объявляете f и d в начале и присваиваете им 0. Мы можем пропустить этот шаг, так как вы переназначаете им другое значение.

Первая панель

d := nz(f[1])

Присвойте значение f на предыдущем баре d. f не имеет предыдущего значения для первого бара, поэтому nz() вернет 0. Итак, d = 0.

f := d+1

f = 0 + 1 -> f = 1

Второй бар

d := nz(f[1])

Присвойте значение f на предыдущем баре d. Значение f на первой панели равно 1. Итак, d = 1.

f := d+1

f = 1 + 1 -> f = 2

Третья панель

d := nz(f[1])

Присвойте значение f на предыдущем баре d. Значение f на секундной панели равно 2. Итак, d = 2.

f := d+1

f = 2 + 1 -> f = 3


Примечание. Попробуйте запустить следующий код, и вы увидите, что он ведет себя точно так же.

//@version=4
study('test')
f = 550.0
d = 0.0
d := nz(f[1])
f := d+1
plot(d)
plot(f)

Причина в том, что изначально не имеет значения, какое значение имеет f. d := nz(f[1]) присвоит значению f на предыдущем баре значение d, а для самого первого бара f не имеет предыдущего значения. Следовательно, nz() вернет 0.

Тогда что происходит для самого первого бара:

d := nz(f[1]) // d = 0
f := d+1      // f = 1

И так далее..

person Baris Yakut    schedule 24.08.2019
comment
У меня есть еще один вопрос, пожалуйста, посмотрите мое обновление, спасибо - person junli; 25.02.2020