HTF PO3 Indicator For ThinkOrSwim

I have modified to support up to 10 candles. You need to manually select which candle you want (eg. 0 is current, 1 is previous and so on). So if you want 10 candles, you want candleType 0 in Candle 'Tenth' and candleType 1 in Candle 'Ninth' and so on. Hopefully this is enough to get you going.

Ruby:
#hint: <b>Intro</b> \n This study displays a higher timeframe candle to the right of the chart in the expansion area. \n <li>Typically used for showing PO3 for daily chart</li> <li>You must have an expansion area of 4 or greater set for this to work</li>
#hint candleType: 0 is current, 1 is previous, 2 is 2 back, etc

# Created by @tony_futures inspired by the ICT Power of 3 concept
declare hide_on_daily;
input htf = AggregationPeriod.DAY;
input useMidnight = no;
input candle = { default "First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth", "Ninth", "Tenth"};
#input candleType = { default "Current", "Previous", "Two Back", "Three Back", "Four Back"};
def candleCount;
input candleType = 0;
def candlePos = candleType;

switch (candle)
{
    case "First":
      candleCount = 1;
    case "Second":
      candleCount = 4;
  case "Third":
      candleCount = 7;
  case "Fourth":
      candleCount = 10;
  case "Fifth":
      candleCount = 13;
  case "Sixth":
      candleCount = 16;
  case "Seventh":
      candleCount = 19;
  case "Eighth":
      candleCount = 22;
  case "Ninth":
      candleCount = 25;
  case "Tenth":
      candleCount = 28;
}

def wickOffset = candleCount;
def midnight = 0000;
def isMidnight = secondsFromTime(midnight) == 0;
def midPrice = if isMidnight then open else midPrice[1];
def xO0 = if useMidnight then midPrice else open(period = htf)[candlePos];
def xH0 = high(period = htf)[candlePos];
def xL0 = low(period = htf)[candlePos];
def xC0 = close(period = htf)[candlePos];


def exp2 = (isNaN(close[wickOffset]) OR isNaN(close[wickOffset+1]) OR isNaN(close[wickOffset+2])) and !isNan(close[wickOffset+3]);
def expMid = isNaN(close[wickOffset+1]) and !isNaN(close[wickOffset+2]);
def expMid2 = isNaN(close[wickOffset+2]) and !isNaN(close[wickOffset+3]);
def expEnd = isNaN(close[wickOffset+3]) and !isNaN(close[wickOffset+4]);
def expFinal = isNaN(close[wickoffset+3]);
def NaN = Double.NaN;

def priceOffset =  if expEnd then (wickOffset + 4) else if expMid then (wickOffset + 2) else if expMid2 then (wickOffset + 3) else (wickOffset + 1);
def XH = getValue(xH0, priceOffset);
def XO = getValue(xO0, priceOffset);
def xC = getValue(xC0, priceOffset);
def xL = getValue(xL0, priceOffset);

def isUp = xo < xc;
def isDn = xo > xc;
def isDoji = xO == xC;

# Global Color setup
DefineGlobalColor("greenCandle", CreateColor(103, 135, 151));
DefineGlobalColor("redCandle", CreateColor(136, 93, 100));
DefineGlobalColor("wick", Color.GRAY);

AddCloud( if exp2 and isUp then xC else NaN, xO, GlobalColor("greenCandle"), GlobalColor("redCandle"));
AddCloud( if exp2 and isDn then xO else NaN, xC, GlobalColor("redCandle"), GlobalColor("redCandle"));

plot dojiWick = if isDoji and exp2 then xO else NaN;
dojiWick.setDefaultColor(GlobalColor("wick"));

def wickHigh = if isUp then xC else xO;
def wickLow = if isDn then xC else xO;
AddChart(if expMid then xH else NaN, if expMid then wickHigh else Double.NaN,  NaN,  NaN, ChartType.BAR, GlobalColor("wick"));
AddChart(if expMid then xL else NaN, if expMid then wickLow else Double.NaN,  NaN,  NaN, ChartType.BAR, GlobalColor("wick"));

input showTimeFrameBubble = no;
def tf = htf/60000;
AddChartBubble(showTimeFrameBubble and expMid,xL,(if tf == 43200 then "M" else if tf == 10080 then "W" else if tf == 1440 then "D" else if tf == 240 then "4h" else if tf == 120 then "2h" else if tf == 60 then "H" else Round(tf,0)+"") + if candlePos != 0 then " -" + CandlePos else "",Color.WHITE,no);

