Это продолжение моего предыдущего вопроса Построение пользовательских данных - ежедневно = нормально, еженедельно = не нормально .
Комментарии к принятому ответу предполагают, что состояние var
внутри функции сохраняется во время последовательных вызовов этой функции.
Это оказалось правильным, потому что удаление var
решило мою проблему.
Однако теперь у меня есть тестовый пример, который, кажется, доказывает обратное.
В приведенном ниже скрипте переменная b
, похоже, НЕ сохраняется.
Функция f2()
должна вызываться на каждом баре, чтобы оценить оператор if
.
Это так, поскольку график y
равен количеству баров.
Поскольку функция f2()
также вызывает f1()
, я ожидаю, что переменная b
внутри f1()
также увеличится на 1.
Окончательное значение b
внутри f1()
извлекается на последнем баре и сохраняется в z
.
К моему удивлению, значение z
после последнего бара оказалось равным 1.
Это означает, что либо:
var
переменные не сохраняются внутри функция (опровергнута моим предыдущим вопросом ) - вызовы вложенных функций имеют свой собственный контекст выполнения.
Не могу придумать другую причину такого поведения.
Может ли кто-нибудь подтвердить это или дать альтернативное объяснение?
//@version=4
study("PlayGround")
var int y = 0
var int z = 0
f1() =>
var int b = 0
b := b + 1
b
f2() =>
f1()
true
if true and f2()
y := y + 1
if barstate.islast
z := f1()
plot(y, title="y")
plot(z, title="z")