Example #1
0
        /// <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);
            }
        }
Example #2
0
        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
        }
Example #3
0
        /// <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);
            }
        }