input showBubbles = no;
AddChartBubble(showBubbles and expEnd and isUp, xO, xO, GlobalColor("greenCandle"), no);
AddChartBubble(showBubbles and expEnd and isDn, xO, xO, GlobalColor("redCandle"), yes);
AddChartBubble(showBubbles and expEnd, xL, xL, if isUp then GlobalColor("greenCandle") else GlobalColor("redCandle"), no);
AddChartBubble(showBubbles and expEnd, xH, xH, if isUp then GlobalColor("greenCandle") else GlobalColor("redCandle"), yes);

input showLabels = no;
def candleRange = xH - xL;
AddLabel(showLabels,(if tf == 43200 then "M" else if tf == 10080 then "W" else if tf == 1440 then "D" else if tf == 240 then "4h" else if tf == 120 then "2h" else if tf == 60 then "H" else AsText(tf)) + " Range: " + candleRange, if isUp then GlobalColor("greenCandle") else if isDn then GlobalColor("redCandle") else GlobalColor("wick"));

def xCL = close(period = htf)[candlePOS-1];
def lastCandle = isNaN(xCL);
input showAdditionalLines = no;

plot currentHigh = if showAdditionalLines and lastCandle and !expFinal then xH else NaN;
currentHigh.setPaintingStrategy(PaintingStrategy.DASHES);
currentHigh.setDefaultColor(GlobalColor("wick"));
currentHigh.DefineColor("Normal", GlobalColor("wick"));
currentHigh.DefineColor("Daily", GlobalColor("greenCandle"));
currentHigh.AssignValueColor(if tf == 1440 then currentHigh.Color("Daily") else currentHigh.Color("Normal"));


plot currentLow = if showAdditionalLines and lastCandle and !expFinal then xL else NaN;
currentLow.setPaintingStrategy(PaintingStrategy.DASHES);
currentLow.setDefaultColor(GlobalColor("wick"));
currentLow.DefineColor("Normal", GlobalColor("wick"));
currentLow.DefineColor("Daily", GlobalColor("redCandle"));
currentLow.AssignValueColor(if tf == 1440 then currentLow.Color("Daily") else currentLow.Color("Normal"));
Can this be modified to support up to 20 candles?
 
Hey there @Mytrades1979...

1. Did you expand the time expansion area 7 bars to the right, as shown below?​
2. Please refer to the link below...I've been working with two candles since I implemented the new script...​
Hope this helps...​
Good Luck and Good Trading :cool:
Thanks for sharing your script! I tried to add a third candle but it overlaid with the first HTF candle. What section of the code allows it to be placed after HTF2?
 
For those of you familiar with the ICT Power of 3 concept, this might be an indicator you would like. In a nutshell, PO3 is a concept that identifies Accumulation, Manipulation and Distribution on a smaller timeframe in the context of a higher timeframe candle. If you consider a bullish candle, there is an opening price, a wick below and then a move higher. The idea here is we want to be buyers below the open when we anticipate bullish price action. And obviously vice versa when we anticipate bearish price action.

Okay, on to the indicator. This indicator will display a daily (or other timeframe) candle to the right of your chart as a reference point for you. You must have your chart set with at least 4 bars in the expansion area for this indicator to work. Optional settings include; showing bubbles for the high/low/open of the higher timeframe candle, drawing horizontal dashes for the highs and lows and labels that display OHLC plus current range. There is also an option to show the opening price as the 'midnight open' vs the standard daily open. Again, this is an ICT concept that may or may not be of interest to you. You can adjust the color of the candles in the global settings for the indicator.

Additional inspiration for the display of this indicator comes from This TradingView indicator by @toodegrees.

You could also set this up to show a monthly candle on a daily chart, etc. This chart uses the unsupported AddChart feature for the wicks. As such, there can be some weirdness with the wick placement on different timeframes. For this reason, I've added a 'wick offset' option. Normally this should just be left at 1 but you can try to adjust it up or down(removes wick at zero) to accommodate.

As always, let me know what you think or if you have other ideas. The image below shows a 4hr candle on a 3m chart. I like this both with the 4hr and daily candles. YMMV.

View attachment 18154

Ruby:
#hint: <b>Intro</b> \n This study displays a higher timeframe candle to the right of the chart in the expansion area. \n <li>Typically used for showing PO3 for daily chart</li> <li>You must have an expansion area of 4 or greater set for this to work</li>
#hint useMidnight: <b>Only</b> for Day Aggregation.

# Created by @tony_futures inspired by the ICT Power of 3 concept

input htf = AggregationPeriod.DAY;
input useMidnight = no;
def midnight = 0000;
def isMidnight = secondsFromTime(midnight) == 0;
def midPrice = if isMidnight then open else midPrice[1];
def xO = if useMidnight then midPrice else open(period = htf);
def xH = high(period = htf);
def xL = low(period = htf);
def xC = close(period = htf);

input wickOffset = 1;

