Fix bug/syntax in python examples (#8658)

* CustomDataRegressionAlgorithm

* DescendingCustomDataObjectStoreRegressionAlgorithm

* CustomDataPropertiesRegressionAlgorithm

* DateTime -> should be datetime

* KerasNeuralNetworkAlgorithm

* OptionIndicatorsMirrorContractsRegressionAlgorithm

* BybitCustomDataCryptoRegressionAlgorithm

* DropboxBaseDataUniverseSelectionAlgorithm

* UserDefinedUniverseAlgorithm

* CompleteOrderTagUpdateAlgorithm

* BasicTemplateOptionEquityStrategyAlgorithm hint

* ETFConstituentUniverseFrameworkRegressionAlgorithm

* FutureStopMarketOrderOnExtendedHoursRegressionAlgorithm

* SecurityDynamicPropertyPythonClassAlgorithm

* hint

* hinting

* CallbackCommandRegressionAlgorithm

* CustomWarmUpPeriodIndicatorAlgorithm

* CrunchDAOSignalExportDemonstrationAlgorithm

* ExpiryHelperAlphaModelFrameworkAlgorithm

* ClassicRenkoConsolidatorAlgorithm

* SmaCrossUniverseSelectionAlgorithm

* PEP8 Fix: Assigning to a Method

* SliceGetByTypeRegressionAlgorithm

* MarketOnCloseOrderBufferExtendedMarketHoursRegressionAlgorithm

* MarketOnCloseOrderBufferRegressionAlgorithm

* CustomIndicatorAlgorithm

* ScheduledQueuingAlgorithm

* ComboOrdersFillModelAlgorithm

* CustomIndicatorWithExtensionAlgorithm

* IndicatorWithRenkoBarsRegressionAlgorithm

* CoarseFineOptionUniverseChainRegressionAlgorithm

* NumeraiSignalExportDemonstrationAlgorithm

* DropboxUniverseSelectionAlgorithm

* WeeklyUniverseSelectionRegressionAlgorithm

* AutoRegressiveIntegratedMovingAverageRegressionAlgorithm

* DropboxBaseDataUniverseSelectionAlgorithm

* IronCondorStrategyAlgorithm

* LongAndShortButterflyPutStrategiesAlgorithm

* FutureStopMarketOrderOnExtendedHoursRegressionAlgorithm

* LongAndShortCallCalendarSpreadStrategiesAlgorithm

* KerasNeuralNetworkAlgorithm

* LongAndShortPutCalendarSpreadStrategiesAlgorithm

* OptionPriceModelForOptionStylesBaseRegressionAlgorithm

* TensorFlowNeuralNetworkAlgorithm

* MarketOnCloseOrderBufferRegressionAlgorithm

* MarketOnCloseOrderBufferExtendedMarketHoursRegressionAlgorithm

* typing

* ComboOrderTicketDemoAlgorithm

* PytorchNeuralNetworkAlgorithm

* MultipleSymbolConsolidationAlgorithm

* fixes

* revert getattr mypy syntax

* address peer review

* Addresses Peer-Review

---------

Co-authored-by: Alexandre Catarino <AlexCatarino@users.noreply.github.com>
This commit is contained in:
Louis Szeto
2025-04-14 20:43:03 +08:00
committed by GitHub
parent fe46e5ec3b
commit 020cf013df
55 changed files with 717 additions and 738 deletions
+25 -25
View File
@@ -33,61 +33,61 @@ class TimeInForceAlgorithm(QCAlgorithm):
# We currently only support GTC and DAY.
# self.default_order_properties.time_in_force = TimeInForce.day
self.symbol = self.add_equity("SPY", Resolution.MINUTE).symbol
self._symbol = self.add_equity("SPY", Resolution.MINUTE).symbol
self.gtc_order_ticket1 = None
self.gtc_order_ticket2 = None
self.day_order_ticket1 = None
self.day_order_ticket2 = None
self.gtd_order_ticket1 = None
self.gtd_order_ticket2 = None
self.expected_order_statuses = {}
self._gtc_order_ticket1 = None
self._gtc_order_ticket2 = None
self._day_order_ticket1 = None
self._day_order_ticket2 = None
self._gtd_order_ticket1 = None
self._gtd_order_ticket2 = None
self._expected_order_statuses = {}
# OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
# Arguments:
# data: Slice object keyed by symbol containing the stock data
def on_data(self, data):
if self.gtc_order_ticket1 is None:
if not self._gtc_order_ticket1:
# These GTC orders will never expire and will not be canceled automatically.
self.default_order_properties.time_in_force = TimeInForce.GOOD_TIL_CANCELED
# this order will not be filled before the end of the backtest
self.gtc_order_ticket1 = self.limit_order(self.symbol, 10, 100)
self.expected_order_statuses[self.gtc_order_ticket1.order_id] = OrderStatus.SUBMITTED
self._gtc_order_ticket1 = self.limit_order(self._symbol, 10, 100)
self._expected_order_statuses[self._gtc_order_ticket1.order_id] = OrderStatus.SUBMITTED
# this order will be filled before the end of the backtest
self.gtc_order_ticket2 = self.limit_order(self.symbol, 10, 160)
self.expected_order_statuses[self.gtc_order_ticket2.order_id] = OrderStatus.FILLED
self._gtc_order_ticket2 = self.limit_order(self._symbol, 10, 160)
self._expected_order_statuses[self._gtc_order_ticket2.order_id] = OrderStatus.FILLED
if self.day_order_ticket1 is None:
if not self._day_order_ticket1:
# These DAY orders will expire at market close,
# if not filled by then they will be canceled automatically.
self.default_order_properties.time_in_force = TimeInForce.DAY
# this order will not be filled before market close and will be canceled
self.day_order_ticket1 = self.limit_order(self.symbol, 10, 140)
self.expected_order_statuses[self.day_order_ticket1.order_id] = OrderStatus.CANCELED
self._day_order_ticket1 = self.limit_order(self._symbol, 10, 140)
self._expected_order_statuses[self._day_order_ticket1.order_id] = OrderStatus.CANCELED
# this order will be filled before market close
self.day_order_ticket2 = self.limit_order(self.symbol, 10, 180)
self.expected_order_statuses[self.day_order_ticket2.order_id] = OrderStatus.FILLED
self._day_order_ticket2 = self.limit_order(self._symbol, 10, 180)
self._expected_order_statuses[self._day_order_ticket2.order_id] = OrderStatus.FILLED
if self.gtd_order_ticket1 is None:
if not self._gtd_order_ticket1:
# These GTD orders will expire on October 10th at market close,
# if not filled by then they will be canceled automatically.
self.default_order_properties.time_in_force = TimeInForce.good_til_date(datetime(2013, 10, 10))
self.default_order_properties.time_in_force = TimeInForce.GOOD_TIL_DATE(datetime(2013, 10, 10))
# this order will not be filled before expiry and will be canceled
self.gtd_order_ticket1 = self.limit_order(self.symbol, 10, 100)
self.expected_order_statuses[self.gtd_order_ticket1.order_id] = OrderStatus.CANCELED
self._gtd_order_ticket1 = self.limit_order(self._symbol, 10, 100)
self._expected_order_statuses[self._gtd_order_ticket1.order_id] = OrderStatus.CANCELED
# this order will be filled before expiry
self.gtd_order_ticket2 = self.limit_order(self.symbol, 10, 160)
self.expected_order_statuses[self.gtd_order_ticket2.order_id] = OrderStatus.FILLED
self._gtd_order_ticket2 = self.limit_order(self._symbol, 10, 160)
self._expected_order_statuses[self._gtd_order_ticket2.order_id] = OrderStatus.FILLED
# Order event handler. This handler will be called for all order events, including submissions, fills, cancellations.
# This method can be called asynchronously, ensure you use proper locks on thread-unsafe objects
@@ -96,7 +96,7 @@ class TimeInForceAlgorithm(QCAlgorithm):
# End of algorithm run event handler. This method is called at the end of a backtest or live trading operation.
def on_end_of_algorithm(self):
for orderId, expectedStatus in self.expected_order_statuses.items():
for orderId, expectedStatus in self._expected_order_statuses.items():
order = self.transactions.get_order_by_id(orderId)
if order.status != expectedStatus:
raise AssertionError(f"Invalid status for order {orderId} - Expected: {expectedStatus}, actual: {order.status}")