コード例 #1
0
        public async Task <OhlcData> GetOhlcAsync(OhlcContext context)
        {
            var api = ApiProvider.GetApi(context);

            var pairCode = context.Pair.ToTicker(this);

            var interval  = ConvertToBinanceInterval(context.Market);
            var startDate = (long)(context.Range.UtcFrom.ToUnixTimeStamp() * 1000);
            var endDate   = (long)(context.Range.UtcTo.ToUnixTimeStamp() * 1000);

            var r = await api.GetCandlestickBarsAsync(pairCode, interval, startDate, endDate).ConfigureAwait(false);

            var ohlc = new OhlcData(context.Market);

            var seriesId = OhlcUtilities.GetHash(context.Pair, context.Market, 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);
        }
コード例 #2
0
ファイル: PoloniexProvider.cs プロジェクト: rsdaltx/prime
        public async Task <OhlcData> GetOhlcAsync(OhlcContext context)
        {
            var pair   = context.Pair;
            var market = context.Market;

            var timeStampStart = (long)context.Range.UtcFrom.ToUnixTimeStamp();
            var timeStampEnd   = (long)context.Range.UtcTo.ToUnixTimeStamp();

            var period = ConvertToPoloniexInterval(market);

            var api = ApiProvider.GetApi(context);
            var r   = await api.GetChartDataAsync(pair.ToTicker(this), timeStampStart, timeStampEnd, period).ConfigureAwait(false);

            var ohlc     = new OhlcData(market);
            var seriesid = OhlcUtilities.GetHash(pair, market, 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);
        }
        private ArrayList getData()
        {
            ArrayList data = new ArrayList();
            int       size = 10;

            Java.Util.Random r = new Java.Util.Random();

            for (int i = 1; i <= size; ++i)
            {
                OhlcData ohlc = new OhlcData();
                ohlc.category = i.ToString();
                ohlc.high     = r.NextInt(100);
                if (ohlc.high < 2)
                {
                    ohlc.high = 2;
                }

                ohlc.low   = r.NextInt(ohlc.high - 1);
                ohlc.open  = ohlc.low + r.NextInt(ohlc.high - ohlc.low);
                ohlc.close = ohlc.low + r.NextInt(ohlc.high - ohlc.low);

                data.Add(ohlc);
            }

            return(data);
        }
コード例 #4
0
        public static GCandleSeries ToGCandleSeries(this OhlcData data, ResolutionSourceProvider resolver = null, string title = "")
        {
            var ohlcChartPointEvaluator = new OhlcInstantChartPointMapper(resolver ?? new ResolutionSourceProvider(data.Resolution));

            var series = new GCandleSeries
            {
                Configuration = ohlcChartPointEvaluator,
                IncreaseBrush = Brushes.Aquamarine,
                DecreaseBrush = Brushes.LightCoral,
                Fill          = Brushes.Transparent,
                Title         = title
            };

            if (data == null)
            {
                return(series);
            }

            var values = new GearedValues <OhlcInstantChartPoint>();

            values.AddRange(data.OrderBy(x => x.DateTimeUtc).Select(i => new OhlcInstantChartPoint(i)));

            series.Values = values;

            return(series);
        }
コード例 #5
0
        private OhlcData CreateDataItem(MarketDataItemRange range, decimal amount, decimal volume, string currency, DateTime date)
        {
            OhlcData result = new OhlcData();

            result.CurrencyId = currency;
            result.Volume     = volume;
            result.VolumeBase = volume * amount;

            result.Max   = amount;
            result.Min   = amount;
            result.Close = amount;
            result.Date  = date;
            result.Range = range;

            _context.Add(result);
            _context.SaveChanges();

            OhlcData previous = GetPreviousDataItem(result);

            if (previous == null)
            {
                result.Open = 0;
            }
            else
            {
                result.Open = previous.Close;
            }

            return(result);
        }
