| Overall Statistics |
|
Total Trades 3 Average Win 0.12% Average Loss 0% Compounding Annual Return -0.029% Drawdown 0.100% Expectancy 0 Net Profit -0.002% Sharpe Ratio -0.04 Probabilistic Sharpe Ratio 37.160% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0 Beta 0.006 Annual Standard Deviation 0.006 Annual Variance 0 Information Ratio -0.016 Tracking Error 0.108 Treynor Ratio -0.04 Total Fees $7.50 |
class SupportAndResistance(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 1)
self.SetEndDate(2020,1,31)
self.SetCash(100000)
self.SetWarmUp(timedelta(7)) # Warm up 7 days of data.
self.UnderlyingTicker = 'SPY'
self.openingBar = None
equity = self.AddEquity(self.UnderlyingTicker, Resolution.Minute)
equity.SetDataNormalizationMode(DataNormalizationMode.Raw)
option = self.AddOption(self.UnderlyingTicker)
self.Consolidate(self.UnderlyingTicker, timedelta(1), self.OnDataConsolidated)
self.option_symbol = option.Symbol
# set our strike/expiry filter for this option chain
option.SetFilter(lambda u: u.IncludeWeeklys().Strikes(0, 10).Expiration(timedelta(0), timedelta(7)))
# use the underlying equity as the benchmark
self.SetBenchmark(equity.Symbol)
def OnData(self, slice):
if self.openingBar == None: return
if not self.Portfolio.Invested:
if not slice.ContainsKey(self.UnderlyingTicker):
self.Debug(f"NO {self.UnderlyingTicker} data on {self.Time}")
return
chain = slice.OptionChains.GetValue(self.option_symbol)
if chain is None:
return
contracts_put = sorted(sorted(sorted(chain, \
key = lambda x: abs(chain.Underlying.Price - x.Strike)), \
key = lambda x: x.Expiry, reverse=False), \
key = lambda x: x.Right, reverse=True)
contracts_call = sorted(sorted(sorted(chain, \
key = lambda x: abs(chain.Underlying.Price - x.Strike)), \
key = lambda x: x.Expiry, reverse=False), \
key = lambda x: x.Right, reverse=False)
if len(contracts_put) == 0: return
self.symbol_put = contracts_put[0].Symbol
if len(contracts_call) == 0: return
self.symbol_call = contracts_call[0].Symbol
if slice[self.UnderlyingTicker].Close >= (self.openingBar.High - .10):
self.MarketOrder(self.symbol_put, 10)
if self.Portfolio.Invested:
option_invested = [x.Key.Value for x in self.Portfolio if x.Value.Invested and x.Value.Type==SecurityType.Option]
# Print to log
for contract in option_invested:
self.c = contract
quantity = self.Portfolio[contract].Quantity
lastPrice = self.Securities[contract].Price
if self.Securities[contract].BidPrice > (self.Securities[contract].Holdings.AveragePrice + .10):
self.Debug('Here')
self.Liquidate(contract)
self.openingBar = None
if self.Securities[contract].Holdings.AveragePrice < self.Securities[contract].BidPrice - .20:
self.Debug('Here')
self.Liquidate(contract)
self.openingBar = None
def OnOrderEvent(self, orderEvent):
self.Log(str(orderEvent))
def OnDataConsolidated(self, bar):
self.openingBar = bar