//@version=5 indicator("Master Pattern Indicator",overlay = true,max_boxes_count = 500, max_lines_count = 500, max_bars_back = 5000) Major_Box_Color = input.color(color.rgb(81, 55, 226),"Major Box Color") show_minor_boxes = input.bool(false,"Show Minor Boxes") Minor_Box_Color = input.color(color.rgb(163, 160, 160),"Minor Box Color") Major_Expansion_Line_Color = input.color(color.rgb(238, 238, 238),"Major Expansion Line Color") Major_Expansion_Line_Style = input.string("Solid","Major Expansion Line Style",["Solid","Dotted","Dashed"]) Major_Expansion_Line_Thickness = input.int(2,"Major Expansion Line Thickness") show_minor_expansion = input.bool(true,"Show Minor Expansion Lines") Minor_Expansion_Line_Color = input.color(color.rgb(241, 238, 239),"Minor Expansion Line Color") Minor_Expansion_Line_Style = input.string("Dashed","Minor Expansion Line Style",["Solid","Dotted","Dashed"]) Minor_Expansion_Line_Thickness = input.int(1,"Minor Expansion Line Thickness") Sell_Line_Color = input.color(color.red,"Sell Side Liquidity Line Color") Sell_Line_Style = input.string("Dotted","Sell Side Liquidity Line Style",["Solid","Dotted","Dashed"]) Sell_Line_Thickness = input.int(1,"Sell Side Liquidity Line Thickness") Buy_Line_Color = input.color(color.green,"Buy Side Liquidity Line Color") Buy_Line_Style = input.string("Dotted","Buy Side Liquidity Line Style",["Solid","Dotted","Dashed"]) Buy_Line_Thickness = input.int(1,"Buy Side Liquidity Line Thickness") max_bars = input.int(500,"Max Bars Back") indi_type = input.int(1,"Type") alert_major_line_confirm = input.bool(true,"Major Line Confirmation",group = "Alerts") alert_major_line_cross = input.bool(true,"Major Line Crossing",group = "Alerts") alert_liquidity_line_touch = input.bool(true,"Liquidity Line Touching",group = "Alerts") //n = input.int(title="Fractals Periods", defval=2, minval=2) repaint = true // // UpFractal // bool upflagDownFrontier = true // bool upflagUpFrontier0 = true // bool upflagUpFrontier1 = true // bool upflagUpFrontier2 = true // bool upflagUpFrontier3 = true // bool upflagUpFrontier4 = true // for i = 1 to n // upflagDownFrontier := upflagDownFrontier and (high[n-i] < high[n]) // upflagUpFrontier0 := upflagUpFrontier0 and (high[n+i] < high[n]) // upflagUpFrontier1 := upflagUpFrontier1 and (high[n+1] <= high[n] and high[n+i + 1] < high[n]) // upflagUpFrontier2 := upflagUpFrontier2 and (high[n+1] <= high[n] and high[n+2] <= high[n] and high[n+i + 2] < high[n]) // upflagUpFrontier3 := upflagUpFrontier3 and (high[n+1] <= high[n] and high[n+2] <= high[n] and high[n+3] <= high[n] and high[n+i + 3] < high[n]) // upflagUpFrontier4 := upflagUpFrontier4 and (high[n+1] <= high[n] and high[n+2] <= high[n] and high[n+3] <= high[n] and high[n+4] <= high[n] and high[n+i + 4] < high[n]) // flagUpFrontier = upflagUpFrontier0 or upflagUpFrontier1 or upflagUpFrontier2 or upflagUpFrontier3 or upflagUpFrontier4 // upFractal = (upflagDownFrontier and flagUpFrontier) // // downFractal // bool downflagDownFrontier = true // bool downflagUpFrontier0 = true // bool downflagUpFrontier1 = true // bool downflagUpFrontier2 = true // bool downflagUpFrontier3 = true // bool downflagUpFrontier4 = true // for i = 1 to n // downflagDownFrontier := downflagDownFrontier and (low[n-i] > low[n]) // downflagUpFrontier0 := downflagUpFrontier0 and (low[n+i] > low[n]) // downflagUpFrontier1 := downflagUpFrontier1 and (low[n+1] >= low[n] and low[n+i + 1] > low[n]) // downflagUpFrontier2 := downflagUpFrontier2 and (low[n+1] >= low[n] and low[n+2] >= low[n] and low[n+i + 2] > low[n]) // downflagUpFrontier3 := downflagUpFrontier3 and (low[n+1] >= low[n] and low[n+2] >= low[n] and low[n+3] >= low[n] and low[n+i + 3] > low[n]) // downflagUpFrontier4 := downflagUpFrontier4 and (low[n+1] >= low[n] and low[n+2] >= low[n] and low[n+3] >= low[n] and low[n+4] >= low[n] and low[n+i + 4] > low[n]) // flagDownFrontier = downflagUpFrontier0 or downflagUpFrontier1 or downflagUpFrontier2 or downflagUpFrontier3 or downflagUpFrontier4 // downFractal = (downflagDownFrontier and flagDownFrontier) // var zz = array.new_float() // var yy = array.new_int() // if upFractal // array.push(zz, high) // array.push(yy,bar_index) // if downFractal // array.push(zz, low) // array.push(yy,bar_index) var Depth = 3 var Deviation = 1 var Backstep = 1 if(indi_type==2) Depth := 2 var last_h = 1, last_h := last_h + 1 var last_l = 1, last_l := last_l + 1 var lw = 1, var hg = 1 lw := lw + 1, hg := hg + 1 p_lw = -ta.lowestbars(Depth), p_hg = -ta.highestbars(Depth) lowing = lw == p_lw or low - low[p_lw] > Deviation*syminfo.mintick highing = hg == p_hg or high[p_hg] - high > Deviation*syminfo.mintick lh = ta.barssince(not highing[1]), ll = ta.barssince(not lowing[1]) down = ta.barssince(not (lh > ll)) >= Backstep, lower = low[lw] > low[p_lw], higher = high[hg] < high[p_hg] if lw != p_lw and (not down[1] or lower) lw := p_lw < hg ? p_lw : 0 if hg != p_hg and (down[1] or higher) hg := p_hg < lw ? p_hg : 0 var zz = array.new_float() var yy = array.new_int() x1 = down ? lw : hg y1 = down ? low[lw] : high[hg] if down == down[1] if repaint if(array.size(zz)>0) array.pop(zz) array.pop(yy) down if down != down[1] if down last_h := hg else last_l := lw if not repaint nx = down?last_h:last_l array.push(zz, (down ? low[last_l] : high[last_h])) array.push(yy,bar_index-(down?last_l:last_h)) down if repaint array.push(zz, y1) array.push(yy,bar_index-x1) allowPlot()=> (last_bar_index-bar_index<=max_bars) checkTrigger()=> value1 = 0.0, value2 = 0.0, value3 = 0.0, value4 = 0.0, counter = 0, res = false, pos = 0 if(array.size(zz)>=4 and array.size(yy)>=4) for x = array.size(zz)-1 to 0 if(xvalue3 and value4>value2) or (value1>value2 and value1 if(array.size(Line)>0) for x = 0 to array.size(Line)-1 if(x < array.size(checktimes) and x < array.size(Line)) if(Time>array.get(checktimes,x)) line.set_x2(array.get(Line,x),Time) if(clear) array.remove(Line,x) var check = array.new_int() var checkMinor = array.new_int() updateExpansionLines(time,expansionLines,false,check) updateExpansionLines(time,minorExpansionLines,false,checkMinor) var majorBoxLines = array.new_line() var majorBoxLineType = array.new_int() var majorBoxLineRef = array.new_int() var Crossed = array.new_bool() getHighOffset(Time)=> x = 1, hi = high, res = 0 while(time[x]>=Time) if(high[x]>hi) hi := high[x] res := x x += 1 res getLowOffset(Time)=> x = 1, lo = low, res = 0 while(time[x]>=Time) if(low[x] result = false Prices = price if array.size(line_array) > 0 for x = 0 to array.size(line_array)-1 Price = line.get_y1(array.get(line_array,x)) if (Prices > Price and Prices[1] <= Price) or (Prices < Price and Prices[1] >= Price) result := true result operateMinorBox(price,hi_price,lo_price,Time)=> var lastMinorExp = 0 confirm = false if(array.size(minorBoxes)>0 and array.size(minorCrossedHigh)>0 and array.size(minorCrossedLow)>0 and array.size(minorBoxNames)>0) x = array.size(minorBoxes)-1 if array.get(minorBoxNames,x)!="NULL" top = box.get_top(array.get(minorBoxes,x)), bottom = box.get_bottom(array.get(minorBoxes,x)) time1 = box.get_left(array.get(minorBoxes,x)) time2 = box.get_right(array.get(minorBoxes,x)), ppp = bottom+(top-bottom)/2 origCrossedHigh = array.get(minorCrossedHigh,x) origCrossedLow = array.get(minorCrossedLow,x) if(not array.get(minorCrossedHigh,x) and not array.get(minorCrossedLow,x)) if(not barstate.islast or barstate.isconfirmed) if(price>top) array.set(minorCrossedHigh,x,true) if(pricetop) array.set(minorCrossedHigh,x,true) if(lo_price result = false if(array.size(majorBoxLines)>0 and array.size(majorBoxLineRef)>0 and array.size(Crossed)>0) z = array.size(majorBoxLines)-1 for x = 0 to z line_price = line.get_y2(array.get(majorBoxLines,x)) hi_pos = getHighOffset(array.get(majorBoxLineRef,x)) lo_pos = getLowOffset(array.get(majorBoxLineRef,x)) qq = 0.0 if(array.get(majorBoxLineType,x)==0 and lo_price <= line_price) if not array.get(Crossed,x) result := true qq := high[hi_pos] if x == z array.set(majorBoxLines,x,line.new(time[hi_pos],qq,Time,qq,xloc.bar_time,extend.none,Sell_Line_Color,(Sell_Line_Style=="Solid"?line.style_solid: Sell_Line_Style=="Dotted"?line.style_dotted:line.style_dashed),Sell_Line_Thickness)) array.set(majorBoxLineType,x,1) else array.set(Crossed,x,true) else if(array.get(majorBoxLineType,x)==1 and hi_price >= line_price) if not array.get(Crossed,x) result := true qq := low[lo_pos] if x == z array.set(majorBoxLines,x,line.new(time[lo_pos],qq,Time,qq,xloc.bar_time,extend.none,Buy_Line_Color,(Buy_Line_Style=="Solid"?line.style_solid: Buy_Line_Style=="Dotted"?line.style_dotted:line.style_dashed),Buy_Line_Thickness)) array.set(majorBoxLineType,x,0) else array.set(Crossed,x,true) if not array.get(Crossed,x) line.set_x2(array.get(majorBoxLines,x),Time) result major_line_confirm = operateMinorBox(close,high,low,time) major_line_cross = checkCross(expansionLines,close) liquidity_line_touch = operateLiquidity(high,low,time) if alert_major_line_confirm and major_line_confirm alert("Major Line Confirmed.") if alert_major_line_cross and major_line_cross alert("Major Line Crossed.") if alert_liquidity_line_touch and liquidity_line_touch alert("Liquidity Line Touched.")