| 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 Lowest Capacity Asset |
from AlgorithmImports import *
import QuantConnect.Securities.Option as option
import QuantConnect.Data.Custom as iqfeed
from QuantConnect.DataSource import *
class OptionTradingAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 1)
self.SetEndDate(2020, 12, 31)
self.SetCash(100000)
self.AddSecurity("SPY")
# Set up the 13 and 48 EMA indicators
self.ema13 = self.EMA("SPY", 13)
self.ema48 = self.EMA("SPY", 48)
# Set up the RSI indicator
self.rsi = self.RSI("SPY", 14)
# Set up a trailing stoploss of 10%
#self.SetTrailingStop(0.1)
self.stopLoss = 0.1
# Enable option trading
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage)
#self.SetOptionChainProvider(QuantConnect.Interfaces.IOptionChainProvider)
# Subscribe to the SPY option chain
self.AddOption("SPY")
self.option_chain = None
#option.SetFilter(-2, +2, 0, 180)
class MySecurityInitializer(SecurityInitializer):
def Initialize(self, security):
security.SetLeverage(1000)
self.SetSecurityInitializer(SecurityInitializer())
def OnData(self, data):
if not self.IsWarmingUp:
if not self.ema13.IsReady:
return
if not self.ema48.IsReady:
return
if not self.RSI.IsReady:
return
# Update the option chain data
if self.option_chain is None or not self.option_chain.IsValid:
self.option_chain = self.OptionChainProvider.GetOptionContractList(self.Time, "SPY")
# Filter the option chain by strike price and expiration date
filtered_chain = self.option_chain.Filter((lambda c: c.Right == option.OptionRight.Call)
and (lambda c: c.Expiry > self.Time)
and (lambda c: c.StrikePrice > 200))
# Check if the 13 EMA has crossed above the 48 EMA
if self.ema13.Current.Value > self.ema48.Current.Value:
# Check if the RSI is above 54
if self.rsi.Current.Value > 54:
# Calculate the number of option contracts to buy
# using 10% of holdings
num_contracts = int(self.Portfolio.TotalHoldingsValue * 0.1 / filtered_chain.UnderlyingLastPrice)
# Buy call options with the nearest expiration date
self.Buy(option.OptionSymbol.Create(filtered_chain.UnderlyingSymbol, filtered_chain.Expiry, filtered_chain.StrikePrice, option.OptionRight.Call), num_contracts)
# Filter the option chain by strike price and expiration date
filtered_chain = self.option_chain.Filter((lambda c: c.Right == option.OptionRight.Put)
and (lambda c: c.Expiry > self.Time)
and (lambda c: c.StrikePrice < 200))
# Check if the 13 EMA has crossed under the 48 EMA
if self.ema13.Current.Value < self.ema48.Current.Value:
# Check if the RSI is below 46
if self.rsi.Current.Value < 46:
# Calculate the number of option contracts to buy
# using 10% of holdings
num_contracts = int(self.Portfolio.TotalHoldingsValue * 0.1 / filtered_chain.UnderlyingLastPrice)
# Buy put options with the nearest expiration date
self.Buy(option.OptionSymbol.Create(filtered_chain.UnderlyingSymbol, filtered_chain.Expiry, filtered_chain.StrikePrice, option.OptionRight.Put), num_contracts)