コード例 #6
0
ファイル: BitMexProvider.cs プロジェクト: whiteneutron/prime
        public async Task <OhlcData> GetOhlcAsync(OhlcContext context)
        {
            var api = ApiProvider.GetApi(context);

            var resolution = ConvertToBitMexInterval(context.Market);
            var startDate  = context.Range.UtcFrom;
            var endDate    = context.Range.UtcTo;

            var r = await api.GetTradeHistoryAsync(context.Pair.Asset1.ToRemoteCode(this), resolution, startDate, endDate).ConfigureAwait(false);

            var ohlc     = new OhlcData(context.Market);
            var seriesId = OhlcUtilities.GetHash(context.Pair, context.Market, 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);
        }
コード例 #7
0
        private OhlcData CollectApi(TimeRange range, OhlcData results)
        {
            var apiresults = ApiAdapters.Select(x => x.GetRange(range)).FirstOrDefault(o => o.IsNotEmpty());

            results = results ?? new OhlcData(range.TimeResolution);
            results.Merge(apiresults);
            return(results);
        }
コード例 #8
0
        /// <summary>
        /// Get previous OHLC data item
        /// </summary>
        /// <param name="item">OHLC data item detalis</param>
        /// <returns></returns>
        private OhlcData GetPreviousDataItem(OhlcData item)
        {
            OhlcData result = null;

            result = _context.OHLCData.Where(a => a.Range == item.Range && a.CurrencyId == item.CurrencyId && a.Id < item.Id).OrderByDescending(a => a.Id).Take(1).FirstOrDefault();

            return(result);
        }
コード例 #9
0
        public async Task <OhlcData> GetOhlcAsync(OhlcContext context)
        {
            var api          = GdaxApiProvider.GetApi(context);
            var currencyCode = context.Pair.ToTicker(this);

            var ohlc     = new OhlcData(context.Market);
            var seriesId = OhlcUtilities.GetHash(context.Pair, context.Market, Network);

            var granularitySeconds = GetSeconds(context.Market);
            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             = (double)candle[1],
                        High            = (double)candle[2],
                        Open            = (double)candle[3],
                        Close           = (double)candle[4],
                        VolumeTo        = (long)candle[5],
                        VolumeFrom      = (long)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);
        }
コード例 #10
0
        public OhlcData GetRange(TimeRange timeRange)
        {
            lock (Lock) {
                Ctx.Status("Requesting local data @" + Ctx.Network.Name);

                var seriesId = _adapter.SeriesId;

                var r = GetDbCollection().Where(x => x.SeriesId == seriesId && x.DateTimeUtcTicks >= timeRange.UtcFrom.Ticks && x.DateTimeUtcTicks <= timeRange.UtcTo.Ticks).ToList();
                var d = new OhlcData(timeRange.TimeResolution);
                d.AddRange(r);
                return(d);
            }
        }
コード例 #11
0
        private void RequestFullDaily()
        {
            var range = TimeRange.EveryDayTillNow;

            OverviewOhlc = Request(range, true);

            if (OverviewOhlc.IsEmpty())
            {
                throw new Exception("Data range missing during " + nameof(Init));
            }

            UtcDataStart = OverviewOhlc.Min(x => x.DateTimeUtc);
        }
コード例 #12
0
        private OhlcData ComputeOHLC(List <Trade> trades, int barNum)
        {
            OhlcData data = new OhlcData();

            data.Open    = barNum == 1 ? trades.OrderBy(x => x.Id).Select(x => x.TradePrice).FirstOrDefault() : tradeClose;
            data.High    = trades.Max(x => x.TradePrice) < data.Open ? data.Open : trades.Max(x => x.TradePrice);
            data.Low     = trades.Min(x => x.TradePrice) > data.Open ? data.Open : trades.Min(x => x.TradePrice);
            data.Close   = trades.OrderByDescending(x => x.Id).Select(x => x.TradePrice).FirstOrDefault();
            data.Volume  = trades.Sum(x => x.QuantityTraded);
            data.Symbol  = trades.Select(x => x.StockName).FirstOrDefault();
            data.Bar_num = barNum;
            tradeClose   = data.Close;
            return(data);
        }
コード例 #13
0
        /// <summary>
        /// Update OHLC data
        /// </summary>
        /// <param name="range">Range</param>
        /// <param name="amount">Amount</param>
        /// <param name="volume">Volume</param>
        /// <param name="currency">Currency</param>
        /// <param name="date">Date</param>
        public void PutData(MarketDataItemRange range, decimal amount, decimal volume, string currency, DateTime date)
        {
            OhlcData di = GetDataItem(range, currency, date);

            if (di == null)
            {
                di = CreateDataItem(range, amount, volume, currency, date);
            }
            else
            {
                UpdateDataItem(di, amount, volume);
            }

            _context.SaveChanges();
        }
