| 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 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 |
# 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):
#class DataConsolidationAlgorithm(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 = [ "SPY"]
self.symbolDataBySymbol = {}
self.trade = True
self.atr=[]
self.MarketCaps = ["IWM", "MDY", "SPY", "QQQ"]
self.spy = ["SPY"]
self.iwm = ["IWM"]
self.mdy = ["MDY"]
self.qqq = ["QQQ"]
# Before the open
for symbol in self.tickers:
self.AddEquity(symbol, Resolution.Hour)
'''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):
for i in range(len(self.tickers)):
self.Log("ATR: {0}".format(self.atr[i].Current.Value))
def tradeStart(self):
self.trade = True
def tradeEnd(self):
self.trade = False
def buySignals(self):
if self.trade == False:
return
for symbol, symbolData in self.symbolDataBySymbol.items():
# if not (self.Securities[symbolmark].Close > symbolmarkData.sma200.Current.Value):
# elif symbol, symbolData in self.symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested and (self.Securities[self.spy].Close > symbolData.sma200.Current.Value) and (self.Securities[symbol].Close > symbolData.sma200.Current.Value) and (symbolData.sma10.Current.Value > symbolData.sma20.Current.Value):
self.stopMarketTicket = self.StopLimitOrder(symbol, self.CalculateOrderQuantity(symbol, 1), 0.9*symbolData.sma20.Current.Value, symbolData.sma20.Current.Value)
# for symbol, symbolData in self.symbolDataBySymbol.items():
# if not self.Portfolio[symbol].Invested and (self.Securities[symbol].Close < symbolData.sma200.Current.Value) and (symbolData.rsi.Current.Value < 30) and (self.Securities[symbol].Close > symbolData.sma7.Current.Value):
# self.SetHoldings(symbol, .1, False, "Buy Signal")
# elif not self.Portfolio[symbol].Invested and (self.Securities[symbol].Close < symbolData.sma200.Current.Value) and (symbolData.rsi.Current.Value < 10):
# self.SetHoldings(symbol, .1, False, "Buy Signal")
# 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.SetHoldings(symbol, 1, False, "Buy Signal")
# self.stopMarketTicket = self.StopLimitOrder(symbol, self.CalculateOrderQuantity(symbol, 1), 0.9*symbolData.sma20.Current.Value, symbolData.sma20.Current.Value)
#elif not self.Portfolio[symbol].Invested and (self.Securities[symbol].Close > symbolData.sma20.Current.Value) and (symbolData.sma7.Current.Value > symbolData.atr.Current.Value):
# self.SetHoldings(symbol, .1, False, "Buy Signal")
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.sma200.Current.Value) and (symbolData.sma20.Current.Value < symbolData.atr.Current.Value):
# self.Liquidate(symbol, "Sell Signal")
if self.Portfolio[symbol].Invested and (self.Securities[symbol].Close < symbolData.sma20.Current.Value):
# self.stopLossTicket = self.StopLimitOrder(symbol, .1, self.Securities[symbol].Close * 0.99)
self.Liquidate(symbol, "Sell Signal")
# elif self.Portfolio[symbol].Invested and (self.Securities[symbol].Close < symbolData.sma20.Current.Value) and (self.Securities[symbol].Close < symbolData.sma7.Current.Value):
# self.stopLossTicket = self.StopMarketOrder(symbol, .1, self.Securities[symbol].Close * 0.985)
# self.Liquidate(symbol, "Sell Signal")
# Update our trailing stop loss as necessary
def OnData(self, slice):
pass
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