Average volume for First bar of the Day

apaul015

New member
I'm trying to create a code where you can input a "X" number of days, and I can get the average Volume of the First bar for those "X" days.
For example, I want to get the average Volume of the first Bar for the last 5 days, beginning with yesterday.

I feel like this should be pretty simple, but I can't seem to get the code right. Any help would be appreciated!
 
Solution
@apaul015
That took a minute.
Had to figure out how to define a moving range.
Averages first bar of day volume for past X number of prior days at the opening bar of every day.
The first X number of days on a chart will be blank as there isn't enough data until the day after X number of days.
ilKCM7K.png

Ruby:
#Averages first bar of day volume for past X number of prior days at the opening bar of every day.
#Svanoy

input Number_Of_Signals_To_Be_Averaged = 5;
input Value_To_Be_Averaged = volume;
input Time_Of_First_Bar_Of_Day = 0930;

def NotToday = GetDay() <> GetLastDay();
def BarToBeAveraged = (secondsFromTime(Time_Of_First_Bar_Of_Day)==0) and NotToday;
def SignalBar = (secondsFromTime(Time_Of_First_Bar_Of_Day)==0);
def...

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

Apologies for reviving a solved thread.
I would like to average the volume of the first 6 bars for an ORB strategy but am having trouble modifying Savnoy's code. Would anyone be willing to take a stab at it while I continue attempting?
 
@Jonessw1
I'm assuming you want to use the total volume for the first 6 bars of the day instead of just the first bars volume.
Ruby:
#Modification request
#Averages total volume for first 6 bars of day of past X number of prior days at the opening bar of every day.
#Svanoy

input Number_Of_Signals_To_Be_Averaged = 5;
input Number_Of_Bars_To_Total_Per_Day = 6;
input Value_To_Be_Averaged = volume;
input Time_Of_First_Bar_Of_Day = 0930;

def NotToday = GetDay() <> GetLastDay();
def BarCounter = if secondsFromTime(Time_Of_First_Bar_Of_Day)==0 then 1
                 else if BarCounter[1] == Number_Of_Bars_To_Total_Per_Day or BarCounter[1] == 0 then 0
                 else BarCounter[1] + 1;
def RangeTotalVolume= if BarCounter == 1 then Value_To_Be_Averaged
                      else if (BarCounter and Barcounter <= Number_Of_Bars_To_Total_Per_Day ) then RangeTotalVolume[1] + Value_To_Be_Averaged
                      else double.nan;
def SignalBar = BarCounter == Number_Of_Bars_To_Total_Per_Day;
def BarToBeAveraged = BarCounter == Number_Of_Bars_To_Total_Per_Day and NotToday;
def TotalSignalCount = if BarToBeAveraged then TotalSignalCount[1] + 1 else TotalSignalCount[1];

def bar = BarNumber();
def BarNum = if !IsNaN(close) and BarNumber()>0 then bar else BarNum[1];
def VBar = HighestAll(BarNum);

def SignalRangeTotal;
if BarNumber() == 0 {
    SignalRangeTotal = 0;
} else if BarToBeAveraged  {
    SignalRangeTotal = SignalRangeTotal[1] + RangeTotalVolume;
} else {
    SignalRangeTotal = SignalRangeTotal[1];
}

def TotalToBeRemoved = fold i = 0 to VBar while ((TotalSignalCount - GetValue(TotalSignalCount,i)) <= Number_Of_Signals_To_Be_Averaged) and TotalSignalCount > Number_Of_Signals_To_Be_Averaged do if BarToBeAveraged then TotalToBeRemoved[1] + GetValue(RangeTotalVolume,i) else TotalToBeRemoved[1];

def RangeAverage = if SignalBar then ((SignalRangeTotal[1]-TotalToBeRemoved[1]) / Number_Of_Signals_To_Be_Averaged) else Double.NaN;

AddChartBubble(SignalBar and TotalSignalCount >= Number_Of_Signals_To_Be_Averaged and NotToday,high,"Total Signals: "+TotalSignalCount,color.white);
AddChartBubble(SignalBar and TotalSignalCount >= Number_Of_Signals_To_Be_Averaged and NotToday,high,"Cumulative Avg: "+SignalRangeTotal,color.light_green);
AddChartBubble(SignalBar and TotalSignalCount >= Number_Of_Signals_To_Be_Averaged ,high,"Average of" + "\n" + "Total Volume for First 6 Bars" + "\n" + "of Last "+Number_Of_Signals_To_Be_Averaged+" Days. Starting Yesterday: "+rangeaverage,color.light_red);
 
Exactly! Thank you for this.

