Exemplo n.º 1
0
        public AggregatedAssetPairData GetAggAssetPairData(AssetPair pair)
        {
            var data = _assetPairs.GetOrAdd(pair, k =>
            {
                var id  = AggregatedAssetPairData.GetHash(k);
                var apd = PublicContext.I.GetCollection <AggregatedAssetPairData>().FindById(id);
                if (apd != null)
                {
                    return(apd);
                }

                var prov = Networks.I.GetProviders <ICoinSnapshotAggregationProvider>().FirstProvider();
                var r    = ApiCoordinator.GetCoinSnapshot(prov, new AssetPairDataContext(new AggregatedAssetPairData(k, prov)));

                apd = r.IsNull ? new AggregatedAssetPairData(k, prov)
                {
                    UtcUpdated = DateTime.UtcNow, IsMissing = true
                } : r.Response;
                apd.Save(PublicContext.I);

                return(apd);
            });

            data.Refresh(PublicContext.I);
            return(data);
        }
Exemplo n.º 2
0
        private static void RemoveFaulting(Dictionary <Network, IReadOnlyList <AssetPair> > pbn)
        {
            var hasFault = false;

            var networks = pbn.Keys.ToList();

            foreach (var n in networks)
            {
                var prov = n.Providers.FirstOf <IDepositProvider>();
                if (prov == null)
                {
                    continue;
                }

                var r = ApiCoordinator.GetTransferSuspensions(prov);
                if (r.IsNull)
                {
                    continue;
                }

                var pairs = pbn[n].AsList();
                var c     = pairs.Count;
                pairs.RemoveAll(x => r.Response.DepositSuspended.Any(x.Has));
                pairs.RemoveAll(x => r.Response.WithdrawalSuspended.Any(x.Has));
                hasFault = hasFault || c != pairs.Count;

                pbn[n] = pairs;
            }

            if (hasFault)
            {
                pbn.RemoveAll(x => !x.Value.Any());
            }
        }
Exemplo n.º 3
0
        public Network NetworkConfirmedPricing(AssetPair pair)
        {
            var     provs = Providers.OfList <IPublicPricingProvider>().OrderByVolume(pair).Where(x => x.IsDirect);
            var     ctx   = new PublicPriceContext(pair);
            Network net   = null;

            foreach (var i in provs)
            {
                lock (_confirmedLock)
                    if (_confirmed.Any(x => x.Item1 == i && Equals(x.Item2, pair)))
                    {
                        net = i.Network;
                        break;
                    }

                if (ApiCoordinator.GetPricing(i, ctx).IsNull)
                {
                    continue;
                }

                net = i.Network;

                lock (_confirmedLock)
                    _confirmed.Add(new Tuple <IPublicPricingProvider, AssetPair>(i, pair));
                break;
            }

            return(net);
        }
Exemplo n.º 4
0
        public async Task <AssetPairs> GetPairsAsync(Network network, bool onlyDirect = true)
        {
            var q    = onlyDirect ? network?.Providers.OfType <IAssetPairsProvider>().Where(x => x.IsDirect) : network?.Providers.OfType <IAssetPairsProvider>();
            var prov = q.FirstProvider();

            if (prov == null)
            {
                Logging.I.DefaultLogger.Error($"An instance of {nameof(IAssetPairsProvider)} cannot be located for {network.Name}");
                return(null);
            }

            var r = await ApiCoordinator.GetAssetPairsAsync(prov).ConfigureAwait(false);

            return(r.IsNull ? null : r.Response);
        }
Exemplo n.º 5
0
        public async void RefreshAsync()
        {
            var prov = Network.Providers.FirstProviderOf <IAssetPairsProvider>();

            if (prov == null)
            {
                throw new Exception($"Cannot 'refresh' {nameof(AssetPairData)} for {Network.Name} as a {nameof(IAssetPairsProvider)} cannot be located.");
            }

            var pairs = await ApiCoordinator.GetAssetPairsAsync(prov).ConfigureAwait(false);

            if (pairs.IsFailed)
            {
                return;
            }

            Pairs = pairs.Response;
        }
