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); }
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()); } }
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); }
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); }
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; }
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); } }
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); }
private PublicVolumeResponse GetVolumeDataAgg(IAggVolumeDataProvider prov, AssetPair pair) { var apir = ApiCoordinator.GetAggVolumeData(prov, new AggVolumeDataContext(pair)); return(apir.IsNull ? null : apir.Response); }