Day Trading with Pivots For ThinkOrSwim

FutureTony

Well-known member
VIP
There has been a lot of discussion here about different Pivot indicators and I wanted to share a slightly different one.

This is a modified Camarilla pivot setup that has been made popular by PostyTrades on Twitter. This setup involves:
  • A bear/bull reversal zone
  • A bear/bull last stand level
  • Two bear/bull extended targets
tIkLNdl.png


These levels, as with most pivots, are simply areas of reference. When combined with other analysis like Vol profile, Price Action, Support/Resistance, Trendlines, etc they can become powerful. Read more about these pivots here: Camarilla Pivots. They provide context on market opening and inform you what to expect - eg. RTH opens above the bearish reversal zone but then trades back through it...this is weakness and likely targets the bullish reversal zone. For this reason, there is a vertical line on the chart that displays the RTH open time but can be switched off OR modified to show another time.

This indicator can be used on Daily/Weekly/Monthly timeframes but it is intended for Day Trading futures. That doesn't mean it won't work for other instruments, just what I have spent time looking at. In addition to the Posty Pivots, I've also included the Central Pivot Range and prior period high/low values as other areas of interest. Each of these elements can be turned off/on in the options.
One thing of interest is the 'RoundLevel' variable. I'm rounding the Pivots to the nearest point on NQ (ie. RoundLevel = 0) but you would want it to be 2 if trading CL or even higher if looking at Forex.

Caveats:
This will not work on mobile as it does not support aggregation periods. I believe the same limitations exist on Range and Renko charts.
The thinkorswim DAY aggregation retrieves the daily close price and NOT the settlement price, which is slightly different. This makes a slight difference in the levels. If you want them to be exact, you need to set the 'Manual Close' to the actual previous day settlement. There may be another way around this but this was the way I had to resolve it.
By default, the indicator will show Today's levels only but you can show prior days as well - just make sure you set 'Manual Close' back to 0 if you want to look at multiple days.
And finally, I am not sure how this is similar/different than PivotBoss work. Maybe others can comment on this but I've derived most of the values here from the original Camarilla information. Possibly others could comment on similarities.

Feedback welcome!

Code:
# Complete Pivot Setup
# Created by @tony_futures
# Inspired from @PostyTrades and @SergeTrades

#declare hide_on_daily;
input aggregationPeriod = {default DAY, WEEK, MONTH, YEAR};
input showCPR = no;
input showPrevious = no;
input showReversalZone = yes;
input showLastStand = yes;
input showLabels = yes;
input showBullTargets = yes;
input showBearTargets = yes;
input showTodayOnly = yes;
input manualClose = 0.00;
input RoundLevel = 0;

def Today = if aggregationPeriod == AggregationPeriod.DAY and GetLastDay() == GetDay() then 1 else if aggregationPeriod == AggregationPeriod.MONTH and GetLastMonth() == GetMonth() then 1  else if aggregationPeriod == AggregationPeriod.WEEK and GetLastWeek() == GetWeek() then 1 else if aggregationPeriod == AggregationPeriod.YEAR and GetLastYEAR() == GetYear() then 1 else 0;

def prevHigh = high(period = aggregationPeriod)[1];
def prevLow = low(period = aggregationPeriod)[1];
def prevClose1 = close(period = aggregationPeriod)[1];
def prevClose = if manualClose != 0 then manualClose else prevClose1;

#Addlabel(aggregationPeriod == AggregationPeriod.DAY," Daily Close: " + prevClose, Color.WHITE);

def pivot = (prevHigh + prevLow + prevClose) / 3.0;
def bc = (prevHigh + prevLow) / 2.0;
def tc = (pivot - bc) + pivot;
def prevDiff = prevHigh - prevLow;
def prevDiff2 = prevDiff*1.1/2;
def prevDiff4 = prevDiff*1.1/4;
def prevDiff8 = prevDiff*1.1/8;

def smallR1 = prevClose + (prevDiff*1.1/ 12);
def smallS1 = prevClose - (prevDiff*1.1/ 12);

def R1 = prevDiff4 + prevClose;
def R3 = RoundDown(prevDiff2 + prevClose, RoundLevel);
def R2 = R3 - prevDiff8;
def R4 = RoundDown(prevDiff + prevClose,RoundLevel);
def R5 = RoundDown((R3 + (1.168 * (R3 - R1))),RoundLevel);

def S1 = PrevClose - prevDiff4; 
def S3 = RoundUp(PrevClose - prevDiff2, RoundLevel);
def S2 = S3 + prevDiff8;
def S4 = RoundUp(prevClose - prevDiff, RoundLevel);
def S5 = RoundUp((S3 - (1.168 * ( S1 - S3))), RoundLevel);

