Попытка создать горизонтальные линии переменной длины на основе переменного количества свечей в сосне

#pine-script

Вопрос:

После нескольких часов работы с массивами и циклами в надежде, что это решит мою проблему, я совершенно не знаю, как поступить с тем, что я хочу, pine и все же то, что я хочу, кажется, должно быть почти тривиальным, поэтому я надеюсь, что кто-то с опытом pine может помочь.

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

То, что я пытаюсь сделать, — это построить линию, показывающую самую высокую и самую низкую точку свечей для длины свечей, где isSideways она остается истинной, а затем ничего не строить, когда isSideways она ложна. Другими словами, всего две прямые горизонтальные линии в затененных областях. Как только это будет выяснено, я захочу нарисовать линии в процентах от расстояния между этими линиями, но это не должно быть проблемой, как только будут нарисованы первые две линии.

Тривиально нарисовать путь, который следует за свечами, а также провести горизонтальную линию, однако нарисовать сегмент горизонтальной линии, который вписывается в ограниченный, но переменный диапазон длины, основанный на самых высоких или самых низких значениях этого переменного числа свечей, оказывается значительно сложнее, чем я думал.

Я использую barssince() то, что помогает мне пройти часть пути, но не весь путь.

Любая помощь будет очень признательна.

 //@version=4
study("Sideways Channel Visual", max_bars_back=4999)

sidewaysBbSource      = input(close, "SMA Source"              , type=input.source  ,                                        group="Sideways Detection")
sidewaysBbLength      = input( 50  , "SMA Length"              , type=input.integer , minval=1      ,                        group="Sideways Detection")
sidewaysBbrLen        = input( 21  , "Std Dev Signal Smoothing", type=input.integer , minval=1      , maxval=50,             group="Sideways Detection")
sidewaysBbMult        = input(  4.0, "Std Dev"                 , type=input.float   , minval=0.001  , maxval=50, step=0.001, group="Sideways Detection")
sidewaysBbrStdThresh  = input( 0.08, "Std Dev threshold"       , type=input.float   ,                            step=0.01 , group="Sideways Detection")

// Sideways indicator
sidewaysBasis   = sma(sidewaysBbSource, sidewaysBbLength)
sidewaysStdDev2 = sidewaysBbMult * stdev(sidewaysBbSource, sidewaysBbLength)
sidewaysUpper   = sidewaysBasis   sidewaysStdDev2
sidewaysLower   = sidewaysBasis - sidewaysStdDev2
sidewaysBbr     = (sidewaysBbSource - sidewaysLower)/(sidewaysUpper - sidewaysLower)
sidewaysStdDev  = stdev(sidewaysBbr, sidewaysBbrLen)
isSideways      = (sidewaysBbr > 0.0 and sidewaysBbr < 1.0) and sidewaysStdDev <= sidewaysBbrStdThresh

barsSinceNotSideways = barssince(not isSideways)
if barsSinceNotSideways == 0
    barsSinceNotSideways := 1 // highest/lowest will fail on 0.

hLevel = array.new_float(1, highest(high, barsSinceNotSideways))
lLevel = array.new_float(1, lowest (low , barsSinceNotSideways))

hNextLevel() =>
    _newLevel = isSideways ? array.get(hLevel, 0) : na
    array.set(hLevel, 0, _newLevel)
    _newLevel

lNextLevel() =>
    _newLevel = isSideways ? array.get(lLevel, 0) : na
    array.set(lLevel, 0, _newLevel)
    _newLevel

L  = lowest(high, barsSinceNotSideways)
H  = highest(low, barsSinceNotSideways)
LB = lowestbars(high, barsSinceNotSideways)
HB = highestbars(low, barsSinceNotSideways)

if not isSideways
    L := na
    H := na
    LB := na
    HB := na
    L
    H
    LB
    HB

bgcolor(title="Sidways", color=isSideways ? color.rgb(236, 64, 122, 90) : color.new(color.white, 100))

plot(hNextLevel(), title="Level High", color=color.red               , style=plot.style_cross, display=display.none)
plot(lNextLevel(), title="Level Low" , color=color.blue              , style=plot.style_cross, display=display.none)
plot(H           , "highest"         , color=color.new(color.red , 0), style=plot.style_cross, display=display.none)
plot(L           , "Lowest"          , color=color.new(color.blue, 0), style=plot.style_cross, display=display.none)
plot(HB          , "highest Bars"    , color=color.new(color.red , 0), style=plot.style_cross, display=display.none)
plot(LB          , "Lowest Bars"     , color=color.new(color.blue, 0), style=plot.style_cross, display=display.none)

 

Ответ №1:

Я нашел (просто случайно, я искал что-то другое) индикатор, который делает это gapsamp;wicks , предназначенный для всех, кто сталкивается с этой проблемой.