UPDATE: had a minor bug on how to detect the range.
//@version=2 study(title='[RS]Swing Charts V1 Darvas Box V0.1', shorttitle='SCDV', overlay=true) SHOW_BARCOLOR = input(title='Overwrite Bar Colors?', type=bool, defval=false) SHOW_ZIGZAG_LVL0 = input(title='Display ZigZag Level 0?', type=bool, defval=true) SHOW_SWINGCHART_LVL0 = input(title='Display Swing Chart Stops Level 0?', type=bool, defval=false) SHOW_SWINGSIGNAL_LVL0 = input(title='Display Swing Signals Level 0?', type=bool, defval=false) f_up_bar(_previous_high, _current_high, _previous_low, _current_low)=> _return = _previous_high < _current_high and _previous_low < _current_low f_down_bar(_previous_high, _current_high, _previous_low, _current_low)=> _return = _previous_high > _current_high and _previous_low > _current_low f_inside_bar(_previous_high, _current_high, _previous_low, _current_low)=> _return = _previous_high >= _current_high and _previous_low <= _current_low f_outside_bar(_previous_high, _current_high, _previous_low, _current_low)=> _return = _previous_high <= _current_high and _previous_low >= _current_low //-- f_swing_high(_previous_high, _current_high, _previous_low, _current_low)=> _condition_00 = f_up_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_down_bar(_previous_high, _current_high, _previous_low, _current_low) _condition_01 = f_outside_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_down_bar(_previous_high, _current_high, _previous_low, _current_low) _condition_02 = f_inside_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_down_bar(_previous_high, _current_high, _previous_low, _current_low) _condition_03 = f_up_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_inside_bar(_previous_high, _current_high, _previous_low, _current_low) and close[0] < hl2[1] _condition_04 = f_outside_bar(_previous_high, _current_high, _previous_low, _current_low) and close < hl2 _condition_05 = false _return = _condition_00 or _condition_01 or _condition_02 or _condition_03 or _condition_04 or _condition_05 f_swing_low(_previous_high, _current_high, _previous_low, _current_low)=> _condition_00 = f_down_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_up_bar(_previous_high, _current_high, _previous_low, _current_low) _condition_01 = f_outside_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_up_bar(_previous_high, _current_high, _previous_low, _current_low) _condition_02 = f_inside_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_up_bar(_previous_high, _current_high, _previous_low, _current_low) _condition_03 = f_down_bar(_previous_high[1], _current_high[1], _previous_low[1], _current_low[1]) and f_inside_bar(_previous_high, _current_high, _previous_low, _current_low) and close[0] > hl2[1] _condition_04 = f_outside_bar(_previous_high, _current_high, _previous_low, _current_low) and close > hl2 _condition_05 = false _return = _condition_00 or _condition_01 or _condition_02 or _condition_03 or _condition_04 or _condition_05 //-- f_swingchart(_swings_high, _swings_low)=> _trend = na(_trend[1]) ? 1 : _trend[1] > 0 and _swings_low ? -1 : _trend[1] < 0 and _swings_high ? 1 : _trend[1] _return = na(_return[1]) ? 0 : change(_trend) > 0 ? nz(_swings_high, high[1]) : change(_trend) < 0 ? nz(_swings_low, low[1]) : _return[1] swings_high_lvl0 = f_swing_high(high[1], high, low[1], low) ? highest(3) : na swings_low_lvl0 = f_swing_low(high[1], high, low[1], low) ? lowest(3) : na swing_chart_lvl0 = f_swingchart(swings_high_lvl0, swings_low_lvl0) zigzag_lvl0 = change(swing_chart_lvl0) != 0 ? swing_chart_lvl0 : na zigzag_lvl0_trend = na(zigzag_lvl0_trend[1]) ? 1 : change(swing_chart_lvl0) > 0 ? 1 : change(swing_chart_lvl0) < 0 ? -1 : zigzag_lvl0_trend[1] plotshape(title='Swing High 0' , series=not SHOW_SWINGSIGNAL_LVL0 ? na : swings_high_lvl0 , style=shape.triangledown , location=location.abovebar, color=red, transp=0, offset=-1) plotshape(title='Swing Low 0' , series=not SHOW_SWINGSIGNAL_LVL0 ? na : swings_low_lvl0 , style=shape.triangleup , location=location.belowbar, color=lime, transp=0, offset=-1) plot(title='Swing Chart 0' , series=not SHOW_SWINGCHART_LVL0 ? na : swing_chart_lvl0 , color=change(swing_chart_lvl0) != 0 ? na : black , transp=0, offset=-1) plot(title='ZigZag 0' , series=not SHOW_ZIGZAG_LVL0 ? na : zigzag_lvl0 , color=zigzag_lvl0_trend > 0 ? lime : red, transp=0, linewidth=1, offset=-1) barcolor(title='Up Bar' , color=not SHOW_BARCOLOR ? na : f_up_bar(high[1], high, low[1], low) ? lime : na ) barcolor(title='Down Bar' , color=not SHOW_BARCOLOR ? na : f_down_bar(high[1], high, low[1], low) ? red : na ) barcolor(title='Inside Bar' , color=not SHOW_BARCOLOR ? na : f_inside_bar(high[1], high, low[1], low) ? blue : na ) barcolor(title='Outside Bar' , color=not SHOW_BARCOLOR ? na : f_outside_bar(high[1], high, low[1], low) ? aqua : na ) a = valuewhen(change(swing_chart_lvl0)!=0, swing_chart_lvl0, 3) b = valuewhen(change(swing_chart_lvl0)!=0, swing_chart_lvl0, 2) c = valuewhen(change(swing_chart_lvl0)!=0, swing_chart_lvl0, 1) d = valuewhen(change(swing_chart_lvl0)!=0, swing_chart_lvl0, 0) //darvas_upper = d < c and high > c ? max(a, max(b, max(c,d))) : d > c and low < c ? max(a, max(b, max(c,d))) : darvas_upper[1] //darvas_lower = d < c and high > c ? min(a, min(b, min(c,d))) : d > c and low < c ? min(a, min(b, min(c,d))) : darvas_lower[1] darvas_upper = d < c and high > c ? c : d > c and low < c ? max(a, max(b, max(c,d))) : darvas_upper[1] darvas_lower = d < c and high > c ? min(a, min(b, min(c,d))) : d > c and low < c ? c : darvas_lower[1] plot(darvas_upper, color=blue, transp=0, linewidth=2) plot(darvas_lower, color=navy, transp=0, linewidth=2)