Skip to content

Commit

Permalink
feat: return null in GetHistory
Browse files Browse the repository at this point in the history
  • Loading branch information
Romazes committed Feb 22, 2024
1 parent 19e88c5 commit 6288c2f
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ public class AlphaVantageDataDownloaderMockTests
private AlphaVantageDataDownloader _downloader;
private readonly TradeBarComparer _tradeBarComparer = new TradeBarComparer();

private Symbol AAPL;
private Symbol IBM;

[OneTimeSetUp]
public void OneTimeSetUp()
{
AAPL = new Symbol(SecurityIdentifier.GenerateEquity("AAPL", Market.USA, false), "AAPL");
IBM = new Symbol(SecurityIdentifier.GenerateEquity("IBM", Market.USA, false), "IBM");
}

[SetUp]
public void SetUp()
{
Expand All @@ -46,7 +56,7 @@ public void SetUp()
[TearDown]
public void TearDown()
{
if (_downloader != null )
if (_downloader != null)
{
_downloader.Dispose();
}
Expand All @@ -55,16 +65,14 @@ public void TearDown()
[Test]
public void GetDailyLessThan100DaysGetsCompactDailyData()
{
var ticker = "AAPL";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var resolution = Resolution.Daily;
var start = new DateTime(2021, 4, 4);
var end = new DateTime(2021, 7, 12);

var expectedBars = new[]
{
new TradeBar(DateTime.Parse("2021-04-05"), symbol, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), symbol, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
new TradeBar(DateTime.Parse("2021-04-05"), AAPL, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), AAPL, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
};

IRestRequest request = null;
Expand All @@ -80,7 +88,7 @@ public void GetDailyLessThan100DaysGetsCompactDailyData()
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end));
var result = _downloader.Get(new DataDownloaderGetParameters(AAPL, resolution, start, end));

_avClient.Verify();
var requestUrl = BuildUrl(request);
Expand All @@ -97,16 +105,14 @@ public void GetDailyLessThan100DaysGetsCompactDailyData()
[Test]
public void GetDailyGreaterThan100DaysGetsFullDailyData()
{
var ticker = "AAPL";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var resolution = Resolution.Daily;
var start = new DateTime(2021, 4, 4);
var end = new DateTime(2024, 1, 1);

var expectedBars = new[]
{
new TradeBar(DateTime.Parse("2021-04-05"), symbol, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), symbol, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
new TradeBar(DateTime.Parse("2021-04-05"), AAPL, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2021-04-06"), AAPL, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
};

IRestRequest request = null;
Expand All @@ -122,7 +128,7 @@ public void GetDailyGreaterThan100DaysGetsFullDailyData()
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end));
var result = _downloader.Get(new DataDownloaderGetParameters(AAPL, resolution, start, end));

_avClient.Verify();
var requestUrl = BuildUrl(request);
Expand All @@ -140,18 +146,16 @@ public void GetDailyGreaterThan100DaysGetsFullDailyData()
[TestCase(Resolution.Hour, "60min")]
public void GetMinuteHourGetsIntradayData(Resolution resolution, string interval)
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var year = DateTime.UtcNow.Year - 1;
var start = new DateTime(year, 04, 05, 0, 0, 0);
var end = new DateTime(year, 05, 06, 15, 0, 0);

var expectedBars = new[]
{
new TradeBar(start.AddHours(9.5), symbol, 133.71m, 133.72m, 133.62m, 133.62m, 1977),
new TradeBar(start.AddHours(10.5), symbol, 134.30m, 134.56m, 134.245m, 134.34m, 154723),
new TradeBar(end.AddHours(-5.5), symbol, 135.54m, 135.56m, 135.26m, 135.28m, 2315),
new TradeBar(end.AddHours(-4.5), symbol, 134.905m,134.949m, 134.65m, 134.65m, 101997),
new TradeBar(start.AddHours(9.5), IBM, 133.71m, 133.72m, 133.62m, 133.62m, 1977),
new TradeBar(start.AddHours(10.5), IBM, 134.30m, 134.56m, 134.245m, 134.34m, 154723),
new TradeBar(end.AddHours(-5.5), IBM, 135.54m, 135.56m, 135.26m, 135.28m, 2315),
new TradeBar(end.AddHours(-4.5), IBM, 134.905m,134.949m, 134.65m, 134.65m, 101997),
};

var responses = new[]
Expand All @@ -176,7 +180,7 @@ public void GetMinuteHourGetsIntradayData(Resolution resolution, string interval
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList();
var result = _downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end)).ToList();

_avClient.Verify();
Assert.AreEqual(2, requestUrls.Count);
Expand All @@ -195,21 +199,17 @@ public void GetMinuteHourGetsIntradayData(Resolution resolution, string interval
[TestCase(Resolution.Second)]
public void GetUnsupportedResolutionThrowsException(Resolution resolution)
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var start = DateTime.UtcNow.AddMonths(-2);
var end = DateTime.UtcNow;

Assert.Throws<ArgumentOutOfRangeException>(() => _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList());
Assert.IsNull(_downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end))?.ToList());
}

