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
+13 -10
View File
@@ -26,18 +26,21 @@ class IronCondorStrategyAlgorithm(OptionStrategyFactoryMethodsBaseAlgorithm):
def expected_orders_count(self) -> int:
return 8
def trade_strategy(self, chain: OptionChain, option_symbol: Symbol):
def trade_strategy(self, chain: OptionChain, option_symbol: Symbol) -> None:
for expiry, group in itertools.groupby(chain, lambda x: x.expiry):
contracts = sorted(group, key=lambda x: x.strike)
if len(contracts) < 4:continue
if len(contracts) < 4:
continue
put_contracts = [x for x in contracts if x.right == OptionRight.PUT]
if len(put_contracts) < 2: continue
if len(put_contracts) < 2:
continue
long_put_strike = put_contracts[0].strike
short_put_strike = put_contracts[1].strike
call_contracts = [x for x in contracts if x.right == OptionRight.CALL and x.strike > short_put_strike]
if len(call_contracts) < 2: continue
if len(call_contracts) < 2:
continue
short_call_strike = call_contracts[0].strike
long_call_strike = call_contracts[1].strike
@@ -45,7 +48,7 @@ class IronCondorStrategyAlgorithm(OptionStrategyFactoryMethodsBaseAlgorithm):
self.buy(self._iron_condor, 2)
return
def assert_strategy_position_group(self, position_group: IPositionGroup, option_symbol: Symbol):
def assert_strategy_position_group(self, position_group: IPositionGroup, option_symbol: Symbol) -> None:
positions = list(position_group.positions)
if len(positions) != 4:
raise AssertionError(f"Expected position group to have 4 positions. Actual: {len(positions)}")
@@ -56,30 +59,30 @@ class IronCondorStrategyAlgorithm(OptionStrategyFactoryMethodsBaseAlgorithm):
long_put_position = next((x for x in position_group.positions
if x.symbol.id.option_right == OptionRight.PUT and x.symbol.id.strike_price == long_put_strike),
None)
if long_put_position is None or long_put_position.quantity != 2:
if not long_put_position or long_put_position.quantity != 2:
raise AssertionError(f"Expected long put position quantity to be 2. Actual: {long_put_position.quantity}")
short_put_strike = ordered_strikes[1]
short_put_position = next((x for x in position_group.positions
if x.symbol.id.option_right == OptionRight.PUT and x.symbol.id.strike_price == short_put_strike),
None)
if short_put_position is None or short_put_position.quantity != -2:
if not short_put_position or short_put_position.quantity != -2:
raise AssertionError(f"Expected short put position quantity to be -2. Actual: {short_put_position.quantity}")
short_call_strike = ordered_strikes[2]
short_call_position = next((x for x in position_group.positions
if x.symbol.id.option_right == OptionRight.CALL and x.symbol.id.strike_price == short_call_strike),
None)
if short_call_position is None or short_call_position.quantity != -2:
if not short_call_position or short_call_position.quantity != -2:
raise AssertionError(f"Expected short call position quantity to be -2. Actual: {short_call_position.quantity}")
long_call_strike = ordered_strikes[3]
long_call_position = next((x for x in position_group.positions
if x.symbol.id.option_right == OptionRight.CALL and x.symbol.id.strike_price == long_call_strike),
None)
if long_call_position is None or long_call_position.quantity != 2:
if not long_call_position or long_call_position.quantity != 2:
raise AssertionError(f"Expected long call position quantity to be 2. Actual: {long_call_position.quantity}")
def liquidate_strategy(self):
def liquidate_strategy(self) -> None:
# We should be able to close the position by selling the strategy
self.sell(self._iron_condor, 2)