コード例 #14
0
        private void StoreResults(TimeRange timeRange, OhlcData results)
        {
            var clone = new OhlcData(results); // ienumerable modifications during storage process.

            if (timeRange.TimeResolution != TimeResolution.Day)
            {
                clone.RemoveAll(x => x.DateTimeUtc.IsLive(timeRange.TimeResolution));
            }

            ThreadPool.QueueUserWorkItem(delegate
            {
                lock (_storageLock)
                    Parallel.ForEach(StorageAdapters, a => a.StoreRange(clone, timeRange));
            });
        }
コード例 #15
0
        private OhlcData ContinuousOrMergedStorage(TimeRange timeRange, bool allowLive = false)
        {
            var partials = new List <OhlcData>();

            foreach (var r in StorageAdapters.Select(x => x.GetRange(timeRange)))
            {
                if (r.IsEmpty())
                {
                    continue;
                }

                if (!allowLive)
                {
                    r.RemoveAll(x => x.CollectedNearLive);
                }

                if (r.IsCovering(timeRange))
                {
                    return(r.HasGap() ? null : r);
                }

                partials.Add(r);
            }

            if (!partials.Any())
            {
                return(null);
            }

            var mergedData = new OhlcData(partials.First());

            mergedData.ConvertedFrom = partials.Select(x => x.ConvertedFrom).FirstOrDefault(x => x != null) ?? mergedData.ConvertedFrom;

            foreach (var i in partials)
            {
                mergedData.Merge(i);
            }

            if (!timeRange.IsFromInfinity && mergedData.HasGap())
            {
                return(null);
            }

            return(mergedData);
        }
コード例 #16
0
        public OhlcData GetRange(TimeRange timeRange)
        {
            lock (Lock) {
                Ctx.Status("Requesting in-memory data");

                var seriesId = _adapter.SeriesId;

                if (!CoverageMap.Covers(timeRange))
                {
                    return(null);
                }

                var r = MemoryCache.Where(x => x.SeriesId == seriesId && x.DateTimeUtc >= timeRange.UtcFrom && x.DateTimeUtc <= timeRange.UtcTo).ToList();
                var d = new OhlcData(timeRange.TimeResolution);
                d.AddRange(r);
                return(d);
            }
        }
コード例 #17
0
        private OhlcData UpdateDataItem(OhlcData item, decimal amount, decimal volume)
        {
            item.Volume     += volume;
            item.VolumeBase += volume * amount;

            if (item.Max < amount)
            {
                item.Max = amount;
            }

            if (item.Min > amount)
            {
                item.Min = amount;
            }

            item.Close = amount;

            return(item);
        }
コード例 #18
0
        public void StoreRange(OhlcData data, TimeRange rangeAttempted)
        {
            lock (Lock)
            {
                if (data == null)
                {
                    return;
                }

                if (CoverageMap.Found.Covers(rangeAttempted))
                {
                    return;
                }

                Parallel.ForEach(data, x => x.SeriesId = _adapter.SeriesId);

                MemoryCache.AddRange(data);

                CoverageMap.Include(rangeAttempted, data);
            }
        }
コード例 #19
0
ファイル: KrakenProvider.cs プロジェクト: whiteneutron/prime
        public async Task <OhlcData> GetOhlcAsync(OhlcContext context)
        {
            var api = ApiProvider.GetApi(context);

            var krakenTimeInterval = ConvertToKrakenInterval(context.Market);

            // 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 OhlcData(context.Market);
            var seriesId = OhlcUtilities.GetHash(context.Pair, context.Market, 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);
        }