# Central Pivot Range - turn off by changing showCPR to no
plot PLine = if showCPR and showTodayOnly and Today then pivot else if showCPR and !showTodayOnly then pivot else Double.NaN;
plot BCLine = if showCPR and showTodayOnly and Today then bc else if showCPR and !showTodayOnly then bc else Double.NaN;
plot TCLine = if showCPR and showTodayOnly and Today then tc else if showCPR and !showTodayOnly then tc else Double.NaN;

PLine.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
PLine.SetDefaultColor(Color.White);
BCLine.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
BCLine.SetDefaultColor(Color.CYAN);
TCLine.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
TCLine.SetDefaultColor(Color.MAGENTA);

# Previous Day High/Low - turn off by changing showPrevious to no
plot PreviousHigh = if showPrevious and showTodayOnly and Today then RoundDown(prevHigh,RoundLevel) else if showPrevious and !showTodayOnly then RoundDown(prevHigh,RoundLevel) else Double.NaN;
PreviousHigh.SetDefaultColor(Color.GRAY);
plot PreviousLow = if showPrevious and showTodayOnly and Today then RoundUp(prevLow,RoundLevel) else if showPrevious and !showTodayOnly then RoundUp(prevLow,RoundLevel) else Double.NaN;
PreviousLow.setDefaultColor(Color.GRAY);
# Reversal zones - turn off by changing showReversalZone to no
AddCloud(if showReversalZone and showTodayOnly and Today then r1 else if showReversalZone and !showTodayOnly then r1 else Double.NaN, r2, Color.DARK_ORANGE, Color.DARK_ORANGE);
AddCloud(if showReversalZone and showTodayOnly and Today then s1 else if showReversalZone and !showTodayOnly then s1 else Double.NaN, s2, Color.LIGHT_GREEN, Color.LIGHT_GREEN);
AddLabel(showReversalZone and showLabels, "Bear zone: " + RoundDown(R1, RoundLevel) + " to " + RoundDown(R2, RoundLevel), Color.LIGHT_RED); 
AddLabel(showReversalZone and showLabels, "Bull zone: " + RoundDown(S1, RoundLevel) + " to " + RoundDown(S2, RoundLevel), Color.LIGHT_GREEN); 

# Last stand lines - turn off by changing ShowLastStand to no
plot bullLastStand = if showLastStand and showTodayOnly and Today then S3 else if showLastStand and !showTodayOnly then S3 else Double.NaN;
bullLastStand.setDefaultColor(Color.GREEN);
plot bearLastStand = if showLastStand and showTodayOnly and Today then R3 else if showLastStand and !showTodayOnly then R3 else Double.NaN;
bearLastStand.setDefaultColor(Color.RED);

input showBubblesLeft = yes;
AddChartBubble(showBubblesLeft and showLastStand and Today and !Today[1], R3, "Bear Last Stand: " + R3, Color.GRAY, yes);
AddChartBubble(showBubblesLeft and showLastStand and Today and !Today[1], S3, "Bull Last Stand: " + S3, Color.GRAY, no);

AddChartBubble(showBubblesLeft and showPrevious and Today and !Today[1], PrevHigh, "Previous High: " + PrevHigh, Color.GRAY, yes);
AddChartBubble(showBubblesLeft and showPrevious and Today and !Today[1], PrevLow, "Previous Low: " + PrevLow, Color.GRAY, no);

plot bull1 = if showBullTargets and showTodayOnly and Today then R5 else if showBullTargets and !showTodayOnly then R5 else Double.NaN;
bull1.setDefaultColor(Color.MAGENTA);
plot bear1 = if showBearTargets  and showTodayOnly and Today then S5 else if showBearTargets and !showTodayOnly then S5 else Double.NaN;
bear1.setDefaultColor(Color.CYAN);
AddChartBubble(showBubblesLeft and showBullTargets and Today and !Today[1], R5, "Bull Target 1: " + R5, Color.GRAY, yes);
AddChartBubble(showBubblesLeft and showBearTargets and Today and !Today[1], S5, "Bear Target 1: " + S5, Color.GRAY, no);
plot bull2 = if showBullTargets  and showTodayOnly and Today then R4 else if showBullTargets and !showTodayOnly then R4 else Double.NaN;
bull2.setDefaultColor(Color.MAGENTA);
plot bear2 = if showBearTargets  and showTodayOnly and Today then S4 else if showBearTargets and !showTodayOnly then S4 else Double.NaN;
bear2.setDefaultColor(Color.CYAN);
AddChartBubble(showBubblesLeft and showBullTargets and Today and !Today[1], R4, "Bull Target 2: " + R4, Color.GRAY, yes);
AddChartBubble(showBubblesLeft and showBearTargets and Today and !Today[1], S4, "Bear Target 2: " + S4, Color.GRAY, no);