[TestCase(Resolution.Minute)]
[TestCase(Resolution.Hour)]
[TestCase(Resolution.Daily)]
public void UnexpectedResponseContentTypeThrowsException(Resolution resolution)
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var start = DateTime.UtcNow.AddMonths(-2);
var end = DateTime.UtcNow;

Expand All @@ -221,22 +221,20 @@ public void UnexpectedResponseContentTypeThrowsException(Resolution resolution)
})
.Verifiable();

Assert.Throws<FormatException>(() => _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList());
Assert.Throws<FormatException>(() => _downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end)).ToList());
}

[Test]
public void GetIntradayDataGreaterThanTwoYears()
{
var ticker = "IBM";
var symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA);
var resolution = Resolution.Minute;
var start = new DateTime(2020, 4, 4);
var end = new DateTime(2020, 6, 5);

var expectedBars = new[]
{
new TradeBar(DateTime.Parse("2020-04-05 7:34:00"), symbol, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2020-04-05 7:35:00"), symbol, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
new TradeBar(DateTime.Parse("2020-04-05 7:34:00"), IBM, 133.64m, 136.69m, 133.40m, 135.93m, 5471616),
new TradeBar(DateTime.Parse("2020-04-05 7:35:00"), IBM, 135.58m, 135.64m, 134.09m, 134.22m, 3620964),
};

IRestRequest request = null;
Expand All @@ -257,7 +255,7 @@ public void GetIntradayDataGreaterThanTwoYears()
})
.Verifiable();

var result = _downloader.Get(new DataDownloaderGetParameters(symbol, resolution, start, end)).ToList();
var result = _downloader.Get(new DataDownloaderGetParameters(IBM, resolution, start, end)).ToList();

_avClient.Verify();
var requestUrl = BuildUrl(request);
Expand Down
31 changes: 11 additions & 20 deletions QuantConnect.AlphaVantage.Tests/AlphaVantageDataDownloaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,11 @@ public class AlphaVantageDataDownloaderTests
private AlphaVantageDataDownloader _downloader;
private MarketHoursDatabase _marketHoursDatabase;

public static Symbol AAPL { get; private set; }

[SetUp]
public void SetUp()
{
_downloader = new();
_marketHoursDatabase = MarketHoursDatabase.FromDataFolder();
AAPL = Symbol.Create("AAPL", SecurityType.Equity, Market.USA);
}

