Average Range of Earnings in 52 weeks


New member
Hi, I'm trying to write a code that calculates the average range in earnings of 52 weeks. However, I encounter issues and I can't seem to write it out due to my lack of knowledge in Thinkscript.
I get stuck on finding the range of the previous earnings, I think it has got to do with defining the date of the earnings. Below is the code that's as far as I get.
Kindly appreciate if anyone is able to help out thanks for reading
Cheers :)

def ear= HasEarnings(EarningTime.BEFORE_MARKET)[1];
def countdown = if ear then getyyYYMMDD() - getyYYYMMDD() else double.nan;
def a = if ear then getyyyymmdd() else double.nan;
def hod = if a then high(period = aggregationperiod.day) else double.nan;
def lod = if a then low(period = aggregationperiod.day) else double.nan;
def range = if a then hod-lod else double.nan;
AddLabel(yes, "range" + range, Color.white);


Well-known member
Welcome @Whitepineapple Please go to Universe of ThinkScript located in Tutorials. It is very deep, have a look to find what you need. Please be a little more definitive... the lowest and highest earnings eg 0.53 cents to 0.98 cents over the last 4 earns releases? People with more smarts than I have done it, I believe. The answer would be in the Tutorial.


New member
This the link of the original code that is used as a reference. Twitch the code to get an average range of 4 previous earnings.

# Data1 to be used to back up to prior days close and ImpVolatility if earnings before market

def afterstart = GetTime() > RegularTradingStart(GetYYYYMMDD());

def Data1 = if (HasEarnings() and HasEarnings(type = EarningTime.AFTER_MARKET))
     then 1
     else if (HasEarnings() and HasEarnings(type = EarningTime.BEFORE_MARKET))
     then 2
     else 0;
# Data1 set = 2 if earnings before open, only need to back up 1 day so add 1 to make a new field TheBarNumber

def TheBarNumber = BarNumber() - Data1 + 2;

# Calculate barnumber to get closing price for each earnings period

def Data  = if Data1 != 0 and !IsNaN(HIGH) then TheBarNumber else Data[1];

def data2 = if Data[1]  != Data  and Data1 != 0 then Data[1]  else data2[1];
def data3 = if data2[1] != data2 and Data1 != 0 then data2[1] else data3[1];
def data4 = if data3[1] != data3 and Data1 != 0 then data3[1] else data4[1];
def data5 = if data4[1] != data4 and Data1 != 0 then data4[1] else data5[1];

# Calculate highest price earnings
def h1 = if BarNumber() == HighestAll(Data)  then HIGH else h1[1];
def h2 = if BarNumber() == HighestAll(data2) then HIGH else h2[1];
def h3 = if BarNumber() == HighestAll(data3) then HIGH else h3[1];
def h4 = if BarNumber() == HighestAll(data4) then HIGH else h4[1]; 
def h5 = if BarNumber() == HighestAll(data5) then HIGH else h5[1]; 

# Calculate lowest price earnings
def l1 = if BarNumber() == HighestAll(Data)  then low else l1[1];
def l2 = if BarNumber() == HighestAll(data2) then low else l2[1];
def l3 = if BarNumber() == HighestAll(data3) then low else l3[1];
def l4 = if BarNumber() == HighestAll(data4) then low else l4[1];
def l5 = if BarNumber() == HighestAll(data5) then low else l5[1];

#Calculate Range
def r1 = h1-l1;
def r2 = h2-l2;
def r3 = h3-l3;
def r4 = h4-l4;
def r5 = h5-l5;

#avg range
def avg = (r1 + r2 + r3 + r4 )/4;
def avg2 = (r2+r3+r4+r5)/4;

def if_tdy_ear = if afterstart == 1 and hasearnings(EarningTime.ANY) then avg2 else avg;

addlabel(yes, " Avg E.R " + round(if_tdy_ear,2),color.yellow);
#end code


Well-known member
Hi @Whitepineapple , out of respect for other coders and keeping best practices, please leave the original header in and add your name to the bottom as shown. Thanks, Markos ☺

PS One reason for this is that there is a coder named Paris who lives in Japan and he has over 7000 thinkscripts on his server, all cataloged, so if I'm misssing a piece from a file, and I ask real nice, he'll often look up the original! @BenTen

#Example Using Prior Earnings
#Paris Chat Request 4.22.2015
#zzz           - 04/22/2015 - original coding
#AlphaInvestor - 04/22/2015 - adjusted to account for Pre-Market Earnings
#AlphaInvestor - 04/22/2015 - added % gain and average % gain post-earnings
#AlphaInvestor - 04/24/2015 - after testing, turned off Pre-Market Earnings adjustment - not working correctly
#AlphaInvestor - 04/24/2015 - added % gain and average % gain pre-earnings
#zzz           - 04/25/2015 - changed earningsdisplayed to an input
#zzz           - 04/26/2015 - added condition for "No Earnings" (ex: RUT)
#zzz           - 04/26/2015 - added fix to exclude future earnings
#Dilbert       - 04/27/2015 - Chg'ed the data1/data/data2-9 logic to make before market work
#Dilbert       - 05/03/2015 - Add IV data , Remove earnclose/preEarnClose/lback/lookforward logic because replaced by data1 calculation.  Clean up code, and comments.
#Dilbert       - 05/03/2015 - Change colors of the IV lables because after earnings there is going to always be a colapse.  Color them green if IV goes up before earnings, and red if IV goes down before earnings.  Fix a couple of fields in the IV labels that were pointing at price fields.
#Dilbert  V9.2 - 05/03/2015 - Comments etc'
#Lookback 10 bars is set to find prior close to earnings and lookforward captures the close 5 bars later.
# Whitepineapple - whatever date and any tweaks you've made, if any.
Last edited by a moderator:

Similar threads