Overall Statistics
Total Trades
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Net Profit
0%
Sharpe Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-3.407
Tracking Error
0.093
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
# 1. Weekly volume is larger than previous week volume * 1.3
# 2. Weekly close > previous week close
# 3. Weekly close > open
# 4. Market cap >= 2B
# 5. Weekly volume is larger than or equal to the previous 10 weeks (not including current week) simple average volume
# 6. Weekly close is higher than the previous 14 weeks (not including current week) average true range (ATR)

''' What is the parameter for ATR? '''
''' When you mean weekly, do you mean the: average, sum, or single value? '''
import datetime

class MeasuredGreenManatee(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2021, 6, 15)
        self.SetEndDate(2021, 7, 1)
        self.SetCash(100000) 
        self.AddUniverse(self.Coarse, self.Fine)
        self.finalPassWeeks1 = 10
        self.finalPassWeeks2 = 14+1 #plus one for current week
        self.diff = self.finalPassWeeks2 - self.finalPassWeeks1 - 1
        self.lastDate = datetime.datetime.min

    def OnData(self, data):
        pass
        
    def OnSecuritiesChanged(self, changes):
        for added in changes.AddedSecurities:
            pass
        for removed in changes.RemovedSecurities:
            pass
        
    def Coarse(self, coarse):
        delta = self.Time - self.lastDate
        if delta.days < 7:
            return Universe.Unchanged
        self.lastDate = self.Time
        
        self.Debug(self.Time)
        
        allCoarse =  [x.Symbol for x in coarse if x.Price > 0 and x.Volume > 0 and x.HasFundamentalData] # Will not trade ETFs if HasFundamentalData
        return allCoarse
    
    def Fine(self, fine):
        allFine = [x.Symbol for x in fine if x.MarketCap >= 2e9]
        history = self.History(allFine, 10, Resolution.Daily)
        firstPass = []
        for symbol in allFine:
            if self.FirstPass(symbol, history):
                firstPass.append(symbol)
        self.Debug(f"Length of first pass filter {len(firstPass)}")        
                
        history = self.History(firstPass, 5*self.finalPassWeeks2, Resolution.Daily)
        finalPass = []
        for symbol in firstPass:
            if self.FinalPass(symbol, history):
                finalPass.append(symbol)
            
        tickers = [x.Value for x in finalPass]
        self.Debug(f"Length of final pass filter {len(finalPass)}") 
        self.Debug(tickers)
            
        return finalPass
            
    def FirstPass(self, symbol, history):
        if len(history.loc[symbol].index) < 10: return False
        currentWeeklyVolume = sum(history.loc[symbol].iloc[5:10].volume)
        currentWeeklyClose = (history.loc[symbol].iloc[5:10].close).mean()
        currentOpen = history.loc[symbol].iloc[0].open
        
        previousWeeklyVolume = sum(history.loc[symbol].iloc[0:5].volume)
        previousWeeklyClose = history.loc[symbol].iloc[5].close
            
        if currentWeeklyVolume > previousWeeklyVolume*1.3 and currentWeeklyClose > previousWeeklyClose and currentWeeklyClose > currentOpen:
            return True
            
        return False
        
    def FinalPass(self, symbol, history):
        if len(history.loc[symbol].index) < 5*self.finalPassWeeks2: return False
        currentWeeklyVolume = (history.loc[symbol].iloc[-5:-1].volume).mean()
        previousWeeklyVolume = (history.loc[symbol].iloc[self.diff*5:-5].volume).mean()
        
        if not currentWeeklyVolume >= previousWeeklyVolume:
            return False
        
        currentAtr = AverageTrueRange(5, MovingAverageType.Simple)
        for tuple in history.loc[symbol].iloc[-5:-1].itertuples():
            currentAtr.Update(TradeBar(tuple.Index, symbol, tuple.open, tuple.high, tuple.low, tuple.close, tuple.volume))
            
        previousAtr = AverageTrueRange(self.finalPassWeeks2, MovingAverageType.Simple)
        for tuple in history.loc[symbol].iloc[:-5].itertuples():
            previousAtr.Update(TradeBar(tuple.Index, symbol, tuple.open, tuple.high, tuple.low, tuple.close, tuple.volume))
            
        if currentAtr.Current.Value > previousAtr.Current.Value:
            return True
        
        return False