Skip to content

Commit

Permalink
[Order] handle MissingMinimalExchangeTradeVolume
Browse files Browse the repository at this point in the history
  • Loading branch information
techfreaque committed Feb 16, 2023
1 parent 49e01cc commit 2405967
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,9 @@ async def _create_order(context, symbol, order_quantity, order_price, tag, order
error_message = "missing minimal funds"
except asyncio.TimeoutError as e:
error_message = f"{e} and is necessary to compute the order details"
except trading_errors.MinimumOrderCostNotReachedError as e:
error_message = f"failed to create order : {e}."
context.logger.exception(e, True, f"Failed to create order : {e}.")
except Exception as e:
error_message = f"failed to create order : {e}."
context.logger.exception(e, True, f"Failed to create order : {e}.")
Expand Down
115 changes: 63 additions & 52 deletions Trading/Mode/arbitrage_trading_mode/arbitrage_trading.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import octobot_trading.personal_data as trading_personal_data
import octobot_trading.constants as trading_constants
import octobot_trading.modes as trading_modes
import octobot_trading.errors as errors
import octobot_trading.octobot_channel_consumer as octobot_channel_consumer
import octobot_trading.enums as trading_enums
import tentacles.Trading.Mode.arbitrage_trading_mode.arbitrage_container as arbitrage_container_import
Expand Down Expand Up @@ -170,22 +171,27 @@ async def _create_initial_arbitrage_order(self, arbitrage_container):
if order_type is trading_enums.TraderOrderType.SELL_LIMIT:
quantity = trading_personal_data.decimal_add_dusts_to_quantity_if_necessary(quantity, price, symbol_market,
current_symbol_holding)
for order_quantity, order_price in trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
quantity,
arbitrage_container.own_exchange_price,
symbol_market):
current_order = trading_personal_data.create_order_instance(trader=self.exchange_manager.trader,
order_type=order_type,
symbol=self.trading_mode.symbol,
current_price=arbitrage_container.own_exchange_price,
quantity=order_quantity,
price=order_price)
created_order = await self.exchange_manager.trader.create_order(current_order)
created_orders.append(created_order)
arbitrage_container.initial_limit_order_id = created_order.order_id
self.open_arbitrages.append(arbitrage_container)
# only create one order per arbitrage
return created_orders
try:
for order_quantity, order_price in trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
quantity,
arbitrage_container.own_exchange_price,
symbol_market):
current_order = trading_personal_data.create_order_instance(trader=self.exchange_manager.trader,
order_type=order_type,
symbol=self.trading_mode.symbol,
current_price=arbitrage_container.own_exchange_price,
quantity=order_quantity,
price=order_price)
created_order = await self.exchange_manager.trader.create_order(current_order)
created_orders.append(created_order)
arbitrage_container.initial_limit_order_id = created_order.order_id
self.open_arbitrages.append(arbitrage_container)
# only create one order per arbitrage
return created_orders
except errors.MissingMinimalExchangeTradeVolume as error:
self.logger.exception(
error, True,
f"Failed to create initial arbitrage orders - error: {error}")

async def _create_secondary_arbitrage_order(self, arbitrage_container, quantity):
created_orders = []
Expand All @@ -197,43 +203,48 @@ async def _create_secondary_arbitrage_order(self, arbitrage_container, quantity)
if now_selling:
quantity = trading_personal_data.decimal_add_dusts_to_quantity_if_necessary(quantity, price, symbol_market,
current_symbol_holding)
for order_quantity, order_price in trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
quantity,
arbitrage_container.target_price,
symbol_market):
oco_group = self.exchange_manager.exchange_personal_data.orders_manager.create_group(
trading_personal_data.OneCancelsTheOtherOrderGroup
)
current_order = trading_personal_data.create_order_instance(trader=self.exchange_manager.trader,
order_type=trading_enums.TraderOrderType.SELL_LIMIT if now_selling
else trading_enums.TraderOrderType.BUY_LIMIT,
symbol=self.trading_mode.symbol,
current_price=arbitrage_container.own_exchange_price,
quantity=order_quantity,
price=order_price,
group=oco_group)
created_order = await self.exchange_manager.trader.create_order(current_order)
created_orders.append(created_order)
arbitrage_container.secondary_limit_order_id = created_order.order_id