input showOpen = yes;
input Open_Time = 0930;
AddVerticalLine(secondsFromTime(Open_Time)[1] < 0 and secondsFromTime(Open_Time) >= 0 and Today and showOpen, concat("Open", ""), Color.Green, curve.POINTS);

input showBubblesRight = No;
input displaceRightBubble = 3;
def showBubbleNow = !IsNaN(close) and IsNaN(close[-1]);
AddChartBubble(showBubblesRight and showLastStand and showBubbleNow[displaceRightBubble], R3, "Bear Last Stand: " + R3, Color.GRAY, yes);
AddChartBubble(showBubblesRight and showLastStand and showBubbleNow[displaceRightBubble], S3, "Bull Last Stand: " + S3, Color.GRAY, no);

AddChartBubble(showBubblesRight and showPrevious and showBubbleNow[displaceRightBubble], PreviousHigh, "Previous High: " + RoundDown(previousHigh,RoundLevel), Color.GRAY, yes);
AddChartBubble(showBubblesRight and showPrevious and showBubbleNow[displaceRightBubble], PreviousLow, "Previous Low: " + PreviousLow, Color.GRAY, no);

AddChartBubble(showBubblesRight and showBullTargets and showBubbleNow[displaceRightBubble], R5, "Bull Target 1: " + R5, Color.GRAY, yes);
AddChartBubble(showBubblesRight and showBearTargets and showBubbleNow[displaceRightBubble], S5, "Bear Target 1: " + S5, Color.GRAY, no);

AddChartBubble(showBubblesRight and showBullTargets and showBubbleNow[displaceRightBubble], R4, "Bull Target 2: " + R4, Color.GRAY, yes);
AddChartBubble(showBubblesRight and showBearTargets and showBubbleNow[displaceRightBubble], S4, "Bear Target 2: " + S4, Color.GRAY, no);

input showWeeklyLabels = yes;
AddChartBubble(showWeeklyLabels and AggregationPeriod == AggregationPeriod.WEEK and Today and !Today[1], (R2 - R1)/2 + R1, "Weekly", Color.WHITE, yes);
AddChartBubble(showWeeklyLabels and AggregationPeriod == AggregationPeriod.WEEK and Today and !Today[1], (S1 - S2)/2 + S2, "Weekly", Color.WHITE, no);

input showSmallCamPoints = no;
plot smallCamResistance = if showSmallCamPoints and Today then smallR1 else Double.NaN;
smallCamResistance.setDefaultColor(Color.LIGHT_RED);
plot smallCamSupport = if showSmallCamPoints and Today then smallS1 else Double.NAN;
smallCamSupport.setDefaultColor(Color.LIGHT_GREEN);
 
I really like what you've put together here. The zones are especially helpful in helping people who are new to pivot trading visualize where to expect significant price action. It reminds me of ripster ema clouds and how they help traders treat ema clouds as zones of support / resistance.

It does not appear the function to plot previous days is working....
 
I really like what you've put together here. The zones are especially helpful in helping people who are new to pivot trading visualize where to expect significant price action. It reminds me of ripster ema clouds and how they help traders treat ema clouds as zones of support / resistance.

It does not appear the function to plot previous days is working....
You need to set showTodayOnly to 'No' and make sure that manualclose is set to '0'. Then you should see the previous days working.
 
Thanks for your work on this, I just started following him on Twitter. This will make it easier to visualize. Maybe we could start some tips on here from people whom may have been following him a long time. I did see a tweet about spacemen key levels and I have no idea what that is
 
Hello, looked briefly at the chart/study this morning. One issue I see is the levels change depending whether you have overnight off or on on TOS. More specifically, the overnight level from the prior day will supersede the day level from the prior day, like yesterday Tues. 9/14. I use overnight highs and overnight lows, as well as the prior day RTH highs and lows and would want to see those levels on the chart, and have the chart plot the zones consistently whether the ETH is on or off on TOS. In that regard until fixed or analyzed, do you only use this when set to ETH (levels are drastically different). Thank you. For reference - tues. 9/14 ETH high 4479.5 (showing on chart) but RTH high was 4477.25. Tues RTH low was lower than the overnight low, so chart is showing 4425.25. That appears inconsistent with the previous high calculation. Unless, it is meant to chart the high and low of the prior 24 hours. Again, I would prefer distinction betw a daily high or low RTH and the overnight high/low levels, especially since there is a greater than 90% likelihood of hitting one or the other session overnight levels during RTH
 
