Trend Pivot Points Indicator by Mobius For ThinkOrSwim

Trend Pivot Indicator by Mobius For ThinkOrSwimView attachment 6604
Code:
# Mobius
# V01.01.29.2019
# Uses trend of higher highs with higher lows and trend of lower lows with lower highs to locate pivots. Distance for trend is set by the user. Confirmation of a reversal from pivots is set with a multiple of the pivot bars range. That multiple is also a user input.
# Trading Rules
# 1) Trade when price crosses and closes outside the pivot Confirmation line. At that point looking for best entry. Min trade is 2 contracts
# 2) Know your risk point before entering trade. Typical risk point is the pivot line itself. If your risk is crossed look for an exit. Never use hard stops - you'll often get out for little or no loss
# 3) Know your Risk off point before entering. Typical Risk Off is an ATR multiple. Offer Risk Off as soon as possible for a Risk Free trade
# 4) set mental stop one tick above entry when Risk Off is achieved
# 5) if trade continues your way move mental stop for your runner to last support / resistance each time a new support / resistance is hit.

input n = 5;
input R_Mult = .7;

def o = open;
def h = high;
def l = low;
def c = close;
def x = BarNumber();
def nan = Double.NaN;
def ts = tickSize();
def tr = TrueRange(h, c, l);
def hh = if Sum(h > h[1], n) >= n and
            Sum(l > l[1], n) >= n-1
         then h
         else if h > hh[1]
              then h
              else hh[1];
def xh = if h == hh
         then x
         else nan;
plot hh_ = if x >= HighestAll(xh)
           then HighestAll(if IsNaN(c[-1])
                           then hh
                           else nan)
           else nan;
     hh_.SetDefaultColor(Color.RED);
     hh_.HideTitle();
     hh_.HideBubble();
def hR = if h == hh
         then Round(Average(tr, n)/TickSize(), 0)*TickSize()
         else hR[1];
def PrevL = if h == hh
            then l[1]
            else PrevL[1];
plot STO = if x >= HighestAll(xh)
           then HighestAll(if IsNaN(c[-1])
           then Round((Max(PrevL, hh_ - (hR * R_Mult))) / ts, 0) * ts
                           else nan)
           else nan;
     STO.SetDefaultColor(Color.RED);
     STO.HideTitle();
     STO.HideBubble();
plot STO_RO = if x >= HighestAll(xh)
              then HighestAll(if isNaN(c[-1])
                              then STO - Min(hR, TickSize() * 16)
                              else nan)
              else nan;
     STO_RO.SetStyle(Curve.Long_Dash);
     STO_RO.SetDefaultColor(Color.White);
     STO_RO.HideBubble();
     STO_RO.HideTitle();
#AddChartBubble(x == HighestAll(x), STO_RO, "RO", STO_RO.TakeValueColor(), 0);
def ll = if Sum(l < l[1], n) >= n and
            Sum(h < h[1], n) >= n-1
         then l
         else if l < ll[1]
              then l
              else ll[1];
def xl = if l == ll
         then x
         else nan;
plot ll_ = if x >= HighestAll(xl)
           then HighestAll(if IsNaN(c[-1])
                           then ll
                           else nan)
           else nan;
     ll_.SetDefaultColor(Color.GREEN);
     ll_.HideTitle();
     ll_.HideBubble();
def lR = if l == ll
         then Round(Average(tr, n)/TickSize(), 0)*TickSize()
         else lR[1];
def PrevH = if l == ll
            then h[1]
            else PrevH[1];
plot BTO = if x >= HighestAll(xl)
           then HighestAll(if IsNaN(c[-1])
           then Round((Min(PrevH, ll_ + (lR * R_Mult))) / ts, 0) * ts
                           else nan)
           else nan;
     BTO.SetDefaultColor(Color.GREEN);
     BTO.HideTitle();
     BTO.HideBubble();
plot BTO_RO = if x >= HighestAll(xl)
              then HighestAll(if isNaN(c[-1])
                              then BTO + Min(lR, TickSize() * 16)
                              else nan)
              else nan;
     BTO_RO.SetStyle(Curve.Long_Dash);
     BTO_RO.SetDefaultColor(Color.White);
     BTO_RO.HideBubble();
     BTO_RO.HideTitle();
#AddChartBubble(x == HighestAll(x), BTO_RO, "RO", BTO_RO.TakeValueColor(), 1);
AddCloud(STO, hh_, Color.LIGHT_RED, Color.LIGHT_RED);
AddCloud(ll_, BTO, Color.LIGHT_GREEN, Color.LIGHT_GREEN);
Alert(c crosses below STO, "", Alert.Bar, Sound.Bell);
Alert(c crosses above BTO, "", Alert.Bar, Sound.Chimes);
# End Code Trend Pivots
This is Cool! Is there any way you can make the zones stay in their place after it's been reached without them disappearing.

The Zones on this disappear once they are reached. Is there a way to make the zones stay up permanently?
 
