Indicator · Pine Script v5 · On the chart

Consecutive Candle Levels

by g-moe· code credited to goodgains

This indicator detects streaks of consecutive candles on a price chart and plots Fibonacci retracement levels based on their high-low range.

View on GitHub

GitHub stars3on the repository
Pine versionv5runs as is
Lines of code346
Settings35inputs
LicenceNone statedfile: MPL-2.0
Last update5 months ago27 May 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

346 lines of Pine Script v5 from Tradingview/consecutive-candle-levels-v2.pine, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

consecutive-candle-levels-v2.pine
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © goodgains


//@version=5
indicator("Consecutive Candle Levels", overlay = true)

// @keywords: consecutive-candles, fibonacci-levels, swing-high, swing-low, barrier-lines, extension-levels, retracement-levels, bar-coloring, background-highlight, range-box, consecutive-count, direction-tracking, level-breakout, configurable-levels, overlay-levels, candle-streak, high-low-range, box-lines, signal-candle, break-detection

// update_tracking() =>
//     var startBN = track_StartBN[1]
//     var endBN = bar_index + 1
//     var fibHigh = math.max(high, track_fibHigh[1])
//     var fibLow = math.min(low, track_fibLow[1])
//     var fibHighBN = high == fibHigh ? bar_index : track_fibHighBN[1]
//     var fibLowBN = low == fibLow ? bar_index : track_fibLowBN[1]
//     [startBN, endBN, fibHigh, fibLow, fibHighBN, fibLowBN]
// [track_StartBN, track_EndBN, track_fibHigh, track_fibLow, track_fibHighBN, track_fibLowBN] = update_tracking()


// inputs
cons_candles = input.int(3, title = 'Consecutive Candles')

