17 using System.Globalization;
19 using System.Runtime.CompilerServices;
31 [ProtoContract(SkipConstructor =
true)]
35 private const decimal _scaleFactor = 1 / 10000m;
68 if (
Bid !=
null &&
Ask !=
null)
100 if (
Bid !=
null &&
Ask !=
null)
132 if (
Bid !=
null &&
Ask !=
null)
164 if (
Bid !=
null &&
Ask !=
null)
192 public override DateTime
EndTime
210 Time =
new DateTime();
228 public QuoteBar(DateTime time,
Symbol symbol,
IBar bid, decimal lastBidSize,
IBar ask, decimal lastAskSize, TimeSpan? period =
null)
250 [MethodImpl(MethodImplOptions.AggressiveInlining)]
251 public override void Update(decimal lastTrade, decimal bidPrice, decimal askPrice, decimal volume, decimal bidSize, decimal askSize)
254 if (
Bid ==
null && bidPrice != 0)
Bid =
new Bar(bidPrice, bidPrice, bidPrice, bidPrice);
257 if (
Ask ==
null && askPrice != 0)
Ask =
new Bar(askPrice, askPrice, askPrice, askPrice);
271 if (lastTrade != 0)
Value = lastTrade;
272 else if (askPrice != 0)
Value = askPrice;
273 else if (bidPrice != 0)
Value = bidPrice;
299 return ParseCfd(config, stream, date);
311 catch (Exception err)
313 Log.
Error(Invariant($
"QuoteBar.Reader(): Error parsing stream, Symbol: {config.Symbol.Value}, SecurityType: {config.SecurityType}, ") +
314 Invariant($
"Resolution: {config.Resolution}, Date: {date.ToStringInvariant("yyyy-MM-dd
")}, Message: {err}")
348 return ParseCfd(config, line, date);
360 catch (Exception err)
362 Log.
Error(Invariant($
"QuoteBar.Reader(): Error parsing line: '{line}', Symbol: {config.Symbol.Value}, SecurityType: {config.SecurityType}, ") +
363 Invariant($
"Resolution: {config.Resolution}, Date: {date.ToStringInvariant("yyyy-MM-dd
")}, Message: {err}")
371 private static bool HasShownWarning;
381 [Obsolete(
"All Forex data should use Quotes instead of Trades.")]
384 if (!HasShownWarning)
386 Logging.Log.Error(
"QuoteBar.ParseTradeAsQuoteBar(): Data formatted as Trade when Quote format was expected. Support for this will disappear June 2017.");
387 HasShownWarning =
true;
396 var csv = line.ToCsv(5);
409 quoteBar.Bid.Open = csv[1].ToDecimal();
410 quoteBar.Bid.High = csv[2].ToDecimal();
411 quoteBar.Bid.Low = csv[3].ToDecimal();
412 quoteBar.Bid.Close = csv[4].ToDecimal();
414 quoteBar.Ask.Open = csv[1].ToDecimal();
415 quoteBar.Ask.High = csv[2].ToDecimal();
416 quoteBar.Ask.Low = csv[3].ToDecimal();
417 quoteBar.Ask.Close = csv[4].ToDecimal();
419 quoteBar.
Value = quoteBar.Close;
433 return ParseQuote(config, date, line,
false);
445 return ParseQuote(config, date, streamReader,
false);
457 return ParseQuote(config, date, line, OptionUseScaleFactor(config.
Symbol));
470 return ParseQuote(config, date, streamReader, useScaleFactor: OptionUseScaleFactor(config.
Symbol));
478 private static bool OptionUseScaleFactor(
Symbol symbol)
493 return ParseQuote(config, date, line,
false);
505 return ParseQuote(config, date, streamReader,
false);
517 return ParseQuote(config, date, line,
false);
529 return ParseQuote(config, date, streamReader,
false);
541 return ParseQuote(config, date, line,
true);
553 return ParseQuote(config, date, streamReader,
true);
567 var scaleFactor = useScaleFactor
588 var open = streamReader.GetDecimal();
589 var high = streamReader.GetDecimal();
590 var low = streamReader.GetDecimal();
591 var close = streamReader.GetDecimal();
592 var lastSize = streamReader.GetDecimal();
594 if (open != 0 || high != 0 || low != 0 || close != 0)
597 quoteBar.Bid.Open = open * scaleFactor;
598 quoteBar.Bid.High = high * scaleFactor;
599 quoteBar.Bid.Low = low * scaleFactor;
600 quoteBar.Bid.Close = close * scaleFactor;
601 quoteBar.LastBidSize = lastSize;
608 open = streamReader.GetDecimal();
609 high = streamReader.GetDecimal();
610 low = streamReader.GetDecimal();
611 close = streamReader.GetDecimal();
612 lastSize = streamReader.GetDecimal();
614 if (open != 0 || high != 0 || low != 0 || close != 0)
617 quoteBar.Ask.Open = open * scaleFactor;
618 quoteBar.Ask.High = high * scaleFactor;
619 quoteBar.Ask.Low = low * scaleFactor;
620 quoteBar.Ask.Close = close * scaleFactor;
621 quoteBar.LastAskSize = lastSize;
628 quoteBar.
Value = quoteBar.Close;
642 private QuoteBar ParseQuote(SubscriptionDataConfig config, DateTime date,
string line,
bool useScaleFactor)
644 var scaleFactor = useScaleFactor
650 Period = config.Increment,
654 var csv = line.ToCsv(10);
658 quoteBar.Time = DateTime.ParseExact(csv[0], DateFormat.TwelveCharacter, CultureInfo.InvariantCulture).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
663 quoteBar.Time = date.Date.AddMilliseconds((
double)csv[0].ToDecimal()).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
667 if (csv[1].Length != 0 || csv[2].Length != 0 || csv[3].Length != 0 || csv[4].Length != 0)
670 quoteBar.Bid.Open = csv[1].ToDecimal() * scaleFactor;
671 quoteBar.Bid.High = csv[2].ToDecimal() * scaleFactor;
672 quoteBar.Bid.Low = csv[3].ToDecimal() * scaleFactor;
673 quoteBar.Bid.Close = csv[4].ToDecimal() * scaleFactor;
674 quoteBar.LastBidSize = csv[5].ToDecimal();
682 if (csv[6].Length != 0 || csv[7].Length != 0 || csv[8].Length != 0 || csv[9].Length != 0)
685 quoteBar.Ask.Open = csv[6].ToDecimal() * scaleFactor;
686 quoteBar.Ask.High = csv[7].ToDecimal() * scaleFactor;
687 quoteBar.Ask.Low = csv[8].ToDecimal() * scaleFactor;
688 quoteBar.Ask.Close = csv[9].ToDecimal() * scaleFactor;
689 quoteBar.LastAskSize = csv[10].ToDecimal();
696 quoteBar.Value = quoteBar.Close;
762 return $
"{Symbol}: " +
763 $
"Bid: O: {Bid?.Open.SmartRounding()} " +
764 $
"Bid: H: {Bid?.High.SmartRounding()} " +
765 $
"Bid: L: {Bid?.Low.SmartRounding()} " +
766 $
"Bid: C: {Bid?.Close.SmartRounding()} " +
767 $
"Ask: O: {Ask?.Open.SmartRounding()} " +
768 $
"Ask: H: {Ask?.High.SmartRounding()} " +
769 $
"Ask: L: {Ask?.Low.SmartRounding()} " +
770 $
"Ask: C: {Ask?.Close.SmartRounding()} ";