Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-3.117%
Drawdown
5.200%
Expectancy
0
Net Profit
-3.024%
Sharpe Ratio
-0.766
Probabilistic Sharpe Ratio
1.783%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.029
Beta
0.131
Annual Standard Deviation
0.028
Annual Variance
0.001
Information Ratio
-0.708
Tracking Error
0.114
Treynor Ratio
-0.166
Total Fees
$1.00
Estimated Strategy Capacity
$69000000.00
Lowest Capacity Asset
MU R735QTJ8XC9X
class LogicalSkyBlueFox(QCAlgorithm):

    openingBar = None 
    
    def Initialize(self):
        self.SetStartDate(2018, 7, 10)  
        self.SetEndDate(2019, 6, 30)  
        self.SetCash(100000)
        self.AddUniverse(self.CoarseUniverse)
        
        # Dictionary holding consolidator and open bar
        self.data = {}
        
    def CoarseUniverse(self, coarse):
        trimmed = [x for x in coarse if 50 <= x.Price <= 60]
        sortedByDollarVolume = sorted(trimmed, key=lambda x: x.DollarVolume, reverse=True)
        
        # Let's return top 10 daily dollar volume with price between 50 and 60
        return [x.Symbol for x in sortedByDollarVolume[:10]]
        
    def OnData(self, data):
        if self.Portfolio.Invested: return
        
        for symbol, symbolData in self.data.items():
            if data.ContainsKey(symbol):
                if symbolData.openingBar and data[symbol].Close > symbolData.openingBar.High:
                    self.SetHoldings(symbol, 0.1)
        
                elif symbolData.openingBar and data[symbol].Close < symbolData.openingBar.Low:
                    self.SetHoldings(symbol, -0.1)
        
    def OnSecuritiesChanged(self, changes):
        for added in changes.AddedSecurities:
            self.data[added.Symbol] = SymbolData(self, added.Symbol)
            
        for removed in changes.RemovedSecurities:
            if removed.Symbol in self.data:
                self.data[removed.Symbol].Dispose()
                del self.data[removed.Symbol]
            
class SymbolData:
    
    def __init__(self, algo, symbol):
        self.symbol = symbol
        self.algo = algo
        
        self.openingBar = None
        self.consolidator = TradeBarConsolidator(timedelta(minutes=30))
        self.consolidator.DataConsolidated += self.OnDataConsolidated
        algo.SubscriptionManager.AddConsolidator(symbol, self.consolidator)
        
    def OnDataConsolidated(self, sender, bar):
        if bar.Time.hour == 9 and bar.Time.minute == 30:
            self.openingBar = bar
    
    def Dispose(self):
        self.algo.SubscriptionManager.RemoveConsolidator(self.symbol, self.consolidator)