//@version=5 indicator("Renko candles", overlay=false) brick_width = input.int(1, 'Brick width', 1, 10, 1, 'Brick width in number of bars') brick_limit = input.int(100, 'Maximum bricks', step=1, tooltip='Too much increase will cause error') bs_calc = input.string('Static', 'Box Size', ['Static','Percentage'], 'Box size calculation protocol') bs_input = input.float(defval=5, title='Input', step=0.1) percent_output = bs_input < 0 ? 0 : math.floor(bs_input*close /100 /syminfo.mintick)*syminfo.mintick // Initialization varip float brick = na varip int dir = 0 varip float level = na varip float upper = na varip float lower = na varip float[] levels = array.new_float() varip float[] open_levels = array.new_float() if barstate.isrealtime brick := switch bs_calc 'Static' => bs_input 'Percentage' => percent_output // Set level if necessary, and upper and lower limits each tick if na(level) level := close upper := dir == -1 ? level + 2*brick : level + brick lower := dir == 1 ? level - 2*brick : level - brick // Upward if close > upper qty = math.floor((close - upper)/brick) + 1 for i = 0 to qty - 1 array.push(open_levels, upper + (i-1) * brick) array.push(levels, upper + i*brick) level := upper + (qty-1)*brick dir := 1 upper := dir == -1 ? level + 2*brick : level + brick lower := dir == 1 ? level - 2*brick : level - brick // Downward else if close < lower qty = math.floor((lower-close)/brick) + 1 for i = 0 to qty - 1 array.push(open_levels, lower - (i-1) * brick) array.push(levels, lower - i*brick) level := lower - (qty-1)*brick dir := -1 upper := dir == -1 ? level + 2*brick : level + brick lower := dir == 1 ? level - 2*brick : level - brick // Clear bricks past the limit if array.size(levels) > brick_limit for i = 0 to array.size(levels) - brick_limit - 1 array.shift(levels) array.shift(open_levels) // Init Boxes var box[] boxes = array.new_box() // Clear Boxes if array.size(boxes) > 0 for i = 0 to array.size(boxes) - 1 box.delete(array.pop(boxes)) // If there are bricks sz = array.size(levels) if sz > 0 for i = 0 to sz - 1 // Draw outlines y2 = array.get(levels,i) y1 = array.get(open_levels, i) x1 = bar_index - (sz - i)*brick_width x2 = x1 + brick_width box_color = y2 > y1 ? color.teal : color.red box_bg = y2 > y1 ? color.teal : color.red array.push(boxes, box.new(left=x1, right=x2, bottom=y1, top=y2, border_width=1, bgcolor=box_bg, border_color=box_color)) // Draw limit, current level, and close lines var line upper_line = na var line lower_line = na var line level_line = na var line close_line = na if not na(upper_line) line.delete(upper_line) line.delete(lower_line) line.delete(level_line) line.delete(close_line) upper_line := line.new(bar_index, upper, bar_index-1, upper, extend=extend.right, color=color.teal, style=line.style_dotted, width=2) lower_line := line.new(bar_index, lower, bar_index-1, lower, extend=extend.right, color=color.rgb(255,0,0,0), style=line.style_dotted, width=2) level_line := line.new(bar_index, level, bar_index-1, level, extend=extend.right, color=color.gray, style=line.style_dotted, width=2) close_line := line.new(bar_index, close, bar_index-brick_width, close, extend=extend.left, color=color.blue, style=line.style_solid, width=2) var color transp = color.new(color.black, 100) var label upper_label = na var label lower_label = na var label level_label = na if not na(upper_label) label.delete(upper_label) label.delete(lower_label) label.delete(level_label) // plot trackprice, price & boxsize status plot(close, "", color.blue, 2, plot.style_line, false, offset=0, show_last=1) plotchar(series=brick, title="", char="", editable=false, color=color.orange)