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
0
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
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.SetSecurityInitializer(self.SecurityInitializer)
        
        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.atr = {}
       
        self.sd = {}
        
        self.hod = {}
        self.lod = {}
        self.open = {}
        #self.pmhigh = {}
        #self.pmlow = {}
        
        
        for s in self.Securities:
            self.Debug(self.Securities[s])
        
    def SecurityInitializer(self, security):
        security.SetLeverage(4)
    
    def CoarseSelectionFunction(self, universe):  
        selected = []
        for coarse in universe:  
            if coarse.Volume > 70000000 and coarse.Value > 10 and coarse.HasFundamentalData:
                symbol = coarse.Symbol
                #tickers
                selected.append(symbol)
                
                #indicators
                
        
        return selected #list of objects of type Symbol
    
    
    def OnSecuritiesChanged(self, changed):
        for security in changed.AddedSecurities:
            symbol = security.Symbol
            if symbol not in self.sd:
                self.sd[symbol] = SymbolData(self, symbol)
        for security in changed.RemovedSecurities:
            symbol = security.Symbol
            self.sd.pop(symbol, None)
        
    #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)
        
    #     self.Debug(self.Securities)
        
    #     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])
        
class SymbolData:
    def __init__(self, algorithm, symbol):
        #algorithm.VWAP(symbol, 10000, Resolution.Minute)
        self.vwap = algorithm.VWAP(symbol, 10, Resolution.Minute)
        self.ema5 = algorithm.EMA(symbol, 5, Resolution.Minute)
        self.ema9 = algorithm.EMA(symbol, 9, Resolution.Minute)
        
        hist = algorithm.History(symbol, 10, Resolution.Minute).loc[symbol]
        for idx, bar in hist.iterrows():
            tradeBar = TradeBar(idx, symbol, bar.open, bar.high, bar.low, bar.close, bar.volume, timedelta(minutes=1))
            self.ema5.Update(idx, bar.close)
            self.ema9.Update(idx, bar.close)
            self.vwap.Update(tradeBar)