커뮤니티

요청 드립니다.

프로필 이미지
느와르
2026-08-21 20:01:52
158
글번호 233357
답변완료

안녕하세요


항상 빠른 답변 감사 드립니다.


아래 식을


지표식,


종목검색식


변환 요청 드립니다.


혹 분봉 및 일봉 적용시 설정 값 변경을 해줘야 한다면 자세한 안내 부탁드립니다.


그럼 좋은 하루 되세요






// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/

// © LuxAlgo


//@version=5

indicator("Liquidity Swings [LuxAlgo]"

  , overlay = true

  , max_lines_count = 500

  , max_labels_count = 500

  , max_boxes_count = 500)

//------------------------------------------------------------------------------

//Settings

//-----------------------------------------------------------------------------{

length = input(14, 'Pivot Lookback')


area = input.string('Wick Extremity', 'Swing Area', options = ['Wick Extremity', 'Full Range'])


intraPrecision = input(false, 'Intrabar Precision', inline = 'intrabar')

intrabarTf = input.timeframe('1', ''              , inline = 'intrabar')


filterOptions = input.string('Count', 'Filter Areas By', options = ['Count', 'Volume'], inline = 'filter')

filterValue   = input.float(0, ''                                            , inline = 'filter')


//Style

showTop      = input(true, 'Swing High'              , inline = 'top', group = 'Style')

topCss       = input(color.red, ''                   , inline = 'top', group = 'Style')

topAreaCss   = input(color.new(color.red, 50), 'Area', inline = 'top', group = 'Style')


showBtm      = input(true, 'Swing Low'                , inline = 'btm', group = 'Style')

btmCss       = input(color.teal, ''                   , inline = 'btm', group = 'Style')

btmAreaCss   = input(color.new(color.teal, 50), 'Area', inline = 'btm', group = 'Style')


labelSize = input.string('Tiny', 'Labels Size', options = ['Tiny', 'Small', 'Normal'], group = 'Style')


//-----------------------------------------------------------------------------}

//Functions

//-----------------------------------------------------------------------------{

n = bar_index


get_data()=> [high, low, volume]


[h, l, v] = request.security_lower_tf(syminfo.tickerid, intrabarTf, get_data())


get_counts(condition, top, btm)=>

    var count = 0

    var vol = 0.


    if condition

        count := 0

        vol := 0.

    else

        if intraPrecision

            if n > length

                if array.size(v[length]) > 0

                    for [index, element] in v[length]

                        vol += array.get(l[length], index) < top and array.get(h[length], index) > btm ? element : 0

        else

            vol += low[length] < top and high[length] > btm ? volume[length] : 0

        

        count += low[length] < top and high[length] > btm ? 1 : 0


    [count, vol]


set_label(count, vol, x, y, css, lbl_style)=>

    var label lbl = na

    var label_size = switch labelSize

        'Tiny' => size.tiny

        'Small' => size.small

        'Normal' => size.normal


    target = switch filterOptions

        'Count'  => count

        'Volume' => vol


    if ta.crossover(target, filterValue)

        lbl := label.new(x, y, str.tostring(vol, format.volume)

          , style = lbl_style

          , size = label_size

          , color = #00000000

          , textcolor = css)


    if target > filterValue

        label.set_text(lbl, str.tostring(vol, format.volume))


set_level(condition, crossed, value, count, vol, css)=>

    var line lvl = na


    target = switch filterOptions

        'Count'  => count

        'Volume' => vol


    if condition

        if target[1] < filterValue[1]

            line.delete(lvl[1])

        else if not crossed[1]

            line.set_x2(lvl, n - length)


        lvl := line.new(n - length, value, n, value

          , color = na)


    if not crossed[1]

        line.set_x2(lvl, n+3)

    

    if crossed and not crossed[1]

        line.set_x2(lvl, n)

        line.set_style(lvl, line.style_dashed)


    if target > filterValue

        line.set_color(lvl, css)


set_zone(condition, x, top, btm, count, vol, css)=>

    var box bx = na


    target = switch filterOptions

        'Count'  => count

        'Volume' => vol


    if ta.crossover(target, filterValue)

        bx := box.new(x, top, x + count, btm

          , border_color = na

          , bgcolor = css)

    

    if target > filterValue

        box.set_right(bx, x + count)