Last edited by a moderator:
@David45 Here you go. I included a yes/no input for the arrows as well.
Code:
# Trend Pivots
# Mobius
# V01.01.29.2019
# Uses trend of higher highs with higher lows and trend of lower lows with lower highs to locate pivots. Distance for trend is set by the user. Confirmation of a reversal from pivots is set with a multiple of the pivot bars range. That multiple is also a user input.
# Trading Rules
# 1) Trade when price crosses and closes outside the pivot Confirmation line. At that point looking for best entry. Min trade is 2 contracts
# 2) Know your risk point before entering trade. Typical risk point is the pivot line itself. If your risk is crossed look for an exit. Never use hard stops - you'll often get out for little or no loss
# 3) Know your Risk off point before entering. Typical Risk Off is an ATR multiple. Offer Risk Off as soon as possible for a Risk Free trade
# 4) set mental stop one tick above entry when Risk Off is achieved
# 5) if trade continues your way move mental stop for your runner to last support / resistance each time a new support / resistance is hit.

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Code has added historical pivot plots as well as visual trade signals.
# No guarantees as to accuracy or reliability.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

input n = 5;
input R_Mult = .7;

def h = high;
def l = low;
def c = close;
def x = BarNumber();
def nan = Double.NaN;
def ts = TickSize();
def tr = TrueRange(h, c, l);
def hh = if Sum(h > h[1], n) >= n and
            Sum(l > l[1], n) >= n - 1
         then h
         else if h > hh[1]
              then h
              else hh[1];
def xh = if h == hh
         then x
         else nan;
plot hh_ = if x >= HighestAll(xh)
           then HighestAll(if IsNaN(c[-1])
                           then hh
                           else nan)
           else nan;
hh_.SetDefaultColor(Color.RED);
hh_.HideTitle();
hh_.HideBubble();
def hR = if h == hh
         then Round(Average(tr, n) / TickSize(), 0) * TickSize()
         else hR[1];
def PrevL = if h == hh
            then l[1]
            else PrevL[1];
plot STO = if x >= HighestAll(xh)
           then HighestAll(if IsNaN(c[-1])
           then Round((Max(PrevL, hh_ - (hR * R_Mult))) / ts, 0) * ts
                           else nan)
           else nan;
STO.SetDefaultColor(Color.RED);
STO.HideTitle();
STO.HideBubble();
plot STO_RO = if x >= HighestAll(xh)
              then HighestAll(if IsNaN(c[-1])
                              then STO - Min(hR, TickSize() * 16)
                              else nan)
              else nan;
STO_RO.SetStyle(Curve.LONG_DASH);
STO_RO.SetDefaultColor(Color.WHITE);
STO_RO.HideBubble();
STO_RO.HideTitle();
def ll = if Sum(l < l[1], n) >= n and
            Sum(h < h[1], n) >= n - 1
         then l
         else if l < ll[1]
              then l
              else ll[1];
def xl = if l == ll
         then x
         else nan;
plot ll_ = if x >= HighestAll(xl)
           then HighestAll(if IsNaN(c[-1])
                           then ll
                           else nan)
           else nan;
ll_.SetDefaultColor(Color.GREEN);
ll_.HideTitle();
ll_.HideBubble();
def lR = if l == ll
         then Round(Average(tr, n) / TickSize(), 0) * TickSize()
         else lR[1];
def PrevH = if l == ll
            then h[1]
            else PrevH[1];
plot BTO = if x >= HighestAll(xl)
           then HighestAll(if IsNaN(c[-1])
           then Round((Min(PrevH, ll_ + (lR * R_Mult))) / ts, 0) * ts
                           else nan)
           else nan;
BTO.SetDefaultColor(Color.GREEN);
BTO.HideTitle();
BTO.HideBubble();
plot BTO_RO = if x >= HighestAll(xl)
              then HighestAll(if IsNaN(c[-1])
                              then BTO + Min(lR, TickSize() * 16)
                              else nan)
              else nan;
BTO_RO.SetStyle(Curve.LONG_DASH);
BTO_RO.SetDefaultColor(Color.WHITE);
BTO_RO.HideBubble();
BTO_RO.HideTitle();
AddCloud(STO, hh_, Color.LIGHT_RED, Color.LIGHT_RED);
AddCloud(ll_, BTO, Color.LIGHT_GREEN, Color.LIGHT_GREEN);

# End Code Trend Pivots

#~~~~~~~~~~~~~~~~~~~~~~~~~ begin historical pivots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
input show_historical_pivots = no;

plot lowestpivot = if show_historical_pivots then ll else nan;
lowestpivot.SetDefaultColor(Color.GREEN);

plot highestpivot = if show_historical_pivots then hh else nan;
highestpivot.SetDefaultColor(Color.RED);

plot shortoncrossbelow = if show_historical_pivots
                         then Round((Max(PrevL, highestpivot - (hR * R_Mult))) / ts, 0) * ts
                         else nan;
     shortoncrossbelow.SetDefaultColor(Color.RED);

plot longoncrossabove = if show_historical_pivots
                        then Round((Min(PrevH, lowestpivot + (lR * R_Mult))) / ts, 0) * ts
                        else nan;
     longoncrossabove.SetDefaultColor(Color.GREEN);

