public async Task <OhlcDataResponse> GetOhlcAsync(OhlcContext context) { var api = ApiProvider.GetApi(context); var resolution = ConvertToBitMexInterval(context.Resolution); var startDate = context.Range.UtcFrom; var endDate = context.Range.UtcTo; var rRaw = await api.GetTradeHistoryAsync(context.Pair.Asset1.ToRemoteCode(this), resolution, startDate, endDate).ConfigureAwait(false); CheckResponseErrors(rRaw); var r = rRaw.GetContent(); var ohlc = new OhlcDataResponse(context.Resolution); var seriesId = OhlcUtilities.GetHash(context.Pair, context.Resolution, Network); foreach (var instrActive in r) { ohlc.Add(new OhlcEntry(seriesId, instrActive.timestamp, this) { Open = instrActive.open, Close = instrActive.close, Low = instrActive.low, High = instrActive.high, VolumeTo = instrActive.volume, VolumeFrom = instrActive.volume, WeightedAverage = (instrActive.vwap ?? 0) // BUG: what to set if vwap is NULL? }); } return(ohlc); }
public async Task <OhlcDataResponse> GetOhlcAsync(OhlcContext context) { var api = GdaxApiProvider.GetApi(context); var currencyCode = context.Pair.ToTicker(this); var ohlc = new OhlcDataResponse(context.Resolution); var seriesId = OhlcUtilities.GetHash(context.Pair, context.Resolution, Network); var granularitySeconds = GetSeconds(context.Resolution); var maxNumberOfCandles = 200; var tsFrom = (long)context.Range.UtcFrom.ToUnixTimeStamp(); var tsTo = (long)context.Range.UtcTo.ToUnixTimeStamp(); var tsStep = maxNumberOfCandles * granularitySeconds; var currTsTo = tsTo; var currTsFrom = tsTo - tsStep; while (currTsTo > tsFrom) { var candles = await api.GetCandlesAsync(currencyCode, currTsFrom.ToUtcDateTime(), currTsTo.ToUtcDateTime(), granularitySeconds).ConfigureAwait(false); foreach (var candle in candles) { var dateTime = ((long)candle[0]).ToUtcDateTime(); ohlc.Add(new OhlcEntry(seriesId, dateTime, this) { Low = candle[1], High = candle[2], Open = candle[3], Close = candle[4], VolumeTo = candle[5], VolumeFrom = candle[5], WeightedAverage = 0 // Is not provided by API. }); } currTsTo = currTsFrom; if (currTsTo - tsStep >= tsFrom) { currTsFrom -= tsStep; } else { currTsFrom = tsFrom; } ApiHelpers.EnterRate(this, context); } return(ohlc); }
public async Task <OhlcDataResponse> GetOhlcAsync(OhlcContext context) { var api = ApiProvider.GetApi(context); var krakenTimeInterval = ConvertToKrakenInterval(context.Resolution); // BUG: "since" is not implemented. Need to be checked. var r = await api.GetOhlcDataAsync(context.Pair.ToTicker(this, ""), krakenTimeInterval).ConfigureAwait(false); CheckResponseErrors(r); var ohlc = new OhlcDataResponse(context.Resolution); var seriesId = OhlcUtilities.GetHash(context.Pair, context.Resolution, Network); if (r.result.pairs.Count != 0) { foreach (var ohlcResponse in r.result.pairs.FirstOrDefault().Value.OrderByDescending(x => x.time)) { var time = ((long)ohlcResponse.time).ToUtcDateTime(); // BUG: ohlcResponse.volume is double ~0.2..10.2, why do we cast to long? ohlc.Add(new OhlcEntry(seriesId, time, this) { Open = ohlcResponse.open, Close = ohlcResponse.close, Low = ohlcResponse.low, High = ohlcResponse.high, VolumeTo = ohlcResponse.volume, // Cast to long should be revised. VolumeFrom = ohlcResponse.volume, WeightedAverage = ohlcResponse.vwap // Should be checked. }); } } else { throw new ApiResponseException("No OHLC data received", this); } return(ohlc); }
public async Task <OhlcDataResponse> GetOhlcAsync(OhlcContext context) { var api = ApiProvider.GetApi(context); var pairCode = context.Pair.ToTicker(this); var interval = ConvertToBinanceInterval(context.Resolution); var startDate = (long)(context.Range.UtcFrom.ToUnixTimeStamp() * 1000); var endDate = (long)(context.Range.UtcTo.ToUnixTimeStamp() * 1000); var rRaw = await api.GetCandlestickBarsAsync(pairCode, interval, startDate, endDate).ConfigureAwait(false); CheckResponseErrors(rRaw); var r = rRaw.GetContent(); var ohlc = new OhlcDataResponse(context.Resolution); var seriesId = OhlcUtilities.GetHash(context.Pair, context.Resolution, Network); foreach (var rEntry in r) { var dateTime = ((long)(rEntry[0] / 1000)).ToUtcDateTime(); ohlc.Add(new OhlcEntry(seriesId, dateTime, this) { Open = rEntry[1], Close = rEntry[4], Low = rEntry[3], High = rEntry[2], VolumeTo = rEntry[7], // Quote asset volume VolumeFrom = rEntry[5], // Volume WeightedAverage = 0 // BUG: no WeightedAverage data returned from API. }); } ohlc.Reverse(); return(ohlc); }
public async Task <OhlcDataResponse> GetOhlcAsync(OhlcContext context) { var pair = context.Pair; var resolution = context.Resolution; var timeStampStart = (long)context.Range.UtcFrom.ToUnixTimeStamp(); var timeStampEnd = (long)context.Range.UtcTo.ToUnixTimeStamp(); var period = ConvertToPoloniexInterval(resolution); var api = ApiProvider.GetApi(context); var rRaw = await api.GetChartDataAsync(pair.ToTicker(this), timeStampStart, timeStampEnd, period).ConfigureAwait(false); CheckResponseErrors(rRaw); var r = rRaw.GetContent(); var ohlc = new OhlcDataResponse(resolution); var seriesid = OhlcUtilities.GetHash(pair, resolution, Network); foreach (var ohlcEntry in r) { ohlc.Add(new OhlcEntry(seriesid, ohlcEntry.date.ToUtcDateTime(), this) { Open = ohlcEntry.open, Close = ohlcEntry.close, Low = ohlcEntry.low, High = ohlcEntry.high, VolumeTo = ohlcEntry.quoteVolume, VolumeFrom = ohlcEntry.volume, WeightedAverage = ohlcEntry.weightedAverage }); } return(ohlc); }
public async Task <OhlcDataResponse> GetOhlcAsync(OhlcContext context) { var range = context.Range; var resolution = context.Resolution; var pair = context.Pair; var limit = range.GetDistanceInResolutionTicks(); var toTs = range.UtcTo.GetSecondsSinceUnixEpoch(); var api = GetApi <ICryptoCompareApi>(); CryptoCompareSchema.HistoricListResult apir = null; switch (resolution) { case TimeResolution.Hour: apir = await api.GetHistoricalHourlyAsync(pair.Asset1.ToRemoteCode(this), pair.Asset2.ToRemoteCode(this), Name, "prime", "false", "true", 0, limit, toTs).ConfigureAwait(false); break; case TimeResolution.Day: apir = await api.GetHistoricalDayAsync(pair.Asset1.ToRemoteCode(this), pair.Asset2.ToRemoteCode(this), Name, "prime", "false", "true", 0, limit, toTs, "false").ConfigureAwait(false); break; case TimeResolution.Minute: apir = await api.GetHistoricalMinuteAsync(pair.Asset1.ToRemoteCode(this), pair.Asset2.ToRemoteCode(this), Name, "prime", "false", "true", 0, limit, toTs).ConfigureAwait(false); break; } if (apir.IsError()) { return(null); } var r = new OhlcDataResponse(resolution); var seriesid = OhlcUtilities.GetHash(pair, resolution, Network); var from = apir.TimeFrom; var to = apir.TimeTo; foreach (var i in apir.Data.Where(x => x.time >= from && x.time <= to)) { var t = ((double)i.time).UnixTimestampToDateTime(); r.Add(new OhlcEntry(seriesid, t, this) { Open = i.open, Close = i.close, Low = i.low, High = i.high, VolumeFrom = i.volumefrom, VolumeTo = i.volumeto }); } if (!string.IsNullOrWhiteSpace(apir.ConversionType.conversionSymbol)) { r.OhlcData.ConvertedFrom = apir.ConversionType.conversionSymbol.ToAsset(this); } return(r); }