//-----------------------------------------------------------------------------}

//Global variables

//-----------------------------------------------------------------------------{

//Pivot high

var float ph_top = na

var float ph_btm = na

var bool  ph_crossed = na

var       ph_x1 = 0

var box   ph_bx = box.new(na,na,na,na

  , bgcolor = color.new(topAreaCss, 80)

  , border_color = na)


//Pivot low

var float pl_top = na

var float pl_btm = na

var bool  pl_crossed = na

var       pl_x1 = 0

var box   pl_bx = box.new(na,na,na,na

  , bgcolor = color.new(btmAreaCss, 80)

  , border_color = na)


//-----------------------------------------------------------------------------}

//Display pivot high levels/blocks

//-----------------------------------------------------------------------------{

ph = ta.pivothigh(length, length)


//Get ph counts

[ph_count, ph_vol] = get_counts(ph, ph_top, ph_btm)


//Set ph area and level

if ph and showTop

    ph_top := high[length]

    ph_btm := switch area

        'Wick Extremity' => math.max(close[length], open[length])

        'Full Range' => low[length]

    

    ph_x1 := n - length

    ph_crossed := false


    box.set_lefttop(ph_bx, ph_x1, ph_top)

    box.set_rightbottom(ph_bx, ph_x1, ph_btm)

else

    ph_crossed := close > ph_top ? true : ph_crossed

    

    if ph_crossed

        box.set_right(ph_bx, ph_x1)

    else

        box.set_right(ph_bx, n+3)


if showTop

    //Set ph zone

    set_zone(ph, ph_x1, ph_top, ph_btm, ph_count, ph_vol, topAreaCss)


    //Set ph level

    set_level(ph, ph_crossed, ph_top, ph_count, ph_vol, topCss)


    //Set ph label

    set_label(ph_count, ph_vol, ph_x1, ph_top, topCss, label.style_label_down)


//-----------------------------------------------------------------------------}

//Display pivot low levels/blocks

//-----------------------------------------------------------------------------{

pl = ta.pivotlow(length, length)


//Get pl counts

[pl_count, pl_vol] = get_counts(pl, pl_top, pl_btm)


//Set pl area and level

if pl and showBtm

    pl_top := switch area

        'Wick Extremity' => math.min(close[length], open[length])

        'Full Range' => high[length]

    pl_btm := low[length]

    

    pl_x1 := n - length

    pl_crossed := false

    

    box.set_lefttop(pl_bx, pl_x1, pl_top)

    box.set_rightbottom(pl_bx, pl_x1, pl_btm)

else

    pl_crossed := close < pl_btm ? true : pl_crossed


    if pl_crossed

        box.set_right(pl_bx, pl_x1)

    else

        box.set_right(pl_bx, n+3)


if showBtm

    //Set pl zone

    set_zone(pl, pl_x1, pl_top, pl_btm, pl_count, pl_vol, btmAreaCss)

    

    //Set pl level

    set_level(pl, pl_crossed, pl_btm, pl_count, pl_vol, btmCss)


    //Set pl labels

    set_label(pl_count, pl_vol, pl_x1, pl_btm, btmCss, label.style_label_up)


//-----------------------------------------------------------------------------}

지표
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2026-08-24 13:09:31

