| 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 3.379 Tracking Error 0.28 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
#region imports
from AlgorithmImports import *
#endregion
from QuantConnect.Data.Consolidators import CalendarInfo
class UncoupledMultidimensionalAutosequencers(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 1) # Set Start Date
self.SetEndDate(2019, 1, 3) # Set End 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.Minute).Symbol
# Create symbol data for respective symbol
self.symbolData[symbol] = SymbolData(self, symbol)
class SymbolData:
def __init__(self, algorithm, symbol):
self.algorithm = algorithm
self.symbol = symbol
# Define our consolidator for 30 min bars
hourlyConsolidator = TradeBarConsolidator(self.Custom)
hourlyConsolidator.DataConsolidated += self.OnDataConsolidated
algorithm.SubscriptionManager.AddConsolidator(symbol, hourlyConsolidator)
# Define our indicator
self.sma = SimpleMovingAverage(14)
# Register indicator to our consolidator
algorithm.RegisterIndicator(symbol, self.sma, hourlyConsolidator)
# Rolling window to hold 30 min bars
self.barWindow = RollingWindow[TradeBar](2)
# Store every thirty minute bar in rolling window
def OnDataConsolidated(self, sender, bar):
self.barWindow.Add(bar)
self.algorithm.Debug("Handler@" + str(bar.Time)[11:] + " SMA:" + str(self.sma) )
if self.IsReady:
lastBar = self.barWindow[1]
currentBar = self.barWindow[0]
sma = self.sma.Current.Value
# Buy if there is a long cross over
if lastBar.Close < sma and currentBar.Close > sma:
self.algorithm.SetHoldings(self.symbol, 0.5)
elif lastBar.Close > sma and currentBar.Close < sma:
self.algorithm.SetHoldings(self.symbol, -0.5)
@property
def IsReady(self):
return self.sma.IsReady and self.barWindow.IsReady
def Custom(self, dt):
# self.algorithm.Debug("dt:" + str(dt)[11:])
period = timedelta(hours=1)
start = dt.replace(minute=30)
if start > dt:
start -= period
return CalendarInfo(start, period)