17 using System.Collections.Generic;
30 private static readonly
object DataFolderSymbolPropertiesDatabaseLock =
new object();
32 private readonly Dictionary<SecurityDatabaseKey, SymbolProperties> _entries;
33 private readonly IReadOnlyDictionary<SecurityDatabaseKey, SecurityDatabaseKey> _keyBySecurityType;
41 var allEntries =
new Dictionary<SecurityDatabaseKey, SymbolProperties>();
42 var entriesBySecurityType =
new Dictionary<SecurityDatabaseKey, SecurityDatabaseKey>();
44 foreach (var keyValuePair
in FromCsvFile(file))
46 if (allEntries.ContainsKey(keyValuePair.Key))
53 if (!entriesBySecurityType.ContainsKey(key))
55 entriesBySecurityType[key] = keyValuePair.Key;
57 allEntries[keyValuePair.Key] = keyValuePair.Value;
60 _entries = allEntries;
61 _keyBySecurityType = entriesBySecurityType;
73 return _entries.ContainsKey(key);
101 if (_keyBySecurityType.TryGetValue(key, out result))
103 market = result.Market;
126 if (!_entries.TryGetValue(key, out symbolProperties))
135 if (_entries.TryGetValue(key, out symbolProperties))
137 return symbolProperties;
142 if (!_entries.TryGetValue(
new SecurityDatabaseKey(market,
null, securityType), out symbolProperties))
149 return symbolProperties;
160 foreach (var entry
in _entries)
163 var symbolProperties = entry.Value;
165 if (key.Market == market && key.SecurityType == securityType)
167 yield
return new KeyValuePair<SecurityDatabaseKey, SymbolProperties>(key, symbolProperties);
179 foreach (var entry
in _entries)
182 var symbolProperties = entry.Value;
184 if (key.Market == market)
186 yield
return new KeyValuePair<SecurityDatabaseKey, SymbolProperties>(key, symbolProperties);
202 _entries[key] = properties;
213 lock (DataFolderSymbolPropertiesDatabaseLock)
215 if (_dataFolderSymbolPropertiesDatabase ==
null)
218 _dataFolderSymbolPropertiesDatabase =
new SymbolPropertiesDatabase(Path.Combine(directory,
"symbol-properties-database.csv"));
221 return _dataFolderSymbolPropertiesDatabase;
229 private static IEnumerable<KeyValuePair<SecurityDatabaseKey, SymbolProperties>> FromCsvFile(
string file)
231 if (!File.Exists(file))
237 foreach (var line
in File.ReadLines(file).Where(x => !x.StartsWith(
"#") && !
string.IsNullOrWhiteSpace(x)).Skip(1))
239 SecurityDatabaseKey key;
241 if (key ==
null || entry ==
null)
246 yield
return new KeyValuePair<SecurityDatabaseKey, SymbolProperties>(key, entry);
258 var csv = line.Split(
',');
261 if (!csv[2].TryParseSecurityType(out securityType))
270 securityType: securityType);
274 quoteCurrency: csv[4],
275 contractMultiplier: csv[5].ToDecimal(),
276 minimumPriceVariation: csv[6].ToDecimalAllowExponent(),
277 lotSize: csv[7].ToDecimal(),
278 marketTicker: HasValidValue(csv, 8) ? csv[8] :
string.Empty,
279 minimumOrderSize: HasValidValue(csv, 9) ? csv[9].ToDecimal() :
null,
280 priceMagnifier: HasValidValue(csv, 10) ? csv[10].ToDecimal() : 1);
283 private static bool HasValidValue(
string[] array, uint position)
285 return array.Length > position && !
string.IsNullOrEmpty(array[position]);