Dynamic Order Blocks [LuxAlgo] for ThinkOrSwim

samer800

Moderator - Expert
VIP
Lifetime
epMylzq.png



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
 

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
391 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top