안녕하세요 예스스탁입니다. 1 종목검색은 어떤 조건으로 검색을 하는지 알수 없습니다. 지표식만 작성해 드립니다. 2 주기는 적용한 차트의 주기로 계산하게 작성해 드립니다. 3 input : length(14); input : area(0);#0:Wick only, 1:Full Bar input : showTop(true); input : topCss(Red); input : topAreaCss(Salmon); input : showBtm(true); input : btmCss(Green); input : btmAreaCss(DarkGreen); input : labelSize(0);#0:Tiny, 1:Small, 2:Normal; var : n(0); var : ph(false),ph_top(0),ph_btm(0),ph_vol(0),ph_count(0),ph_x1(0),ph_crossed(False); var : pl(false),pl_top(0),pl_btm(0),pl_vol(0),pl_count(0),pl_x1(0),pl_crossed(False); var : ph_xd(0),ph_xt(0),ph_bx(0),pl_xd(0),pl_xt(0),pl_bx(0); n = index; ph = SwingHigh(1,h,length,length,length*2+1) != -1;# ta.pivothigh(length, length) pl = Swinglow(1,l,length,length,length*2+1) != -1;# ta.pivotlow(length, length) if ph == true Then { ph_count = 0; ph_vol = 0 ; } Else { ph_vol = ph_vol + iff(low[length] < ph_top and high[length] > ph_btm , volume[length] , 0); ph_count = ph_count + iff(low[length] < ph_top and high[length] > ph_btm , 1 , 0); } if pl == true Then { pl_count = 0; pl_vol = 0 ; } Else { pl_vol = pl_vol + iff(low[length] < pl_top and high[length] > pl_btm , volume[length] , 0); pl_count = pl_count + iff(low[length] < pl_top and high[length] > pl_btm , 1 , 0); } if ph and showTop then { ph_top = high[length]; ph_btm = iff(area==0,max(close[length], open[length]),low[length]); ph_xd = sDate[length]; ph_xt = sTime[length]; ph_crossed = false; Box_Delete(ph_bx); ph_bx = Box_New(ph_xd,ph_xt,ph_top,ph_xd,ph_xt,ph_btm); Box_SetColor(ph_bx,topAreaCss); Box_SetFill(ph_bx,true); } else { if close > ph_top Then ph_crossed = true; if ph_crossed == true Then Box_Delete(ph_bx); Else Box_SetEnd(ph_bx,NextBarSdate,NextBarStime,ph_btm); } if pl and showBtm Then { pl_top = iff(area == 0, min(close[length], open[length]),high[length]); pl_btm = low[length]; pl_xd = sdate[length]; pl_xt = sTime[length]; pl_crossed = false; Box_Delete(pl_bx); pl_bx = Box_New(pl_xd,pl_xt,pl_top,sDate,sTime,pl_btm); Box_SetColor(pl_bx,btmAreaCss); Box_SetFill(pl_bx,true); } else { if close < pl_btm Then pl_crossed = true; if pl_crossed == true Then Box_SetEnd(pl_bx,pl_xd,pl_xt,pl_btm); Else Box_SetEnd(pl_bx,NextBarSdate,NextBarStime,pl_btm); } var : ph_tx(0),pl_tx(0); var : ph_ln(0),pl_ln(0); if CrossUp(ph_count,0) Then { ph_tx = Text_New(ph_xd,ph_xt,ph_top,NToStr(ph_vol,0)); Text_SetStyle(ph_tx,2,1); Text_SetColor(ph_tx,Red); } if ph_count > 0 Then Text_SetString(ph_tx,NToStr(ph_vol,0)); if ph == true Then { var1 = ph_top; if ph_crossed[1] == False Then TL_SetEnd(ph_ln,ph_xd,ph_xt,var1[1]); ph_ln = TL_new(ph_xd,ph_xt,var1,ph_xd,ph_xt,var1); } Else { if ph_crossed[1] == False Then { TL_SetEnd(ph_ln,sDate,sTime,var1); } if ph_crossed and ph_crossed[1] == False Then { TL_SetEnd(ph_ln,sDate,sTime,var1); TL_SetStyle(ph_ln,3); } if ph_count > 0 Then TL_SetColor(ph_ln, topAreaCss); } if CrossUp(pl_count,0) Then { pl_tx = Text_New(pl_xd,pl_xt,pl_btm,NToStr(pl_vol,0)); Text_SetStyle(pl_tx,2,0); Text_SetColor(pl_tx,Green); } if pl_count > 0 Then Text_SetString(pl_tx,NToStr(pl_vol,0)); if pl == true Then { var2 = pl_btm; if pl_crossed[1] == False Then TL_SetEnd(pl_ln,pl_xd,pl_xt,var2[1]); pl_ln = TL_new(pl_xd,pl_xt,var2,pl_xd,pl_xt,var2); } Else { if pl_crossed[1] == False Then { TL_SetEnd(pl_ln,sDate,sTime,var2); } if pl_crossed and pl_crossed[1] == False Then { TL_SetEnd(pl_ln,sDate,sTime,var2); TL_SetStyle(pl_ln,3); } if pl_count > 0 Then TL_SetColor(pl_ln, btmAreaCss); } 즐거운 하루되세요