22 using System.Collections.Generic;
39 private bool _isLiveMode;
40 private bool _modelsMismatchWarningSent;
55 _registeredTypes = registeredTypes;
56 _marketHoursDatabase = marketHoursDatabase;
57 _symbolPropertiesDatabase = symbolPropertiesDatabase;
58 _securityInitializerProvider = securityInitializerProvider;
59 _cacheProvider = cacheProvider;
60 _primaryExchangeProvider = primaryExchangeProvider;
61 _algorithm = algorithm;
70 List<SubscriptionDataConfig> subscriptionDataConfigList,
72 bool addToSymbolCache,
74 bool initializeSecurity)
77 configList.AddRange(subscriptionDataConfigList);
79 var dataTypes = Enumerable.Empty<Type>();
82 dataTypes =
new[] { type };
84 var exchangeHours = _marketHoursDatabase.GetEntry(symbol, dataTypes).ExchangeHours;
86 var defaultQuoteCurrency = _cashBook.AccountCurrency;
89 defaultQuoteCurrency = symbol.
Value.Substring(3);
94 throw new ArgumentException(Messages.SecurityService.SymbolNotFoundInSymbolPropertiesDatabase(symbol));
98 var symbolProperties = _symbolPropertiesDatabase.GetSymbolProperties(
102 defaultQuoteCurrency);
105 if (addToSymbolCache)
107 SymbolCache.Set(symbol.
Value, symbol);
111 var quoteCurrency = symbolProperties.QuoteCurrency;
112 if (!_cashBook.TryGetValue(quoteCurrency, out var quoteCash))
115 quoteCash = _cashBook.Add(quoteCurrency, 0, 0);
118 Cash baseCash =
null;
122 if (!_cashBook.TryGetValue(baseCurrencySymbol, out baseCash))
125 baseCash = _cashBook.Add(baseCurrencySymbol, 0, 0);
129 var cache = _cacheProvider.GetSecurityCache(symbol);
135 var primaryExchange =
136 _primaryExchangeProvider?.GetPrimaryExchange(symbol.
ID) ??
138 security =
new Equity.Equity(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache, primaryExchange);
143 security =
new Option.Option(symbol, exchangeHours, quoteCash,
new Option.OptionSymbolProperties(symbolProperties), _cashBook, _registeredTypes, cache, underlying);
148 security =
new IndexOption.IndexOption(symbol, exchangeHours, quoteCash,
new IndexOption.IndexOptionSymbolProperties(symbolProperties), _cashBook, _registeredTypes, cache, underlying);
153 var optionSymbolProperties =
new Option.OptionSymbolProperties(symbolProperties);
157 optionSymbolProperties.SetContractUnitOfTrade(1);
159 security =
new FutureOption.FutureOption(symbol, exchangeHours, quoteCash, optionSymbolProperties, _cashBook, _registeredTypes, cache, underlying);
163 security =
new Future.Future(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache, underlying);
167 security =
new Forex.Forex(symbol, exchangeHours, quoteCash, baseCash, symbolProperties, _cashBook, _registeredTypes, cache);
171 security =
new Cfd.Cfd(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache);
175 security =
new Index.Index(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache);
179 security =
new Crypto.Crypto(symbol, exchangeHours, quoteCash, baseCash, symbolProperties, _cashBook, _registeredTypes, cache);
183 security =
new CryptoFuture.CryptoFuture(symbol, exchangeHours, quoteCash, baseCash, symbolProperties, _cashBook, _registeredTypes, cache);
188 security =
new Security(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache);
194 if (security.IsTradable)
196 security.IsTradable = !configList.IsInternalFeed;
199 security.AddData(configList);
202 if (initializeSecurity)
204 _securityInitializerProvider.SecurityInitializer.Initialize(security);
207 CheckCanonicalSecurityModels(security);
211 if (leverage != Security.NullLeverage)
213 security.SetLeverage(leverage);
219 if ((_isLiveMode || isNotNormalized) && security.Type ==
SecurityType.Equity)
221 security.PriceVariationModel =
new EquityPriceVariationModel();
233 List<SubscriptionDataConfig> subscriptionDataConfigList,
234 decimal leverage = 0,
235 bool addToSymbolCache =
true,
238 return CreateSecurity(symbol, subscriptionDataConfigList, leverage, addToSymbolCache, underlying, initializeSecurity:
true);
248 return CreateSecurity(symbol,
new List<SubscriptionDataConfig> { subscriptionDataConfig }, leverage, addToSymbolCache, underlying);
258 return CreateSecurity(symbol,
259 new List<SubscriptionDataConfig>(),
261 addToSymbolCache:
false,
263 initializeSecurity:
false);
272 _isLiveMode = isLiveMode;
279 private void CheckCanonicalSecurityModels(
Security security)
281 if (!_modelsMismatchWarningSent &&
282 _algorithm !=
null &&
284 _algorithm.Securities.TryGetValue(security.
Symbol.
Canonical, out var canonicalSecurity))
286 if (security.
FillModel.GetType() != canonicalSecurity.FillModel.GetType() ||
287 security.
FeeModel.GetType() != canonicalSecurity.FeeModel.GetType() ||
288 security.
BuyingPowerModel.GetType() != canonicalSecurity.BuyingPowerModel.GetType() ||
290 security.
SlippageModel.GetType() != canonicalSecurity.SlippageModel.GetType() ||
291 security.
VolatilityModel.GetType() != canonicalSecurity.VolatilityModel.GetType() ||
292 security.
SettlementModel.GetType() != canonicalSecurity.SettlementModel.GetType())
294 _modelsMismatchWarningSent =
true;
295 _algorithm.Debug($
"Warning: Security {security.Symbol} its canonical security {security.Symbol.Canonical} have at least one model of different types (fill, fee, buying power, margin interest rate, slippage, volatility, settlement). To avoid this, consider using a security initializer to set the right models to each security type according to your algorithm's requirements.");