if created_order.is_open():
stop_price = self._get_stop_loss_price(symbol_market,
arbitrage_container.own_exchange_price,
now_selling)
current_order = trading_personal_data.create_order_instance(
trader=self.exchange_manager.trader,
order_type=trading_enums.TraderOrderType.STOP_LOSS,
symbol=self.trading_mode.symbol,
current_price=arbitrage_container.own_exchange_price,
quantity=order_quantity,
price=stop_price,
group=oco_group,
side=trading_enums.TradeOrderSide.SELL
if now_selling else trading_enums.TradeOrderSide.BUY
try:
for order_quantity, order_price in trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
quantity,
arbitrage_container.target_price,
symbol_market):
oco_group = self.exchange_manager.exchange_personal_data.orders_manager.create_group(
trading_personal_data.OneCancelsTheOtherOrderGroup
)
await self.exchange_manager.trader.create_order(current_order)
arbitrage_container.secondary_stop_order_id = current_order.order_id
return created_orders
current_order = trading_personal_data.create_order_instance(trader=self.exchange_manager.trader,
order_type=trading_enums.TraderOrderType.SELL_LIMIT if now_selling
else trading_enums.TraderOrderType.BUY_LIMIT,
symbol=self.trading_mode.symbol,
current_price=arbitrage_container.own_exchange_price,
quantity=order_quantity,
price=order_price,
group=oco_group)
created_order = await self.exchange_manager.trader.create_order(current_order)
created_orders.append(created_order)
arbitrage_container.secondary_limit_order_id = created_order.order_id

if created_order.is_open():
stop_price = self._get_stop_loss_price(symbol_market,
arbitrage_container.own_exchange_price,
now_selling)
current_order = trading_personal_data.create_order_instance(
trader=self.exchange_manager.trader,
order_type=trading_enums.TraderOrderType.STOP_LOSS,
symbol=self.trading_mode.symbol,
current_price=arbitrage_container.own_exchange_price,
quantity=order_quantity,
price=stop_price,
group=oco_group,
side=trading_enums.TradeOrderSide.SELL
if now_selling else trading_enums.TradeOrderSide.BUY
)
await self.exchange_manager.trader.create_order(current_order)
arbitrage_container.secondary_stop_order_id = current_order.order_id
return created_orders
except errors.MissingMinimalExchangeTradeVolume as error:
self.logger.exception(
error, True, f"Failed to create secondary arbitrage orders - error: {error}")
raise

def _get_quantity_from_holdings(self, current_symbol_holding, market_quantity, state):
# TODO handle quantity in a non dynamic manner (avoid subsequent orders volume reduction)
Expand Down
20 changes: 13 additions & 7 deletions Trading/Mode/dip_analyser_trading_mode/dip_analyser_trading.py
Original file line number Diff line number Diff line change
Expand Up @@ -390,13 +390,19 @@ def _generate_sell_orders(self, sell_orders_count, quantity, sell_weight, sell_b
total_volume = 0
for i in range(adapted_sell_orders_count):
order_price = sell_base + (increment * (i + 1))
for adapted_quantity, adapted_price \
in trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
order_volume,
order_price,
symbol_market):
total_volume += adapted_quantity
volume_with_price.append((adapted_quantity, adapted_price))
try:
for adapted_quantity, adapted_price \
in trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
order_volume,
order_price,
symbol_market):
total_volume += adapted_quantity
volume_with_price.append((adapted_quantity, adapted_price))
except trading_errors.MissingMinimalExchangeTradeVolume as error:
self.logger.exception(
error, True,
f"Failed to generate sell orders - error: {error}")
# continue trying to create other orders
if not volume_with_price:
volume_with_price.append((quantity, trading_personal_data.decimal_adapt_price(symbol_market,
sell_base + increment)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,8 @@ async def create_order(self, order_data, current_price, symbol_market):
# disable instant fill to avoid looping order fill in simulator
current_order.allow_instant_fill = False
created_order = await self.exchange_manager.trader.create_order(current_order)
except trading_errors.MissingFunds as e:
except (trading_errors.MissingFunds,
trading_errors.MissingMinimalExchangeTradeVolume) as e:
raise e
except Exception as e:
self.logger.error(f"Failed to create order : {e}. Order: {order_data}")
Expand Down

0 comments on commit 2405967

Please sign in to comment.