/// <summary> /// Gets the history for the requested security /// </summary> /// <param name="request">The historical data request</param> /// <returns>An enumerable of bars covering the span specified in the request</returns> public override IEnumerable <BaseData> GetHistory(HistoryRequest request) { if (!_symbolMapper.IsKnownLeanSymbol(request.Symbol)) { Log.Trace("OandaBrokerage.GetHistory(): Invalid symbol: {0}, no history returned", request.Symbol.Value); yield break; } var exchangeTimeZone = MarketHoursDatabase.FromDataFolder().GetExchangeHours(Market.Oanda, request.Symbol, request.Symbol.SecurityType).TimeZone; // Oanda only has 5-second bars, we return these for Resolution.Second var period = request.Resolution == Resolution.Second ? TimeSpan.FromSeconds(5) : request.Resolution.ToTimeSpan(); // set the starting date/time var startDateTime = request.StartTimeUtc; // loop until last date while (startDateTime <= request.EndTimeUtc) { // request blocks of bars at the requested resolution with a starting date/time var quoteBars = _api.DownloadQuoteBars(request.Symbol, startDateTime, request.EndTimeUtc, request.Resolution, exchangeTimeZone).ToList(); if (quoteBars.Count == 0) { break; } foreach (var quoteBar in quoteBars) { yield return(quoteBar); } // calculate the next request datetime startDateTime = quoteBars[quoteBars.Count - 1].Time.ConvertToUtc(exchangeTimeZone).Add(period); } }
public void ChecksForKnownSymbols() { #pragma warning disable 0618 // This test requires implicit operators var mapper = new OandaSymbolMapper(); Assert.IsFalse(mapper.IsKnownBrokerageSymbol(null)); Assert.IsFalse(mapper.IsKnownBrokerageSymbol("")); Assert.IsTrue(mapper.IsKnownBrokerageSymbol("EUR_USD")); Assert.IsTrue(mapper.IsKnownBrokerageSymbol("DE30_EUR")); Assert.IsFalse(mapper.IsKnownBrokerageSymbol("ABC_USD")); Assert.IsFalse(mapper.IsKnownLeanSymbol(null)); Assert.IsFalse(mapper.IsKnownLeanSymbol("")); Assert.IsFalse(mapper.IsKnownLeanSymbol(Symbol.Empty)); Assert.IsTrue(mapper.IsKnownLeanSymbol(Symbol.Create("EURUSD", SecurityType.Forex, Market.Oanda))); Assert.IsFalse(mapper.IsKnownLeanSymbol(Symbol.Create("ABCUSD", SecurityType.Forex, Market.Oanda))); Assert.IsFalse(mapper.IsKnownLeanSymbol(Symbol.Create("EURUSD", SecurityType.Cfd, Market.Oanda))); Assert.IsFalse(mapper.IsKnownLeanSymbol(Symbol.Create("DE30EUR", SecurityType.Forex, Market.Oanda))); #pragma warning restore 0618 }
/// <summary> /// Gets the history for the requested security /// </summary> /// <param name="request">The historical data request</param> /// <returns>An enumerable of bars covering the span specified in the request</returns> public override IEnumerable <BaseData> GetHistory(HistoryRequest request) { if (!_symbolMapper.IsKnownLeanSymbol(request.Symbol)) { Log.Trace("OandaBrokerage.GetHistory(): Invalid symbol: {0}, no history returned", request.Symbol.Value); yield break; } var granularity = ToGranularity(request.Resolution); // Oanda only has 5-second bars, we return these for Resolution.Second var period = request.Resolution == Resolution.Second ? TimeSpan.FromSeconds(5) : request.Resolution.ToTimeSpan(); // set the starting date/time var startDateTime = request.StartTimeUtc; // loop until last date while (startDateTime <= request.EndTimeUtc) { var start = startDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); // request blocks of bars at the requested resolution with a starting date/time var oandaSymbol = _symbolMapper.GetBrokerageSymbol(request.Symbol); var candles = DownloadBars(oandaSymbol, start, MaxBarsPerRequest, granularity, ECandleFormat.bidask); if (candles.Count == 0) { break; } foreach (var candle in candles) { var time = GetDateTimeFromString(candle.time); if (time > request.EndTimeUtc) { break; } var quoteBar = new QuoteBar( time, request.Symbol, new Bar( Convert.ToDecimal(candle.openBid), Convert.ToDecimal(candle.highBid), Convert.ToDecimal(candle.lowBid), Convert.ToDecimal(candle.closeBid) ), 0, new Bar( Convert.ToDecimal(candle.openAsk), Convert.ToDecimal(candle.highAsk), Convert.ToDecimal(candle.lowAsk), Convert.ToDecimal(candle.closeAsk) ), 0, period); yield return(quoteBar); } // calculate the next request datetime startDateTime = GetDateTimeFromString(candles[candles.Count - 1].time).Add(period); } }