Overall Statistics
Total Trades
16
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
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$16.50
clr.AddReference('QuantConnect.Research')
from QuantConnect.Research import QuantBook


class TachyonMultidimensionalChamber(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 11, 19)  # Set Start Date
        self.SetEndDate(2020, 11, 19)  # Set Start Date
        self.SetCash(400000)  # Set Strategy Cash
        self.AddUniverse(self.CoarseSelectionFunction)
        self.UniverseSettings.ExtendedMarketHours = True
        self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin)
        self.UniverseSettings.Leverage = 4
        #self.UniverseSettings.Resolution = Resolution.Hour #can comment/change this out
        
        #indicators
        self.vwap = {}
        self.atr = {}
        self.ema5 = {} #on 1 minute chart
        self.ema9 = {}
        self.hod = {}
        self.lod = {}
        self.open = {}
        #self.pmhigh = {}
        #self.pmlow = {}
        
        
        
    def CoarseSelectionFunction(self, universe):  
        selected = []
        for coarse in universe:  
            if coarse.Volume > 70000000 and coarse.Value > 10 and coarse.HasFundamentalData:
                #tickers
                selected.append(coarse.Symbol)
                
                #indicators
                self.vwap[coarse.Symbol] = self.VWAP(self.AddEquity(coarse.Symbol.Value, Resolution.Minute, Market.USA, True, 1, True).Symbol, 100000) 
                self.ema5[coarse.Symbol] = self.EMA(self.AddEquity(coarse.Symbol.Value, Resolution.Minute, Market.USA, True, 1, True).Symbol, 5)
                self.ema9[coarse.Symbol] = self.EMA(self.AddEquity(coarse.Symbol.Value, Resolution.Minute, Market.USA, True, 1, True).Symbol, 9)
        
        return selected #list of objects of type Symbol
    
    
    #is it during market hours or not (e.g. for getting hod and lod)
    def isMarketHours(self):
        if ( (self.Time.hour == 9 and self.Time.minute >= 30) or self.Time.hour >= 10) and (self.Time.hour <= 15):
            return True
        else:
            return False

    
    #sizing
    def positionSize(self, stop, currPrice, dollarSize):
        nShares = int(dollarSize / abs(stop - currPrice))
        return nShares
    
    
    def OnData(self, data):
        '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
            Arguments:
                data: Slice object keyed by symbol containing the stock data
        '''

        #for k in self.vwap:
        #    self.Log(type(k)) #<class 'QuantConnect.Symbol'>


        tradeBars = data.Bars #OHLC of past time interval
        #self.Debug(self.Time)
        
        for d in self.vwap: #can't just get tickers from data?
            if self.isMarketHours():
                
                #this block should not execute in practice since PM data should always be used
                if d not in self.hod:
                    self.hod[d] = -1.0
                    self.lod[d] = 2000000000.0
                    self.open[d] = -1.0
                
                
                #get hod and lod
                if tradeBars[d].High > self.hod[d]:
                    self.hod[d] = tradeBars[d].High
                if tradeBars[d].Low < self.lod[d]:
                    self.lod[d] = tradeBars[d].Low
                if self.open[d] == -1.0:
                    self.open[d] = tradeBars[d].Open
                
                
                ################
                # trade setups #
                ################
                #self.Debug(self.Time)
        
                
                ### above VWAP and short-term trend up, then ORB
                price = float(tradeBars[d].Close)
                vwap = self.vwap[d].Current.Value
                ema = self.ema5[d].Current.Value
                hod = float(self.hod[d])
                lod = float(self.lod[d])
                ema9 = self.ema9[d].Current.Value
                size = 10.0
                
                
                if self.Portfolio[d].Invested == False and self.Portfolio.MarginRemaining > size:
                    if price > vwap and ema > vwap and (price > ((hod + lod)/2) ) and self.Time.hour < 15:
                        #long
 
                        #self.Debug("lod " + str(lod))
                        stop = self.lod[d]
                        shares = self.positionSize(stop, price, size)
                        
                        self.Debug(self.Time)
                        self.Debug("New long")
                        self.Debug("margin remaining: " + str(self.Portfolio.MarginRemaining))
                        self.Debug("nShares: " + str(self.Portfolio[d].Quantity))
                        self.Debug(d)
                        self.Debug("nShares: " + str(shares))
                        self.Debug("currPrice: " + str(price))
                        self.Debug("stop: " + str(lod))
                        self.Debug("buying power used: " + str(shares*price))
                        self.Debug("")
                        
                        self.MarketOrder(d, shares)
                        stop = -1*shares
                        self.StopMarketOrder(d, stop, lod)
                elif self.Portfolio[d].Invested == True:
                    if ema < ema9 and price < ema9 and self.Portfolio[d].UnrealizedProfit > size:
                        self.Liquidate(d)
                
                
                
                if self.Time.hour >= 15:
                    self.Liquidate()
                
            else:
                
                #should only need to do this once...
                self.hod[d] = -1.0
                self.lod[d] = 2000000000
                self.open[d] = -1.0
                
            
        #    self.Debug(d)
        #    self.Debug(self.vwap[d])
        #    self.Debug(self.ema5[d])
        #    self.Debug(self.hod[d])
        #    self.Debug(self.lod[d])