Значение TradingView Pinescript, когда не работает с переменной-итератором (i) - PullRequest
0 голосов
/ 25 мая 2020

Я хочу получить последние пять текущих позиций с ценой, когда. Но это не работает. Я думаю, что вызов valuewhen (curPosition> 0, curPosition, i) с помощью итератора for i является проблемой. Не могли бы вы мне помочь?

//@version=4
strategy(title="Test", shorttitle="Test", overlay=true)

// curPosition
// 0 == "-"
// 1 == "LONG"
// 2 == "SHORT"
curPosition = 0

longCnt = 0
shortCnt = 0
noneCnt = 0

prevPosition = 0
for i = 1 to 5
    prevPosition := valuewhen(curPosition>0, curPosition, i)
    if (prevPosition == 1)
        longCnt := longCnt + 1
    if (prevPosition == 2)
        shortCnt := shortCnt + 1
    if na(prevPosition)
        noneCnt := noneCnt + 1

if (open>close)
    curPosition := 1
if (open<close)
    curPosition := 2
plotchar(longCnt, "LONG CNT", "", location=location.top)
plotchar(shortCnt, "SHORT CNT", "", location=location.top)
plotchar(noneCnt , "NONE CNT", "", location=location.top)

1 Ответ

1 голос
/ 26 мая 2020

Я нашел root причины. Пины скриптового движка работают странно.

См. Документ сценария Pine, см. Описание ниже.

//@version=4
study("SMA in for loop")
sum = 0
for i = 1 to 2
    sum := sum + sma(close, i)
plot(sum)

Хотя вы можете ожидать, что эта сумма будет содержать sma (close, 1) + sma (close, 2), это не так. Он будет содержать sma (close, 1) + sma (close, 1), потому что после инициализации sma длиной 1 эта длина сохраняется до тех пор, пока скрипт не будет удален с диаграммы. Чтобы избежать этого, вы можете использовать собственную реализацию функции без сохранения состояния. Это список встроенных функций, которые имеют такое же поведение:

...