Code:
def BarCounter = if secondsFromTime(Time_Of_First_Bar_Of_Day)==0 then 1
                 else if BarCounter[1] == Number_Of_Bars_To_Total_Per_Day or BarCounter[1] == 0 then 0
                 else BarCounter[1] + 1;
def RangeTotalVolume= if BarCounter == 1 then Value_To_Be_Averaged
                      else if (BarCounter and Barcounter <= Number_Of_Bars_To_Total_Per_Day ) then RangeTotalVolume[1] + Value_To_Be_Averaged
                      else double.nan;

I will now try to make some useful plots.
 
@apaul015 - I am new to trading, can you explain what you are trying to capture using this code @Svanoy wrote ? trying to learn
@rcheltap

For this, I was mainly trying to explore different ways of calculating relative volume. The idea behind it is that stocks with high relative volume tend to give me the moves I'm looking for intraday, and the first 15 minutes of the day is when the most volume is typically done. If the volume during this period is significantly higher than what was normal, then there may be an opportunity for a trade depending on how the price action looks. Not using this as a signal to get long or short, but as a check in favor for my overall thesis on the stock.
 
@Jonessw1
I'm assuming you want to use the total volume for the first 6 bars of the day instead of just the first bars volume.
Ruby:
#Modification request
#Averages total volume for first 6 bars of day of past X number of prior days at the opening bar of every day.
#Svanoy

input Number_Of_Signals_To_Be_Averaged = 5;
input Number_Of_Bars_To_Total_Per_Day = 6;
input Value_To_Be_Averaged = volume;
input Time_Of_First_Bar_Of_Day = 0930;

def NotToday = GetDay() <> GetLastDay();
def BarCounter = if secondsFromTime(Time_Of_First_Bar_Of_Day)==0 then 1
                 else if BarCounter[1] == Number_Of_Bars_To_Total_Per_Day or BarCounter[1] == 0 then 0
                 else BarCounter[1] + 1;
def RangeTotalVolume= if BarCounter == 1 then Value_To_Be_Averaged
                      else if (BarCounter and Barcounter <= Number_Of_Bars_To_Total_Per_Day ) then RangeTotalVolume[1] + Value_To_Be_Averaged
                      else double.nan;
def SignalBar = BarCounter == Number_Of_Bars_To_Total_Per_Day;
def BarToBeAveraged = BarCounter == Number_Of_Bars_To_Total_Per_Day and NotToday;
def TotalSignalCount = if BarToBeAveraged then TotalSignalCount[1] + 1 else TotalSignalCount[1];

def bar = BarNumber();
def BarNum = if !IsNaN(close) and BarNumber()>0 then bar else BarNum[1];
def VBar = HighestAll(BarNum);

def SignalRangeTotal;
if BarNumber() == 0 {
    SignalRangeTotal = 0;
} else if BarToBeAveraged  {
    SignalRangeTotal = SignalRangeTotal[1] + RangeTotalVolume;
} else {
    SignalRangeTotal = SignalRangeTotal[1];
}

def TotalToBeRemoved = fold i = 0 to VBar while ((TotalSignalCount - GetValue(TotalSignalCount,i)) <= Number_Of_Signals_To_Be_Averaged) and TotalSignalCount > Number_Of_Signals_To_Be_Averaged do if BarToBeAveraged then TotalToBeRemoved[1] + GetValue(RangeTotalVolume,i) else TotalToBeRemoved[1];

def RangeAverage = if SignalBar then ((SignalRangeTotal[1]-TotalToBeRemoved[1]) / Number_Of_Signals_To_Be_Averaged) else Double.NaN;

AddChartBubble(SignalBar and TotalSignalCount >= Number_Of_Signals_To_Be_Averaged and NotToday,high,"Total Signals: "+TotalSignalCount,color.white);
AddChartBubble(SignalBar and TotalSignalCount >= Number_Of_Signals_To_Be_Averaged and NotToday,high,"Cumulative Avg: "+SignalRangeTotal,color.light_green);
AddChartBubble(SignalBar and TotalSignalCount >= Number_Of_Signals_To_Be_Averaged ,high,"Average of" + "\n" + "Total Volume for First 6 Bars" + "\n" + "of Last "+Number_Of_Signals_To_Be_Averaged+" Days. Starting Yesterday: "+rangeaverage,color.light_red);
Hi @Svanoy Great code! I'm wondering what syntax would need to be changed in order to convert this to an intraday study? So instead of calculating against the first 6 bars of x days prior, just focus on the first 6 bars (1m agg) of the day and then base the rvol calculation off that throughout the session. Subsequently, Rvol thresholds could be defined against the avg vol of those first 6 bars combined.

Thanks!

H
 

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

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