[TearDown]
Expand All @@ -60,6 +57,7 @@ public static IEnumerable<TestCaseData> DownloaderValidCaseData
{
get
{
var AAPL = new Symbol(SecurityIdentifier.GenerateEquity("AAPL", Market.USA, false), "AAPL");
yield return new TestCaseData(AAPL, Resolution.Minute, new DateTime(2024, 1, 1, 5, 30, 0), new DateTime(2024, 2, 1, 20, 0, 0), TickType.Trade);
yield return new TestCaseData(AAPL, Resolution.Minute, new DateTime(2024, 1, 8, 9, 30, 0), new DateTime(2024, 1, 12, 16, 0, 0), TickType.Trade);
yield return new TestCaseData(AAPL, Resolution.Minute, new DateTime(2015, 2, 2, 9, 30, 0), new DateTime(2015, 3, 1, 16, 0, 0), TickType.Trade);
Expand Down Expand Up @@ -97,38 +95,31 @@ public static IEnumerable<TestCaseData> DownloaderInvalidCaseData
{
var startUtc = new DateTime(2024, 1, 1);
var endUtc = new DateTime(2024, 2, 1);
var AAPL = new Symbol(SecurityIdentifier.GenerateEquity("AAPL", Market.USA, false), "AAPL");

yield return new TestCaseData(AAPL, Resolution.Minute, startUtc, endUtc, TickType.Quote, false)
yield return new TestCaseData(AAPL, Resolution.Minute, startUtc, endUtc, TickType.Quote)
.SetDescription($"Not supported {nameof(TickType.Quote)} -> empty result");
yield return new TestCaseData(AAPL, Resolution.Minute, startUtc, endUtc, TickType.OpenInterest, false)
yield return new TestCaseData(AAPL, Resolution.Minute, startUtc, endUtc, TickType.OpenInterest)
.SetDescription($"Not supported {nameof(TickType.OpenInterest)} -> empty result");
yield return new TestCaseData(AAPL, Resolution.Tick, startUtc, endUtc, TickType.Trade, true)
yield return new TestCaseData(AAPL, Resolution.Tick, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(Resolution.Tick)} -> throw Exception");
yield return new TestCaseData(AAPL, Resolution.Second, startUtc, endUtc, TickType.Trade, true)
yield return new TestCaseData(AAPL, Resolution.Second, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(Resolution.Second)} -> throw Exception");
yield return new TestCaseData(AAPL, Resolution.Minute, endUtc, startUtc, TickType.Trade, false)
yield return new TestCaseData(AAPL, Resolution.Minute, endUtc, startUtc, TickType.Trade)
.SetDescription("startDateTime > endDateTime -> empty result");
yield return new TestCaseData(Symbol.Create("USDJPY", SecurityType.Forex, Market.Oanda), Resolution.Minute, startUtc, endUtc, TickType.Trade, false)
yield return new TestCaseData(Symbol.Create("USDJPY", SecurityType.Forex, Market.Oanda), Resolution.Minute, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(SecurityType.Forex)} -> empty result");
yield return new TestCaseData(Symbol.Create("BTCUSD", SecurityType.Crypto, Market.Coinbase), Resolution.Minute, startUtc, endUtc, TickType.Trade, false)
yield return new TestCaseData(Symbol.Create("BTCUSD", SecurityType.Crypto, Market.Coinbase), Resolution.Minute, startUtc, endUtc, TickType.Trade)
.SetDescription($"Not supported {nameof(SecurityType.Crypto)} -> empty result");
}
}

[TestCaseSource(nameof(DownloaderInvalidCaseData))]
public void DownloadDataWithDifferentInvalidParameters(Symbol symbol, Resolution resolution, DateTime start, DateTime end, TickType tickType, bool isThrowException)
public void DownloadDataWithDifferentInvalidParameters(Symbol symbol, Resolution resolution, DateTime start, DateTime end, TickType tickType)
{
var downloadParameters = new DataDownloaderGetParameters(symbol, resolution, start, end, tickType);

if (isThrowException)
{
Assert.Throws<ArgumentOutOfRangeException>(() => _downloader.Get(downloadParameters).ToList());
return;
}

var baseData = _downloader.Get(downloadParameters).ToList();

Assert.IsEmpty(baseData);
Assert.IsNull(_downloader.Get(downloadParameters)?.ToList());
}

private DateTime ConvertUtcTimeToSymbolExchange(Symbol symbol, DateTime dateTimeUtc)
Expand Down
11 changes: 6 additions & 5 deletions QuantConnect.AlphaVantage/AlphaVantageDataDownloader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ public AlphaVantageDataDownloader(IRestClient restClient, string apiKey)
/// </summary>
/// <param name="dataDownloaderGetParameters">model class for passing in parameters for historical data</param>
/// <returns>Enumerable of base data for this symbol</returns>
public IEnumerable<BaseData> Get(DataDownloaderGetParameters dataDownloaderGetParameters)
public IEnumerable<BaseData>? Get(DataDownloaderGetParameters dataDownloaderGetParameters)
{
var symbol = dataDownloaderGetParameters.Symbol;
var resolution = dataDownloaderGetParameters.Resolution;
Expand All @@ -125,7 +125,7 @@ public IEnumerable<BaseData> Get(DataDownloaderGetParameters dataDownloaderGetPa
if (endUtc < startUtc)
{
Log.Error($"{nameof(AlphaVantageDataDownloader)}.{nameof(Get)}:InvalidDateRange. The history request start date must precede the end date, no history returned");
return Enumerable.Empty<BaseData>();
return null;
}

if (tickType != TickType.Trade)
Expand All @@ -136,7 +136,7 @@ public IEnumerable<BaseData> Get(DataDownloaderGetParameters dataDownloaderGetPa
$"Currently available support only for historical of type - TradeBar");
_invalidHistoryDataTypeWarningFired = true;
}
return Enumerable.Empty<BaseData>();
return null;
}

if (symbol.SecurityType != SecurityType.Equity)
Expand All @@ -146,7 +146,7 @@ public IEnumerable<BaseData> Get(DataDownloaderGetParameters dataDownloaderGetPa
Log.Trace($"{nameof(AlphaVantageDataDownloader)}.{nameof(Get)}: Unsupported SecurityType '{symbol.SecurityType}' for symbol '{symbol}'");
_invalidSecurityTypeWarningFired = true;
}
return Enumerable.Empty<BaseData>();
return null;
}

var request = new RestRequest("query", DataFormat.Json);
Expand All @@ -164,7 +164,8 @@ public IEnumerable<BaseData> Get(DataDownloaderGetParameters dataDownloaderGetPa
data = GetDailyData(request, startUtc, endUtc, symbol);
break;
default:
throw new ArgumentOutOfRangeException(nameof(resolution), $"{resolution} resolution not supported by API.");
Log.Trace($"{nameof(AlphaVantageDataDownloader)}.{resolution} resolution not supported by API.");
return null;
}

var period = resolution.ToTimeSpan();
Expand Down

0 comments on commit 6288c2f

Please sign in to comment.