Skip to content

Commit 5d5f73d

Browse files
committed
[TradingMode] add convert_with_market_or_limit_order
1 parent a130ed8 commit 5d5f73d

File tree

1 file changed

+61
-51
lines changed

1 file changed

+61
-51
lines changed

octobot_trading/modes/modes_util.py

Lines changed: 61 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -92,61 +92,71 @@ async def convert_asset_to_target_asset(
9292
tickers = tickers or {}
9393
portfolio = trading_mode.exchange_manager.exchange_personal_data.portfolio_manager.portfolio.portfolio
9494
if asset in portfolio and portfolio[asset].available:
95-
# get symbol of the order
96-
symbol, order_type = _get_associated_symbol_and_order_type(trading_mode, asset, target_asset)
97-
if symbol is None:
98-
# can't convert asset into target_asset
99-
trading_mode.logger.warning(
100-
f"Impossible to convert {asset} into {target_asset}: no associated trading pair "
101-
f"on {trading_mode.exchange_manager.exchange_name}"
102-
)
103-
return created_orders
95+
created_orders.extend(
96+
await convert_with_market_or_limit_order(trading_mode, asset, target_asset, tickers, asset_amount)
97+
)
98+
return created_orders
10499

105-
# get symbol price
106-
price_base = asset
107-
price_target = target_asset
108-
if order_type is trading_enums.TraderOrderType.BUY_MARKET:
109-
price_base = target_asset
110-
price_target = asset
111100

112-
price = trading_personal_data.get_asset_price_from_converter_or_tickers(
113-
trading_mode.exchange_manager, price_base, price_target, symbol, tickers
101+
async def convert_with_market_or_limit_order(
102+
trading_mode, asset: str, target_asset: str, tickers: dict, asset_amount=None
103+
) -> list:
104+
# get symbol of the order
105+
symbol, order_type = _get_associated_symbol_and_order_type(trading_mode, asset, target_asset)
106+
if symbol is None:
107+
# can't convert asset into target_asset
108+
trading_mode.logger.warning(
109+
f"Impossible to convert {asset} into {target_asset}: no associated trading pair "
110+
f"on {trading_mode.exchange_manager.exchange_name}"
114111
)
112+
return []
115113

116-
if not price:
117-
# can't get price, should not happen as symbol is in client_symbols
118-
trading_mode.logger.error(
119-
f"Impossible to convert {asset} into {target_asset}: {symbol} ticker can't be fetched"
120-
)
121-
return created_orders
122-
123-
if trading_personal_data.get_trade_order_type(order_type) is not trading_enums.TradeOrderType.MARKET:
124-
# can't use market orders: use limit orders with price a bit under the current price to instant fill it.
125-
price = get_instantly_filled_limit_order_adapted_price(price, order_type)
126-
127-
# get order quantity
128-
quantity = _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount)
129-
symbol_market = trading_mode.exchange_manager.exchange.get_market_status(symbol, with_fixer=False)
130-
for order_quantity, order_price in \
131-
trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
132-
quantity,
133-
price,
134-
symbol_market
135-
):
136-
# create order
137-
order = trading_personal_data.create_order_instance(
138-
trader=trading_mode.exchange_manager.trader,
139-
order_type=order_type,
140-
symbol=symbol,
141-
current_price=price,
142-
quantity=order_quantity,
143-
price=order_price
144-
)
145-
initialized_order = await trading_mode.create_order(order)
146-
if isinstance(initialized_order, trading_personal_data.LimitOrder) and initialized_order.simulated:
147-
# on simulator, this order should be instantly filled now as its price is meant to be instantly filled
148-
await initialized_order.on_fill()
149-
created_orders.append(initialized_order)
114+
# get symbol price
115+
price_base = asset
116+
price_target = target_asset
117+
if order_type is trading_enums.TraderOrderType.BUY_MARKET:
118+
price_base = target_asset
119+
price_target = asset
120+
121+
price = trading_personal_data.get_asset_price_from_converter_or_tickers(
122+
trading_mode.exchange_manager, price_base, price_target, symbol, tickers
123+
)
124+
125+
if not price:
126+
# can't get price, should not happen as symbol is in client_symbols
127+
trading_mode.logger.error(
128+
f"Impossible to convert {asset} into {target_asset}: {symbol} ticker can't be fetched"
129+
)
130+
return []
131+
132+
if trading_personal_data.get_trade_order_type(order_type) is not trading_enums.TradeOrderType.MARKET:
133+
# can't use market orders: use limit orders with price a bit under the current price to instant fill it.
134+
price = get_instantly_filled_limit_order_adapted_price(price, order_type)
135+
136+
# get order quantity
137+
quantity = _get_available_or_target_quantity(trading_mode, symbol, order_type, price, asset_amount)
138+
symbol_market = trading_mode.exchange_manager.exchange.get_market_status(symbol, with_fixer=False)
139+
created_orders = []
140+
for order_quantity, order_price in \
141+
trading_personal_data.decimal_check_and_adapt_order_details_if_necessary(
142+
quantity,
143+
price,
144+
symbol_market
145+
):
146+
# create order
147+
order = trading_personal_data.create_order_instance(
148+
trader=trading_mode.exchange_manager.trader,
149+
order_type=order_type,
150+
symbol=symbol,
151+
current_price=price,
152+
quantity=order_quantity,
153+
price=order_price
154+
)
155+
initialized_order = await trading_mode.create_order(order)
156+
if isinstance(initialized_order, trading_personal_data.LimitOrder) and initialized_order.simulated:
157+
# on simulator, this order should be instantly filled now as its price is meant to be instantly filled
158+
await initialized_order.on_fill()
159+
created_orders.append(initialized_order)
150160
return created_orders
151161

152162

0 commit comments

Comments
 (0)