You can do this in trading view. Here is the pinescript code for linebreak chart-
// © kitoboynaya
//@version=5
indicator(‘Line break’)
color color_up_line = input.color(title=‘Up line color’, defval=color.green)
color color_down_line = input.color(title=‘Down line color’, defval=color.red)
color bordercolor = input.color(title=‘Bordercolor’, defval=color.black)
color wickcolor = input.color(title=‘Wickcolor’, defval=color.black)
bool wicks = input.bool(defval=true, title=‘Wicks’)
get_linebreak(lines, wicks) =>
var float[] lines_close = array.new_float(lines)
var float[] lines_open = array.new_float(lines)
var float base_price = close
var float max_price = high
var float min_price = low
var float lb_close = na
var float lb_open = na
var float lb_high = na
var float lb_low = na
var bool repaint_LH = false
if not na(array.get(lines_close, 0))
max_value = math.max(array.max(lines_close), array.max(lines_open))
min_value = math.min(array.min(lines_close), array.min(lines_open))
if repaint_LH
lb_high := lb_close > lb_open ? lb_open : lb_close
lb_low := lb_close > lb_open ? lb_close : lb_open
repaint_LH := false
lb_high := high > lb_high ? high : lb_high
lb_low := low < lb_low ? low : lb_low
if close > max_value
if array.get(lines_close, 0) > array.get(lines_open, 0)
lb_open := array.get(lines_close, 0)
lb_close := close
repaint_LH := true
else
lb_open := array.get(lines_open, 0)
lb_close := close
repaint_LH := true
array.pop(lines_close)
array.pop(lines_open)
array.unshift(lines_close, lb_close)
array.unshift(lines_open, lb_open)
if close < min_value
if array.get(lines_close, 0) > array.get(lines_open, 0)
lb_open := array.get(lines_open, 0)
lb_close := close
repaint_LH := true
else
lb_open := array.get(lines_close, 0)
lb_close := close
repaint_LH := true
array.pop(lines_close)
array.pop(lines_open)
array.unshift(lines_close, lb_close)
array.unshift(lines_open, lb_open)
if close < max_value and close > min_value
lb_close := na
lb_open := na
if na(array.get(lines_close, 0))
if close > base_price
lb_close := close
lb_open := base_price
lb_low := low < min_price ? low : min_price
lb_high := high > max_price ? high : max_price
repaint_LH := true
array.pop(lines_close)
array.pop(lines_open)
array.unshift(lines_close, lb_close)
array.unshift(lines_open, lb_open)
else if close < base_price
lb_close := close
lb_open := base_price
lb_low := low < min_price ? low : min_price
lb_high := high > max_price ? high : max_price
repaint_LH := true
array.pop(lines_close)
array.pop(lines_open)
array.unshift(lines_close, lb_close)
array.unshift(lines_open, lb_open)
[lb_open, wicks ? lb_high : lb_close > lb_open ? lb_close : lb_open, wicks ? lb_low : lb_close < lb_open ? lb_close : lb_open, lb_close]
[lb_open, lb_high, lb_low, lb_close] = get_linebreak(input.int(defval=3, title=‘Number of lines’, minval=1), wicks)
plotcandle(lb_open, lb_high, lb_low, lb_close, color=lb_close > lb_open ? color_up_line : color_down_line, wickcolor=wickcolor, bordercolor=bordercolor)