17 using System.Collections.Generic;
19 using System.Runtime.CompilerServices;
33 public static partial class Messages
40 [MethodImpl(MethodImplOptions.AggressiveInlining)]
41 public static string ToString(Securities.AccountEvent accountEvent)
43 return Invariant($
"Account {accountEvent.CurrencySymbol} Balance: {accountEvent.CashBalance:0.00}");
52 public static string InvalidInitialMarginRequirement =
"Initial margin requirement must be between 0 and 1";
54 public static string InvalidMaintenanceMarginRequirement =
"Maintenance margin requirement must be between 0 and 1";
56 public static string InvalidFreeBuyingPowerPercentRequirement =
"Free Buying Power Percent requirement must be between 0 and 1";
58 public static string InvalidLeverage =
"Leverage must be greater than or equal to 1.";
60 [MethodImpl(MethodImplOptions.AggressiveInlining)]
61 public static string InsufficientBuyingPowerDueToNullOrderTicket(Orders.Order order)
63 return Invariant($
"Null order ticket for id: {order.Id}");
66 [MethodImpl(MethodImplOptions.AggressiveInlining)]
67 public static string InsufficientBuyingPowerDueToUnsufficientMargin(Orders.Order order,
68 decimal initialMarginRequiredForRemainderOfOrder, decimal freeMargin)
70 return Invariant($
@"Id: {order.Id}, Initial Margin: {
71 initialMarginRequiredForRemainderOfOrder.Normalize()}, Free Margin: {freeMargin.Normalize()}");
74 [MethodImpl(MethodImplOptions.AggressiveInlining)]
75 public static string TargetOrderMarginNotAboveMinimum(decimal absDifferenceOfMargin, decimal minimumValue)
77 return Invariant($
"The target order margin {absDifferenceOfMargin} is less than the minimum {minimumValue}.");
80 [MethodImpl(MethodImplOptions.AggressiveInlining)]
81 public static string TargetOrderMarginNotAboveMinimum()
83 return "Warning: Portfolio rebalance result ignored as it resulted in a single share trade recommendation which can generate high fees." +
84 " To disable minimum order size checks please set Settings.MinimumOrderMarginPortfolioPercentage = 0.";
87 [MethodImpl(MethodImplOptions.AggressiveInlining)]
88 public static string OrderQuantityLessThanLotSize(Securities.Security security, decimal targetOrderMargin)
90 return Invariant($
@"The order quantity is less than the lot size of {
91 security.SymbolProperties.LotSize} and has been rounded to zero. Target order margin {targetOrderMargin}. ");
94 [MethodImpl(MethodImplOptions.AggressiveInlining)]
96 decimal signedTargetFinalMarginValue, decimal orderFees)
98 return Invariant($
@"GetMaximumOrderQuantityForTargetBuyingPower failed to converge on the target margin: {
99 signedTargetFinalMarginValue}; the following information can be used to reproduce the issue. Total Portfolio Cash: {
100 parameters.Portfolio.Cash}; Security : {parameters.Security.Symbol.ID}; Price : {parameters.Security.Close}; Leverage: {
101 parameters.Security.Leverage}; Order Fee: {orderFees}; Lot Size: {
102 parameters.Security.SymbolProperties.LotSize}; Current Holdings: {parameters.Security.Holdings.Quantity} @ {
103 parameters.Security.Holdings.AveragePrice}; Target Percentage: %{parameters.TargetBuyingPower * 100};");
106 [MethodImpl(MethodImplOptions.AggressiveInlining)]
107 public static string FailedToConvergeOnTheTargetMarginUnderlyingSecurityInfo(Securities.Security underlying)
109 return Invariant($
@"Underlying Security: {underlying.Symbol.ID}; Underlying Price: {
110 underlying.Close}; Underlying Holdings: {underlying.Holdings.Quantity} @ {underlying.Holdings.AveragePrice};");
113 [MethodImpl(MethodImplOptions.AggressiveInlining)]
114 public static string MarginBeingAdjustedInTheWrongDirection(decimal targetMargin, decimal marginForOneUnit, Securities.Security security)
117 $
@"Margin is being adjusted in the wrong direction. Reproduce this issue with the following variables, Target Margin: {
118 targetMargin}; MarginForOneUnit: {marginForOneUnit}; Security Holdings: {security.Holdings.Quantity} @ {
119 security.Holdings.AveragePrice}; LotSize: {security.SymbolProperties.LotSize}; Price: {security.Close}; Leverage: {
120 security.Leverage}");
123 [MethodImpl(MethodImplOptions.AggressiveInlining)]
124 public static string MarginBeingAdjustedInTheWrongDirectionUnderlyingSecurityInfo(Securities.Security underlying)
126 return Invariant($
@"Underlying Security: {underlying.Symbol.ID}; Underlying Price: {
127 underlying.Close}; Underlying Holdings: {underlying.Holdings.Quantity} @ {underlying.Holdings.AveragePrice};");
137 public static string DeltaCannotBeApplied =
"No buying power used, delta cannot be applied";
139 [MethodImpl(MethodImplOptions.AggressiveInlining)]
140 public static string ComputedZeroInitialMargin(
IPositionGroup positionGroup)
142 return Invariant($
"Computed zero initial margin requirement for {positionGroup.GetUserFriendlyName()}.");
145 [MethodImpl(MethodImplOptions.AggressiveInlining)]
146 public static string PositionGroupQuantityRoundedToZero(decimal targetOrderMargin)
148 return Invariant($
"The position group order quantity has been rounded to zero. Target order margin {targetOrderMargin}.");
151 [MethodImpl(MethodImplOptions.AggressiveInlining)]
152 public static string FailedToConvergeOnTargetMargin(decimal targetMargin, decimal positionGroupQuantity, decimal orderFees,
155 return Invariant($
@"Failed to converge on the target margin: {targetMargin}; the following information can be used to reproduce the issue. Total Portfolio Cash: {parameters.Portfolio.Cash}; Position group: {parameters.PositionGroup.GetUserFriendlyName()}; Position group order quantity: {positionGroupQuantity} Order Fee: {orderFees}; Current Holdings: {parameters.PositionGroup.Quantity}; Target Percentage: %{parameters.TargetBuyingPower * 100};");
164 public static string NullOrEmptyCashSymbol =
"Cash symbols cannot be null or empty.";
166 [MethodImpl(MethodImplOptions.AggressiveInlining)]
167 public static string NoTradablePairFoundForCurrencyConversion(
string cashCurrencySymbol,
string accountCurrency,
168 IEnumerable<KeyValuePair<SecurityType, string>> marketMap)
170 return Invariant($
@"No tradeable pair was found for currency {cashCurrencySymbol}, conversion rate to account currency ({
171 accountCurrency}) will be set to zero. Markets: [{string.Join(",
", marketMap.Select(x => $"{x.Key}:{x.Value}
"))}]");
174 [MethodImpl(MethodImplOptions.AggressiveInlining)]
175 public static string AddingSecuritySymbolForCashCurrencyFeed(
QuantConnect.
Symbol symbol,
string cashCurrencySymbol)
177 return Invariant($
"Adding {symbol.Value} {symbol.ID.Market} for cash {cashCurrencySymbol} currency feed");
180 [MethodImpl(MethodImplOptions.AggressiveInlining)]
181 public static string ToString(Securities.Cash cash,
string accountCurrency)
184 var rate = cash.ConversionRate;
185 rate = rate < 1000 ? rate.RoundToSignificantDigits(5) : Math.Round(rate, 2);
186 return Invariant($
@"{cash.Symbol}: {cash.CurrencySymbol}{cash.Amount,15:0.00} @ {rate,10:0.00####} = {
187 QuantConnect.Currencies.GetCurrencySymbol(accountCurrency)}{Math.Round(cash.ValueInAccountCurrency, 2)}");
196 public static string UnexpectedRequestForNullCurrency =
"Unexpected request for NullCurrency Cash instance";
198 [MethodImpl(MethodImplOptions.AggressiveInlining)]
199 public static string ConversionRateNotFound(
string currency)
201 return Invariant($
"The conversion rate for {currency} is not available.");
204 [MethodImpl(MethodImplOptions.AggressiveInlining)]
205 public static string ToString(Securities.CashBook cashBook)
207 var sb =
new StringBuilder();
208 sb.AppendLine(Invariant($
"Symbol {"Quantity
",13} {"Conversion
",10} = Value in {cashBook.AccountCurrency}"));
209 foreach (var value
in cashBook.Values)
211 sb.AppendLine(value.ToString(cashBook.AccountCurrency));
213 sb.AppendLine(
"-------------------------------------------------");
214 sb.AppendLine(Invariant($
@"CashBook Total Value: {
215 QuantConnect.Currencies.GetCurrencySymbol(cashBook.AccountCurrency)}{
216 Math.Round(cashBook.TotalValueInAccountCurrency, 2).ToStringInvariant()}"));
218 return sb.ToString();
221 [MethodImpl(MethodImplOptions.AggressiveInlining)]
222 public static string CashSymbolNotFound(
string symbol)
224 return $
"This cash symbol ({symbol}) was not found in your cash book.";
227 [MethodImpl(MethodImplOptions.AggressiveInlining)]
228 public static string FailedToRemoveRecord(
string symbol)
230 return $
"Failed to remove the cash book record for symbol {symbol}";
239 public static string UnsupportedLeverage =
"CashBuyingPowerModel does not allow setting leverage. Cash accounts have no leverage.";
241 public static string GetMaximumOrderQuantityForDeltaBuyingPowerNotImplemented =
242 $
@"The {nameof(CashBuyingPowerModel)} does not require '{
243 nameof(Securities.CashBuyingPowerModel.GetMaximumOrderQuantityForDeltaBuyingPower)}'.";
245 public static string ShortingNotSupported =
"The cash model does not allow shorting.";
247 public static string InvalidSecurity = $
"The security type must be {nameof(SecurityType.Crypto)}or {nameof(SecurityType.Forex)}.";
249 [MethodImpl(MethodImplOptions.AggressiveInlining)]
250 public static string UnsupportedSecurity(Securities.Security security)
252 return $
@"The '{security.Symbol.Value}' security is not supported by this cash model. Currently only {
253 nameof(SecurityType.Crypto)} and {nameof(SecurityType.Forex)} are supported.";
256 [MethodImpl(MethodImplOptions.AggressiveInlining)]
257 public static string SellOrderShortHoldingsNotSupported(decimal totalQuantity, decimal openOrdersReservedQuantity, decimal orderQuantity,
260 return Invariant($
@"Your portfolio holds {totalQuantity.Normalize()} {
261 baseCurrency.BaseCurrency.Symbol}, {openOrdersReservedQuantity.Normalize()} {
262 baseCurrency.BaseCurrency.Symbol} of which are reserved for open orders, but your Sell order is for {
263 orderQuantity.Normalize()} {baseCurrency.BaseCurrency.Symbol
264 }. Cash Modeling trading does not permit short holdings so ensure you only sell what you have, including any additional open orders.");
267 [MethodImpl(MethodImplOptions.AggressiveInlining)]
268 public static string BuyOrderQuantityGreaterThanMaxForBuyingPower(decimal totalQuantity, decimal maximumQuantity,
269 decimal openOrdersReservedQuantity, decimal orderQuantity,
IBaseCurrencySymbol baseCurrency, Securities.Security security,
272 return Invariant($
@"Your portfolio holds {totalQuantity.Normalize()} {
273 security.QuoteCurrency.Symbol}, {openOrdersReservedQuantity.Normalize()} {
274 security.QuoteCurrency.Symbol} of which are reserved for open orders, but your Buy order is for {
275 order.AbsoluteQuantity.Normalize()} {baseCurrency.BaseCurrency.Symbol}. Your order requires a total value of {
276 orderQuantity.Normalize()} {security.QuoteCurrency.Symbol}, but only a total value of {
277 Math.Abs(maximumQuantity).Normalize()} {security.QuoteCurrency.Symbol} is available.");
280 [MethodImpl(MethodImplOptions.AggressiveInlining)]
281 public static string NoDataInInternalCashFeedYet(Securities.Security security, Securities.SecurityPortfolioManager portfolio)
283 return Invariant($
@"The internal cash feed required for converting {security.QuoteCurrency.Symbol} to {
284 portfolio.CashBook.AccountCurrency} does not have any data yet (or market may be closed).");
287 [MethodImpl(MethodImplOptions.AggressiveInlining)]
288 public static string ZeroContractMultiplier(Securities.Security security)
290 return $
@"The contract multiplier for the {
291 security.Symbol.Value} security is zero. The symbol properties database may be out of date.";
294 [MethodImpl(MethodImplOptions.AggressiveInlining)]
295 public static string OrderQuantityLessThanLotSize(Securities.Security security)
297 return Invariant($
@"The order quantity is less than the lot size of {
298 security.SymbolProperties.LotSize} and has been rounded to zero.");
301 [MethodImpl(MethodImplOptions.AggressiveInlining)]
302 public static string OrderQuantityLessThanLotSizeOrderDetails(decimal targetOrderValue, decimal orderQuantity, decimal orderFees)
304 return Invariant($
"Target order value {targetOrderValue}. Order fees {orderFees}. Order quantity {orderQuantity}.");
307 [MethodImpl(MethodImplOptions.AggressiveInlining)]
308 public static string FailedToConvergeOnTargetOrderValue(decimal targetOrderValue, decimal currentOrderValue, decimal orderQuantity,
309 decimal orderFees, Securities.Security security)
311 return Invariant($
@"GetMaximumOrderQuantityForTargetBuyingPower failed to converge to target order value {
312 targetOrderValue}. Current order value is {currentOrderValue}. Order quantity {orderQuantity}. Lot size is {
313 security.SymbolProperties.LotSize}. Order fees {orderFees}. Security symbol {security.Symbol}");
322 public static string MarginCallOrderTag =
"Margin Call";
330 public static string PropertiesCannotBeSet =
331 "DynamicSecurityData is a view of the SecurityCache. It is readonly, properties can not be set";
333 [MethodImpl(MethodImplOptions.AggressiveInlining)]
334 public static string PropertyNotFound(
string name)
336 return $
"Property with name '{name}' does not exist.";
339 [MethodImpl(MethodImplOptions.AggressiveInlining)]
340 public static string UnexpectedTypesForGetAll(Type type,
object data)
342 return $
"Expected a list with type '{type.GetBetterTypeName()}' but found type '{data.GetType().GetBetterTypeName()}";
351 [MethodImpl(MethodImplOptions.AggressiveInlining)]
352 public static string InvalidSecurityType(Securities.Security security)
354 return Invariant($
"Invalid SecurityType: {security.Type}");
363 public static string AccountCurrencyUnexpectedUsage =
"Unexpected usage of ErrorCurrencyConverter.AccountCurrency";
365 public static string ConvertToAccountCurrencyPurposefullyThrow =
366 $
@"This method purposefully throws as a proof that a test does not depend on {
367 nameof(ICurrencyConverter)}. If this exception is encountered, it means the test DOES depend on {
368 nameof(ICurrencyConverter)} and should be properly updated to use a real implementation of {nameof(ICurrencyConverter)}.";
376 [MethodImpl(MethodImplOptions.AggressiveInlining)]
377 public static string SeededSecurityInfo(
BaseData seedData)
379 return $
"Seeded security: {seedData.Symbol.Value}: {seedData.GetType()} {seedData.Value}";
382 [MethodImpl(MethodImplOptions.AggressiveInlining)]
383 public static string UnableToSeedSecurity(Securities.Security security)
385 return $
"Unable to seed security: {security.Symbol.Value}";
388 [MethodImpl(MethodImplOptions.AggressiveInlining)]
389 public static string UnableToSecurityPrice(Securities.Security security)
391 return $
"Could not seed price for security {security.Symbol}";
400 public static string UnableToHandleCashInNonAccountCurrency =
401 $
"The {nameof(Securities.IdentityCurrencyConverter)} can only handle CashAmounts in units of the account currency";
409 public static string ForUnderlyingOnlyInvokableForIDerivativeSecurity =
410 "ForUnderlying is only invokable for IDerivativeSecurity (Option|Future)";
418 [MethodImpl(MethodImplOptions.AggressiveInlining)]
419 public static string ToString(Securities.LocalMarketHours instance)
421 if (instance.IsClosedAllDay)
423 return "Closed All Day";
426 if (instance.IsOpenAllDay)
428 return "Open All Day";
431 return Invariant($
"{instance.DayOfWeek}: {string.Join(" |
", instance.Segments)}");
440 public static string ForUnderlyingOnlyInvokableForIDerivativeSecurity =
441 "ForUnderlying is only invokable for IDerivativeSecurity (Option|Future)";
449 public static string FutureUsaMarketTypeNoLongerSupported =
450 "Future.Usa market type is no longer supported as we mapped each ticker to its actual exchange. " +
451 "Please find your specific market in the symbol-properties database.";
453 [MethodImpl(MethodImplOptions.AggressiveInlining)]
454 public static string ExchangeHoursNotFound(Securities.SecurityDatabaseKey key,
455 IEnumerable<Securities.SecurityDatabaseKey> availableKeys =
null)
458 if (availableKeys !=
null)
460 keys =
" Available keys: " +
string.Join(
", ", availableKeys);
463 return $
"Unable to locate exchange hours for {key}.{keys}";
466 [MethodImpl(MethodImplOptions.AggressiveInlining)]
467 public static string SuggestedMarketBasedOnTicker(
string market)
469 return $
"Suggested market based on the provided ticker 'Market.{market.ToUpperInvariant()}'.";
478 public static string InvalidExtendedMarketOpenTime =
"Extended market open time must be less than or equal to market open time.";
480 public static string InvalidMarketCloseTime =
"Market close time must be after market open time.";
482 public static string InvalidExtendedMarketCloseTime =
"Extended market close time must be greater than or equal to market close time.";
484 [MethodImpl(MethodImplOptions.AggressiveInlining)]
485 public static string ToString(Securities.MarketHoursSegment instance)
487 return $
"{instance.State}: {instance.Start.ToStringInvariant(null)}-{instance.End.ToStringInvariant(null)}";
496 [MethodImpl(MethodImplOptions.AggressiveInlining)]
497 public static string TwoDifferentTypesDetectedForTheSameTypeName(Type type, Type existingType)
499 return $
"Two different types were detected trying to register the same type name: {existingType} - {type}";
508 public static string ValidSymbolPropertiesInstanceRequired =
"Security requires a valid SymbolProperties instance.";
510 public static string UnmatchingQuoteCurrencies =
"symbolProperties.QuoteCurrency must match the quoteCurrency.Symbol";
512 public static string SetLocalTimeKeeperMustBeCalledBeforeUsingLocalTime =
513 "Security.SetLocalTimeKeeper(LocalTimeKeeper) must be called in order to use the LocalTime property.";
515 public static string UnmatchingSymbols =
"Symbols must match.";
517 public static string UnmatchingExchangeTimeZones =
"ExchangeTimeZones must match.";
525 [MethodImpl(MethodImplOptions.AggressiveInlining)]
526 public static string KeyNotInExpectedFormat(
string key)
528 return $
"The specified key was not in the expected format: {key}";
531 [MethodImpl(MethodImplOptions.AggressiveInlining)]
532 public static string ToString(Securities.SecurityDatabaseKey instance)
534 return Invariant($
"{instance.SecurityType}-{instance.Market}-{instance.Symbol}");
543 [MethodImpl(MethodImplOptions.AggressiveInlining)]
544 public static string NoSecurityDefinitionsLoaded(
string securitiesDefinitionKey)
546 return $
"No security definitions data loaded from file: {securitiesDefinitionKey}";
555 public static string UnableToLocateNextMarketOpenInTwoWeeks =
"Unable to locate next market open within two weeks.";
557 public static string UnableToLocateNextMarketCloseInTwoWeeks =
"Unable to locate next market close within two weeks.";
559 [MethodImpl(MethodImplOptions.AggressiveInlining)]
560 public static string LastMarketOpenNotFound(DateTime localDateTime,
bool isMarketAlwaysOpen)
562 return $
"Did not find last market open for {localDateTime}. IsMarketAlwaysOpen: {isMarketAlwaysOpen}";
571 [MethodImpl(MethodImplOptions.AggressiveInlining)]
572 public static string ToString(Securities.SecurityHolding instance)
574 return Invariant($
"{instance.Symbol.Value}: {instance.Quantity} @ {instance.AveragePrice}");
583 [MethodImpl(MethodImplOptions.AggressiveInlining)]
586 return Invariant($
@"This asset symbol ({
587 symbol}) was not found in your security list. Please add this security or check it exists before using it with 'Securities.ContainsKey(""{
588 QuantConnect.SymbolCache.GetTicker(symbol)}"")'");
591 [MethodImpl(MethodImplOptions.AggressiveInlining)]
594 return Invariant($
"Unable to overwrite existing Security: {symbol}");
603 public static string DictionaryAddNotImplemented =
604 "Portfolio object is an adaptor for Security Manager. To add a new asset add the required data during initialization.";
606 public static string DictionaryClearNotImplemented =
"Portfolio object is an adaptor for Security Manager and cannot be cleared.";
608 public static string DictionaryRemoveNotImplemented =
"Portfolio object is an adaptor for Security Manager and objects cannot be removed.";
610 public static string CannotChangeAccountCurrencyAfterAddingSecurity =
611 "Cannot change AccountCurrency after adding a Security. Please move SetAccountCurrency() before AddSecurity().";
613 public static string CannotChangeAccountCurrencyAfterSettingCash =
614 "Cannot change AccountCurrency after setting cash. Please move SetAccountCurrency() before SetCash().";
616 [MethodImpl(MethodImplOptions.AggressiveInlining)]
617 public static string AccountCurrencyAlreadySet(Securities.CashBook cashBook,
string newAccountCurrency)
619 return $
"account currency has already been set to {cashBook.AccountCurrency}. Will ignore new value {newAccountCurrency}";
622 [MethodImpl(MethodImplOptions.AggressiveInlining)]
623 public static string SettingAccountCurrency(
string accountCurrency)
625 return $
"setting account currency to {accountCurrency}";
628 [MethodImpl(MethodImplOptions.AggressiveInlining)]
629 public static string TotalMarginInformation(decimal totalMarginUsed, decimal marginRemaining)
631 return Invariant($
"Total margin information: TotalMarginUsed: {totalMarginUsed:F2}, MarginRemaining: {marginRemaining:F2}");
634 [MethodImpl(MethodImplOptions.AggressiveInlining)]
635 public static string OrderRequestMarginInformation(decimal marginUsed, decimal marginRemaining)
637 return Invariant($
"Order request margin information: MarginUsed: {marginUsed:F2}, MarginRemaining: {marginRemaining:F2}");
646 [MethodImpl(MethodImplOptions.AggressiveInlining)]
647 public static string SymbolNotFoundInSymbolPropertiesDatabase(
QuantConnect.
Symbol symbol)
649 return $
"Symbol can't be found in the Symbol Properties Database: {symbol.Value}";
658 public static string CancelOpenOrdersNotAllowedOnInitializeOrWarmUp =
659 "This operation is not allowed in Initialize or during warm up: CancelOpenOrders. Please move this code to the OnWarmupFinished() method.";
661 [MethodImpl(MethodImplOptions.AggressiveInlining)]
662 public static string OrderCanceledByCancelOpenOrders(DateTime time)
664 return Invariant($
"Canceled by CancelOpenOrders() at {time:o}");
667 [MethodImpl(MethodImplOptions.AggressiveInlining)]
668 public static string UnableToLocateOrderTicket(
int orderId)
670 return Invariant($
"Unable to locate ticket for order: {orderId}");
673 [MethodImpl(MethodImplOptions.AggressiveInlining)]
674 public static string OrderNotFilledWithinExpectedTime(TimeSpan fillTimeout)
676 return Invariant($
"Order did not fill within {fillTimeout.TotalSeconds} seconds.");
685 public static string InvalidLotSize =
"SymbolProperties LotSize can not be less than or equal to 0";
687 public static string InvalidPriceMagnifier =
"SymbolProprties PriceMagnifier can not be less than or equal to 0";
689 public static string InvalidStrikeMultiplier =
"SymbolProperties StrikeMultiplier can not be less than or equal to 0";
691 [MethodImpl(MethodImplOptions.AggressiveInlining)]
692 public static string ToString(Securities.SymbolProperties instance)
694 var marketTicker =
",";
695 var minimumOrderSize = marketTicker;
696 var priceMagnifier = marketTicker;
697 if (!
string.IsNullOrEmpty(instance.MarketTicker))
699 marketTicker = $
",{instance.MarketTicker}";
701 if (instance.MinimumOrderSize !=
null)
703 minimumOrderSize = Invariant($
",{instance.MinimumOrderSize}");
705 if (instance.PriceMagnifier != 1)
707 priceMagnifier = Invariant($
",{instance.PriceMagnifier}");
710 return Invariant($
@"{instance.Description},{instance.QuoteCurrency},{instance.ContractMultiplier},{
711 instance.MinimumPriceVariation},{instance.LotSize}{marketTicker}{minimumOrderSize}{priceMagnifier}");
722 [MethodImpl(MethodImplOptions.AggressiveInlining)]
723 public static string DuplicateKeyInFile(
string file, Securities.SecurityDatabaseKey key)
725 return $
"Encountered duplicate key while processing file: {file}. Key: {key}";
728 [MethodImpl(MethodImplOptions.AggressiveInlining)]
729 public static string DatabaseFileNotFound(
string file)
731 return $
"Unable to locate symbol properties file: {file}";