Функция сосны-скрипта возвращает другое значение, чем ожидалось - PullRequest
1 голос
/ 29 мая 2020

Я борюсь с пониманием выполнения функций в сосновом скрипте. Пожалуйста, посмотрите короткий сценарий ниже, он должен компилироваться как есть:

//@version=4
study("My Script")
a = 100.
d = 100.

d:=nz(d[1]) + 10

f_(_src) => nz(_src[1]) + 10
a := f_(a)

plot(a, "a", color.red, 5)
plot(d, "d", color.yellow, 5)

Я ожидал, что значения a и d совпадают, поскольку функция "f_" выполняет тот же код, что и в присвоении d. Но a всегда имеет постоянное значение 110 со 2-го цикла, когда d линейно увеличивает каждый цикл + 10.

Какова причина его такого поведения? Я был бы очень рад получить ссылку.

Большое спасибо за вашу помощь, Себ.

a != d, d's value increases linear, a stay constant

1 Ответ

2 голосов
/ 29 мая 2020

Ваши переменные инициализируются как 100. на каждом баре.

Для переменной a:

  • Значение, переданное в f_(), всегда является переменной a который был только что инициализирован 100., так как он инициализируется на каждом баре, но, оказавшись внутри функции, это текущее значение не используется. Поскольку вы используете nz(_src[1]), используемое значение является значением параметра при последнем вызове функции, все это с точки зрения функции, а не с точки зрения глобальной области.
  • При первом вызове функции Вызов nz() заменяет значение на 0, так как предыдущего значения нет. Функция возвращает 10.
  • На втором и всех последующих столбцах вы по-прежнему вызываете функцию с аргументом a=100, но с этого момента для аргумента внутри функции существует предыдущее значение. Это всегда 100., потому что это то, что вы вызываете функцию каждый раз, поэтому nz(_src[1]) всегда возвращает 100., а функция всегда возвращает 110.

Для переменной d :

  • На первом баре нет предыдущего значения, поэтому nz(d[1]) возвращает 0, а значение 0 + 10 = 10 присваивается d.
  • На втором баре , nz(d[1]) возвращает 10, а значение 10 + 10 = 20 присваивается d и так далее.
  • В случае d недавно инициализированное значение 100. на каждом баре фактически никогда не используется.
...