private void NewRate(LatestPriceResultMessage result) { UiDispatcher.Invoke(() => { var e = ExchangeRates.FirstOrDefault(x => x.IsSimilarRequest(result)); if (e != null) { ExchangeRates.Remove(e); } ExchangeRates.Add(result); var exrs = ExchangeRates.OrderBy(x => x.Pair.ToString()).ToList(); ExchangeRates.Clear(); foreach (var er in exrs) { ExchangeRates.Add(er); } if (AssetLeft.IsNone() || AssetRight.IsNone() || ConvertLeft == 0) { return; } var ap = new AssetPair(AssetLeft, AssetRight); if (!result.Pair.Equals(ap)) { return; } _isConverted = result.IsConverted; ResultViewModel = new ExchangeRateResultViewModel(this, result); LoadingInfo = ""; }); }
public ExchangeRateResultViewModel(ExchangeRateViewModel model, LatestPriceResultMessage result) { _model = model; _result = result; var userQuantity = _model.ConvertLeft; var total = (double)((decimal)result.Price * (decimal)userQuantity); AssetLeft = _model.AssetLeft; AssetRight = _model.AssetRight; UtcCreated = result.UtcCreated; IsConverted = result.IsConverted; FinalPrice = new Money((decimal)total, AssetRight); UserInputValue = new Money((decimal)userQuantity, AssetLeft); NetworkLeft = result.Provider?.Network; if (IsConverted) { AssetConvert = result.AssetIntermediary; InfoLeft = result.MarketPrice.ToString(); InfoConvert = result.MarketPrice1.AsQuote(result.AssetIntermediary)?.ToString(); InfoRight = result.MarketPrice2.AsQuote(AssetRight)?.ToString(); NetworkMiddle = result.ProviderConversion?.Network; } else { InfoLeft = $"1 {AssetLeft.ShortCode} = {new Money(result.Price, AssetRight).ToString()}"; InfoRight = $"1 {AssetRight.ShortCode} = {new Money(1 / result.Price, AssetLeft).ToString()}"; } IsVisible = true; }
internal void LatestPriceResultMessage(LatestPriceResultMessage result) { lock (_resultsLock) { _results.RemoveAll(x => x.IsSimilarRequest(result)); _results.Add(result); } }
private void DoReversal(LatestPriceResultMessage m) { lock (_lock) { if (_nets.Pair.Equals(m.Pair)) { _m.SendAsync(new LatestPriceResultMessage(m.Provider, m.MarketPrice.Reversed)); } } }
private bool TryConversion(AssetPairNetworks networks, LatestPriceResultMessage m) { if (TryConversion(networks, m, false)) { return(true); } if (TryConversion(networks, m, true)) { return(true); } return(false); }
private void IncomingLatestPrice(LatestPriceResultMessage m) { lock (_lock) { var qa = UserContext.Testing.Finance().QuoteAsset; var ti = _items.Where(x => Equals(x.Total.Asset, m.Pair.Asset1) && Equals(qa, m.Pair.Asset2)); if (DoConversion(ti, m, qa)) { SendChangedMessageDebounced(); } } }
private static bool DoConversion(IEnumerable <PortfolioLineItem> items, LatestPriceResultMessage m, Asset targetAsset) { var change = false; foreach (var i in items) { var mn = new Money((decimal)i.Total * (decimal)m.Price, targetAsset); if (i.Converted != null && mn.ToDecimalValue() == i.Converted.Value.ToDecimalValue()) { continue; } i.Converted = mn; i.ConversionFailed = false; change = true; } return(change); }
private void DoConversion(LatestPriceResultMessage m) { if (m.IsConverted) { return; } lock (_lock) { var converted = TryConversion(_nets.ConversionPart1, m) || TryConversion(_nets.ConversionPart2, m); if (!converted) { return; } EmitConversion(); } }
private bool TryConversion(AssetPairNetworks networks, LatestPriceResultMessage m, bool reverse) { var pair = reverse ? networks.Pair.Reversed : networks.Pair; if (!pair.Equals(m.Pair)) { return(false); } var message = reverse ? new LatestPriceResultMessage(m.Provider, m.MarketPrice.Reversed) : m; if (networks.IsConversionPart1) { _request.LastConvert1 = message; } else { _request.LastConvert2 = message; } return(true); }
private void EmitConversion() { if (_request.LastConvert1 == null || _request.LastConvert2 == null) { return; } var p1 = _request.LastConvert1; var p2 = _request.LastConvert2; var reverse1 = Equals(p1.Pair.Asset1, _request.Pair.Asset1); var reverse2 = Equals(p2.Pair.Asset1, _request.Pair.Asset1); var p1F = reverse1 ? 1 / p1.Price : p1.Price; var p2F = reverse2 ? 1 / p2.Price : p2.Price; var price = new Money(p1F * p2F, _request.Pair.Asset2); var market = new MarketPrice(p1.Provider.Network, _request.Pair.Asset1, price); var message = new LatestPriceResultMessage(market, _nets.Intermediary, p1.MarketPrice, p2.MarketPrice, p1.Provider, p2.Provider); _m.SendAsync(message); }
private void SendResults(MarketPrice response) { var resultMsg = new LatestPriceResultMessage(Provider, response); _messenger.SendAsync(resultMsg); }