コード例 #20
0
		private ArrayList getData() {
			ArrayList data = new ArrayList();
			int size = 10;
			Java.Util.Random r = new Java.Util.Random();

			for (int i = 1; i <= size; ++i) {
				OhlcData ohlc = new OhlcData();
				ohlc.category = i.ToString();
				ohlc.high = r.NextInt(100);
				if (ohlc.high < 2) {
					ohlc.high = 2;
				}

				ohlc.low = r.NextInt(ohlc.high - 1);
				ohlc.open = ohlc.low + r.NextInt(ohlc.high - ohlc.low);
				ohlc.close = ohlc.low + r.NextInt(ohlc.high - ohlc.low);

				data.Add(ohlc);
			}

			return data;
		}
コード例 #21
0
        private OhlcData RequestInternal(TimeRange timeRange, bool allowLive = false)
        {
            if (!_apiAdapters.Any() && !_storageAdapters.Any())
            {
                return(null);
            }

            if (!StorageEnabled && !ApiEnabled)
            {
                return(null);
            }

            lock (_lock)
            {
                OhlcData results = null;

                if (StorageEnabled)
                {
                    results = ContinuousOrMergedStorage(timeRange, allowLive);
                }

                var hasRemaining = results.IsEmpty() ? null : results.Remaining(timeRange);

                if (ApiEnabled && (results.IsEmpty() || hasRemaining != null))
                {
                    results = CollectApi(hasRemaining ?? timeRange, results);
                }

                Ctx.Status(results.IsNotEmpty() ? "Data received, processing." : "No data received.");

                if (StorageEnabled && results.IsNotEmpty())
                {
                    StoreResults(timeRange, results);
                }

                return(results);
            }
        }
コード例 #22
0
        public static GLineSeries ToSmaSeries(this OhlcData data, int length, ResolutionSourceProvider resolver = null, string title = null)
        {
            title = title ?? length + " SMA";

            var chartPointEvaluator = new InstantChartPointMapper(resolver ?? new ResolutionSourceProvider(data.Resolution));

            var series = new GLineSeries
            {
                Configuration = chartPointEvaluator,
                Fill          = Brushes.Transparent,
                PointGeometry = null,
                Title         = title
            };

            if (data == null)
            {
                return(series);
            }

            var values  = new GearedValues <InstantChartPoint>();
            var ordered = data.OrderBy(x => x.DateTimeUtc).ToList();
            var smadata = FinancialHelper.ComputeMovingAverage(ordered.Select(x => x.Close).ToList(), length);

            for (var index = 0; index < ordered.Count; index++)
            {
                var d = ordered[index];
                var v = smadata[index];
                if (double.IsNaN(v))
                {
                    continue;
                }
                values.Add(new InstantChartPoint(d.DateTimeUtc, (decimal)v));
            }

            series.Values = values;

            return(series);
        }
コード例 #23
0
        public static GColumnSeries ToVolumeSeries(this OhlcData data, ResolutionSourceProvider resolver = null, string title = "")
        {
            var chartPointEvaluator = new InstantChartPointMapper(resolver ?? new ResolutionSourceProvider(data.Resolution));

            var series = new GColumnSeries
            {
                Configuration = chartPointEvaluator,
                Title         = title
            };

            if (data == null)
            {
                return(series);
            }

            var values = new GearedValues <InstantChartPoint>();

            values.AddRange(data.OrderBy(x => x.DateTimeUtc).Select(i => new InstantChartPoint(i)));
            values.Quality = Quality.Low;
            series.Values  = values;

            return(series);
        }
コード例 #24
0
        public void StoreRange(OhlcData data, TimeRange rangeAttempted)
        {
            lock (Lock)
            {
                if (data == null)
                {
                    return;
                }

                var isInDb = CoverageMap.Found.Covers(rangeAttempted);
                if (isInDb)
                {
                    return;
                }

                var seriesId = _adapter.SeriesId;
                var col      = PublicContext.I.GetCollection <OhlcEntry>();
                data.ForEach(x => x.SeriesId = seriesId);

                col.Upsert(data);

                CoverageMap.Include(rangeAttempted, data);
            }
        }
