19 using System.Threading;
21 using System.Globalization;
31 [ProtoContract(SkipConstructor =
true)]
35 private const decimal _scaleFactor = 1 / 10000m;
37 private int _initialized;
38 private decimal _open;
39 private decimal _high;
46 public virtual decimal
Volume {
get;
set; }
52 public virtual decimal
Open
66 public virtual decimal
High
80 public virtual decimal
Low
94 public virtual decimal
Close
107 public override DateTime
EndTime
117 public virtual TimeSpan
Period {
get;
set; }
146 Time =
new DateTime(original.
Time.Ticks);
169 public TradeBar(DateTime time,
Symbol symbol, decimal open, decimal high, decimal low, decimal close, decimal volume, TimeSpan? period =
null)
222 return ParseCfd(config, line, date);
237 catch (Exception err)
239 Log.
Error(Invariant($
"TradeBar.Reader(): Error parsing line: '{line}', Symbol: {config.Symbol.Value}, SecurityType: ") +
240 Invariant($
"{config.SecurityType}, Resolution: {config.Resolution}, Date: {date:yyyy-MM-dd}, Message: {err}")
259 if (stream ==
null || stream.EndOfStream)
288 return ParseCfd(config, stream, date);
300 catch (Exception err)
302 Log.
Error(Invariant($
"TradeBar.Reader(): Error parsing stream, Symbol: {config.Symbol.Value}, SecurityType: ") +
303 Invariant($
"{config.SecurityType}, Resolution: {config.Resolution}, Date: {date:yyyy-MM-dd}, Message: {err}")
330 return ParseCfd(config, line, baseDate);
389 tradeBar.
Open = stream.GetDecimal() * _scaleFactor;
390 tradeBar.
High = stream.GetDecimal() * _scaleFactor;
391 tradeBar.
Low = stream.GetDecimal() * _scaleFactor;
392 tradeBar.
Close = stream.GetDecimal() * _scaleFactor;
393 tradeBar.
Volume = stream.GetDecimal();
396 private static void ParseEquity(
TradeBar tradeBar, SubscriptionDataConfig config,
string line, DateTime date)
398 var csv = line.ToCsv(6);
402 tradeBar.
Time = DateTime.ParseExact(csv[0], DateFormat.TwelveCharacter, CultureInfo.InvariantCulture).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
407 tradeBar.Time = date.Date.AddMilliseconds(csv[0].ToInt32()).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
410 tradeBar.Open = csv[1].ToDecimal() * _scaleFactor;
411 tradeBar.High = csv[2].ToDecimal() * _scaleFactor;
412 tradeBar.Low = csv[3].ToDecimal() * _scaleFactor;
413 tradeBar.Close = csv[4].ToDecimal() * _scaleFactor;
414 tradeBar.Volume = csv[5].ToDecimal();
451 LineParseNoScale(config, line, date, tradeBar, hasVolume:
false);
471 LineParseNoScale(config, line, date, tradeBar);
484 return LineParseNoScale(config, line, date);
495 return StreamParseNoScale(config, streamReader, date);
507 return LineParseNoScale(config, line, date, hasVolume:
false);
519 return StreamParseNoScale(config, streamReader, date, hasVolume:
false);
560 return ParseForex(config, streamReader, date);
576 Period = config.Increment,
580 var csv = line.ToCsv(6);
584 tradeBar.Time = DateTime.ParseExact(csv[0],
DateFormat.
TwelveCharacter, CultureInfo.InvariantCulture).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
589 tradeBar.Time = date.Date.AddMilliseconds(csv[0].ToInt32()).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
592 var scalingFactor = GetScaleFactor(config.Symbol);
593 tradeBar.Open = csv[1].ToDecimal() * scalingFactor;
594 tradeBar.High = csv[2].ToDecimal() * scalingFactor;
595 tradeBar.Low = csv[3].ToDecimal() * scalingFactor;
596 tradeBar.Close = csv[4].ToDecimal() * scalingFactor;
597 tradeBar.Volume = csv[5].ToDecimal();
615 Period = config.Increment,
622 tradeBar.Time = streamReader.GetDateTime().ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
627 tradeBar.Time = date.Date.AddMilliseconds(streamReader.GetInt32()).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
630 var scalingFactor = GetScaleFactor(config.Symbol);
631 tradeBar.Open = streamReader.GetDecimal() * scalingFactor;
632 tradeBar.High = streamReader.GetDecimal() * scalingFactor;
633 tradeBar.Low = streamReader.GetDecimal() * scalingFactor;
634 tradeBar.Close = streamReader.GetDecimal() * scalingFactor;
635 tradeBar.Volume = streamReader.GetDecimal();
653 Period = config.Increment,
656 StreamParseNoScale(config, streamReader, date, tradeBar);
674 Period = config.Increment,
677 LineParseNoScale(config, line, date, tradeBar);
687 return LineParseNoScale(config, line, date);
701 var csv = line.ToCsv(hasVolume ? 6 : 5);
712 tradeBar.Open = csv[1].ToDecimal();
713 tradeBar.High = csv[2].ToDecimal();
714 tradeBar.Low = csv[3].ToDecimal();
715 tradeBar.Close = csv[4].ToDecimal();
718 tradeBar.Volume = csv[5].ToDecimal();
727 private static TradeBar StreamParseNoScale(SubscriptionDataConfig config, StreamReader streamReader, DateTime date,
TradeBar bar =
null,
bool hasVolume =
true)
731 Period = config.Increment,
738 tradeBar.Time = streamReader.GetDateTime().ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
743 tradeBar.Time = date.Date.AddMilliseconds(streamReader.GetInt32()).ConvertTo(config.DataTimeZone, config.ExchangeTimeZone);
745 tradeBar.Open = streamReader.GetDecimal();
746 tradeBar.High = streamReader.GetDecimal();
747 tradeBar.Low = streamReader.GetDecimal();
748 tradeBar.Close = streamReader.GetDecimal();
751 tradeBar.Volume = streamReader.GetDecimal();
762 return StreamParseNoScale(config, streamReader, date);
774 return ParseOption<TradeBar>(config, line, date);
786 return ParseOption<TradeBar>(config, streamReader, date);
798 return ParseFuture<TradeBar>(config, line, date);
810 return ParseFuture<TradeBar>(config, streamReader, date);
822 public override void Update(decimal lastTrade, decimal bidPrice, decimal askPrice, decimal volume, decimal bidSize, decimal askSize)
824 Initialize(lastTrade);
825 if (lastTrade >
High)
High = lastTrade;
826 if (lastTrade <
Low)
Low = lastTrade;
864 var clone = base.
Clone(fillForward);
889 return $
"{Symbol}: " +
890 $
"O: {Open.SmartRounding()} " +
891 $
"H: {High.SmartRounding()} " +
892 $
"L: {Low.SmartRounding()} " +
893 $
"C: {Close.SmartRounding()} " +
894 $
"V: {Volume.SmartRounding()}";
903 private static decimal GetScaleFactor(
Symbol symbol)
905 return UseScaleFactor(symbol)
910 private static bool UseScaleFactor(
Symbol symbol)
921 private void Initialize(decimal value)
923 if (Interlocked.CompareExchange(ref _initialized, 1, 0) == 0)