예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }