public void MinuteResolutionSelectedForFuturesOptions() { const int periods = 5; var reference = new DateTime(2016, 04, 06, 12, 0, 0); var referenceUtc = reference.ConvertToUtc(TimeZones.Chicago); var timeKeeper = new TimeKeeper(referenceUtc); var underlyingSymbol = Symbol.Create("ES", SecurityType.Future, Market.CME); var futureOption = Symbol.CreateOption( underlyingSymbol, Market.CME, OptionStyle.American, OptionRight.Call, 0, SecurityIdentifier.DefaultDate); var underlyingConfig = new SubscriptionDataConfig(typeof(TradeBar), underlyingSymbol, Resolution.Minute, TimeZones.Chicago, TimeZones.Chicago, true, false, false); var futureOptionConfig = new SubscriptionDataConfig(typeof(TradeBar), futureOption, Resolution.Minute, TimeZones.Chicago, TimeZones.Chicago, true, false, false); var underlyingSecurity = new Security( SecurityExchangeHours.AlwaysOpen(TimeZones.Chicago), underlyingConfig, new Cash(Currencies.USD, 0, 0), SymbolProperties.GetDefault(Currencies.USD), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache() ); var futureOptionSecurity = new Security( SecurityExchangeHours.AlwaysOpen(TimeZones.Chicago), futureOptionConfig, new Cash(Currencies.USD, 0, 0), SymbolProperties.GetDefault(Currencies.USD), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache() ); underlyingSecurity.SetLocalTimeKeeper(timeKeeper.GetLocalTimeKeeper(TimeZones.Chicago)); futureOptionSecurity.SetLocalTimeKeeper(timeKeeper.GetLocalTimeKeeper(TimeZones.Chicago)); var mock = new MockSubscriptionDataConfigProvider(); mock.SubscriptionDataConfigs.Add(underlyingConfig); mock.SubscriptionDataConfigs.Add(futureOptionConfig); var model = new StandardDeviationOfReturnsVolatilityModel(periods, Resolution.Minute, TimeSpan.FromMinutes(1)); model.SetSubscriptionDataConfigProvider(mock); var futureHistoryRequirements = model.GetHistoryRequirements(underlyingSecurity, referenceUtc); var optionHistoryRequirements = model.GetHistoryRequirements(futureOptionSecurity, referenceUtc); Assert.IsTrue(futureHistoryRequirements.All(x => x.Resolution == Resolution.Minute)); Assert.IsTrue(optionHistoryRequirements.All(x => x.Resolution == Resolution.Minute)); }
public void PriceReturnsQuoteBarsIfPresent(OrderDirection orderDirection, decimal expected) { var time = new DateTime(2018, 9, 24, 9, 30, 0); var timeKeeper = new TimeKeeper(time.ConvertToUtc(TimeZones.NewYork), TimeZones.NewYork); var symbol = Symbol.Create("SPY", SecurityType.Equity, Market.USA); var configTradeBar = new SubscriptionDataConfig(typeof(TradeBar), symbol, Resolution.Minute, TimeZones.NewYork, TimeZones.NewYork, true, true, false); var configQuoteBar = new SubscriptionDataConfig(configTradeBar, typeof(QuoteBar)); var security = new Security( SecurityExchangeHoursTests.CreateUsEquitySecurityExchangeHours(), configQuoteBar, new Cash(Currencies.USD, 0, 1m), SymbolProperties.GetDefault(Currencies.USD), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache() ); security.SetLocalTimeKeeper(timeKeeper.GetLocalTimeKeeper(TimeZones.NewYork)); var tradeBar = new TradeBar(time, symbol, 290m, 292m, 289m, 291m, 12345); security.SetMarketPrice(tradeBar); var quoteBar = new QuoteBar(time, symbol, new Bar(10, 15, 5, 11), 100, new Bar(20, 25, 15, 21), 100); security.SetMarketPrice(quoteBar); var configProvider = new MockSubscriptionDataConfigProvider(configQuoteBar); configProvider.SubscriptionDataConfigs.Add(configTradeBar); var testFillModel = new TestFillModel(); testFillModel.SetParameters(new FillModelParameters(security, null, configProvider, TimeSpan.FromDays(1))); var result = testFillModel.GetPricesPublic(security, orderDirection); Assert.AreEqual(expected, result.Close); }
public void GetHistoryRequirementsWorksForTwoDifferentSubscriptions() { const int periods = 3; var reference = new DateTime(2016, 04, 06, 12, 0, 0); var referenceUtc = reference.ConvertToUtc(TimeZones.NewYork); var timeKeeper = new TimeKeeper(referenceUtc); var config = new SubscriptionDataConfig(typeof(TradeBar), Symbols.SPY, Resolution.Minute, TimeZones.NewYork, TimeZones.NewYork, true, false, false); var security = new Security( SecurityExchangeHours.AlwaysOpen(TimeZones.NewYork), config, new Cash(Currencies.USD, 0, 0), SymbolProperties.GetDefault(Currencies.USD), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache() ); security.SetLocalTimeKeeper(timeKeeper.GetLocalTimeKeeper(TimeZones.NewYork)); var model = new StandardDeviationOfReturnsVolatilityModel(periods); var mock = new MockSubscriptionDataConfigProvider(config); mock.SubscriptionDataConfigs.Add( new SubscriptionDataConfig( typeof(TradeBar), Symbols.SPY, Resolution.Second, TimeZones.NewYork, TimeZones.NewYork, true, true, false, true)); model.SetSubscriptionDataConfigProvider(mock); var result = model.GetHistoryRequirements(security, DateTime.UtcNow).First(); Assert.AreEqual(config.DataNormalizationMode, result.DataNormalizationMode); Assert.AreEqual(config.Symbol, result.Symbol); Assert.AreEqual(config.DataTimeZone, result.DataTimeZone); Assert.AreEqual(true, result.IsCustomData); Assert.AreEqual(true, result.FillForwardResolution != null); Assert.AreEqual(true, result.IncludeExtendedMarketHours); // the StandardDeviationOfReturnsVolatilityModel always uses daily Assert.AreEqual(Resolution.Daily, result.Resolution); }
public void PerformsLimitIfTouchedFillSell() { var model = new ImmediateFillModel(); var order = new LimitIfTouchedOrder(Symbols.SPY, -100, 101.5m, 105m, Noon); var configTradeBar = CreateTradeBarConfig(Symbols.SPY); var configQuoteBar = new SubscriptionDataConfig(configTradeBar, typeof(QuoteBar)); var configProvider = new MockSubscriptionDataConfigProvider(configQuoteBar); var security = new Security( SecurityExchangeHoursTests.CreateUsEquitySecurityExchangeHours(), configTradeBar, new Cash(Currencies.USD, 0, 1m), SymbolProperties.GetDefault(Currencies.USD), ErrorCurrencyConverter.Instance, RegisteredSecurityDataTypesProvider.Null, new SecurityCache() ); // Sets price at time zero security.SetLocalTimeKeeper(TimeKeeper.GetLocalTimeKeeper(TimeZones.NewYork)); security.SetMarketPrice(new TradeBar(Noon, Symbols.SPY, 100m, 100m, 90m, 90m, 100)); configProvider.SubscriptionDataConfigs.Add(configTradeBar); var fill = model.Fill(new FillModelParameters( security, order, configProvider, Time.OneHour)).OrderEvent; Assert.AreEqual(0, fill.FillQuantity); Assert.AreEqual(0, fill.FillPrice); Assert.AreEqual(OrderStatus.None, fill.Status); // Time jump => trigger touched but not limit security.SetMarketPrice(new TradeBar(Noon, Symbols.SPY, 102m, 103m, 102m, 102m, 100)); security.SetMarketPrice(new QuoteBar(Noon, Symbols.SPY, new Bar(101m, 102m, 100m, 100m), 100, // Bid bar new Bar(103m, 104m, 102m, 102m), 100) // Ask bar ); Assert.AreEqual(0, fill.FillQuantity); Assert.AreEqual(0, fill.FillPrice); Assert.AreEqual(OrderStatus.None, fill.Status); fill = model.Fill(new FillModelParameters( security, order, configProvider, Time.OneHour)).OrderEvent; Assert.AreEqual(0, fill.FillQuantity); Assert.AreEqual(0, fill.FillPrice); Assert.AreEqual(OrderStatus.None, fill.Status); // Time jump => limit reached, holdings sold security.SetMarketPrice(new TradeBar(Noon, Symbols.SPY, 103m, 108m, 103m, 105m, 100)); security.SetMarketPrice(new QuoteBar(Noon, Symbols.SPY, new Bar(103m, 106m, 103m, 105m), 100, // Bid bar new Bar(103m, 108m, 103m, 105m), 100) // Ask bar ); fill = model.LimitIfTouchedFill(security, order); // this fills worst case scenario Assert.AreEqual(order.Quantity, fill.FillQuantity); Assert.AreEqual(order.LimitPrice, fill.FillPrice); Assert.AreEqual(OrderStatus.Filled, fill.Status); }