Overall Statistics |
Total Trades 14 Average Win 0% Average Loss 0% Compounding Annual Return 36.219% Drawdown 5.400% Expectancy 0 Net Profit 37.844% Sharpe Ratio 2.707 Probabilistic Sharpe Ratio 95.915% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.197 Beta 0.404 Annual Standard Deviation 0.114 Annual Variance 0.013 Information Ratio 0.239 Tracking Error 0.126 Treynor Ratio 0.767 Total Fees $14.00 |
class UncoupledMultidimensionalAutosequencers(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash tickers = ["SPY", "TLT"] # Dictionary to hold Symbol Data self.symbolData = {} for ticker in tickers: # Add equity data symbol = self.AddEquity(ticker, Resolution.Daily).Symbol # Create symbol data for respective symbol self.symbolData[symbol] = SymbolData(self, symbol) def OnData(self, data): # Make sure indicators and rolling windows are ready if not all([symbol.IsReady for symbol in self.symbolData.values()]): return for symbol, value in self.symbolData.items(): # If the ADX today is higher than ADX yesterday if value.adxWindow[0] > value.adxWindow[1]: self.MarketOrder(symbol, 100) class SymbolData: def __init__(self, algorithm, symbol): self.algorithm = algorithm self.symbol = symbol self.adx = algorithm.ADX(symbol, 14, Resolution.Daily) # Define our indicator self.adxWindow = RollingWindow[IndicatorDataPoint](2) # Define our rolling window to hold indicator points self.adx.Updated += self.OnAdxUpdated # Set our event handler def OnAdxUpdated(self, sender, updated): if self.adx.IsReady: self.adxWindow.Add(updated) # Add updated indicator data to rolling window @property def IsReady(self): return self.adx.IsReady and self.adxWindow.IsReady