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
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
import pandas as pd 
import numpy as np 


class ModulatedResistanceContainmentField(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2018, 4, 20)  # Set Start Date
        self.SetEndDate(2018,8,28) # Set End Date
        
        self.SetCash(100000)  # Set Strategy Cash
        # self.AddEquity("SPY", Resolution.Minute)
        self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol
        # resolution for the data added to the universe 
        self.UniverseSettings.Resolution = Resolution.Daily
        
        self.AddUniverse(self.CoarseSelectionFunction,self.FineSelectionFunction)

        self.symbols = []
        self.volumeAvg = {}
        self.stateData = {}
        self.stocks_worst =[]
        self.effectiveTradingDays ={}
        self.effectiveTradingDaysTickers = {}
        
        self.MaxCandidates=30
        self.MaxBuyOrdersAtOnce=15
        self.MyLeastPrice=1.15
        self.MyMostPrice=1.49
        self.MyFireSalePrice= self.MyLeastPrice
        self.MyFireSaleAge=3

        self.LowVar = 6 
        self.HighVar = 40
        
        #self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen(self.spy, -45), Action(self.BeforeMarketOpen))

    def CoarseSelectionFunction(self,coarce):
        
        '''The stocks must have fundamental data
        The stock must have positive previous-day close price and volume
        '''
        ### filtered universe is changing every day. A specific symbol may be selected one day and out of universe the next day. So, the SMA indicators will not be ready until the accumulated
        ### effective trading days reach the specifed moving average length.
        filtered = [x for x in coarce if (x.HasFundamentalData) and (x.Volume > 0) and (x.Price >= self.MyLeastPrice) and (x.Price <= self.MyMostPrice)]

        first_filter_symbol = [x.Symbol for x in filtered]
        # self.Debug('first filter %s' % len(first_filter_symbol))
        self.Debug('%s length of coarse fundamental filter: %s' % (self.Time.date(),len(filtered)))
        
        for cf in filtered:
            if cf.Symbol not in self.stateData:
                self.stateData[cf.Symbol] = SelectionData(cf.Symbol)
                self.effectiveTradingDays[cf.Symbol] = 0 ### create a dictionary using filtered symbols as keys and initialize the value of effective trading days as 0

            self.effectiveTradingDays[cf.Symbol] += 1 ### tracks the effective trading days for each symbol
            # Updates the SymbolData object with current EOD price
            avg = self.stateData[cf.Symbol]
            avg.update(cf.EndTime, cf.AdjustedPrice,cf.DollarVolume)
        
        values = list(filter(lambda x: x.is_ready, self.stateData.values()))
        
        symbols = [x.symbol.Value for x in values]
        self.Debug('%s length of values: %s' % (self.Time.date(),len(symbols)))
        self.Debug(symbols)
        ### Changing symbols to tickers
        for k, v in self.effectiveTradingDays.items():
            self.effectiveTradingDaysTickers[k.Value] = v
        self.Debug(self.effectiveTradingDaysTickers) ### Here you can check the effective trading days for all symbols
        #volume_values = [x.mean_volume for x in values]
        #pct_values = [x.percent_difference for x in values]
        #self.Debug(self.Time)
        #self.Debug(len(pct_values))
        #self.Debug(pct_values)
        #if pct_values:
        #    self.Debug(self.Time)
        #   self.Debug('volume')
        #    self.Debug(volume_values)
        #    self.Debug(len(volume_values))
        #    pct_diff = [x.percent_difference for x in values]
        #    self.Debug('pct_diff')
        #    self.Debug(pct_diff)
        #self.Debug(len(values))
        #if len(volume_values) > 0:
        #    vol_small_percentile = np.percentile(volume_values, self.LowVar)
        ##    vol_large_percentile = np.percentile(volume_values, self.HighVar)
        #    self.Debug('small percentile volume is %s' % vol_small_percentile)
        #    self.Debug('large percentile volume is %s' % vol_large_percentile)
        
            # The volume_filter is the list of items in the values object that has volume between the small percentile and large percentile
        #    volume_filter = [x for x in values if (x.self.volumeAvg > vol_small_percentile) and (x.self.volumeAvg < vol_large_percentile)] 
            
            # Sort the volume_filter by the percent_difference variable that is the ratio of (ShortAvg-LongAvg)/LongAvg
        #    stocks_by_perc_diff = sorted(volume_filter, key=lambda x:x.percent_difference)
        
        #    percent_diff = [x.percent_difference for x in stocks_by_perc_diff]
        
            #self.Debug(self.Time)
        
        #    self.Debug('percent_diff %s' % percent_diff)
        
         #   self.Log(self.Time)
        
        #    self.Log(percent_diff)
        
         #   symbols = [x.symbol for x in stocks_by_perc_diff]
        
            #self.Debug('length of symbols %s' % len(symbols))
        
        #    self.stock_worst = symbols[0:30]
        
         #   return [x.Symbol for x in self.stock_worst]
       # perc_diff_sorted = sorted(values, key=lambda x:x.percent_difference)
        
    #    percent_diff = [x.percent_difference for x in perc_diff_sorted]
        
      #  self.Debug(self.Time)
        
     #   self.Debug('percent_diff %s' % percent_diff)
        #symbols = [x.Symbol for x in values]
        
        return [x.Symbol for x in filtered]
    
    def FineSelectionFunction(self,fine):
        
        fine_filter = [x.Symbol for x in fine if x.SecurityReference.IsPrimaryShare == 1 and x.SecurityReference.SecurityType == 'ST00000001' and x.CompanyReference.IsLimitedPartnership == 0 and 
        x.SecurityReference.IsDepositaryReceipt == 0 ]
        
        self.symbols = [x for x in fine_filter]
        
    #    self.Debug('%s length fine fundamental filter %s' % (self.Time.date(),len(self.symbols)))
        
        return self.symbols   
  
        
class SelectionData(object):
    
    def __init__(self, symbol):
        self.symbol = symbol
        self.ShortAvg = SimpleMovingAverage(3)
        self.LongAvg = SimpleMovingAverage(45)
        self.is_ready = False
        self.percent_difference = 0
        self.volume = SimpleMovingAverage(20)
        self.mean_volume = 0
        
    def update(self, time, price,volume):
        ### In "A and B and C" statement, when A is False, B and C will not be executed.
        ### Your strategy wants to update all the three SMA and then check if all of them are ready,
        ### So, the Update() methods should not be in the "and" statement condition.
        self.LongAvg.Update(time,price)
        self.ShortAvg.Update(time,price)
        self.volume.Update(time,volume)
        if self.LongAvg.IsReady and self.ShortAvg.IsReady and self.volume.IsReady:
        # if self.LongAvg.Update(time,price) and self.ShortAvg.Update(time,price) and self.volume.Update(time,volume):
            shortAvg = self.ShortAvg.Current.Value
            longAvg = self.LongAvg.Current.Value
            
            self.mean_volume = self.volume.Current.Value
            
            self.percent_difference = (shortAvg - longAvg) / longAvg       
            self.is_ready = True
            #self.Debug('se actualizaron los indicadores')
            #self.is_ready = True
            #shortAvg = self.ShortAvg.Current.Value
            
            #longAvg = self.LongAvg.Current.Value
            #self.percent_difference = (shortAvg - longAvg) / longAvg