hi there im testing out a simple strategy with options

i have option data from ibkr (is it possible to use ibkr data for backtest? is it possible to use ibkr paper trade mode to connect QC in live mode?)

i want to backtest it but i get 

Backtest Handled Error: No data loaded for SPY because there were no tradeable dates for this security.

from clr import AddReference
from datetime import timedelta
AddReference("System")
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Common")
from System import *
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Indicators import *

class FibonacciStraddleAlgorithm(QCAlgorithm):
   def Initialize(self):
       self.SetStartDate(2023, 1, 1)
       self.SetEndDate(2023, 7, 13)
       self.SetCash(100000)
       
       self.equity = self.AddEquity("SPY", Resolution.Daily)
       self.symbol = self.equity.Symbol
       self.option = self.AddOption("SPY", Resolution.Minute)
       self.option.SetFilter(-2, 2, timedelta(0), timedelta(days=30))
       
       self.sd = SymbolData(self, self.symbol)
       self.option_chain = None
       self.Schedule.On(self.DateRules.EveryDay(self.symbol), 
                        self.TimeRules.AfterMarketOpen(self.symbol, 1), 
                        Action(self.PlaceStraddle))
   def OnData(self, slice):
       for kvp in slice.OptionChains:
           if kvp.Key != self.option.Symbol: continue
           self.option_chain = kvp.Value
   def PlaceStraddle(self):
       if self.Time.date() > self.EndDate.date() or self.option_chain is None:
           return
       contracts = [i for i in self.option_chain if i.Right != OptionRight.Call]
       curr_price = self.Securities[self.symbol].Price
       # Find the closest fib level above and below the current price
       fib_levels = [self.sd.fib_38_2, self.sd.fib_50_0, self.sd.fib_61_8]
       
       # Find the closest fib level to the current price
       closest_fib = min(fib_levels, key=lambda x: abs(x - curr_price))
       # Find the closest strike to the fib level
       contracts = sorted(contracts, key=lambda x: abs(x.Strike - closest_fib))
       # Split contracts into puts and calls
       call_contracts = [contract for contract in contracts if contract.Right == OptionRight.Call]
       put_contracts = [contract for contract in contracts if contract.Right == OptionRight.Put]
       if call_contracts and put_contracts and len(call_contracts) > 0 and len(put_contracts) > 0:
           self.MarketOrder(call_contracts[0].Symbol, 1)
           self.MarketOrder(put_contracts[0].Symbol, 1)
   def OnOrderEvent(self, orderEvent):
       self.Debug(str(orderEvent))

class SymbolData:
   def __init__(self, algorithm, symbol):
       self.algorithm = algorithm
       self.symbol = symbol
       
       self.max = algorithm.MAX(symbol, 180, Resolution.Daily)
       self.min = algorithm.MIN(symbol, 180, Resolution.Daily)
       
       self.fib_50_0 = 0
       self.fib_61_8 = 0
       self.fib_38_2 = 0
       
       self.min.Updated += self.OnMin
       
   def OnMin(self, sender, updated):
       height = self.max.Current.Value - self.min.Current.Value
       self.fib_50_0 = self.min.Current.Value + (height * 0.500)
       self.fib_61_8 = self.min.Current.Value + (height * 0.618)
       self.fib_38_2 = self.min.Current.Value + (height * 0.382)