| Overall Statistics |
|
Total Trades 298 Average Win 0.28% Average Loss -0.30% Compounding Annual Return -0.139% Drawdown 5.200% Expectancy -0.001 Net Profit -0.138% Sharpe Ratio 0.005 Probabilistic Sharpe Ratio 11.668% Loss Rate 48% Win Rate 52% Profit-Loss Ratio 0.93 Alpha 0.008 Beta 0.073 Annual Standard Deviation 0.05 Annual Variance 0.002 Information Ratio 0.583 Tracking Error 0.193 Treynor Ratio 0.004 Total Fees $298.00 Estimated Strategy Capacity $2300000.00 Lowest Capacity Asset NUE R735QTJ8XC9X |
#region imports
from AlgorithmImports import *
#endregion
class NadionResistanceShield(QCAlgorithm):
#class DataConsolidationAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2022, 1, 1) # Set Start Date
self.SetEndDate(2023, 1, 1)
self.SetCash(50000) # Set Strategy Cash
self.tickers = ["NUE", "MSFT", "AMZN", "GOOG", "NVDA"]
self.symbolDataBySymbol = {}
self.trade = True
# Before the open
for symbol in self.tickers:
self.AddEquity(symbol, Resolution.Minute)
self.Debug(f"Registering {symbol}")
'''For the below 3 EMA's, you can convert them to 4H bars using the colidator method'''
macd = self.MACD(symbol, 12, 26, 9, MovingAverageType.Exponential, Resolution.Daily, Field.Close)
ema10 = self.EMA(symbol, 10, Resolution.Hour, Field.Close)
sma200 = self.SMA(symbol, 200, Resolution.Daily, Field.Close)
sma20 = self.SMA(symbol, 20, Resolution.Daily, Field.Close)
sma50 = self.SMA(symbol, 50, Resolution.Daily, Field.Close)
sma7 = self.SMA(symbol, 7, Resolution.Hour, Field.Close)
#sma7 = self.SMA(symbol, 7, Resolution.Minute, Field.Close)
ema20 = self.EMA(symbol, 20, Resolution.Hour, Field.Close)
ema7 = self.EMA(symbol, 7, Resolution.Hour, Field.Close)
#ema7 = self.EMA(symbol, 7, Resolution.Minute, Field.Close)
ema9 = self.EMA(symbol, 9, Resolution.Hour, Field.Close)
rsi = self.RSI(symbol, 14, Resolution.Daily)
wilr_up = self.WILR(symbol, 10, Resolution.Daily)
wilr = self.WILR(symbol, 14, Resolution.Daily)
'''Consolidator method'''
smaConsolidate = ExponentialMovingAverage(20, 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, smaConsolidate, fourHourConsolidator)
#self.Schedule.On(self.DateRules.EveryDay(self.tickers),
#self.TimeRules.AfterMarketOpen(self.tickers, -5),
# Action(self.beforeTheOpen))
symbolData = SymbolData(symbol, ema10, sma200, sma20, sma50, sma7, ema20, ema7, ema9, rsi, wilr, smaConsolidate)
self.symbolDataBySymbol[symbol] = symbolData
self.spy = self.AddEquity("SPY", Resolution.Daily)
# Before the open
#self.Schedule.On(self.DateRules.EveryDay(self.tickers),
# self.TimeRules.AfterMarketOpen(self.tickers, -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(minutes=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.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(10, 0), self.Trade)
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(12, 0), self.Exit)
#self.AddRiskManagement(TrailingStopRiskManagementModel(0.03))
self.SetWarmUp(timedelta(days=50))
def tradeStart(self):
self.trade = True
def tradeEnd(self):
self.trade = False
def Trade(self):
if self.trade == False:
return
for symbol in self.tickers:
# Get the daily data for the symbol
history = self.History([symbol], 1, Resolution.Daily)
if not history.empty:
daily_data = history.loc[symbol]
# Get the open and close prices for the previous day
previous_open = daily_data["open"].iloc[0]
previous_close = daily_data["close"].iloc[0]
# Get the current price
current_price = self.Securities[symbol].Price
# Calculate the price gap and percentage change
price_gap = current_price - previous_close
percentage_change = price_gap / previous_close
# Check if the price has gapped up by more than 1%
if percentage_change > 0.02:
self.Log("{} gap up detected: {}%".format(symbol, percentage_change * 100))
# Enter a long position
self.SetHoldings(symbol, .25)
def buySignals(self):
if self.trade == False:
return
for symbol, symbolData in self.symbolDataBySymbol.items():
if not self.Portfolio[symbol].Invested and (self.Securities[symbol].Close > symbolData.ema7.Current.Value) and (symbolData.ema7.Current.Value > symbolData.atr.Current.Value) and (symbolData.sma20.Current.Value > symbolData.sma50.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.wilr.Current.Value < -95):
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.sma7.Current.Value):
self.Liquidate(symbol, "Sell Signal")
def Exit(self):
for symbol in self.tickers:
# Exit the position
self.Liquidate(symbol)
def OnData(self, slice):
pass
class SymbolData:
def __init__(self, symbol, ema10, sma200, sma20, sma50, sma7, ema20, ema7, ema9, rsi, wilr, smaConsolidate):
self.Symbol = symbol
self.ema10 = ema10
self.sma200 = sma200
self.sma20 = sma20
self.sma50 = sma50
self.sma7 = sma7
self.ema20 = ema20
self.ema7 = ema7
self.ema9 = ema9
self.rsi = rsi
self.wilr = wilr
#self.emaConsolidate = emaConsolidate
self.smaConsolidate = smaConsolidate