18 using System.Collections.Generic;
28 private DateTime _date;
29 private readonly Dictionary<SecurityIdentifier, CoarseFundamental> _coarseFundamental =
new();
41 var name = Enum.GetName(enumName);
42 lock (_coarseFundamental)
46 return GetProperty<T>(securityIdentifier, name);
50 var path = Path.Combine(
Globals.
DataFolder,
"equity",
"usa",
"fundamental",
"coarse", $
"{time:yyyyMMdd}.csv");
52 if (fileStream ==
null)
57 _coarseFundamental.Clear();
58 using (var reader =
new StreamReader(fileStream))
60 while (!reader.EndOfStream)
62 var line = reader.ReadLine();
63 var coarse = Read(line, time);
66 _coarseFundamental[coarse.Symbol.ID] = coarse;
71 return GetProperty<T>(securityIdentifier, name);
75 public static CoarseFundamentalSource Read(
string line, DateTime date)
79 var csv = line.Split(
',');
80 var coarse =
new CoarseFundamentalSource
84 Value = csv[2].ToDecimal(),
85 VolumeSetter = csv[3].ToInt64(),
86 DollarVolumeSetter = (double)csv[4].ToDecimal()
91 coarse.HasFundamentalDataSetter = csv[5].ConvertInvariant<
bool>();
96 coarse.PriceFactorSetter = csv[6].ToDecimal();
97 coarse.SplitFactorSetter = csv[7].ToDecimal();
109 private dynamic GetProperty<T>(SecurityIdentifier securityIdentifier,
string property)
111 if (!_coarseFundamental.TryGetValue(securityIdentifier, out var coarse))
118 case nameof(CoarseFundamental.Price):
120 case nameof(CoarseFundamental.Value):
122 case nameof(CoarseFundamental.Market):
123 return coarse.Market;
124 case nameof(CoarseFundamental.Volume):
125 return coarse.Volume;
126 case nameof(CoarseFundamental.PriceFactor):
127 return coarse.PriceFactor;
128 case nameof(CoarseFundamental.SplitFactor):
129 return coarse.SplitFactor;
130 case nameof(CoarseFundamental.DollarVolume):
131 return coarse.DollarVolume;
132 case nameof(CoarseFundamental.HasFundamentalData):
144 public long VolumeSetter;
145 public double DollarVolumeSetter;
146 public decimal PriceFactorSetter = 1;
147 public decimal SplitFactorSetter = 1;
148 public bool HasFundamentalDataSetter;
158 public override long Volume => VolumeSetter;