コード例 #25
0
        public async Task <OhlcData> GetOhlcAsync(OhlcContext context)
        {
            var range  = context.Range;
            var market = context.Market;
            var pair   = context.Pair;

            var limit = range.GetDistanceInResolutionTicks();
            var toTs  = range.UtcTo.GetSecondsSinceUnixEpoch();

            var api = GetApi <ICryptoCompareApi>();

            CryptoCompareSchema.HistoricListResult apir = null;

            switch (market)
            {
            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 OhlcData(market);
            var seriesid = OhlcUtilities.GetHash(pair, market, 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.ConvertedFrom = apir.ConversionType.conversionSymbol.ToAsset(this);
            }

            return(r);
        }
コード例 #26
0
 public static bool IsNotEmpty(this OhlcData data)
 {
     return(data != null && data.Count > 0);
 }
コード例 #27
0
 public static bool IsEmpty(this OhlcData data)
 {
     return(data == null || data.Count == 0);
 }
コード例 #28
0
        /// <summary>
        /// Get OHLC element from database
        /// </summary>
        /// <param name="range">Range</param>
        /// <param name="currency">Currency</param>
        /// <param name="date">Date</param>
        /// <returns></returns>
        private OhlcData GetDataItem(MarketDataItemRange range, string currency, DateTime date)
        {
            OhlcData result = null;

            if (range == MarketDataItemRange.Year)
            {
                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2}", range, currency, date.Year).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Month)
            {
                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3}", range, currency, date.Year, date.Month).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Day)
            {
                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4}", range, currency, date.Year, date.Month, date.Day).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Hour4)
            {
                int hour = date.Hour;
                int range_start, range_end;

                BuildRange(1, 23, 6, hour, out range_start, out range_end);

                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4} and ((date_part('hour', \"Date\") >= {5}) and (date_part('hour', \"Date\") < {6}))", range, currency, date.Year, date.Month, date.Day, range_start, range_end).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Hour)
            {
                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4} and date_part('hour', \"Date\")={5}", range, currency, date.Year, date.Month, date.Day, date.Hour).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Minute)
            {
                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4} and date_part('hour', \"Date\")={5} and date_part('minute', \"Date\")={6}", range, currency, date.Year, date.Month, date.Day, date.Hour, date.Minute).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Minutes30)
            {
                int minute = date.Minute;
                int range_start, range_end;

                BuildRange(1, 59, 2, minute, out range_start, out range_end);

                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4} and date_part('hour', \"Date\")={5} and (date_part('minute', \"Date\")>={6} and date_part('minute', \"Date\")<{7})", range, currency, date.Year, date.Month, date.Day, date.Hour, range_start, range_end).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Minutes15)
            {
                int minute = date.Minute;
                int range_start, range_end;

                BuildRange(1, 59, 4, minute, out range_start, out range_end);

                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4} and date_part('hour', \"Date\")={5} and (date_part('minute', \"Date\")>={6} and date_part('minute', \"Date\")<{7})", range, currency, date.Year, date.Month, date.Day, date.Hour, range_start, range_end).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Minutes5)
            {
                int minute = date.Minute;
                int range_start, range_end;

                BuildRange(1, 59, 12, minute, out range_start, out range_end);

                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4} and date_part('hour', \"Date\")={5} and (date_part('minute', \"Date\")>={6} and date_part('minute', \"Date\")<{7})", range, currency, date.Year, date.Month, date.Day, date.Hour, range_start, range_end).FirstOrDefault();
            }

            if (range == MarketDataItemRange.Minutes3)
            {
                int minute = date.Minute;
                int range_start, range_end;

                BuildRange(1, 59, 20, minute, out range_start, out range_end);

                result = _context.OHLCData.FromSql("select * from \"OHLCData\" where \"Range\"={0} and \"CurrencyId\"={1} and date_part('year', \"Date\")={2} and date_part('month', \"Date\")={3} and date_part('day', \"Date\")={4} and date_part('hour', \"Date\")={5} and (date_part('minute', \"Date\")>={6} and date_part('minute', \"Date\")<{7})", range, currency, date.Year, date.Month, date.Day, date.Hour, range_start, range_end).FirstOrDefault();
            }

            return(result);
        }
            public override Java.Lang.Object GetValue(Java.Lang.Object p0)
            {
                OhlcData entity = (OhlcData)p0;

                return(entity.category);
            }
コード例 #30
0
 public OhlcDataUpdatedEvent(OhlcData newData, Asset asset, bool isLive)
 {
     NewData = newData;
     Asset   = asset;
     IsLive  = isLive;
 }
コード例 #31
0
        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;

            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;

            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);
        }