| Overall Statistics |
|
Total Trades 10 Average Win 0% Average Loss -4.14% Compounding Annual Return -38.774% Drawdown 64.000% Expectancy -1 Net Profit -56.721% Sharpe Ratio -0.865 Probabilistic Sharpe Ratio 0.108% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.143 Beta -1.957 Annual Standard Deviation 0.296 Annual Variance 0.087 Information Ratio -1.119 Tracking Error 0.411 Treynor Ratio 0.131 Total Fees $11.19 Estimated Strategy Capacity $16000000.00 Lowest Capacity Asset QQQ RIWIV7K5Z9LX |
from QuantConnect.Data.Consolidators import CalendarInfo
from AlgorithmImports import *
class UncoupledMultidimensionalAutosequencers(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 5, 28) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.leverage = 1
tickers = ["QQQ"]
# 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)
self.vix = self.AddIndex("VIX", Resolution.Daily).Symbol
self.staticAssets = [self.vix]
class SymbolData:
def __init__(self, algorithm, symbol):
self.algorithm = algorithm
self.symbol = symbol
# Define our consolidator for 15 min bars
fifteenMinuteConsolidator = TradeBarConsolidator(self.Custom)
fifteenMinuteConsolidator.DataConsolidated += self.OnDataConsolidated
algorithm.SubscriptionManager.AddConsolidator(symbol, fifteenMinuteConsolidator)
# Define our indicator
self.adx = AverageDirectionalIndex(10)
self.padxone = IndicatorExtensions.Of(Delay(1), self.adx)
self.padxtwo = IndicatorExtensions.Of(Delay(2), self.adx)
self.padxthree = IndicatorExtensions.Of(Delay(3), self.adx)
self.rsi = RelativeStrengthIndex(28)
self.psar = ParabolicStopAndReverse(0.02, 0.02, 0.2)
# Register indicator to our consolidator
algorithm.RegisterIndicator(symbol, self.adx, fifteenMinuteConsolidator)
algorithm.RegisterIndicator(symbol, self.rsi, fifteenMinuteConsolidator)
algorithm.RegisterIndicator(symbol, self.psar, fifteenMinuteConsolidator)
# Rolling window to hold 15 min bars
self.barWindow = RollingWindow[TradeBar](2)
# Store every 15 minute bar in rolling window
def OnDataConsolidated(self, sender, bar):
self.barWindow.Add(bar)
if self.IsReady:
lastBar = self.barWindow[1]
currentBar = self.barWindow[0]
price = currentBar.Close
currentRsi = self.rsi.Current.Value
psar = self.psar.Current.Value
vix = self.algorithm.Securities["VIX"].Price
previous3adx = self.padxthree.Current.Value
previous2adx = self.padxtwo.Current.Value
previous1adx = self.padxone.Current.Value
currentadx = self.adx.Current.Value
self.algorithm.Debug(str(self.algorithm.Time) + " Symbol Name: " + str(self.algorithm.Portfolio[bar.Symbol])+ " Symbol Quantity: " + str(self.algorithm.Portfolio[bar.Symbol].Quantity))
if self.algorithm.Portfolio[bar.Symbol].Quantity == 0:
if currentRsi < 66 and currentadx > 27 and price > psar and currentadx > previous1adx > previous2adx:
quantity = self.algorithm.CalculateOrderQuantity(currentBar.Symbol, self.algorithm.leverage)
marketTicket = self.algorithm.MarketOrder(currentBar.Symbol, quantity, False, "Long")
self.algorithm.Debug(str(self.algorithm.Time) + " ADX: " + str(currentadx)+ " RSI: " + str(currentRsi)+ " PSAR: " + str(psar)+ " Price: " + str(currentBar.Close))
if currentRsi > 34 and currentadx > 27 and price < psar and currentadx > previous1adx > previous2adx and vix > 20 and vix < 40:
quantity = self.algorithm.CalculateOrderQuantity(currentBar.Symbol, self.algorithm.leverage)
marketTicket = self.algorithm.MarketOrder(currentBar.Symbol, -quantity, False, "Short")
self.algorithm.Debug(str(self.algorithm.Time) + " ADX: " + str(currentadx)+ " RSI: " + str(currentRsi)+ " PSAR: " + str(psar)+ " Price: " + str(currentBar.Close))
if self.algorithm.Portfolio[currentBar.Symbol].Quantity > 0 and self.algorithm.Portfolio.TotalUnrealizedProfit > 0 and price < psar:
self.algorithm.Liquidate(currentBar.Symbol)
if self.algorithm.Portfolio[currentBar.Symbol].Quantity < 0 and self.algorithm.Portfolio.TotalUnrealizedProfit > 0 and price > psar:
self.algorithm.Liquidate(currentBar.Symbol)
# if self.algorithm.Portfolio[currentBar.Symbol].Quantity > 0:
# if currentadx < 20 or currentRsi > 70 or price < psar:
# self.algorithm.Liquidate(bar.Symbol)
# if self.algorithm.Portfolio[currentBar.Symbol].Quantity < 0:
# if currentadx < 20 or currentRsi < 30 or price > psar:
# self.algorithm.Liquidate(currentBar.Symbol)
@property
def IsReady(self):
return self.adx.IsReady and self.barWindow.IsReady and self.padxthree.IsReady and self.psar.IsReady
def Custom(self, dt):
start = dt.replace(minute=int(dt.minute / 15) * 15, second=0, microsecond=0)
return CalendarInfo(start, timedelta(minutes=15))