plot buyRO = if show_historical_pivots then longoncrossabove + Min(lR, TickSize() * 16) else nan;
     buyRO.SetDefaultColor(Color.WHITE);
     buyRO.SetStyle(Curve.LONG_DASH);

plot sellRO = if show_historical_pivots then shortoncrossbelow - Min(hR, TickSize() * 16) else nan;
     sellRO.SetDefaultColor(Color.WHITE);
     sellRO.SetStyle(Curve.LONG_DASH);

AddCloud(highestpivot,shortoncrossbelow,Color.RED,Color.RED);
AddCloud(lowestpivot,longoncrossabove,Color.GREEN,Color.GREEN);
#~~~~~~~~~~~~~~~~~~~~~~ end historical pivots ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~~~~~~~~~~~~~~~~~~~~~~ begin arrow signals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
input show_arrows = yes;

def SOCB = Round((Max(PrevL, hh - (hR * R_Mult))) / ts, 0) * ts;
def LOCA = Round((Min(PrevH, ll + (lR * R_Mult))) / ts, 0) * ts;
def BRO = LOCA + Min(lR, TickSize() * 16);
def SRO = SOCB - Min(hR, TickSize() * 16);
def datadn = close > SRO and high[1] > SOCB and close < SOCB;
def dataup = close < BRO and low[1] < LOCA and close > LOCA;

plot arrowdn = if show_arrows then !datadn[1] and datadn else nan;
     arrowdn.setpaintingstrategy(paintingstrategy.boolean_arrow_down);
     arrowdn.setdefaultcolor(color.magenta);
     arrowdn.setlineweight(3);
plot arrowup = if show_arrows then !dataup[1] and dataup else nan;
     arrowup.setpaintingstrategy(paintingstrategy.boolean_arrow_up);
     arrowup.setdefaultcolor(color.cyan);
     arrowup.setlineweight(3);
#~~~~~~~~~~~~~~~~~~~~~~~~~ end arrow signals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~~~~~~~~~~~~~~~~~~~~~~ begin bubble signals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
input show_bubbles = yes;
input Buy_Sell_Bubble_Data = {default current, historical};

def short;
def long;

switch (Buy_Sell_Bubble_Data)
        {
        case historical:
             short = hh;
             long = ll;
        case current:
             short = hh_;
             long = ll_;
        }

def SOCB1 = Round((Max(PrevL, short - (hR * R_Mult))) / ts, 0) * ts;
def LOCA1 = Round((Min(PrevH, long + (lR * R_Mult))) / ts, 0) * ts;
def BRO1 = LOCA + Min(lR, TickSize() * 16);
def SRO1 = SOCB - Min(hR, TickSize() * 16);
def SE = close > SRO1 and high[1] > SOCB1 and close <= SOCB1;
def LE = close < BRO1 and low[1] < LOCA1 and close >= LOCA1;

def exitbuy = l < long[1];
def exitsell = h > short[1];

def holdLE = if LE and !LE[1] then 1 else if !exitbuy then holdLE[1] else 0;
def holdSE = if SE and !SE[1] then 1 else if !exitsell then holdSE[1] else 0;

def exit_long = holdLE[1] and !holdLE;
def exit_short = holdSE[1] and !holdSE;

AddChartBubble(if show_bubbles then !LE[1] and LE else nan, low, "Enter Long", Color.GREEN, 0);
AddChartBubble(if show_bubbles then !SE[1] and SE else nan, high, "Enter Short", Color.RED, 1);
AddChartBubble(if show_bubbles then exit_long else nan, high, "Exit Long", Color.GREEN, 1);
AddChartBubble(if show_bubbles then exit_short else nan, low, "Exit Short", Color.RED, 0);

#~~~~~~~~~~~~~~~~~~~~~~~~~~ end bubble signals ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~~~~~~~~~~~~~~~~~~~~~ begin explanation bubbles ~~~~~~~~~~~~~~~~~~~~~~~~~
input explanation_bubbles = yes;
AddChartBubble(explanation_bubbles and x == HighestAll(x), STO_RO, "Risk Off", STO_RO.TakeValueColor(), 0);
AddChartBubble(explanation_bubbles and x == HighestAll(x), BTO_RO, "Risk Off", BTO_RO.TakeValueColor(), 1);
AddChartBubble(explanation_bubbles and x == HighestAll(x), STO, "Entry Line", STO.TakeValueColor(), 0);
AddChartBubble(explanation_bubbles and x == HighestAll(x), BTO, "Entry Line", BTO.TakeValueColor(), 1);
AddChartBubble(explanation_bubbles and x == HighestAll(x), hh_, "Pivot Line", hh_.TakeValueColor(), 1);
AddChartBubble(explanation_bubbles and x == HighestAll(x), ll_, "Pivot Line", ll_.TakeValueColor(), 0);
#~~~~~~~~~~~~~~~~~~~~~~~~ end explanation bubbles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Edit: Added buy/sell bubbles. Please test before using - perform your own due diligence.
Can the look back length be extended back further on the zones?
 
Can the look back length be extended back further on the zones?

The 'lookback' is based on the bars on your chart.
To increase your 'lookback'; add more days to your chart via your timeframe settings.
 

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
201 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