Exemplo n.º 6
0
        public void KeepFresh(UserContext context, IDepositProvider provider, Asset asset, bool forceStale = false)
        {
            var stale = forceStale || _ws.Any(x => x.Asset == asset && (!x.IsFresh() || x.IsExpired()));

            if (!stale)
            {
                return;
            }

            lock (Lock)
            {
                var r = ApiCoordinator.FetchAllDepositAddresses(provider, new WalletAddressAssetContext(asset, context));
                if (r.IsNull)
                {
                    return;
                }

                AddRange(r.Response.WalletAddresses);
                this.Save(context);
            }
        }
Exemplo n.º 7
0
        private void DoRefresh()
        {
            var cc = Networks.I.GetProvider <ICoinInformationProvider>();
            var r  = ApiCoordinator.GetCoinInformation(cc);

            if (r.IsNull)
            {
                return;
            }

            Items.Clear();
            Items.AddRange(r.Response);
            Items.Add(new AssetInfo()
            {
                Asset = Assets.I.GetRaw("EUR"), FullName = "Euro", SortOrder = 1
            });
            Items.Add(new AssetInfo()
            {
                Asset = Assets.I.GetRaw("USD"), FullName = "U.S. dollar", SortOrder = 1
            });
        }
        private OhlcData Convert(TimeRange range)
        {
            Ctx.Status("Converting @" + Ctx.PrimaryApiProvider.Title + " " + Ctx.CurrencyConversionApiProvider.Title + " [1]");

            var pc = new OhlcContext(new AssetPair(Ctx.Pair.Asset1, Ctx.AssetIntermediary), Ctx.TimeResolution, range, L);
            var r1 = ApiCoordinator.GetOhlc(Ctx.PrimaryApiProvider, pc);

            if (r1.IsNull)
            {
                return(null);
            }

            var d1 = r1.Response.OhlcData;

            Ctx.Status("Converting @" + Ctx.PrimaryApiProvider.Title + " " + Ctx.CurrencyConversionApiProvider.Title + " [2]");

            var pc2 = new OhlcContext(new AssetPair(Ctx.AssetIntermediary, Ctx.Pair.Asset2), Ctx.TimeResolution, range, L);

            var r2 = ApiCoordinator.GetOhlc(Ctx.CurrencyConversionApiProvider, pc2);

            if (r2.IsNull)
            {
                return(null);
            }

            var d2 = r2.Response.OhlcData;

            if (d1.IsEmpty() || d2.IsEmpty())
            {
                return(null);
            }

            if (d1.Count != d2.Count)
            {
                return(null);
            }

            var ohcldata = new OhlcData(_adapter.TimeResolution)
            {
                ConvertedFrom = Ctx.AssetIntermediary,
                Network       = Ctx.PrimaryApiProvider.Network
            };

            var seriesid = OhlcUtilities.GetHash(Ctx.Pair, range.TimeResolution, ohcldata.Network);

            foreach (var i in d1)
            {
                var i2 = d2.FirstOrDefault(x => x.DateTimeUtc == i.DateTimeUtc);
                if (i2 == null)
                {
                    return(null);
                }

                ohcldata.Add(new OhlcEntry(seriesid, i.DateTimeUtc, Ctx.PrimaryApiProvider, Ctx.CurrencyConversionApiProvider, Ctx.AssetIntermediary)
                {
                    Open            = i.Open * i2.Open,
                    Close           = i.Close * i2.Close,
                    High            = i.High * i2.High,
                    Low             = i.Low * i2.Low,
                    VolumeTo        = 0,
                    VolumeFrom      = i2.VolumeFrom,
                    WeightedAverage = 0
                });
            }

            return(ohcldata);
        }
Exemplo n.º 9
0
        private PublicVolumeResponse GetVolumeDataAgg(IAggVolumeDataProvider prov, AssetPair pair)
        {
            var apir = ApiCoordinator.GetAggVolumeData(prov, new AggVolumeDataContext(pair));

            return(apir.IsNull ? null : apir.Response);
        }