| Overall Statistics |
|
Total Trades 11 Average Win 0.12% Average Loss 0.00% Compounding Annual Return 52.069% Drawdown 0.100% Expectancy 39.935 Net Profit 0.345% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 57% Win Rate 43% Profit-Loss Ratio 94.52 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 2.244 Tracking Error 0.089 Treynor Ratio 0 Total Fees $12.83 |
class ResistanceTachyonCoreWave(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 11, 18) # Set Start Date
self.SetEndDate(2020, 11, 20) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
# Number of symbols returned by Coarse Universe
self.__numberOfSymbols = 20
# Call coarse and fine universe
self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)
# Initialze list for selected symbols from universe
self.selectedSymbols = []
self.ema_nine_win = RollingWindow[IndicatorDataPoint](2)
self.ema_eighteen_win = RollingWindow[IndicatorDataPoint](2)
self.ema_thirtysix_win = RollingWindow[IndicatorDataPoint](2)
self.five_min_check = False
# When data is received
def OnData(self, data):
# Make a list of the symbols from the universe
symbols = self.selectedSymbols
# Get 36 minutes of history for all symbols
history = self.History(symbols, 36, Resolution.Minute)
# Variable for what percent will be invested in each stock
percent_invested = 1 / len(symbols)
# Loop through for each symbol in our list
for symbol in symbols:
# Get local history
symbolhistory = history.loc[str(symbol)]
# Initialize all current moving averages
symbolEMAnine = self.EMA(symbol, 9, Resolution.Minute)
symbolEMAeighteen = self.EMA(symbol, 18, Resolution.Minute)
symbolEMAthirtysix = self.EMA(symbol, 36, Resolution.Minute)
symbolMINvolume = self.SMA(symbol, 3, Resolution.Minute)
# Initialize high, low, close
symbol_high = symbolhistory.high[35]
symbol_prev_high = symbolhistory.high[34]
symbol_low = symbolhistory.low[35]
symbol_close = symbolhistory.close[35]
# Update Moving Averages
for tuple in symbolhistory.itertuples():
symbolEMAnine.Update(tuple.Index, tuple.close)
symbolEMAeighteen.Update(tuple.Index, tuple.close)
symbolEMAthirtysix.Update(tuple.Index, tuple.close)
symbolMINvolume.Update(tuple.Index, tuple.volume)
# Initialize the EMAs for past values
self.ema_nine = self.EMA(symbol, 9, Resolution.Minute)
self.ema_nine.Updated += self.ema_one
self.ema_eighteen = self.EMA(symbol, 18, Resolution.Minute)
self.ema_eighteen.Updated += self.ema_two
self.ema_thirtysix = self.EMA(symbol, 36, Resolution.Minute)
self.ema_thirtysix.Updated += self.ema_three
# Consolidate to five minute data
#self.Consolidate(symbol, timedelta(minutes=5), self.FiveMinuteBarHandler)
# If the window for the EMAs is ready
if self.ema_nine_win.IsReady:
# Get the slope of each EMA and make sure all are greater
ema_nine_increasing = self.ema_nine_win[0] > self.ema_nine_win[1]
ema_eighteen_increasing = self.ema_eighteen_win[0] > self.ema_eighteen_win[1]
ema_thirtysix_increasing = self.ema_thirtysix_win[0] > self.ema_thirtysix_win[1]
all_emas_increasing = ema_nine_increasing and ema_eighteen_increasing and ema_thirtysix_increasing
# EMA9 > EMA18 * 1.05
nine_prct_greater_eighteen = float(str(symbolEMAnine)) > (float(str(symbolEMAeighteen)) * 1.005)
# If the 3 minute volume > 80000
if float(str(symbolMINvolume)) > 80000:
# EMA9 > EMA18 > EMA36
if float(str(symbolEMAnine)) > float(str(symbolEMAeighteen)) and float(str(symbolEMAeighteen)) > float(str(symbolEMAthirtysix)):
# Current high > Last high
if symbol_high > symbol_prev_high:
# Low > EMA9
if float(symbol_low) > float(str(symbolEMAnine)):
# EMA9 is at least 5% greater than EMA18
if nine_prct_greater_eighteen:
# Checks if the EMAs are increasing
if all_emas_increasing:
# Makes sure on the five minute EMA9 > EMA18 > EMA36
#if self.five_min_check:
# If the symbol has not been invested, invest
#if not self.Portfolio[symbol].Invested:
self.SetHoldings(symbol, percent_invested)
#self.StopMarketOrder(symbol, (percent_invested * -1), (0.995 * symbol_close))
if float(str(symbolEMAnine)) < float(str(symbolEMAeighteen)) or float(str(symbolEMAeighteen)) < float(str(symbolEMAthirtysix)):
#if self.Portfolio[symbol].Invested:
self.Liquidate(symbol)
def CoarseSelectionFunction(self, coarse):
# Sort descending by daily dollar volume
sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
pricefilter = [x for x in sortedByDollarVolume if x.Price > 1 and x.Price < 700 and x.Volume > 1000000]
# Return the symbol objects of the top entries from our sorted collection
return [ x.Symbol for x in pricefilter[:self.__numberOfSymbols] ]
def FineSelectionFunction(self, fine):
# Retrieve 10 days of historical data for each symbol
symbols = [x.Symbol for x in fine]
history = self.History(symbols, 10, Resolution.Daily)
# Iterate through symbols
for symbol in symbols:
# Find hsitory for specific symbol
symbolVolumeHistory = history.loc[str(symbol)]
# Create SMA for symbol and register it with algorithm
symbolSMA = SimpleMovingAverage(10)
# Iterate through historical data
for tuple in symbolVolumeHistory.itertuples():
# Update SMA with data time and volume
symbolSMA.Update(tuple.Index, tuple.volume)
# If the SMA Volume > 3,500,000, add to selected symbols
if float(str(symbolSMA)) > float(3500000):
self.selectedSymbols.append(symbol)
# Return selected symbols
return self.selectedSymbols
# Updates the rolling window for the EMA9
def ema_one(self, sender, updated):
self.ema_nine_win.Add(updated)
# Updates the rolling window for the EMA18
def ema_two(self, sender, updated):
self.ema_eighteen_win.Add(updated)
# Updates the rolling window for the EMA36
def ema_three(self, sender, updated):
self.ema_thirtysix_win.Add(updated)
#def FiveMinuteBarHandler(self, consolidated):
# symbolEMAnine = self.EMA(consolidated.Symbol, 9, Resolution.Minute)
# symbolEMAnine.Update(self.Time, consolidated.Close)
# symbolEMAeighteen = self.EMA(consolidated.Symbol, 18, Resolution.Minute)
# symbolEMAeighteen.Update(self.Time, consolidated.Close)
# if symbolEMAnine > symbolEMAeighteen:
# self.five_min_check = True
# else:
# self.five_min_check = False
#self.Log(f"{consolidated.EndTime} >> FortyFiveMinuteBarHandler >> {symbolEMAnine}")