| 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)