VAR НЕ сохраняет свои значения в барах - PullRequest
1 голос
/ 16 апреля 2020
//@version=4
study("Keep data across bars (var)", overlay=true)

// Variables
var bool canGoShort = true
var bool canGoLong = true
var int myTest = 5

// Functions
f_print(_txt) => t = time + (time - time[1]) * 3, var _lbl = label.new(t, high, _txt, xloc.bar_time, yloc.price, #00000000, label.style_none, color.gray, size.large), label.set_xy(_lbl, t, high + 3 * tr)

// MAIN
if canGoShort
    myTest := myTest + 1

if canGoLong
    myTest := myTest + 1

f_print("myTest=" + tostring(myTest))

Я озадачен этим простым сценарием, который, кажется, не работает так, как задумано.

Я инициализирую переменную var myTest значением 5.
Поскольку canGoShort и canGoLong оба всегда true, я ожидаю, что значение myTest будет увеличивается на 1, дважды на каждом баре:
Один раз на if canGoShort и один раз на if canGoLong.
Скажем, у нас есть 5000 баров, тогда я ожидал бы, что он закончится sh при 5 + (5000 * 2) = 10005.

Однако при запуске сценария печатается myTest=7?

У меня складывается впечатление, что объявление var int myTest = 5 выполняется на каждом баре.
Насколько я понял, переменная, определенная с ключевым словом var, сохраняет свое значение во всех барах, но это не похоже на это.

В документации четко сказано, что она должна сохранять свое значение:

  • https://www.tradingview.com/pine-script-reference/#op_var
    var - ключевое слово, используемое для присвоения, и один время инициализации переменной.
  • https://www.pinecoders.com/faq_and_code/#techniques
    Начиная с версии v4 ключевое слово var обеспечивает способ инициализации переменных только на первом баре набора данных Сценарий запускается не на каждой панели, как раньше. Это имеет очень полезное преимущество, так как автоматически заботится о распространении значения по барам

Чего мне здесь не хватает?

1 Ответ

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

Calcs происходят, как и ожидалось. Что не так, есть наша f_print() функция. Извиняюсь за это. Версия, которую вы выбрали, не обновляет sh текст. Этот код имеет более новую версию f_print(), которая делает это.

Обратите внимание, что для проверки значений бар за баром, как вы хотели бы здесь, наш трюк plotchar() более полезен, если у вас также есть ваши данные Окно открыто для проверки значения, так как вы можете проверить значение каждого бара при наведении курсора мыши на бар. Смотрите наш ответ здесь для нашего макроса AHK, который генерирует оператор из имени переменной, если у вас есть настройка Windows и вы заинтересованы.

//@version=4
study("Keep data across bars (var)", overlay=true)

// Variables
var bool canGoShort = true
var bool canGoLong = true
var int myTest = 5

// Functions
f_print(_txt) => var _lbl = label.new(bar_index, highest(10)[1], _txt, xloc.bar_index, yloc.price, #00000000, label.style_none, color.gray, size.large, text.align_left), label.set_xy(_lbl, bar_index, highest(10)[1]), label.set_text(_lbl, _txt)
// MAIN
if canGoShort
    myTest := myTest + 1

if canGoLong
    myTest := myTest + 1

f_print("myTest=" + tostring(myTest, "0.0"))
plotchar(myTest, "myTest", "", location.top)

enter image description here Опять извинения за беспокойство. Мы обновили все экземпляры f_print() в нашем FAQ. Обратите внимание, что мы используем эту версию в основном для отладки, потому что она хранится в одной строке. Это код AHK, который мы используем для генерации f_print() с Ctrl + Shift + p для отладки:

^+P:: SendInput f_print(_txt) => var _lbl = label.new(bar_index, highest(10)[1], _txt, xloc.bar_index, yloc.price, {#}00000000, label.style_none, color.gray, size.large, text.align_left), label.set_xy(_lbl, bar_index, highest(10)[1]), label.set_text(_lbl, _txt)`nf_print(){Left}

In Сценарии, которые будут опубликованы, мы используем эту версию, которая является более гибкой и более эффективной, но не может быть сжата в одну строку из-за операторов if:

// ————— Print a label at end of chart.
f_print(_txt, _y, _color, _offsetLabels) => 
    var label _lbl = na
    _t = int(time + (time - time[1]) * _offsetLabels)
    if barstate.islast
        if na(_lbl)
            // Only create label once.
            _lbl := label.new(_t, _y, _txt, xloc.bar_time, yloc.price, #00000000, label.style_none, color.gray, size.large)
            // Fudge return type of `if` block so compiler doesn't complain (thx midtownsk8rguy for the trick).
            int(na)
        else
            // Rather than delete and recreate the label on every realtime bar update, update the label's information; it's more efficient.
            label.set_xy(_lbl, _t, _y)
            label.set_text(_lbl, _txt)
            label.set_textcolor(_lbl, _color)
            int(na)
...