Good afternoon,

I am working on an algorithm that involves options trading from a coarse and fine selected universe and keep running into this error:

Runtime Error: symbol must not contain the characters '|' or ' '. (Parameter 'symbol') in SecurityIdentifier.cs:line 327

When i add symbols manually in initialize and run the algorithm I don't receive the error, but when I try and trade symbols added in the universe selection model the error keeps popping up. Any help would be appreciated, I cannot attach backtest because it did not finished but I will paste code here. 

#region imports


from AlgorithmImports import *
#endregion
import datetime #import timedelta, time
from datetime import datetime
import math
import time as t
from AlgorithmImports import *
from QuantConnect.Data.UniverseSelection import * 
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel

holidays = [2021-11-26, 2022-11-25, 2023-11-25, 2023-7-3]
selected = []

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
Symbol Data

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
class SymbolData(object):
    
    def __init__(self, algorithm, symbol, criteriaDict):
        
        self.symbol = symbol
        self.symbolValue = symbol.Value

        self.algorithm = algorithm
        self.criteriaDict = criteriaDict
        
        self.highestTrailStopPrice = -1
        self.tradeLock = False
        self.current = None
        self.smaDictionary = {}
        self.selectedSymbols = {}
        self.avg = {}
        self.BuyIn = {}
        
    
 

