| Overall Statistics |
|
Total Trades 124 Average Win 0% Average Loss -0.01% Compounding Annual Return -0.697% Drawdown 0.700% Expectancy -1 Net Profit -0.697% Sharpe Ratio -2.435 Probabilistic Sharpe Ratio 0.000% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.006 Beta 0.001 Annual Standard Deviation 0.002 Annual Variance 0 Information Ratio -2.32 Tracking Error 0.113 Treynor Ratio -6.784 Total Fees $124.00 Estimated Strategy Capacity $890000.00 |
# Import packages
import numpy as np
import pandas as pd
import scipy as sc
#class InOut(QCAlgorithm):
#
# def Initialize(self):
#
# self.SetStartDate(2021, 1, 1) #Set Start Date
# self.SetEndDate(2021, 4, 26) #Set End Date
#
#
#
#
# def CoarseSelectionFunction(self, coarse):
# if not self.selection_flag:
# return Universe.Unchanged
#
# selected = sorted([x for x in coarse if x.HasFundamentalData and x.Market == 'usa' and x.Price > 5],
# key=lambda x: x.DollarVolume, reverse=True)
#
# return [x.Symbol for x in selected[:self.course_count]]
class NadionResistanceShield(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 1) # Set Start Date
self.SetEndDate(2020, 1, 1)
self.SetCash(25000) # Set Strategy Cash
self.tickers = [ "TSLA"]
self.symbolDataBySymbol = {}
self.trade = True
self.atr=[]
self.MarketCaps = ["IWM", "MDY", "SPY", "QQQ"]
self.marketDataBySymbol = {}
# Before the open
for ticker_mark in self.MarketCaps:
symbol = self.AddEquity(ticker_mark, Resolution.Daily).Symbol
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
self.marketDataBySymbol[symbol] = symbolMarkData(symbol, sma50, sma200)
for ticker in self.tickers:
symbol = self.AddEquity(ticker, Resolution.Hour).Symbol
'''For the below 3 EMA's, you can convert them to 4H bars using the colidator method'''
sma10 = self.SMA(symbol, 10, Resolution.Daily, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
sma250 = self.SMA(symbol, 250, Resolution.Daily, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema50 = self.EMA(symbol, 50, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
wilr_fast = self.WILR(symbol, 10, Resolution.Daily)
atr = self.ATR(symbol, 14, Resolution.Daily)
self.atr.append(self.ATR(symbol, 7, Resolution.Daily))
'''Consolidator method'''
sma20_4hr = ExponentialMovingAverage(20, MovingAverageType.Simple)#, Resolution.Hour, Field.Close)
sma250_4hr = ExponentialMovingAverage(250, MovingAverageType.Simple)
# create the 4 hour data consolidator
fourHourConsolidator = TradeBarConsolidator(timedelta(hours=4))
self.SubscriptionManager.AddConsolidator(symbol, fourHourConsolidator)
# register the 4 hour consolidated bar data to automatically update the indicator
self.RegisterIndicator(symbol, sma20_4hr, fourHourConsolidator)
self.RegisterIndicator(symbol, sma250_4hr, fourHourConsolidator)
#self.Schedule.On(self.DateRules.EveryDay(self.tickers),
#self.TimeRules.AfterMarketOpen(self.tickers, -5),
# Action(self.beforeTheOpen))
symbolData = SymbolData(symbol, sma10, sma20, sma200, sma7, sma50, sma250, ema20, ema50, rsi, wilr, wilr_fast, atr, sma20_4hr, sma250_4hr)
self.symbolDataBySymbol[symbol] = symbolData
self.spy = self.AddEquity("SPY", Resolution.Daily)
# Before the open
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.AfterMarketOpen("SPY", -5),
Action(self.beforeTheOpen))
#set the following between 1 - 4 hours depending on buy frequency
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.Every(timedelta(hours=1)),
self.buySignals)
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.Every(timedelta(hours=.5)),
self.sellSignals)
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.AfterMarketOpen("SPY"),
self.tradeStart)
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.BeforeMarketClose("SPY"),
self.tradeEnd)
#self.AddRiskManagement(TrailingStopRiskManagementModel(0.04))
self.SetWarmUp(timedelta(days=300))
def beforeTheOpen(self):
return
def tradeStart(self):
self.trade = True
def tradeEnd(self):
self.trade = False
def buySignals(self):
if self.trade == False:
return
# Return if benchmark is below SMA
for symbolmark, symbolmarkData in self.marketDataBySymbol.items():
if (self.Securities[symbolmark].Close <= symbolmarkData.sma200.Current.Value):
return
for symbol, symbolData in self.symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested and (self.Securities[symbol].Close > symbolData.sma200.Current.Value) and (symbolData.sma10.Current.Value > symbolData.sma20.Current.Value):
self.stopMarketTicket = self.StopLimitOrder(symbol, 1, 0.9*symbolData.sma20.Current.Value, symbolData.sma20.Current.Value)
def sellSignals(self):
if self.trade == False:
return
for symbol, symbolData in self.symbolDataBySymbol.items():
if self.Portfolio[symbol].Invested and (self.Securities[symbol].Close < symbolData.sma20.Current.Value):
self.Liquidate(symbol, "Sell Signal")
class symbolMarkData:
def __init__(self, symbol, sma50, sma200):
self.Symbol = symbol
self.sma50 = sma50
self.sma200 = sma200
class SymbolData:
def __init__(self, symbol, sma10, sma20, sma50, sma200, sma250, sma7, ema20, ema50, rsi, wilr, wilr_fast, atr, sma20_4hr, sma250_4hr):
self.Symbol = symbol
self.sma10 = sma10
self.sma20 = sma20
self.sma50 = sma50
self.sma200 = sma200
self.sma250 = sma250
self.sma7 = sma7
self.ema20 = ema20
self.ema50 = ema50
self.rsi = rsi
self.wilr = wilr
self.wilr_fast = wilr_fast
self.atr = atr
#self.emaConsolidate = emaConsolidate
self.sma20_4hr = sma20_4hr
self.sma250_4hr = sma250_4hr