Last edited:
Hello, looked briefly at the chart/study this morning. One issue I see is the levels change depending whether you have overnight off or on on TOS. More specifically, the overnight level from the prior day will supersede the day level from the prior day, like yesterday Tues. 9/14. I use overnight highs and overnight lows, as well as the prior day RTH highs and lows and would want to see those levels on the chart, and have the chart plot the zones consistently whether the ETH is on or off on TOS. In that regard until fixed or analyzed, do you only use this when set to ETH (levels are drastically different). Thank you. For reference - tues. 9/14 ETH high 4479.5 (showing on chart) but RTH high was 4477.25. Tues RTH low was lower than the overnight low, so chart is showing 4425.25. That appears inconsistent with the previous high calculation. Unless, it is meant to chart the high and low of the prior 24 hours. Again, I would prefer distinction betw a daily high or low RTH and the overnight high/low levels, especially since there is a greater than 90% likelihood of hitting one or the other session overnight levels during RTH
The study is intended to use the high and low of the previous 24 hrs. You could experiment with just the RTH but I'm not sure if that would be better. These pivots are meant to be reference areas and I'm sure they could be effective (but different) either way. Possibly you could combine with something like this study: Globex High/Low to pinpoint those areas. Cheers!
 
I am trying to see if we can get imbalance range for past 14days. So this is the logic i am looking for if someone can assist. Look at first hour high and low vs last 14 days first hour high low avg and it produces a label in left corner so we can that. Can someone assist?
 
This gives out DTR but dont know how to make to give imbalnce in similar way:


# Custom ATR Plot by 7of9 for BRT
# edited 3/20/19

declare upper;

input AtrAvgLength = 14;

def ATR = WildersAverage(TrueRange(high(period = aggregationPeriod.DAY), close(period = aggregationPeriod.DAY), low(period = aggregationPeriod.DAY)), AtrAvgLength);

def TodayHigh = Highest(high(period = aggregationPeriod.DAY), 1);
def TodayLow = Lowest(low(period = aggregationPeriod.DAY), 1);

def DTR = TodayHigh - TodayLow;

def DTRpct = Round((DTR / ATR) * 100, 0);

AddLabel (yes, "DTR " + Round (DTR , 2) + " vs ATR " + round (ATR,2)+ " " + round (DTRpct,0) + "%", (if DTRpct <= 70 then Color.GREEN else if DTRpct >= 90 then Color.RED else Color.ORANGE));
 
This gives out DTR but dont know how to make to give imbalnce in similar way:


# Custom ATR Plot by 7of9 for BRT
# edited 3/20/19

declare upper;

input AtrAvgLength = 14;

def ATR = WildersAverage(TrueRange(high(period = aggregationPeriod.DAY), close(period = aggregationPeriod.DAY), low(period = aggregationPeriod.DAY)), AtrAvgLength);

def TodayHigh = Highest(high(period = aggregationPeriod.DAY), 1);
def TodayLow = Lowest(low(period = aggregationPeriod.DAY), 1);

def DTR = TodayHigh - TodayLow;

def DTRpct = Round((DTR / ATR) * 100, 0);

AddLabel (yes, "DTR " + Round (DTR , 2) + " vs ATR " + round (ATR,2)+ " " + round (DTRpct,0) + "%", (if DTRpct <= 70 then Color.GREEN else if DTRpct >= 90 then Color.RED else Color.ORANGE));
@FutureTony Can you asist?
 
is there any scanner for this indicator , for example ..
scan for price close over bull last line time frame ( 15 min ) or close over bullish reversal area .
I tried but every time gave error .
 
I don't believe the scanner will work on studies that use embedded time aggregation but maybe someone on here knows more about that than me. I only use this on Futures, so don't need a scanner.
 
This will scan. @FutureTony can you add quarterly and yearly aggregation to the posty pivots please.

Ruby:
# Posty Reversal Zone scan by bigboss
# SAVE STUDY AS POSTY_REVERSAL_ZONE_SCAN
# THEN CREATE A SCAN with the following:
# Posty_Reversal_Zone_Scan("period" = "DAY")."inside_bull_reversal_zone" is true
# or
# Posty_Reversal_Zone_Scan("period" = "DAY")."inside_bear_reversal_zone" is true
#
# On the Scanner, you can use any aggregation above DAY. Just make sure what's in the scan criteria matches the aggregation period at the top of the scanner.

input period = aggregationperiod.DAY;

def price = close(period = period)[1];
def range = high(period = period)[1] - low(period = period)[1];

def lb = price + range*1.1/2;
def sb = price - range*1.1/2;
def gl = price - range*1.1/4;
def gs = price + range*1.1/4;

plot inside_bear_reversal_zone = if close > gs and close < (lb+gs)/2 then 1 else 0;
plot inside_bull_reversal_zone = if close < gl and close > (sb+gl)/2 then 1 else 0;
 
Is it possible to run a scan where the price is x% away from bull/bear zone?
 
Last edited by a moderator:

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