Реализация функции Pine Script без сохранения состояния - PullRequest
0 голосов
/ 04 мая 2020

В Pine-скрипте tradingview я пытаюсь найти предыдущий фрактал (HF1), который выше последней цены закрытия, и построить уровень HF1

Мой код до сих пор не работает:

//@version=4
strategy("Fractal Breakout Strategy", overlay=true)

HF = bar_index>5 and high[2]>high[1] and high[2]>high and high[2]>high[3] and high[2]>high[4] ? -1 : 0
LF = bar_index>5 and low[2]<low[1] and low[2]<low and low[2]<low[3] and low[2]<low[4] ? 1 : 0

tot = HF + LF
pl = abs(tot)>=1 ? 1 : 0

//Plot fractal arrows:
plotarrow(pl==1 ? tot : na, colorup=color.teal, colordown=color.orange,offset=-2,maxheight=15)

HF1 = 0.0

for i = 0 to 40
    HF1_temp = valuewhen(HF, high[2],i)
    if (HF1_temp > close[1])
        HF1 := HF1_temp
        break

plot(HF1, color = color.blue)

Я подозреваю, что это связано с последним абзацем в документации здесь

Чтобы избежать этого, вы можете использовать собственную реализацию функции без сохранения состояния. Это список встроенных функций с одинаковым поведением:

sma (источник, длина): длина с состоянием.

ema (источник, длина): длина с состоянием.

сумма (источник, длина): длина с состоянием.

valueewhen (условие, источник, происхождение): вхождение с состоянием.

rsi (x, y): когда y имеет тип integer и ведет себя как длина, y - с состоянием.

.. но не могу понять, как это реализовать ... Любая помощь будет высоко оценена, спасибо!

1 Ответ

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

Ваше подозрение было верным. Необходимо проверить, но думаю, что это делает работу:

//@version=4
strategy("Fractal Breakout Strategy", overlay=true)

ofst = 2
HF = bar_index>5 and high[2]>high[1] and high[2]>high and high[2]>high[3] and high[2]>high[4] ? -1 : 0
LF = bar_index>5 and low[2]<low[1] and low[2]<low and low[2]<low[3] and low[2]<low[4] ? 1 : 0
// Save fractal's hi/lo when we find one, offset `ofst` bars later.
//      This could also be done in the 2 lines above but didn't want to change them 
//      in case you will need their -1 and 1 values elsewhere in your code.
HFval = HF != 0 ? high[ofst] : na
LFval = LF != 0 ? low[ofst] : na

tot = HF + LF
pl = abs(tot)>=1 ? 1 : 0

//Plot fractal arrows:
plotarrow(pl==1 ? tot : na, colorup=color.teal, colordown=color.orange,offset=-ofst,maxheight=15)

float HF1 = na
for i = 0 to 40
    if (HFval[i] > close[1])
        HF1 := HFval[i]
        break

// Plotting circles eliminates the inelegant joins between non `na` values.
plot(HF1, "HF1", color.blue, 2, plot.style_circles)

enter image description here

...