示例#1
0
        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;
        }
示例#3
0
 internal void LatestPriceResultMessage(LatestPriceResultMessage result)
 {
     lock (_resultsLock)
     {
         _results.RemoveAll(x => x.IsSimilarRequest(result));
         _results.Add(result);
     }
 }
示例#4
0
 private void DoReversal(LatestPriceResultMessage m)
 {
     lock (_lock)
     {
         if (_nets.Pair.Equals(m.Pair))
         {
             _m.SendAsync(new LatestPriceResultMessage(m.Provider, m.MarketPrice.Reversed));
         }
     }
 }
示例#5
0
 private bool TryConversion(AssetPairNetworks networks, LatestPriceResultMessage m)
 {
     if (TryConversion(networks, m, false))
     {
         return(true);
     }
     if (TryConversion(networks, m, true))
     {
         return(true);
     }
     return(false);
 }
示例#6
0
        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();
                }
            }
        }
示例#7
0
        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);
        }
示例#8
0
        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();
            }
        }
示例#9
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        private void SendResults(MarketPrice response)
        {
            var resultMsg = new LatestPriceResultMessage(Provider, response);

            _messenger.SendAsync(resultMsg);
        }