private IReadOnlyCollection <string> ValidateQuote(MtQuoteMessage quote) { var errors = new List <string>(); if (quote == null) { errors.Add("Argument 'Order' is null."); } else { if (string.IsNullOrEmpty(quote.Instrument)) { errors.Add("Empty 'Instrument'"); } if (quote.Date.Kind != DateTimeKind.Utc) { errors.Add($"Invalid 'Date' Kind (UTC is required): '{quote.Date.Kind}'"); } if (_skipEodQuote && (quote?.IsEod ?? false)) { errors.Add($"Skipping EOD quote"); } } return(errors); }
private async Task ProcessQuoteAsync(MtQuoteMessage quote) { try { var validationErrors = ValidateQuote(quote); if (validationErrors.Any()) { var message = string.Join("\r\n", validationErrors); await _log.WriteWarningAsync(nameof(MtQuotesSubscriber), nameof(ProcessQuoteAsync), quote.ToJson(), message); return; } await _candlesManager.ProcessMtQuoteAsync(new MtQuoteDto { AssetPair = quote.Instrument, Ask = quote.Ask, Bid = quote.Bid, Timestamp = quote.Date }); } catch (Exception) { await _log.WriteWarningAsync(nameof(MtQuotesSubscriber), nameof(ProcessQuoteAsync), quote.ToJson(), "Failed to process quote"); throw; } }