from datetime import datetime from pandas import DataFrame from backtesting.credit_targeting import iron_condor_strategy from database.trades import get_leg, get_spread, upsert from database.trades.action import Action from database.trades.option_type import OptionType from ibkr import option_type as IBKROptionType from ibkr.option_order import OptionOrder def translate_action(action_string: str) -> Action: for action in Action: if action_string == action.value: return action def translate_option_type(option_type_string: str) -> OptionType: if option_type_string == IBKROptionType.CALL: return OptionType.CALL else: return OptionType.PUT def spread(spread_order: OptionOrder) -> dict: near_leg = spread_order.legs[0] far_leg = spread_order.legs[1] return get_spread( near_leg = get_leg( action = translate_action(near_leg.action), strike = near_leg.strike, option_type = translate_option_type(near_leg.option_type) ), far_leg = get_leg( action = translate_action(far_leg.action), strike = far_leg.strike, option_type = translate_option_type(far_leg.option_type) ), open_price = spread_order.fill_price, entry_slippage = round(spread_order.mid_price - spread_order.fill_price, 3) ) def insert_trade( symbol: str, target: float, entry_time: datetime, call_spread_order: OptionOrder, put_spread_order: OptionOrder ): upsert( DataFrame([{ 'Date': datetime.now().date(), 'Symbol': symbol, 'Strategy': iron_condor_strategy(target), 'Entry Time': entry_time.replace(tzinfo = None), 'Exit Time': None, # Required. 'Spreads': [spread(call_spread_order), spread(put_spread_order)], 'Profit': None # Required. }]) )