Can a secondary point of control be added on volume profile?

YungTraderFromMontana

Well-known member
I'm trying to use volume profile in a strategy to look for heavily traded levels and I want to be able to use more then then just the POC. Can a POC2 or POC3 be added at the 2nd and 3rd highest points of volume accumulation? Any help is appreciated. @Welkin you've always been good with volume so I'm @ing you.
 
try playing around with this, for the trigger try High Volume Deviations
if you wanna see something added let me know

edit: also if you want to find different POCs for the day, simply mark the highest volume nodes with a price line. You need to utilize multiple volume profiles otherwise... can only have one poc for each profile...
Code:
#[email protected]
#Volume Profile All-In-One
##########################
#Seconds based for TICK charts
#High Volume Deviations
#Regular Trading Hours
#Extended Trading Hours
#Every X Number of Bars
#Anchored at Date/Time
#Moving Average Crossover
#RSI OverBought/OverSold
#CCI OverBought/OverSold
#v8.30.2020
declare upper;

def NA = Double.NaN;
input VolumeProfileTrigger = {SecondsBasedForTick, VolumeDeviations, default RegularTradingHours, ExtendedTradingHours, EveryXNumberOfBars, AnchorAtDateTime, MovingAverageCross, RSI_OBOS, CCI_OBOS};
input aggregationInSeconds = 300;
input start = 0930;
input end = 1600;
def YYYYMMDD = GetYYYYMMDD();
def RTH = SecondsFromTime(start) >=0 and SecondsFromTime(end) <=0;

def o = open;
def h = high;
def c = close;
def l = low;
def v = volume;
def min = Floor(SecondsFromTime(start) / aggregationInSeconds);
def test = min != min[1];
############################################
#Deviations in Volume
input avgVolLength = 20;
input volAverageType = AverageType.SIMPLE;
def VolAvg = MovingAverage(volAverageType, V, avgVolLength);
#2Sigma and 3Sigma Vol Filter
input Sigma2Deviation = 2.0;
input Sigma3Deviation = 3.0;
def averageType = AverageType.SIMPLE;
def sDev = StDev(data = V, length = avgVolLength);
def VolSigma2 = VolAvg + Sigma2Deviation * sDev;
def VolSigma3 = VolAvg + Sigma3Deviation * sDev;

############################################
#Every X Number of Bars
input everyXNumberBars = 40;
def bn = barNumber();
def cnt = if isnan(cnt[1]) then 1 else if cnt[1] <= everyXNumberBars then cnt[1]+ 1 else 1;
def xcnttest = if cnt[1] == everyXNumberBars then 1 else 0;

############################################
#Anchored Date/Time
input dateAnchor = 20200827;
input timeAnchor = 0930;
def dateTest = if YYYYMMDD == dateAnchor then 1 else 0;
def timeTest = if SecondsTillTime(timeAnchor) ==0 then 1 else 0;

############################################
#Moving Average Crosses
input movAvg1Price = close;
input movAvg2Price = close;
input movAvg1Type = AverageType.SIMPLE;
input movAvg2Type = AverageType.SIMPLE;
input movAvg1Length = 18;
input movAvg2Length = 50;
def movAvg1 = MovingAverage(movAvg1Type, movAvg1Price, movAvg1Length);
def movAvg2 = MovingAverage(movAvg2Type, movAvg2Price, movAvg2Length);
def MAtest = if (movAvg1 crosses below movAvg2) or (movAvg1 crosses above movAvg2) then 1 else 0;

############################################
#RSI
input rsiLength = 14;
input rsiOverBought = 75;
input rsiOverSold = 25;
input rsiPrice = close;
input rsiAvgType = AverageType.WILDERS;
def NetChgAvg = MovingAverage(averageType, rsiPrice - rsiPrice[1], rsiLength);
def TotChgAvg = MovingAverage(averageType, AbsValue(rsiPrice - rsiPrice[1]), rsiLength);
def ChgRatio = if TotChgAvg != 0 then NetChgAvg / TotChgAvg else 0;
def RSI = 50 * (ChgRatio + 1);
def RSIOBtest = RSI >= rsiOverBought;
def RSIOStest = RSI <= rsiOverSold;

############################################
#CCI
input CCIlength = 14;
input cciOverBought = 140;
input cciOverSold = -140;
def cciPrice = c + l + h;
def linDev = lindev(cciPrice, CCIlength);
def CCI = if linDev == 0 then 0 else (cciPrice - Average(cciPrice, CCIlength)) / linDev / 0.015;
def cciOBtest = CCI >= cciOverBought;
def cciOStest = CCI <= cciOverSold;

