17 using System.Collections.Generic;
29 private IReadOnlyDictionary<SecurityDatabaseKey, SecurityDatabaseKey> _keyBySecurityType;
36 : base(null,
FromDataFolder, (entry, newEntry) => entry.Update(newEntry))
38 var allEntries =
new Dictionary<SecurityDatabaseKey, SymbolProperties>();
39 var entriesBySecurityType =
new Dictionary<SecurityDatabaseKey, SecurityDatabaseKey>();
41 foreach (var keyValuePair
in FromCsvFile(file))
43 if (allEntries.ContainsKey(keyValuePair.Key))
50 if (!entriesBySecurityType.ContainsKey(key))
52 entriesBySecurityType[key] = keyValuePair.Key;
54 allEntries[keyValuePair.Key] = keyValuePair.Value;
58 _keyBySecurityType = entriesBySecurityType;
72 if (_keyBySecurityType.TryGetValue(key, out result))
74 market = result.Market;
97 if (!
Entries.TryGetValue(key, out symbolProperties))
106 if (
Entries.TryGetValue(key, out symbolProperties))
108 return symbolProperties;
120 return symbolProperties;
134 var symbolProperties = entry.Value;
136 if (key.Market == market && key.SecurityType == securityType)
138 yield
return new KeyValuePair<SecurityDatabaseKey, SymbolProperties>(key, symbolProperties);
153 var symbolProperties = entry.Value;
155 if (key.Market == market)
157 yield
return new KeyValuePair<SecurityDatabaseKey, SymbolProperties>(key, symbolProperties);
207 private static IEnumerable<KeyValuePair<SecurityDatabaseKey, SymbolProperties>> FromCsvFile(
string file)
209 if (!File.Exists(file))
215 foreach (var line
in File.ReadLines(file).Where(x => !x.StartsWith(
"#") && !
string.IsNullOrWhiteSpace(x)).Skip(1))
217 SecurityDatabaseKey key;
219 if (key ==
null || entry ==
null)
224 yield
return new KeyValuePair<SecurityDatabaseKey, SymbolProperties>(key, entry);
236 var csv = line.Split(
',');
239 if (!csv[2].TryParseSecurityType(out securityType))
248 securityType: securityType);
252 quoteCurrency: csv[4],
253 contractMultiplier: csv[5].ToDecimal(),
254 minimumPriceVariation: csv[6].ToDecimalAllowExponent(),
255 lotSize: csv[7].ToDecimal(),
256 marketTicker: HasValidValue(csv, 8) ? csv[8] :
string.Empty,
257 minimumOrderSize: HasValidValue(csv, 9) ? csv[9].ToDecimal() :
null,
258 priceMagnifier: HasValidValue(csv, 10) ? csv[10].ToDecimal() : 1,
259 strikeMultiplier: HasValidValue(csv, 11) ? csv[11].ToDecimal() : 1);
262 private static bool HasValidValue(
string[] array, uint position)
264 return array.Length > position && !
string.IsNullOrEmpty(array[position]);
269 base.Merge(newDatabase, resetCustomEntries);
270 _keyBySecurityType = newDatabase._keyBySecurityType.ToReadOnlyDictionary();