class ErrorSubmission_TrailStop(QCAlgorithm):
     
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    Iniitalization
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""    
    def Initialize(self):
        
        #-- Date Range
        self.SetStartDate(2021, 1, 1) # Set Start Date
        self.SetEndDate(2021, 2, 1) # Set End Date
        #-- Starting Equity
        self.SetCash(10000)  # Set Strategy Cash # check if will be replaced
        self.UniverseSettings.Resolution = Resolution.Minute
        self.AddUniverse(self.CoarseFilterSelection, self.FineFilterSelection)
        self.SetSecurityInitializer(lambda x: x.SetMarketPrice(self.GetLastKnownPrice(x)))
 

        self.criteriaDict = {
        }
        self.averages = {}
        self.smavolume = {}
        self.purchased_options = []
        
        self.symbolDict = {} 
        self.symbolWithPositionDict = {} 
       
        
        self.lock = {}
        self.SetWarmUp(200, Resolution.Minute)
        self.sm = {}
        self.smavol = {}
        self.BuyIn = {}
       
        
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    OnData
    
    """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""    
    def OnSecuritiesChanged(self, changes):
      
        for security in changes.RemovedSecurities:
            if ((security.Symbol in self.symbolDict) and (security.Symbol not in self.symbolWithPositionDict) and (security.Symbol not in selected) and (security.Symbol not in self.purchased_options)):
               
                symbolData = self.symbolDict[security.Symbol]
               
                del self.symbolDict[security.Symbol] 
                
        for security in changes.AddedSecurities:
            if security.Symbol not in self.symbolDict:
                
                equity = self.AddEquity(security.Symbol.Value, Resolution.Minute, Market.USA)
                self.symbolDict[security.Symbol] = SymbolData(self,security.Symbol,self.criteriaDict)
                equity.SetDataNormalizationMode(DataNormalizationMode.Raw)
                self.symbol = equity.Symbol
                
         
    

    def TradeOptions(self, contracts, ticker):
        filtered_contracts = self.InitialFilter(ticker, contracts, -1, 1, 1, 15) 
        if filtered_contracts == None:
            return
        elif len(filtered_contracts) > 0: 
                
            expiry = sorted(filtered_contracts,key = lambda x: x.ID.Date, reverse=False)[0].ID.Date 
            
            call = [i for i in filtered_contracts if i.ID.Date == expiry and i.ID.OptionRight == 0]
         
            call_contracts = sorted(call,key = lambda x: x.ID.StrikePrice)
            self.call = call_contracts[0]
            
            for i in filtered_contracts:
                if i.ID.Date == expiry and i.ID.OptionRight == 1 and i.ID.StrikePrice ==call_contracts[0].ID.StrikePrice:
                    self.put = i

            self.AddOptionContract(self.call, Resolution.Minute)
            self.AddOptionContract(self.put, Resolution.Minute)
      
       
            self.purchased_options.append(self.symbol)
            self.Buy(self.call, 5) 
        
    
            
    def InitialFilter(self, underlyingsymbol, symbol_list, min_strike_rank, max_strike_rank, min_expiry, max_expiry):
              
        contract_list = [i for i in symbol_list if min_expiry <= (i.ID.Date.date() - self.Time.date()).days < max_expiry]
       
        try :
            atm_strike = sorted(contract_list,
                                key = lambda x: abs(x.ID.StrikePrice - self.Securities[underlyingsymbol].Price))[0].ID.StrikePrice
            strike_list = sorted(set([i.ID.StrikePrice for i in contract_list]))
            
            atm_strike_rank = strike_list.index(atm_strike)
            try: 
                min_strike = strike_list[atm_strike_rank + min_strike_rank]
                max_strike = strike_list[atm_strike_rank + max_strike_rank]
            except:
                min_strike = strike_list[0]
                max_strike = strike_list[-1]
            
            filtered_contracts = [i for i in contract_list if i.ID.StrikePrice >= min_strike and i.ID.StrikePrice <= max_strike]
        
        except:
            filtered_contracts = None
            
        return filtered_contracts 
        

    def OnData(self, data):

        if self.IsWarmingUp: return

        todaydate = datetime.today().strftime('%Y-%m-%d')

        for x in holidays:
            if x == todaydate:
                return  
    
        for symbol in self.symbolDict:
            
            symbolData = self.symbolDict[symbol]
            symbolData.CurrentPrice = self.Securities[symbol].Price
            
   
            if len (self.symbolWithPositionDict) != 0:
                continue
            if len(selected) != 0:
                continue
            
            elif symbol not in selected and symbol not in self.lock:
                selected.append(symbol)
                self.BuyIn[symbol] = symbolData.CurrentPrice
    
        for symbol in selected:
           
            symbolData = self.symbolDict[symbol]
            symbolData.CurrentPrice = self.Securities[symbol].Price
      

            if not self.Portfolio[symbol].Invested:
                symbolData.BuyIn = symbolData.CurrentPrice 
                symbolData.current = self.Time
                cash = self.Portfolio.Cash
                available = (cash *.5)
                purchase = math.floor(available / symbolData.CurrentPrice)
                
                locktime = self.Time
                
                contracts = self.OptionChainProvider.GetOptionContractList(symbol, self.Time.date())
                if contracts:
                    self.Debug('contracts')
                    self.Debug(contracts)
                    self.TradeOptions(contracts, symbol.Value)
                

                self.lock[symbol] = locktime

                self.MarketOrder(symbol, -purchase)
               
                self.symbolWithPositionDict[symbol] = SymbolData(self,symbol,self.criteriaDict)
           
               
        for symbol in list(self.symbolWithPositionDict):
            symbolData = self.symbolDict[symbol]
            if self.Securities[symbol].Price < symbolData.BuyIn * .85 or self.Securities[symbol].Price > symbolData.BuyIn * 1.1: # self.Securities[symbol].Price < symbolData.highestTrailStopPrice * .9 
                self.Liquidate(symbol)
                
                del self.symbolWithPositionDict[symbol]
                selected.remove(symbol)
             
               
     
    def CoarseFilterSelection(self, universe):  
        filtering = []
        universe = sorted(universe, key=lambda c: c.DollarVolume, reverse=True)  
        universe = [c for c in universe]

        for coarse in universe:  

            symbol = coarse.Symbol
          
            
            options = self.OptionChainProvider.GetOptionContractList(symbol, self.Time.date())
            if len(options) == 0:
                continue
        
            if symbol not in self.averages:
               
                history = self.History(symbol, 30, Resolution.Daily)
                
                self.averages[symbol] = SelectionData(history) 

            self.averages[symbol].update(self.Time, coarse.Volume)
            
            if  self.averages[symbol].is_ready() and self.averages[symbol].aver.Current.Value > 500000:
                filtering.append(symbol)
        
        return filtering

    def FineFilterSelection(self, fine):
        sortedByShares = sorted(fine, key = lambda f: f.CompanyProfile.SharesOutstanding, reverse = True)
        universed = [f for f in sortedByShares if f.CompanyProfile.SharesOutstanding < 15000000 and f.MarketCap < 2000000000]
        return [x.Symbol for x in universed]

class SelectionData():
    
    def __init__(self, history):
        self.aver = SimpleMovingAverage(30)
    
        for bar in history.itertuples():
           
            self.aver.Update(bar.Index[1], bar.close)
    
    def is_ready(self):
        return self.aver.IsReady 

    def update(self, time, volume):
        self.aver.Update(time, volume)
  

Thank you,

Keenan

Author