@@ -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