Refactor Delistings Processing (#6059)
Regression Tests / build (push) Has been cancelled
Build & Test Lean / build (push) Has been cancelled
Regression Tests / build (push) Has been cancelled
Build & Test Lean / build (push) Has been cancelled
* Move processing of delistings to Brokerage * Deal with case that exchange is not open on OptionSymbol.ID.Date * Refactor solution to use DelistingNotification event * Adjust some regression expected liquidation time * Mark some todos on deprecated functions * Update expected liqudation time for Py regressions * Update regressions that have been validated * Use HandlePositionAssigned for assignment orders * Update regressions * Update some missed unit tests; remove one that is already covered by regression * Cleanup deprecated backend functions * nit - small cleanup adjustment * Post rebase fix * Address review * Minor tweak to py regression
This commit is contained in:
@@ -16,7 +16,7 @@ from AlgorithmImports import *
|
||||
class BasicTemplateIndexAlgorithm(QCAlgorithm):
|
||||
def Initialize(self) -> None:
|
||||
self.SetStartDate(2021, 1, 4)
|
||||
self.SetEndDate(2021, 1, 15)
|
||||
self.SetEndDate(2021, 1, 18)
|
||||
self.SetCash(1000000)
|
||||
|
||||
# Use indicator for signal; but it cannot be traded
|
||||
|
||||
@@ -28,6 +28,7 @@ class BasicTemplateOptionsDailyAlgorithm(QCAlgorithm):
|
||||
self.SetStartDate(2015, 12, 23)
|
||||
self.SetEndDate(2016, 1, 20)
|
||||
self.SetCash(100000)
|
||||
self.optionExpired = False
|
||||
|
||||
equity = self.AddEquity(self.UnderlyingTicker, Resolution.Daily)
|
||||
option = self.AddOption(self.UnderlyingTicker, Resolution.Daily)
|
||||
@@ -56,3 +57,17 @@ class BasicTemplateOptionsDailyAlgorithm(QCAlgorithm):
|
||||
|
||||
def OnOrderEvent(self, orderEvent):
|
||||
self.Log(str(orderEvent))
|
||||
|
||||
# Check for our expected OTM option expiry
|
||||
if orderEvent.Message == "OTM":
|
||||
|
||||
# Assert it is at midnight 1/16 (5AM UTC)
|
||||
if orderEvent.UtcTime.month != 1 and orderEvent.UtcTime.day != 16 and orderEvent.UtcTime.hour != 5:
|
||||
raise AssertionError(f"Expiry event was not at the correct time, {orderEvent.UtcTime}")
|
||||
|
||||
self.optionExpired = True
|
||||
|
||||
def OnEndOfAlgorithm(self):
|
||||
# Assert we had our option expire and fill a liquidation order
|
||||
if not self.optionExpired:
|
||||
raise AssertionError("Algorithm did not process the option expiration like expected")
|
||||
|
||||
@@ -26,7 +26,7 @@ class BasicTemplateOptionsFilterUniverseAlgorithm(QCAlgorithm):
|
||||
|
||||
def Initialize(self):
|
||||
self.SetStartDate(2015, 12, 24)
|
||||
self.SetEndDate(2015, 12, 24)
|
||||
self.SetEndDate(2015, 12, 28)
|
||||
self.SetCash(100000)
|
||||
|
||||
equity = self.AddEquity(self.UnderlyingTicker)
|
||||
|
||||
@@ -29,7 +29,7 @@ class BasicTemplateOptionsFrameworkAlgorithm(QCAlgorithm):
|
||||
self.UniverseSettings.Resolution = Resolution.Minute
|
||||
|
||||
self.SetStartDate(2014, 6, 5)
|
||||
self.SetEndDate(2014, 6, 6)
|
||||
self.SetEndDate(2014, 6, 9)
|
||||
self.SetCash(100000)
|
||||
|
||||
# set framework models
|
||||
|
||||
@@ -25,7 +25,7 @@ class FilterUniverseRegressionAlgorithm(QCAlgorithm):
|
||||
|
||||
def Initialize(self):
|
||||
self.SetStartDate(2015, 12, 24)
|
||||
self.SetEndDate(2015, 12, 24)
|
||||
self.SetEndDate(2015, 12, 28)
|
||||
self.SetCash(100000)
|
||||
|
||||
equity = self.AddEquity(self.UnderlyingTicker)
|
||||
|
||||
@@ -84,7 +84,7 @@ class FutureOptionCallITMExpiryRegressionAlgorithm(QCAlgorithm):
|
||||
self.Log(f"{self.Time} -- {orderEvent.Symbol} :: Price: {self.Securities[orderEvent.Symbol].Holdings.Price} Qty: {self.Securities[orderEvent.Symbol].Holdings.Quantity} Direction: {orderEvent.Direction} Msg: {orderEvent.Message}")
|
||||
|
||||
def AssertFutureOptionOrderExercise(self, orderEvent: OrderEvent, future: Security, optionContract: Security):
|
||||
expectedLiquidationTimeUtc = datetime(2020, 6, 19, 20, 0, 0)
|
||||
expectedLiquidationTimeUtc = datetime(2020, 6, 20, 4, 0, 0)
|
||||
|
||||
if orderEvent.Direction == OrderDirection.Sell and future.Holdings.Quantity != 0:
|
||||
# We expect the contract to have been liquidated immediately
|
||||
|
||||
@@ -83,7 +83,7 @@ class FutureOptionPutITMExpiryRegressionAlgorithm(QCAlgorithm):
|
||||
self.Log(f"{self.Time} -- {orderEvent.Symbol} :: Price: {self.Securities[orderEvent.Symbol].Holdings.Price} Qty: {self.Securities[orderEvent.Symbol].Holdings.Quantity} Direction: {orderEvent.Direction} Msg: {orderEvent.Message}")
|
||||
|
||||
def AssertFutureOptionOrderExercise(self, orderEvent: OrderEvent, future: Security, optionContract: Security):
|
||||
expectedLiquidationTimeUtc = datetime(2020, 6, 19, 20, 0, 0)
|
||||
expectedLiquidationTimeUtc = datetime(2020, 6, 20, 4, 0, 0)
|
||||
|
||||
if orderEvent.Direction == OrderDirection.Buy and future.Holdings.Quantity != 0:
|
||||
# We expect the contract to have been liquidated immediately
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ class FuturesAndFuturesOptionsExpiryTimeAndLiquidationRegressionAlgorithm(QCAlgo
|
||||
|
||||
self.expectedExpiryWarningTime = datetime(2020, 6, 19)
|
||||
self.expectedExpiryDelistingTime = datetime(2020, 6, 20)
|
||||
self.expectedLiquidationTime = datetime(2020, 6, 19, 16, 0, 0)
|
||||
self.expectedLiquidationTime = datetime(2020, 6, 20)
|
||||
|
||||
self.SetStartDate(2020, 1, 5)
|
||||
self.SetEndDate(2020, 12, 1)
|
||||
|
||||
Reference in New Issue
Block a user