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); }
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); }
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); }
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); }
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); }
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); }
/// <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); }
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); }
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); } }
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); }
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); }
/// <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(); }
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)); }); }
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); }
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); } }
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); }
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); } }
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); }
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; }
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); } }
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); }
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); }
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); } }
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); }
public static bool IsNotEmpty(this OhlcData data) { return(data != null && data.Count > 0); }
public static bool IsEmpty(this OhlcData data) { return(data == null || data.Count == 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); }
public OhlcDataUpdatedEvent(OhlcData newData, Asset asset, bool isLive) { NewData = newData; Asset = asset; IsLive = isLive; }
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); }