show_0 = input(true, "", inline = "0")
label_0 = input.string("0", "", inline = "0")
value_0 = input(0, "", inline = "0")
color_0 = input(#787b86, "", inline = "0")

show_100 = input(true, "", inline = "100")
label_100 = input.string("100", "", inline = "100")
value_100 = input(100, "", inline = "100")
color_100 = input(#787b86, "", inline = "100")

show_1 = input(false, "", inline = "Level1")
label_1 = input.string("Level 1", "", inline = "Level1")
value_1 = input(0.382, "", inline = "Level1")
color_1 = input(#787b86, "", inline = "Level1")

show_2 = input(false, "", inline = "Level2")
label_2 = input.string("Level 2", "", inline = "Level2")
value_2 = input(0.5, "", inline = "Level2")
color_2 = input(#787b86, "", inline = "Level2")

show_3 = input(false, "", inline = "Level3")
label_3 = input.string("Level 3", "", inline = "Level3")
value_3 = input(0.68, "", inline = "Level3")
color_3 = input(#787b86, "", inline = "Level3")

show_4 = input(false, "", inline = "Level4")
label_4 = input.string("Level 4", "", inline = "Level4")
value_4 = input(1.38, "", inline = "Level4")
color_4 = input(#787b86, "", inline = "Level4")

show_5 = input(false, "", inline = "Level5")
label_5 = input.string("Level 5", "", inline = "Level5")
value_5 = input(1.5, "", inline = "Level5")
color_5 = input(#787b86, "", inline = "Level5")


barrier_pos_lbl = input.string("+1.65", "", inline = "Positive Barrier")
barrier_pos = input(1.65, "", inline = "Positive Barrier")
barrier_pos_css = input(#b51d1d, "", inline = "Positive Barrier")

barrier_neg_lbl = input.string("-0.65", "", inline = "Negative Barrier")
barrier_neg = input(-0.65, "", inline = "Negative Barrier")
barrier_neg_css = input(#b51d1d, "", inline = "Negative Barrier")




// functions
f_array_shift_push(array, new_value_to_add) =>
    array.shift(array)
    array.push(array, new_value_to_add)


// f_array_add_pop(array, new_value_to_add) =>
//     array.unshift(array, new_value_to_add)
//     array.pop(array)


f_stopLine(boxObj) =>
    // box.set_left(boxObj, bar_index[1])  
    // box.set_extend(boxObj, extend.none)  
    box.delete(boxObj)

f_create_fib_values(startBN, endBN, fibTop, fibBot, fibTopBN, fibBotBN) =>
    var float fib0_value = 0.00
    var float fib100_value = 0.00

    var float fib1_value = 0.00
    var float fib2_value = 0.00
    var float fib3_value = 0.00
    var float fib4_value = 0.00
    var float fib5_value = 0.00

    var float fibpos_value = 0.00
    var float fibneg_value = 0.00 

    topIsO = fibTopBN > fibBotBN

    fib0_value := topIsO ? fibTop : fibBot
    fib100_value := topIsO ? fibBot : fibTop
    fib_distance = math.abs(fib0_value - fib100_value)

    fibpos_value := topIsO ?  fib0_value - (fib_distance * barrier_pos) : fib0_value + (fib_distance * barrier_pos)
    fibneg_value := topIsO ?  fib0_value - (fib_distance * barrier_neg) : fib0_value + (fib_distance * barrier_neg)

    [fib0_value, fib100_value, fibpos_value, fibneg_value]


f_draw_fibs(
     stopLines, startBN, endBN, fibTop, fibBot, fibTopBN, fibBotBN
     ) =>


    var float barrier_top = na
    var float barrier_bot = na

    var box fib0Line    = na
    var box fib100Line  = na
    var box fibPOSLine  = na
    var box fibNEGLine  = na

    if stopLines
        f_stopLine(fib0Line)
        f_stopLine(fib100Line)
        f_stopLine(fibPOSLine)
        f_stopLine(fibNEGLine)

        barrier_top := na
        barrier_bot := na

    else


        [fib0_value, fib100_value, fibpos_value, fibneg_value] = f_create_fib_values(startBN, endBN, fibTop, fibBot, fibTopBN, fibBotBN)

        if show_0
            fib0Line := box.new(left=startBN, top=fib0_value, right= endBN, bottom=fib0_value,
                 border_color = color_0, extend = extend.none, text = label_0, text_color = chart.fg_color,
                 text_size = size.small, text_halign = text.align_right, text_valign = text.align_top)

        if show_100
            fib100Line := box.new(left=startBN, top=fib100_value, right= endBN, bottom=fib100_value,
                 border_color = color_100, extend = extend.none, text = label_100, text_color = chart.fg_color,
                 text_size = size.small, text_halign = text.align_right, text_valign = text.align_top)


        fibPOSLine := box.new(left=startBN, top=fibpos_value, right= endBN, bottom=fibpos_value,
                 border_color = barrier_pos_css, extend = extend.none, text = barrier_pos_lbl, text_color = chart.fg_color,
                 text_size = size.small, text_halign = text.align_right, text_valign = text.align_top)

        fibNEGLine := box.new(left=startBN, top=fibneg_value, right= endBN, bottom=fibneg_value,
                 border_color = barrier_neg_css, extend = extend.none, text = barrier_neg_lbl, text_color = chart.fg_color,
                 text_size = size.small, text_halign = text.align_right, text_valign = text.align_top)

        barrier_top := math.max(fibpos_value, fibneg_value)
        barrier_bot := math.min(fibpos_value, fibneg_value)


    // return all line values here for alerts
    [barrier_top, barrier_bot] 
    









// define vars
var startBNs    = array.new_int(100, na)
var endBNs      = array.new_int(100, na)
var fibHighs    = array.new_float(100, na)
var fibLows     = array.new_float(100, na)
var fibHighsBN  = array.new_int(100, na)
var fibLowsBN   = array.new_int(100, na)






var int track_StartBN   = 0
var int track_EndBN     = 0
var float track_fibHigh = na
var float track_fibLow  = na
var int track_fibHighBN = 0
var int track_fibLowBN  = 0

var int candleCount = 0
var int candleSide  = 0

var bool firstDraw      = true
var bool barrierBroken  = false

var float barrier_top   = na
var float barrier_bot   = na


// track candle type / consecutive 
candleSide  := bar_index < cons_candles*2 ? 0 : close >= close[1] ? 1 : -1
candleCount := bar_index < cons_candles*2 ? 0 
     : bar_index  == 0 or candleSide != candleSide[1] ? 1 
     : candleCount[1] + 1






// main
if bar_index < cons_candles * 2
    firstDraw := true


else if firstDraw
    if candleCount[1] == cons_candles
        // cond met
        track_StartBN       := track_StartBN[1]
        track_EndBN         := bar_index + 1
        track_fibHigh       := math.max(high, track_fibHigh[1])
        track_fibLow        := math.min(low, track_fibLow[1])
        track_fibHighBN     := high == track_fibHigh ? bar_index : track_fibHighBN[1]
        track_fibLowBN      := low == track_fibLow ? bar_index : track_fibLowBN[1] 
    else if candleSide != candleSide[1]
        //  reset
        track_StartBN       := bar_index[1]
        track_EndBN         := bar_index + 1
        track_fibHigh       := math.max(high, high[1])
        track_fibLow        := math.min(low, low[1])
        track_fibHighBN     := high[1] == track_fibHigh ? bar_index[1] : high == track_fibHigh ? bar_index : track_fibHighBN[1]
        track_fibLowBN      := low[1] == track_fibLow ? bar_index[1] : low == track_fibLow ? bar_index : track_fibLowBN[1]
    else 
        // track
        track_StartBN       := track_StartBN[1]
        track_EndBN         := bar_index + 1
        track_fibHigh       := math.max(high, track_fibHigh[1])
        track_fibLow        := math.min(low, track_fibLow[1])
        track_fibHighBN     := high == track_fibHigh ? bar_index : track_fibHighBN[1]
        track_fibLowBN      := low == track_fibLow ? bar_index : track_fibLowBN[1]

    if candleCount[1] == cons_candles
        [barr_top, barr_bot] = f_draw_fibs(false, track_StartBN, track_EndBN, track_fibHigh, track_fibLow, track_fibHighBN, track_fibLowBN)
        barrier_top := barr_top
        barrier_bot := barr_bot

        // reset
        track_StartBN       := bar_index[1]
        track_EndBN         := bar_index + 1
        track_fibHigh       := math.max(high, high[1])
        track_fibLow        := math.min(low, low[1])
        track_fibHighBN     := high[1] == track_fibHigh ? bar_index[1] : high == track_fibHigh ? bar_index : track_fibHighBN[1]
        track_fibLowBN      := low[1] == track_fibLow ? bar_index[1] : low == track_fibLow ? bar_index : track_fibLowBN[1]
        
        firstDraw := false


// else
//     if candleCount[1] == cons_candles
//         // cond met
//         track_StartBN       := track_StartBN[1]
//         track_EndBN         := bar_index + 1
//         track_fibHigh       := math.max(high, track_fibHigh[1])
//         track_fibLow        := math.min(low, track_fibLow[1])
//         track_fibHighBN     := high == track_fibHigh ? bar_index : track_fibHighBN[1]
//         track_fibLowBN      := low == track_fibLow ? bar_index : track_fibLowBN[1] 

//         f_array_shift_push(startBNs, track_StartBN)
//         f_array_shift_push(endBNs, track_EndBN)
//         f_array_shift_push(fibHighs, track_fibHigh)
//         f_array_shift_push(fibLows, track_fibLow)
//         f_array_shift_push(fibHighsBN, track_fibHighBN)
//         f_array_shift_push(fibLowsBN, track_fibLowBN)


//     else if candleSide != candleSide[1]
//         // reset
//         track_StartBN       := bar_index[1]
//         track_EndBN         := bar_index + 1
//         track_fibHigh       := math.max(high, high[1])
//         track_fibLow        := math.min(low, low[1])
//         track_fibHighBN     := high[1] == track_fibHigh ? bar_index[1] : high == track_fibHigh ? bar_index : track_fibHighBN[1]
//         track_fibLowBN      := low[1] == track_fibLow ? bar_index[1] : low == track_fibLow ? bar_index : track_fibLowBN[1]
//     else 
//         // track
//         track_StartBN       := track_StartBN[1]
//         track_EndBN         := bar_index + 1
//         track_fibHigh       := math.max(high, track_fibHigh[1])
//         track_fibLow        := math.min(low, track_fibLow[1])
//         track_fibHighBN     := high == track_fibHigh ? bar_index : track_fibHighBN[1]
//         track_fibLowBN      := low == track_fibLow ? bar_index : track_fibLowBN[1]




barrierBroken := high >= barrier_top or low <= barrier_bot
if barrierBroken

    // stop current lines
    [barr_top, barr_bot] = f_draw_fibs(true, track_StartBN, track_EndBN, track_fibHigh, track_fibLow, track_fibHighBN, track_fibLowBN)

    // check if new lines are not broken - if they are delete other draw
    // for i = 0 to array.size(startBNs) - 1
    //     temp_startBN    = array.get(startBNs, i)
    //     temp_endBN      = array.get(endBNs, i)
    //     temp_barsback   = bar_index - temp_startBN


        // if this doesnt work can create own loop to lookback
        // temp_HH         = ta.highestbars(high, temp_barsback)
        // temp_LL         = ta.lowestbars(low, temp_barsback)



        // create new fib level values
        // temp_


        // if it fits draw
        // else delete from array


    // draw lines from array
    // delete newly drawn values from array


// plot(barrier_top)
// plot(barrier_bot)

bgcolor(firstDraw ? color.new(color.aqua, 95) : barrierBroken ? color.new(color.yellow,95) : na)
barcolor(candleCount[1] == cons_candles and firstDraw[1] ? color.new(color.white, 0) 
 : barrierBroken ? color.new(color.fuchsia, 0)
 : na)
// plot(track_fibHigh, color = color.gray)
// plot(track_fibLow, color = color.gray)






// alerts

Overview

Users set the streak length (default 3) to identify swing highs and lows. It calculates and displays customizable levels at 0, 100, 38.2, 50, 68, 138, and 150 percent of the range, along with optional positive and negative barriers. Horizontal lines appear on the chart for support and resistance identification. Settings control level visibility, labels, colors, and barrier positions.

Details

Published by

g-moe on GitHub

Code credit

goodgains, as written in the script's header

Type

Indicator, Pine Script v5

Draws

On the price chart

Category

Support & resistance, Candlestick patterns

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Consecutive Candlesint3cons_candles
show_0booltrueshow_0
label_0string0label_0
value_0int0value_0
color_0color#787b86color_0
show_100booltrueshow_100
label_100string100label_100
value_100int100value_100
color_100color#787b86color_100
show_1boolfalseshow_1
label_1stringLevel 1label_1
value_1float0.382value_1
Show all 35 settings
SettingTypeDefaultVariable
color_1color#787b86color_1
show_2boolfalseshow_2
label_2stringLevel 2label_2
value_2float0.5value_2
color_2color#787b86color_2
show_3boolfalseshow_3
label_3stringLevel 3label_3
value_3float0.68value_3
color_3color#787b86color_3
show_4boolfalseshow_4
label_4stringLevel 4label_4
value_4float1.38value_4
color_4color#787b86color_4
show_5boolfalseshow_5
label_5stringLevel 5label_5
value_5float1.5value_5
color_5color#787b86color_5
barrier_pos_lblstring+1.65barrier_pos_lbl
barrier_posfloat1.65barrier_pos
barrier_pos_csscolor#b51d1dbarrier_pos_css
barrier_neg_lblstring-0.65barrier_neg_lbl
barrier_negfloat-0.65barrier_neg
barrier_neg_csscolor#b51d1dbarrier_neg_css
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

[RS]MTF Candle Sticks

by ricardosantos79
261 stars

This indicator overlays up to five higher-timeframe candlestick groups on the price chart. For each enabled timeframe it requests open, high, low, and close and can show up to five candles, offset by a spacing setting. The main inputs set the candle count, the

Indicator v4 Candlestick patternsSupport & resistance Repaints
Updated 4 years ago · None stated GitHub repository of [RS]MTF Candle Sticks

Candlestick Patterns

by harryguiacorn
219 stars

This indicator plots optional candlestick pattern signals on the price chart. It detects engulfing bars, inside bars, HOLP and LOHP, kicker patterns, body-mass extremes, higher highs and lower lows, ATR warnings, and four-bar fractals. Optional pivot marks use

Indicator v5 Candlestick patternsVolatility & bands
Updated 1 year ago · None stated GitHub repository of Candlestick Patterns

Strat Assistant

by rickyzcarroll
90 stars

The Strat Assistant indicator identifies candlestick patterns from the STRAT methodology on the price chart. It detects inside bars, 2-candle directional bars, 3-candle outside bars, and sequences like 212 and 222 for continuations and reversals. Shapes such a

Indicator v4 Candlestick patternsSupport & resistance
Updated 5 years ago · None stated GitHub repository of Strat Assistant
56 stars

This overlay indicator highlights candles with a body smaller than 50% of their total range by coloring them white on the price chart. Simultaneously, it calculates and plots horizontal lines for open prices across multiple higher timeframes, such as daily, we

Indicator v6 Support & resistanceCandlestick patterns Repaints
Updated 2 months ago · None stated GitHub repository of Daily Weekly Monthly Yearly Opens

This Pine Script indicator identifies liquidity sweeps and confirms signals using a close-back candle pattern directly on the price chart. It tracks recent swing highs and lows over a customizable lookback period. A bullish signal forms when a prior bar sweeps

Indicator v6 SMC / ICT / price actionSupport & resistance
Updated 2 months ago · MPL-2.0 GitHub repository of Liquidity Sweep + Close-Back Confirmation

8020 System Indicator

by TamaraKGreen
46 stars

This overlay indicator draws 80/20 price levels and optional 40-point zone bands on the price chart. It marks repairs, cross sections, and forks with optional letter labels, and can highlight confluence when those marks sit near a level. Separate options shade

Indicator v6 Support & resistanceCandlestick patterns
Updated 7 weeks ago · None stated GitHub repository of 8020 System Indicator

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers