| Overall Statistics |
|
Total Trades 2170 Average Win 0.02% Average Loss -0.01% Compounding Annual Return -0.867% Drawdown 2.000% Expectancy -0.265 Net Profit -1.851% Sharpe Ratio -2.824 Probabilistic Sharpe Ratio 0.000% Loss Rate 79% Win Rate 21% Profit-Loss Ratio 2.48 Alpha -0.007 Beta 0.001 Annual Standard Deviation 0.003 Annual Variance 0 Information Ratio -0.554 Tracking Error 0.227 Treynor Ratio -5.03 Total Fees $4495.99 |
class ResistanceVentralCircuit(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2018, 6, 17) # Set Start Date
self.SetCash(1000000) # Set Strategy Cash
self.symbol = self.AddEquity('SPY', Resolution.Minute).Symbol
self.UniverseSettings.Resolution = Resolution.Minute
self.AddUniverse(self.CoarseFilter)
self.Schedule.On(self.DateRules.EveryDay(self.symbol), self.TimeRules.BeforeMarketClose(self.symbol, 10), self.BeforeClose)
self.num_securities = 50
self.Gaps = {}
self.curr_day = -1
self.days = 0
self.symbols = None
def CoarseFilter(self, coarse):
if self.days % 7 == 0:
sortedByDollarVolume = sorted(coarse, key=lambda c: c.DollarVolume, reverse=True)[:self.num_securities]
self.symbols = [x.Symbol for x in sortedByDollarVolume]
self.days += 1
return self.symbols
def OnData(self, data):
if not self.IsMarketOpen(self.symbol):
return
# get current day open
if self.curr_day != self.Time.day:
for symbol in self.Gaps:
self.Gaps[symbol].StopTrading = False
self.Gaps[symbol].MadeTrade = False
if data.ContainsKey(symbol) and data[symbol] is not None:
self.Gaps[symbol].Open = data[symbol].Close
else:
self.Gaps[symbol].Open = -1
self.curr_day = self.Time.day
for symbol, gap in self.Gaps.items():
if gap.StopTrading:
continue
# if we don't have sufficient data, don't trade
elif gap.Open < 0 or gap.Close < 0:
gap.StopTrading = True
continue
# if gap down doesn't meet our -1% threshold, don't trade
elif gap.Open / gap.Close > .99:
gap.StopTrading = True
continue
# elif not data.ContainsKey(symbol) or data[symbol] is None:
# continue
else:
curr_price = data[symbol].Close
# breakout past yesterday's close
if not gap.MadeTrade and curr_price > gap.Close:
self.SetHoldings(symbol, .02)
#self.MarketOrder(symbol, 1)
gap.MadeTrade = True
elif gap.MadeTrade and (curr_price < gap.Close or curr_price > 1.01 * gap.Close):
self.Liquidate(symbol)
gap.StopTrading = True
def BeforeClose(self):
self.Liquidate()
for symbol in self.Gaps:
if self.CurrentSlice.ContainsKey(symbol) and self.CurrentSlice[symbol] is not None:
self.Gaps[symbol].Close = self.Securities[symbol].Price
else:
self.Gaps[symbol].Close = -1
self.Gaps[symbol].StopTrading = True
def OnSecuritiesChanged(self, changed):
for security in changed.RemovedSecurities:
self.Gaps.pop(security.Symbol)
for security in changed.AddedSecurities:
self.Gaps[security.Symbol] = Gap()
class Gap:
def __init__(self):
self.Close = -1
self.Open = -1
self.MadeTrade = False
self.StopTrading = False