|
22 | 22 | using QuantConnect.Indicators; |
23 | 23 | using QuantConnect.Orders; |
24 | 24 | using QuantConnect.Orders.Fills; |
| 25 | +using QuantConnect.Orders.Slippage; |
25 | 26 | using QuantConnect.Securities; |
26 | 27 | using QuantConnect.Securities.Forex; |
27 | 28 | using QuantConnect.Tests.Common.Data; |
@@ -446,6 +447,69 @@ public void PerformsMarketOnOpenUsingOpenPriceWithMinuteSubscription(int quantit |
446 | 447 | Assert.AreEqual(expected, fill.FillPrice); |
447 | 448 | } |
448 | 449 |
|
| 450 | + [TestCase(-100, 103.896)] |
| 451 | + [TestCase(100, 104.104)] |
| 452 | + public void PerformsMarketOnOpenUsingOpenPriceForConstantSlippageWithDailySubscription(int quantity, decimal expected) |
| 453 | + { |
| 454 | + const decimal open = 104m; |
| 455 | + const decimal baselineClose = 105m; |
| 456 | + const decimal mutatedClose = 103.5m; |
| 457 | + const decimal slippagePercent = 0.001m; |
| 458 | + |
| 459 | + var reference = new DateTime(2015, 06, 05, 12, 0, 0); |
| 460 | + var config = CreateTradeBarConfig(Symbols.SPY, Resolution.Daily); |
| 461 | + |
| 462 | + var baselineEquity = CreateEquity(config); |
| 463 | + var mutatedEquity = CreateEquity(config); |
| 464 | + |
| 465 | + baselineEquity.SetSlippageModel(new ConstantSlippageModel(slippagePercent)); |
| 466 | + mutatedEquity.SetSlippageModel(new ConstantSlippageModel(slippagePercent)); |
| 467 | + |
| 468 | + var time = baselineEquity.Exchange.Hours.GetNextMarketOpen(reference, false); |
| 469 | + TimeKeeper.SetUtcDateTime(time.ConvertToUtc(TimeZones.NewYork)); |
| 470 | + |
| 471 | + TradeBar GetTradeBar(decimal close) => new TradeBar( |
| 472 | + time.RoundDown(Time.OneDay), |
| 473 | + Symbols.SPY, |
| 474 | + open, |
| 475 | + 106m, |
| 476 | + 100m, |
| 477 | + close, |
| 478 | + 100, |
| 479 | + Time.OneDay); |
| 480 | + |
| 481 | + baselineEquity.SetMarketPrice(GetTradeBar(baselineClose)); |
| 482 | + mutatedEquity.SetMarketPrice(GetTradeBar(mutatedClose)); |
| 483 | + |
| 484 | + var baselineOrder = new MarketOnOpenOrder(Symbols.SPY, quantity, reference); |
| 485 | + var mutatedOrder = new MarketOnOpenOrder(Symbols.SPY, quantity, reference); |
| 486 | + |
| 487 | + var configProvider = new MockSubscriptionDataConfigProvider(config); |
| 488 | + |
| 489 | + var baselineFill = ((EquityFillModel)baselineEquity.FillModel) |
| 490 | + .Fill(new FillModelParameters( |
| 491 | + baselineEquity, |
| 492 | + baselineOrder, |
| 493 | + configProvider, |
| 494 | + Time.OneHour, |
| 495 | + null)) |
| 496 | + .Single(); |
| 497 | + |
| 498 | + var mutatedFill = ((EquityFillModel)mutatedEquity.FillModel) |
| 499 | + .Fill(new FillModelParameters( |
| 500 | + mutatedEquity, |
| 501 | + mutatedOrder, |
| 502 | + configProvider, |
| 503 | + Time.OneHour, |
| 504 | + null)) |
| 505 | + .Single(); |
| 506 | + |
| 507 | + Assert.AreEqual(quantity, baselineFill.FillQuantity); |
| 508 | + Assert.AreEqual(quantity, mutatedFill.FillQuantity); |
| 509 | + Assert.AreEqual(expected, baselineFill.FillPrice); |
| 510 | + Assert.AreEqual(baselineFill.FillPrice, mutatedFill.FillPrice); |
| 511 | + } |
| 512 | + |
449 | 513 | [TestCase(-100)] |
450 | 514 | [TestCase(100)] |
451 | 515 | public void PerformsMarketOnOpenUsingOpenPriceWithDailySubscription(int quantity) |
|
0 commit comments