//@version=5 indicator('DR/IDR V1', overlay=true, max_lines_count=500, max_boxes_count=500) import PineCoders/VisibleChart/4 as PCchart // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // Input options // { LS0='Solid', LS1='Dashed', LS2='Dotted' BX0='DR', BX1='IDR' // } Input options // Inputs // { var GRP1 = "Time Settings" //timings exchangeOffset = input.int(0,"Exchange Offset (hours)", group=GRP1) regularTime = input.session('0930-1030', 'RDR Time', group=GRP1) regularExtend = input.session('1030-1600', 'RDR Lines Time', group=GRP1) overnightTime = input.session('0300-0400', 'ODR Time', group=GRP1) overnightExtend = input.session('0400-0830', 'ODR Lines Time', group=GRP1) var GRP2 = "General Settings" //lines drlines = input.bool(true, 'Show DR Lines ?', group=GRP2) idrlines = input.bool(true, 'Show IDR Lines ?', group=GRP2) middledrline = input.bool(false, 'Show Middle DR Line ?', group=GRP2) middleidrline = input.bool(true, 'Show Middle IDR Line ?', group=GRP2) showBackground = input.bool(true, 'Show DR/IDR Box ?', group=GRP2) boxType = input.string(BX1, 'Box DR or IDR ?', options=[BX0,BX1], group=GRP2) extenddrLines = input.bool(true, 'Extend DR Lines ?', group=GRP2) extendidrLines = input.bool(true, 'Extend IDR Lines ?', group=GRP2) showAllHistory = input.bool(false, 'Show complete history ?', 'Might cause a slight drawing delay when panning/moving/zooming the chart.', group=GRP2) useBoxColors = input.bool(false, 'Box color based on open and close', 'If unchecked, it will default to the selected Box Background Color', group=GRP2) var GRP3 = "Styles" linesWidth = input.int(1, 'Box And Lines Width ?', minval=1, maxval=4, group=GRP3) drLineColor = input.color(color.gray, 'DR Line Color', group=GRP3, inline='drline') drLineStyle = input.string(LS0, 'Style', options=[LS0,LS1,LS2], group=GRP3, inline='drline') idrLineColor = input.color(color.red, 'IDR Line Color', group=GRP3, inline='idrline') idrLineStyle = input.string(LS1, 'Style', options=[LS0,LS1,LS2], group=GRP3, inline='idrline') middleLineColor = input.color(color.gray, 'Middle Line Color', group=GRP3, inline='midline') middleLineStyle = input.string(LS2, 'Style', options=[LS0,LS1,LS2], group=GRP3, inline='midline') backgroundColor = input.color(color.new(color.gray, 75), 'Box Background Color', group=GRP3) boxBorderSize = input.int(0, title="Box border size", minval=0, group=GRP3) upBoxColor = input.color(color.new(color.green, 85), 'Up box', group=GRP3, inline='upbox') upBorderColor = input.color(color.green, 'border', group=GRP3, inline='upbox') downBoxColor = input.color(color.new(color.red, 85), 'Down box', group=GRP3, inline='downbox') downBorderColor = input.color(color.red, 'border', group=GRP3, inline='downbox') // } Inputs // Constants // { exchangeOffsetMS = exchangeOffset * 3600000 // } Constants // Variables { var int startTime = na var line lowrdrl = na var line highrdrl = na var line lowridrl = na var line highridrl = na var line leftrdrl = na var line rightrdrl = na var line middlerdrl = na var line middleridrl = na var box bgBox = na var float rdrlow = na var float rdrhigh = na var float ridrlow = na var float ridrhigh = na var float rdrmiddle = na var float ridrmiddle = na var float sessionOpen = na var bool use_m5 = false // } Variables // Functions { f_insession(_session) => not na(time(timeframe.period, _session, "America/New_York")) f_lineStyle(_inputOption) => switch(_inputOption) LS0 => line.style_solid LS1 => line.style_dashed LS2 => line.style_dotted => line.style_solid f_newline(_color, _style) => line.new(na, na, na, na, xloc=xloc.bar_time, color=_color, style=_style, width=linesWidth) f_newdrline() => f_newline(drLineColor, f_lineStyle(drLineStyle)) f_newidrline() => f_newline(idrLineColor, f_lineStyle(idrLineStyle)) f_newmdline() => f_newline(middleLineColor, f_lineStyle(middleLineStyle)) f_newbox() => box.new(na, na, na, na, xloc=xloc.bar_time, bgcolor=backgroundColor, border_width=boxBorderSize) f_moveLine(_line, _x1, _y, _x2) => line.set_xy1(_line, _x1 + exchangeOffsetMS, _y), line.set_xy2(_line, _x2 + exchangeOffsetMS, _y) f_movebox(_box, _left, _top, _right, _bottom, _bordercolor, _bgcolor) => box.set_lefttop(_box, _left + exchangeOffsetMS, _top), box.set_rightbottom(_box, _right + exchangeOffsetMS, _bottom), box.set_border_color(_box, _bordercolor), box.set_bgcolor(_box, _bgcolor) // } Functions // Use the 5 minute timeframe if the chart timeframe is lower than 5m if barstate.isfirst use_m5 := timeframe.in_seconds() < 300 [m5_open, m5_high, m5_low, m5_close] = request.security(syminfo.tickerid, '5', [open, high, low, close], lookahead = barmerge.lookahead_on) open_value = use_m5 ? m5_open : open high_value = use_m5 ? m5_high : high low_value = use_m5 ? m5_low : low close_value = use_m5 ? m5_close : close inRegularSession = f_insession(regularTime) inRegularExtend = f_insession(regularExtend) inOvernightSession = f_insession(overnightTime) inOvernightExtend = f_insession(overnightExtend) inSession = inRegularSession or inOvernightSession inExtend = inRegularExtend or inOvernightExtend if timeframe.isintraday and (PCchart.barIsVisible() or not showAllHistory) if inSession // Initialize levels if not inSession[1] startTime := time sessionOpen := open_value rdrhigh := high_value rdrlow := low_value ridrlow := math.min(open_value, close_value) ridrhigh := math.max(open_value, close_value) // Initialize drawing objects if showBackground bgBox := f_newbox() if drlines highrdrl := f_newdrline() lowrdrl := f_newdrline() if idrlines highridrl := f_newidrline() lowridrl := f_newidrline() if middledrline middlerdrl := f_newmdline() if middleidrline middleridrl := f_newmdline() // Calculate levels rdrhigh := math.max(high_value, rdrhigh) rdrlow := math.min(low_value, rdrlow) ridrhigh := math.max(open_value, close_value, ridrhigh) ridrlow := math.min(open_value, close_value, ridrlow) rdrmiddle := math.avg(rdrhigh, rdrlow) ridrmiddle := math.avg(ridrhigh, ridrlow) // Draw objects if showBackground and inSession boxUp = close_value > sessionOpen boxBorderColor = useBoxColors ? (boxUp ? upBorderColor : downBorderColor) : backgroundColor boxBackgroundColor = useBoxColors ? (boxUp ? upBoxColor : downBoxColor) : backgroundColor boxHigh = boxType==BX0 ? rdrhigh : ridrhigh boxLow = boxType==BX0 ? rdrlow : ridrlow f_movebox(bgBox, startTime, boxHigh, time, boxLow, boxBorderColor, boxBackgroundColor) if drlines and (inSession or (extenddrLines and inExtend)) f_moveLine(highrdrl, startTime, rdrhigh, time) f_moveLine(lowrdrl, startTime, rdrlow, time) if middledrline f_moveLine(middlerdrl, startTime, rdrmiddle, time) if idrlines and (inSession or (extendidrLines and inExtend)) f_moveLine(highridrl, startTime, ridrhigh, time) f_moveLine(lowridrl, startTime, ridrlow, time) if middleidrline f_moveLine(middleridrl, startTime, ridrmiddle, time)