############################################
#Volume Profile
input onExpansion = no;
input profiles = 1000;
input showPointOfControl = yes;
input showValueArea = no;
input valueAreaPercent = 70;
input opacity = 50;
input height = .25;
def vcond;
switch(VolumeProfileTrigger){
case SecondsBasedForTick:
vcond = if test then 1 else 0;
case VolumeDeviations:
vcond = if v > VolSigma2 or v > VolSigma3 then 1 else 0;
case RegularTradingHours:
vcond = if !RTH and RTH[1] then 1 else if !RTH then 1 else 0;
case ExtendedTradingHours:
vcond = if RTH and !RTH[1] then 1 else if RTH then 1 else 0;
case EveryXNumberOfBars:
vcond = if xcnttest then 1 else 0;
case AnchorAtDateTime:
vcond = if dateTest and timeTest then 1 else 0;
case MovingAverageCross:
vcond = if MAtest then 1 else 0;
case RSI_OBOS:
vcond = if RSIOBtest or RSIOStest then 1 else 0;
case CCI_OBOS:
vcond = if cciOBtest or cciOStest then 1 else 0;
};
profile vol = VolumeProfile("startNewProfile" = vcond, "onExpansion" = onExpansion, "numberOfProfiles" = profiles, "pricePerRow" = height, "value area percent" = valueAreaPercent);
def con = CompoundValue(1, onExpansion, no);
def pc = if IsNaN(vol.GetPointOfControl()) and con then pc[1] else vol.GetPointOfControl();
def hVA = if IsNaN(vol.GetHighestValueArea()) and con then hVA[1] else vol.GetHighestValueArea();
def lVA = if IsNaN(vol.GetLowestValueArea()) and con then lVA[1] else vol.GetLowestValueArea();

def hProfile = if IsNaN(vol.GetHighest()) and con then hProfile[1] else vol.GetHighest();
def lProfile = if IsNaN(vol.GetLowest()) and con then lProfile[1] else vol.GetLowest();
def plotsDomain = IsNaN(c) == onExpansion;

plot POC = if plotsDomain then pc else Double.NaN;
plot ProfileHigh = if plotsDomain then hProfile else Double.NaN;
plot ProfileLow = if plotsDomain then lProfile else Double.NaN;
plot VAHigh = if plotsDomain then hVA else Double.NaN;
plot VALow = if plotsDomain then lVA else Double.NaN;


DefineGlobalColor("Profile", Color.DARK_GRAY);
DefineGlobalColor("Point Of Control", Color.DARK_ORANGE);
DefineGlobalColor("Value Area", Color.GRAY);

vol.Show(GlobalColor("Profile"), if showPointOfControl then GlobalColor("Point Of Control") else Color.CURRENT, if showValueArea then GlobalColor("Value Area") else Color.CURRENT, opacity);
POC.SetDefaultColor(GlobalColor("Point Of Control"));
POC.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
VAHigh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
VALow.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
VAHigh.SetDefaultColor(GlobalColor("Value Area"));
VALow.SetDefaultColor(GlobalColor("Value Area"));
ProfileHigh.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ProfileLow.SetPaintingStrategy(PaintingStrategy.HORIZONTAL);
ProfileHigh.SetDefaultColor(Color.GRAY);
ProfileLow.SetDefaultColor(Color.GRAY);
ProfileHigh.Hide();
ProfileLow.Hide();
 
Last edited:

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

@Welkin The issue is I've been working on 4h charts and tick charts only show the last five days so I can't use this for my main strategy.

What I'm looking for is this. I put arrows next to a line a drew where the second highest POC is. For my strategy I need that to be a variable I can use it.

7OeG7VR.png
 
Last edited by a moderator:
@YungTraderFromMontana It will work for other aggregations not just tick charts, change the trigger in the settings the volumeprofile() function is limited to only one poc... you'll need to utilize multiple profiles for multiple pocs... or continue what you've been doing by marking high volume nodes with price lines. sorry, its a limitation of the function.

yea, in the settings change the trigger to VolumeDeviations,

tnq3HIQ.png


pretty much nailed the node you were pointing at.

also love that indicator name sixninebitchmoney 😂
 
Last edited by a moderator:

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
296 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