def exp2 = (isNaN(close[wickOffset]) OR isNaN(close[wickOffset+1]) OR isNaN(close[wickOffset+2])) and !isNan(close[wickOffset+3]);
def expMid = isNaN(close[wickOffset+1]) and !isNaN(close[wickOffset+2]);
def expEnd = isNaN(close[wickOffset+3]) and !isNaN(close[wickOffset+4]);
def NaN = Double.NaN;

def isUp = xo < xc;
def isDn = xo > xc;
def isDoji = xO == xC;

# Global Color setup
DefineGlobalColor("greenCandle", CreateColor(103, 135, 151));
DefineGlobalColor("redCandle", CreateColor(136, 93, 100));
DefineGlobalColor("wick", Color.GRAY);

AddCloud( if exp2 and isUp then xC else NaN, xO, GlobalColor("greenCandle"), GlobalColor("redCandle"));
AddCloud( if exp2 and isDn then xO else NaN, xC, GlobalColor("redCandle"), GlobalColor("redCandle"));

plot dojiWick = if isDoji and exp2 then xO else NaN;
dojiWick.setDefaultColor(GlobalColor("wick"));

def wickHigh = if isUp then xC else xO;
def wickLow = if isDn then xC else xO;
AddChart(if expMid then xH else NaN, if expMid then wickHigh else Double.NaN,  NaN,  NaN, ChartType.BAR, GlobalColor("wick"));
AddChart(if expMid then xL else NaN, if expMid then wickLow else Double.NaN,  NaN,  NaN, ChartType.BAR, GlobalColor("wick"));

input showTimeFrameBubble = no;
def tf = htf/60000;
AddChartBubble(showTimeFrameBubble and expMid,xL,if tf == 1440 then "D" else if tf == 240 then "4h" else if tf == 120 then "2h" else if tf == 60 then "H" else AsText(tf),Color.WHITE,no);

input showBubbles = yes;
AddChartBubble(showBubbles and expEnd and isUp, xO, xO, GlobalColor("greenCandle"), no);
AddChartBubble(showBubbles and expEnd and isDn, xO, xO, GlobalColor("redCandle"), yes);
AddChartBubble(showBubbles and expEnd, xL, xL, if isUp then GlobalColor("greenCandle") else GlobalColor("redCandle"), no);
AddChartBubble(showBubbles and expEnd, xH, xH, if isUp then GlobalColor("greenCandle") else GlobalColor("redCandle"), yes);

input showLabels = no;
def candleRange = xH - xL;
AddLabel(showLabels,(if tf == 1440 then "D" else if tf == 240 then "4h" else if tf == 120 then "2h" else if tf == 60 then "H" else AsText(tf)) + " Range: " + candleRange, if isUp then GlobalColor("greenCandle") else if isDn then GlobalColor("redCandle") else GlobalColor("wick"));


input length = 14;
input averageType = AverageType.WILDERS;
def ATR = Round(MovingAverage(averageType, TrueRange(xH, xC, xL), length),1);
AddLabel(showLabels,"ATR: " + ATR, GlobalColor("wick"));
AddLabel(showLabels,"Open: " + xO, GlobalColor("wick"));
AddLabel(showLabels,"High: " + xH, GlobalColor("wick"));
AddLabel(showLabels,"Low: " + xL, GlobalColor("wick"));

def xCL = close(period = htf)[-1];
def lastCandle = isNaN(xCL);
input showAdditionalLines = yes;

plot currentHigh = if showAdditionalLines and lastCandle then xH else NaN;
currentHigh.setPaintingStrategy(PaintingStrategy.DASHES);
currentHigh.setDefaultColor(GlobalColor("wick"));
currentHigh.DefineColor("Normal", GlobalColor("wick"));
currentHigh.DefineColor("Daily", GlobalColor("greenCandle"));
currentHigh.AssignValueColor(if tf == 1440 then currentHigh.Color("Daily") else currentHigh.Color("Normal"));


plot currentLow = if showAdditionalLines and lastCandle then xL else NaN;
currentLow.setPaintingStrategy(PaintingStrategy.DASHES);
currentLow.setDefaultColor(GlobalColor("wick"));
currentLow.DefineColor("Normal", GlobalColor("wick"));
currentLow.DefineColor("Daily", GlobalColor("redCandle"));
currentLow.AssignValueColor(if tf == 1440 then currentLow.Color("Daily") else currentLow.Color("Normal"));


Please help. I would like to see the 4H Po3 starts at 10AM(EST) and 2PM(EST). How to change the settings/script? Thanks.
 
Last edited:
I copy code and put it into my ToS. But it is now showing me the larger TF bar, which in my case is the weekly. It does indicate with dashed line the top/bottom of the week but not the bar. Any clue what I'm doing wrong?

1743379300794.png
 

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