* pep8 conversion * more * Minor fix * Fix related regression algorithm --------- Co-authored-by: Martin Molinero <martin.molinero1@gmail.com>
This commit is contained in:
@@ -14,46 +14,46 @@
|
||||
from AlgorithmImports import *
|
||||
|
||||
class BasicTemplateIndexOptionsAlgorithm(QCAlgorithm):
|
||||
def Initialize(self) -> None:
|
||||
self.SetStartDate(2021, 1, 4)
|
||||
self.SetEndDate(2021, 2, 1)
|
||||
self.SetCash(1000000)
|
||||
def initialize(self) -> None:
|
||||
self.set_start_date(2021, 1, 4)
|
||||
self.set_end_date(2021, 2, 1)
|
||||
self.set_cash(1000000)
|
||||
|
||||
self.spx = self.AddIndex("SPX", Resolution.Minute).Symbol
|
||||
spxOptions = self.AddIndexOption(self.spx, Resolution.Minute)
|
||||
spxOptions.SetFilter(lambda x: x.CallsOnly())
|
||||
self.spx = self.add_index("SPX", Resolution.MINUTE).symbol
|
||||
spx_options = self.add_index_option(self.spx, Resolution.MINUTE)
|
||||
spx_options.set_filter(lambda x: x.calls_only())
|
||||
|
||||
self.emaSlow = self.EMA(self.spx, 80)
|
||||
self.emaFast = self.EMA(self.spx, 200)
|
||||
self.ema_slow = self.ema(self.spx, 80)
|
||||
self.ema_fast = self.ema(self.spx, 200)
|
||||
|
||||
def OnData(self, data: Slice) -> None:
|
||||
if self.spx not in data.Bars or not self.emaSlow.IsReady:
|
||||
def on_data(self, data: Slice) -> None:
|
||||
if self.spx not in data.bars or not self.ema_slow.is_ready:
|
||||
return
|
||||
|
||||
for chain in data.OptionChains.Values:
|
||||
for contract in chain.Contracts.Values:
|
||||
if self.Portfolio.Invested:
|
||||
for chain in data.option_chains.values():
|
||||
for contract in chain.contracts.values():
|
||||
if self.portfolio.invested:
|
||||
continue
|
||||
|
||||
if (self.emaFast > self.emaSlow and contract.Right == OptionRight.Call) or \
|
||||
(self.emaFast < self.emaSlow and contract.Right == OptionRight.Put):
|
||||
if (self.ema_fast > self.ema_slow and contract.right == OptionRight.CALL) or \
|
||||
(self.ema_fast < self.ema_slow and contract.right == OptionRight.PUT):
|
||||
|
||||
self.Liquidate(self.InvertOption(contract.Symbol))
|
||||
self.MarketOrder(contract.Symbol, 1)
|
||||
self.liquidate(self.invert_option(contract.symbol))
|
||||
self.market_order(contract.symbol, 1)
|
||||
|
||||
def OnEndOfAlgorithm(self) -> None:
|
||||
if self.Portfolio[self.spx].TotalSaleVolume > 0:
|
||||
def on_end_of_algorithm(self) -> None:
|
||||
if self.portfolio[self.spx].total_sale_volume > 0:
|
||||
raise Exception("Index is not tradable.")
|
||||
|
||||
if self.Portfolio.TotalSaleVolume == 0:
|
||||
if self.portfolio.total_sale_volume == 0:
|
||||
raise Exception("Trade volume should be greater than zero by the end of this algorithm")
|
||||
|
||||
def InvertOption(self, symbol: Symbol) -> Symbol:
|
||||
return Symbol.CreateOption(
|
||||
symbol.Underlying,
|
||||
symbol.ID.Market,
|
||||
symbol.ID.OptionStyle,
|
||||
OptionRight.Put if symbol.ID.OptionRight == OptionRight.Call else OptionRight.Call,
|
||||
symbol.ID.StrikePrice,
|
||||
symbol.ID.Date
|
||||
def invert_option(self, symbol: Symbol) -> Symbol:
|
||||
return Symbol.create_option(
|
||||
symbol.underlying,
|
||||
symbol.id.market,
|
||||
symbol.id.option_style,
|
||||
OptionRight.PUT if symbol.id.option_right == OptionRight.CALL else OptionRight.CALL,
|
||||
symbol.id.strike_price,
|
||||
symbol.id.date
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user