private IEnumerable <Bar> getHistoricalData(string symbol, Resolution resolution, DateTime startDateTime, DateTime endDateTime) { GetHistoricalDataResponseListener responseListener = new GetHistoricalDataResponseListener(session); session.subscribeResponse(responseListener); List <FxBar> barList = new List <FxBar>(); for (int i = 0; i < 100; i++) { var bars = getHistoryPrices(session, symbol, resolution, startDateTime, endDateTime, 1000, responseListener); if (barList.Count() > 0 && bars.Count() > 0 && bars.Last().DateTime == barList.First().DateTime) { bars.RemoveAt(bars.Count() - 1); } if (bars.Count() == 0) { break; } barList.InsertRange(0, bars); endDateTime = barList.First().DateTime; } if (resolution.TimeFrame == TimeFrame.Quarterly) { return(normalizeToQuarterlyTimeFrame(barList)); } session.unsubscribeResponse(responseListener); return(barList); }
private List <FxBar> getHistoryPrices(O2GSession session, string instrument, Resolution resolution, DateTime startDateTime, DateTime endDateTime, int maxBars, GetHistoricalDataResponseListener responseListener) { O2GRequestFactory factory = session.getRequestFactory(); var tf = convert_Resolution_To_string(resolution); O2GTimeframe timeframe = factory.Timeframes[tf]; if (timeframe == null) { throw new TimeframeNotFoundException($"Timeframe '{resolution.TimeFrame}:{resolution.Size}' is incorrect!"); } O2GRequest request = factory.createMarketDataSnapshotRequestInstrument(instrument, timeframe, maxBars); factory.fillMarketDataSnapshotRequestTime(request, startDateTime, endDateTime, false); responseListener.SetRequestID(request.RequestID); session.sendRequest(request); if (!responseListener.WaitEvents()) { throw new Exception($"{responseListener.Error}"); } O2GResponse response = responseListener.GetResponse(); List <FxBar> barList = new List <FxBar>(); if (response != null && response.Type == O2GResponseType.MarketDataSnapshot) { O2GResponseReaderFactory readerFactory = session.getResponseReaderFactory(); if (readerFactory != null) { O2GMarketDataSnapshotResponseReader reader = readerFactory.createMarketDataSnapshotReader(response); if (reader.Count > 0) { for (int i = 0; i < reader.Count; i++) { barList.Add(new FxBar { Open = reader.getBidOpen(i), High = reader.getBidHigh(i), Low = reader.getBidLow(i), Close = reader.getBidClose(i), Volume = reader.getVolume(i), DateTime = reader.getDate(i) }); } } } } return(barList); }