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,
75 bool reCreateSecurity)
78 configList.AddRange(subscriptionDataConfigList);
80 if (!reCreateSecurity && _algorithm !=
null && _algorithm.Securities.TryGetValue(symbol, out var existingSecurity))
82 existingSecurity.AddData(configList);
85 if (!configList.IsInternalFeed)
87 existingSecurity.MakeTradable();
90 InitializeSecurity(initializeSecurity, existingSecurity);
92 return existingSecurity;
95 var dataTypes = Enumerable.Empty<Type>();
98 dataTypes =
new[] { type };
100 var exchangeHours = _marketHoursDatabase.GetEntry(symbol, dataTypes).ExchangeHours;
102 var defaultQuoteCurrency = _cashBook.AccountCurrency;
105 defaultQuoteCurrency = symbol.
Value.Substring(3);
110 throw new ArgumentException(Messages.SecurityService.SymbolNotFoundInSymbolPropertiesDatabase(symbol));
114 var symbolProperties = _symbolPropertiesDatabase.GetSymbolProperties(
118 defaultQuoteCurrency);
121 if (addToSymbolCache)
123 SymbolCache.Set(symbol.
Value, symbol);
127 var quoteCurrency = symbolProperties.QuoteCurrency;
128 if (!_cashBook.TryGetValue(quoteCurrency, out var quoteCash))
131 quoteCash = _cashBook.Add(quoteCurrency, 0, 0);
134 Cash baseCash =
null;
140 if (!_cashBook.TryGetValue(baseCurrencySymbol, out baseCash))
143 baseCash = _cashBook.Add(baseCurrencySymbol, 0, 0);
148 throw new ArgumentException($
"Failed to resolve base currency for '{symbol.ID.Symbol}', it might be missing from the Symbol database or market '{symbol.ID.Market}' could be wrong");
152 var cache = _cacheProvider.GetSecurityCache(symbol);
158 var primaryExchange =
159 _primaryExchangeProvider?.GetPrimaryExchange(symbol.
ID) ??
161 security =
new Equity.Equity(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache, primaryExchange);
166 security =
new Option.Option(symbol, exchangeHours, quoteCash,
new Option.OptionSymbolProperties(symbolProperties), _cashBook, _registeredTypes, cache, underlying);
171 security =
new IndexOption.IndexOption(symbol, exchangeHours, quoteCash,
new IndexOption.IndexOptionSymbolProperties(symbolProperties), _cashBook, _registeredTypes, cache, underlying);
176 var optionSymbolProperties =
new Option.OptionSymbolProperties(symbolProperties);
180 optionSymbolProperties.SetContractUnitOfTrade(1);
182 security =
new FutureOption.FutureOption(symbol, exchangeHours, quoteCash, optionSymbolProperties, _cashBook, _registeredTypes, cache, underlying);
186 security =
new Future.Future(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache);
190 security =
new Forex.Forex(symbol, exchangeHours, quoteCash, baseCash, symbolProperties, _cashBook, _registeredTypes, cache);
194 security =
new Cfd.Cfd(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache);
198 security =
new Index.Index(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache);
202 security =
new Crypto.Crypto(symbol, exchangeHours, quoteCash, baseCash, symbolProperties, _cashBook, _registeredTypes, cache);
206 security =
new CryptoFuture.CryptoFuture(symbol, exchangeHours, quoteCash, baseCash, symbolProperties, _cashBook, _registeredTypes, cache);
211 security =
new Security(symbol, exchangeHours, quoteCash, symbolProperties, _cashBook, _registeredTypes, cache);
217 if (security.IsTradable)
219 security.IsTradable = !configList.IsInternalFeed;
222 security.AddData(configList);
225 InitializeSecurity(initializeSecurity, security);
227 CheckCanonicalSecurityModels(security);
231 if (leverage != Security.NullLeverage)
233 security.SetLeverage(leverage);
239 if ((_isLiveMode || isNotNormalized) && security.Type ==
SecurityType.Equity)
241 security.PriceVariationModel =
new EquityPriceVariationModel();
253 List<SubscriptionDataConfig> subscriptionDataConfigList,
254 decimal leverage = 0,
255 bool addToSymbolCache =
true,
258 return CreateSecurity(symbol, subscriptionDataConfigList, leverage, addToSymbolCache, underlying,
259 initializeSecurity:
true, reCreateSecurity:
false);
269 return CreateSecurity(symbol,
new List<SubscriptionDataConfig> { subscriptionDataConfig }, leverage, addToSymbolCache, underlying);
279 return CreateSecurity(symbol,
280 new List<SubscriptionDataConfig>(),
282 addToSymbolCache:
false,
284 initializeSecurity:
false,
285 reCreateSecurity:
true);
294 _isLiveMode = isLiveMode;
301 private void CheckCanonicalSecurityModels(
Security security)
303 if (!_modelsMismatchWarningSent &&
304 _algorithm !=
null &&
306 _algorithm.Securities.TryGetValue(security.
Symbol.
Canonical, out var canonicalSecurity))
308 if (security.
FillModel.GetType() != canonicalSecurity.FillModel.GetType() ||
309 security.
FeeModel.GetType() != canonicalSecurity.FeeModel.GetType() ||
310 security.
BuyingPowerModel.GetType() != canonicalSecurity.BuyingPowerModel.GetType() ||
312 security.
SlippageModel.GetType() != canonicalSecurity.SlippageModel.GetType() ||
313 security.
VolatilityModel.GetType() != canonicalSecurity.VolatilityModel.GetType() ||
314 security.
SettlementModel.GetType() != canonicalSecurity.SettlementModel.GetType())
316 _modelsMismatchWarningSent =
true;
317 _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.");
322 private void InitializeSecurity(
bool initializeSecurity, Security security)
324 if (initializeSecurity && !security.IsInitialized)
326 _securityInitializerProvider.SecurityInitializer.Initialize(security);
327 security.IsInitialized =
true;