public void AdjustForLatestPrice(string exchange, ExchangePriceInfo exchangePriceInfo) { Prices[exchange] = exchangePriceInfo; decimal volumeWeightedPriceTotal = 0m; decimal volumeTotal = 0m; foreach (var p in Prices) { var(price, volume) = (p.Value.Price, p.Value.Volume); volumeWeightedPriceTotal += price * volume; volumeTotal += volume; } VolumeWeightedPrice = Round(volumeWeightedPriceTotal / volumeTotal, 8); }
void OnPriceEvent( string currencyPair, string exchange, decimal price, decimal volume, decimal bid, decimal ask) { /*var previousPrice = priceInfoLookup.TryGetValue(currencyPair, out var priceInfo) ? * priceInfo.Prices.TryGetValue(exchange, out var tuple) ? tuple.price : -1 : -1; * * if (price == previousPrice) * return;*/ priceInfoLookup.TryGetValue(currencyPair, out var priceInfo); priceInfo = priceInfo ?? new PriceInfo(currencyPair); var exchangePriceInfo = new ExchangePriceInfo(exchange, price, volume, bid, ask); priceInfo.AdjustForLatestPrice(exchange, exchangePriceInfo); priceInfoLookup[currencyPair] = priceInfo; var list = exchangeLookup.TryGetValue(exchange, out var exchangeCurrencyList) ? exchangeCurrencyList : new Dictionary <string, ExchangePriceInfo>(); list[currencyPair] = exchangePriceInfo; exchangeLookup[exchange] = list; var priceChange = new PriceChange { CurrencyPair = currencyPair, VolumeWeightedPrice = priceInfo.VolumeWeightedPrice, Exchange = exchange, Price = price, HighestBid = bid, LowestAsk = ask }; OnPriceChangeAction?.OnPriceChange(priceChange); }