
Author Message:
The Dynamic Order Blocks indicator displays the most recent unmitigated bullish and bearish order blocks on the chart, providing dynamic support/resistance areas.
When price sweeps an order block, this is highlighted by the script indicating a potential reversal.
The average between the displayed order blocks is also displayed.
Read more: https://www.tradingview.com/script/074XJWqf-Dynamic-Order-Blocks-LuxAlgo/
CODE:
CSS:
#// Indicator for TOS
#// © LuxAlgo
#indicator("Dynamic Order Blocks [LuxAlgo]", "LuxAlgo - Dynamic Order Blocks", overlay = true)
# Converted by Sam4Cok@Samer800 - 08/2024
input barColors = no;
input showDynamicSweeps = yes; # 'Dynamic Sweeps'
input showAverageLine = yes;
input useCandleBody = {Default "Yes", "No"}; #(true, 'Use Candle Body')
input SwingLookback = 10; #, 'Swing Lookback', minval = 3)
def na = Double.NaN;
def last = IsNaN(close);
DefineGlobalColor("up", CreateColor(8, 153, 129));
DefineGlobalColor("dn", CreateColor(242, 54, 69));
#//Functions
script swings {
input len = 10;
def n = BarNumber();
def bar = if isNaN(close) then bar[1] else n;
def upper = Highest(high, len);
def lower = Lowest(low , len);
def os = if high[len] > upper then 0 else
if low[len] < lower then 1 else os[1];
def topCond = os == 0 and os[1] != 0;
def btmCond = os == 1 and os[1] != 1;
def top = if topCond then high[len] else top[1];
def topx = if topCond then len else topx[1] + 1;
def btm = if btmCond then low[len] else btm[1];
def btmx = if btmCond then len else btmx[1] + 1;
plot up = if top then top else upper;
plot lo = if btm then btm else lower;
plot upx = if isNaN(topx) then 1 else topx;
plot lox = if isNaN(btmx) then 1 else btmx;
plot dir = os;
}
#//Detect Swings
#def n1 = BarNumber();
#def n = if last then n[1] else if n1>1 then n1 else 1;
def top = swings(SwingLookback).up;
def btm = swings(SwingLookback).lo;
def topx = swings(SwingLookback).upx;
def btmx = swings(SwingLookback).lox;
def os = swings(SwingLookback).dir;
def topCond = os == 0 and os[1] != 0;
def btmCond = os == 1 and os[1] != 1;
def maxx; # = high;#if useBody then Max(close, open) else high;
def minn; # = low;#; # = if useBody then Min(close, open) else low;
Switch (useCandleBody) {
Case "No" :
maxx = high;
minn = low;
Default :
maxx = Max(close, open);
minn = Min(close, open);
}
def foldTop = Max(topx, SwingLookback);
#//Bullish OB
def topCrossed;
def topCrossed1 = if topCond then no else topCrossed[1];
def minimaTop;
def maximaTop;
def minimaTop0;
def maximaTop0;
def minimaTop1;
def maximaTop1;
def minimaTop2;
def maximaTop2;
def minimaTop3;
def maximaTop3;
def minimaTop4;
def maximaTop4;
def minimaTop5;
def maximaTop5;
def minimaTop6;
def maximaTop6;
def minimaTop7;
def maximaTop7;
def minimaTop8;
def maximaTop8;
def minimaTop9;
def maximaTop9;
if close > top and !topCrossed1 {
topCrossed = yes;
minimaTop9 = minimaTop8[1];
maximaTop9 = maximaTop8[1];
minimaTop8 = minimaTop7[1];
maximaTop8 = maximaTop7[1];
minimaTop7 = minimaTop6[1];
maximaTop7 = maximaTop6[1];
minimaTop6 = minimaTop5[1];
maximaTop6 = maximaTop5[1];
minimaTop5 = minimaTop4[1];
maximaTop5 = maximaTop4[1];
minimaTop4 = minimaTop3[1];
maximaTop4 = maximaTop3[1];
minimaTop3 = minimaTop2[1];
maximaTop3 = maximaTop2[1];
minimaTop2 = minimaTop1[1];
maximaTop2 = maximaTop1[1];
minimaTop1 = minimaTop0[1];
maximaTop1 = maximaTop0[1];
minimaTop = fold i0 = 1 to foldTop with p0 = maxx[1] do
min(GetValue(minn, i0), p0);
maximaTop = fold i1 = 1 to foldTop with p1 = minn[1] do
if minimaTop == GetValue(minn, i1) then GetValue(maxx, i1) else p1;
minimaTop0 = minimaTop;
maximaTop0 = maximaTop;
} else {
topCrossed = topCrossed1;
minimaTop0 = minimaTop0[1];
maximaTop0 = maximaTop0[1];
minimaTop9 = if Min(close, open) < minimaTop9[1] then minimaTop0 else minimaTop9[1];
maximaTop9 = if Min(close, open) < minimaTop9[1] then maximaTop0 else maximaTop9[1];
minimaTop8 = if Min(close, open) < minimaTop8[1] then minimaTop9 else minimaTop8[1];
maximaTop8 = if Min(close, open) < minimaTop8[1] then maximaTop9 else maximaTop8[1];
minimaTop7 = if Min(close, open) < minimaTop7[1] then minimaTop8 else minimaTop7[1];
maximaTop7 = if Min(close, open) < minimaTop7[1] then maximaTop8 else maximaTop7[1];
minimaTop6 = if Min(close, open) < minimaTop6[1] then minimaTop7 else minimaTop6[1];
maximaTop6 = if Min(close, open) < minimaTop6[1] then maximaTop7 else maximaTop6[1];
minimaTop5 = if Min(close, open) < minimaTop5[1] then minimaTop6 else minimaTop5[1];
maximaTop5 = if Min(close, open) < minimaTop5[1] then maximaTop6 else maximaTop5[1];
minimaTop4 = if Min(close, open) < minimaTop4[1] then minimaTop5 else minimaTop4[1];
maximaTop4 = if Min(close, open) < minimaTop4[1] then maximaTop5 else maximaTop4[1];
minimaTop3 = if Min(close, open) < minimaTop3[1] then minimaTop4 else minimaTop3[1];
maximaTop3 = if Min(close, open) < minimaTop3[1] then maximaTop4 else maximaTop3[1];
minimaTop2 = if Min(close, open) < minimaTop2[1] then minimaTop3 else minimaTop2[1];
maximaTop2 = if Min(close, open) < minimaTop2[1] then maximaTop3 else maximaTop2[1];
minimaTop1 = if Min(close, open) < minimaTop1[1] then minimaTop2 else minimaTop1[1];
maximaTop1 = if Min(close, open) < minimaTop1[1] then maximaTop2 else maximaTop1[1];
minimaTop = if Min(close, open) < minimaTop[1] then minimaTop1 else minimaTop[1];
maximaTop = if Min(close, open) < minimaTop[1] then maximaTop1 else maximaTop[1];
}
#//Bearish OB
def btmCrossed;
def btmCrossed1 = if btmCond then no else btmCrossed[1];
def minimaBtm;
def maximaBtm;
def minimaBtm0;
def maximaBtm0;
def minimaBtm1;
def maximaBtm1;
def minimaBtm2;
def maximaBtm2;
def minimaBtm3;
def maximaBtm3;
def minimaBtm4;
def maximaBtm4;
def minimaBtm5;
def maximaBtm5;
def minimaBtm6;
def maximaBtm6;
def minimaBtm7;
def maximaBtm7;
def minimaBtm8;
def maximaBtm8;
def minimaBtm9;
def maximaBtm9;
def foldBtm = Max(btmx, SwingLookback);
if close < btm and !btmCrossed1 {
btmCrossed = yes;
maximaBtm9 = maximaBtm8[1];
minimaBtm9 = minimaBtm8[1];
maximaBtm8 = maximaBtm7[1];
minimaBtm8 = minimaBtm7[1];
maximaBtm7 = maximaBtm6[1];
minimaBtm7 = minimaBtm6[1];
maximaBtm6 = maximaBtm5[1];
minimaBtm6 = minimaBtm5[1];
maximaBtm5 = maximaBtm4[1];
minimaBtm5 = minimaBtm4[1];
maximaBtm4 = maximaBtm3[1];
minimaBtm4 = minimaBtm3[1];
maximaBtm3 = maximaBtm2[1];
minimaBtm3 = minimaBtm2[1];
maximaBtm2 = maximaBtm1[1];
minimaBtm2 = minimaBtm1[1];
maximaBtm1 = maximaBtm[1];
minimaBtm1 = minimaBtm[1];
maximaBtm = fold j0 = 0 to foldBtm with q0 = maxx[1] do
Max(GetValue(maxx, j0), q0);
minimaBtm = fold j1 = 0 to foldBtm with q1 = minn[1] do
if maximaBtm == GetValue(maxx, j1) then GetValue(minn, j1) else q1;
maximaBtm0 = maximaBtm;
minimaBtm0 = minimaBtm;
} else {
btmCrossed = btmCrossed1;
maximaBtm0 = maximaBtm0[1];
minimaBtm0 = minimaBtm0[1];
maximaBtm9 = if Max(close, open) > maximaBtm9[1] then maximaBtm0 else maximaBtm9[1];
minimaBtm9 = if Max(close, open) > maximaBtm9[1] then minimaBtm0 else minimaBtm3[1];
maximaBtm8 = if Max(close, open) > maximaBtm8[1] then maximaBtm9 else maximaBtm8[1];
minimaBtm8 = if Max(close, open) > maximaBtm8[1] then minimaBtm9 else minimaBtm8[1];
maximaBtm7 = if Max(close, open) > maximaBtm7[1] then maximaBtm8 else maximaBtm7[1];
minimaBtm7 = if Max(close, open) > maximaBtm7[1] then minimaBtm8 else minimaBtm7[1];
maximaBtm6 = if Max(close, open) > maximaBtm6[1] then maximaBtm7 else maximaBtm6[1];
minimaBtm6 = if Max(close, open) > maximaBtm6[1] then minimaBtm7 else minimaBtm6[1];
maximaBtm5 = if Max(close, open) > maximaBtm5[1] then maximaBtm6 else maximaBtm5[1];
minimaBtm5 = if Max(close, open) > maximaBtm5[1] then minimaBtm6 else minimaBtm5[1];
maximaBtm4 = if Max(close, open) > maximaBtm4[1] then maximaBtm5 else maximaBtm4[1];
minimaBtm4 = if Max(close, open) > maximaBtm4[1] then minimaBtm5 else minimaBtm4[1];
maximaBtm3 = if Max(close, open) > maximaBtm3[1] then maximaBtm4 else maximaBtm3[1];
minimaBtm3 = if Max(close, open) > maximaBtm3[1] then minimaBtm4 else minimaBtm3[1];
maximaBtm2 = if Max(close, open) > maximaBtm2[1] then maximaBtm3 else maximaBtm2[1];
minimaBtm2 = if Max(close, open) > maximaBtm2[1] then minimaBtm3 else minimaBtm2[1];
maximaBtm1 = if Max(close, open) > maximaBtm1[1] then maximaBtm2 else maximaBtm1[1];
minimaBtm1 = if Max(close, open) > maximaBtm1[1] then minimaBtm2 else minimaBtm1[1];
maximaBtm = if Max(close, open) > maximaBtm[1] then maximaBtm1 else maximaBtm[1];
minimaBtm = if Max(close, open) > maximaBtm[1] then minimaBtm1 else minimaBtm[1];
}
def bull_top = if minimaTop!=minimaTop[1] then na else maximaTop;
plot bull_btm = if minimaTop!=minimaTop[1] then na else if minimaTop then minimaTop else na;
bull_btm.SetDefaultColor(Color.GREEN);
plot bear_top = if maximaBtm!=maximaBtm[1] then na else if maximaBtm then maximaBtm else na;
def bear_btm = if maximaBtm!=maximaBtm[1] then na else minimaBtm;
bear_top.SetDefaultColor(Color.RED);
def avg = if maximaBtm and minimaTop then (maximaBtm + minimaTop) / 2 else avg[1];
def avgVol = if avg>avg[1] then 1 else if avg<avg[1] then -1 else avgVol[1];
plot avgLine = if showAverageLine and avg then avg else na;
avgLine.AssignValueColor(if avgVol>0 then Color.CYAN else COlor.MAGENTA);
AddCloud(bull_top, bull_btm, Color.DARK_GREEN);
AddCloud(bear_top, bear_btm, Color.DARK_RED);
#--//Dynamic Sweeps
def sweepUp = bull_btm and low < bull_btm and close > bull_btm;
def sweepDn = bear_top and high > bear_top and close < bear_top;
plot BullSweep = if showDynamicSweeps and sweepUp then low else na;
plot BearSweep = if showDynamicSweeps and sweepDn then high else na;
BullSweep.SetPaintingStrategy(PaintingStrategy.BOOLEAN_WEDGE_DOWN);
BearSweep.SetPaintingStrategy(PaintingStrategy.BOOLEAN_WEDGE_UP);
BullSweep.setDefaultColor(Color.CYAN);
BearSweep.setDefaultColor(Color.MAGENTA);
#-- bar Color
def barCol = if topCrossed then 1 else if btmCrossed then -1 else 0;
AssignPriceColor(if !barColors then Color.CURRENT else
if barCol>0 then Color.DARK_GREEN else
if barCol<0 then Color.DARK_RED else Color.DARK_GRAY);
#-- END of CODE