async def _trigger_arbitrage_secondary_order(self, arbitrage, filled_order, filled_quantity_before_fees): arbitrage.passed_initial_order = True now_buying = arbitrage.state is trading_enums.EvaluatorStates.SHORT # a SHORT arbitrage is an initial SELL followed by a BUY order. # Here in the secondary order construction: # - Buy (at a lower price) when the arbitrage is a SHORT # - Sell (at a higher price) when the arbitrage is a LONG paid_fees_in_quote = trading_personal_data.total_fees_from_order_dict( filled_order, self.quote) secondary_quantity = filled_quantity_before_fees - paid_fees_in_quote filled_price = filled_order[ trading_enums.ExchangeConstantsOrderColumns.PRICE.value] if now_buying: arbitrage.initial_before_fee_filled_quantity = filled_quantity_before_fees else: arbitrage.initial_before_fee_filled_quantity = filled_quantity_before_fees * filled_price if now_buying: # buying at a lower price: buy more than what has been sold, take fees into account fees_in_base = trading_personal_data.total_fees_from_order_dict( filled_order, self.base) secondary_base_amount = filled_price * secondary_quantity - fees_in_base secondary_quantity = secondary_base_amount / arbitrage.target_price # reduce quantity a bit to avoid python rounding issues, # remaining amount will be handled as dusts if necessary secondary_quantity = secondary_quantity * 0.99999 await self._create_arbitrage_secondary_order(arbitrage, secondary_quantity)
async def order_filled_callback(self, filled_order): if filled_order[ trading_enums.ExchangeConstantsOrderColumns.SIDE.value] == trading_enums.TradeOrderSide.BUY.value: self.state = trading_enums.EvaluatorStates.SHORT paid_fees = trading_personal_data.total_fees_from_order_dict(filled_order, self.base) sell_quantity = filled_order[trading_enums.ExchangeConstantsOrderColumns.FILLED.value] - paid_fees await self._create_sell_order_if_enabled(filled_order[trading_enums.ExchangeConstantsOrderColumns.ID.value], sell_quantity, filled_order[ trading_enums.ExchangeConstantsOrderColumns.PRICE.value])