diff --git a/app/services/Bybit/functions/Futures.py b/app/services/Bybit/functions/Futures.py index f8ac8bb..afd28a0 100644 --- a/app/services/Bybit/functions/Futures.py +++ b/app/services/Bybit/functions/Futures.py @@ -280,14 +280,17 @@ async def open_market_order(tg_id, message, api_key, secret_key): await contract_long(tg_id, message, margin_mode) elif trading_mode == 'Short': await contract_short(tg_id, message, margin_mode) - else: - await message.answer("Неизвестный режим торговли: выберите Long или Short.") + elif trading_mode == 'Smart': + await message.answer("Режим Smart пока недоступен") + elif trading_mode == 'Switch': + await message.answer("Режим Switch пока недоступен") async def open_limit_order(tg_id, message, price, api_key, secret_key): data_main_stgs = await rq.get_user_main_settings(tg_id) trading_mode = data_main_stgs['trading_mode'] margin_mode = data_main_stgs.get('margin_type') + order_type = await rq.get_entry_order_type(tg_id) client = HTTP( @@ -297,7 +300,7 @@ async def open_limit_order(tg_id, message, price, api_key, secret_key): symbol = await rq.get_symbol(tg_id) qty = float(data_main_stgs['starting_quantity']) - side = 'Buy' if trading_mode == 'Long' else 'Sell' + side = 'Buy' if trading_mode == 'Long' else 'Short' try: @@ -313,6 +316,8 @@ async def open_limit_order(tg_id, message, price, api_key, secret_key): ) if response.get('retCode') == 0: await message.answer(f"Limit ордер открыт: {side} {qty} {symbol} по цене {price}") + await rq.update_user_trades(tg_id, symbol=symbol, side=order_type) + else: await message.answer(f"Ошибка открытия ордера: {response.get('retMsg')}") except Exception as e: diff --git a/app/services/Bybit/functions/functions.py b/app/services/Bybit/functions/functions.py index a2ca431..ac8b186 100644 --- a/app/services/Bybit/functions/functions.py +++ b/app/services/Bybit/functions/functions.py @@ -132,19 +132,27 @@ async def process_limit_price_message(message: Message, state: FSMContext): @router_functions_bybit_trade.callback_query(F.data == "clb_open_deal") async def open_deal(callback: CallbackQuery, state: FSMContext): + data_main_stgs = await rq.get_user_main_settings(callback.from_user.id) data = await state.get_data() order_type = await rq.get_entry_order_type(callback.from_user.id) api = await rq.get_bybit_api_key(callback.from_user.id) secret = await rq.get_bybit_secret_key(callback.from_user.id) + qty = data_main_stgs['starting_quantity'] + qty_min = await func_min_qty.get_min_qty(callback.from_user.id, callback.message) + + if qty < qty_min: + await callback.message.edit_text(f"Количество вашей ставки ({qty}) меньше минимального количества ({qty_min}) для данной торговой пары") + await callback.answer() + return if order_type == 'Market': await open_market_order(callback.from_user.id, callback.message, api_key=api, secret_key=secret) + await rq.update_user_trades(callback.from_user.id, symbol=data.get('symbol'), side=order_type) elif order_type == 'Limit': price = data.get('limit_price') if not price: await callback.answer("Цена для лимитного ордера не задана. Введите сначала цену.") return - await open_limit_order(callback.from_user.id, callback.message, price, api_key=api, secret_key=secret) else: await callback.answer("Неизвестный тип ордера.") @@ -153,6 +161,33 @@ async def open_deal(callback: CallbackQuery, state: FSMContext): await state.clear() +@router_functions_bybit_trade.callback_query(F.data == "clb_my_deals") +async def show_my_trades_callback(callback: CallbackQuery): + tg_id = callback.from_user.id + trades = await rq.get_user_trades(tg_id) + + if not trades: + await callback.message.answer("У вас ещё нет сделок.") + await callback.answer() + return + + grouped = {} + for trade in trades: + symbol = trade['symbol'] if isinstance(trade, dict) else trade.symbol + grouped.setdefault(symbol, []).append(trade) + + text_response = "Ваши сделки по валютным парам:\n\n" + for symbol, trade_list in grouped.items(): + text_response += f"{symbol}\n" + for t in trade_list: + side = t['side'] if isinstance(t, dict) else t.side + text_response += f" - {side}\n" + text_response += "\n" + + await callback.message.answer(text_response, parse_mode='html') + await callback.answer() + + # @router_functions_bybit_trade.callback_query(F.data == 'clb_open_deal') # async def make_deal_bybit (callback: CallbackQuery): # data_main_stgs = await rq.get_user_main_settings(callback.from_user.id) @@ -160,7 +195,7 @@ async def open_deal(callback: CallbackQuery, state: FSMContext): # trade_mode = data_main_stgs['trading_mode'] # qty = data_main_stgs['starting_quantity'] # margin_mode = data_main_stgs['margin_type'] -# qty_min = await func_min_qty.get_min_qty(callback.from_user.id, callback.message) + qty_min = await func_min_qty.get_min_qty(callback.from_user.id, callback.message) # # if qty < qty_min: # await callback.message.edit_text(f"Количество вашей ставки ({qty}) меньше минимального количества ({qty_min}) для данной торговой пары") diff --git a/app/telegram/functions/main_settings/settings.py b/app/telegram/functions/main_settings/settings.py index 632c234..8ab3c03 100644 --- a/app/telegram/functions/main_settings/settings.py +++ b/app/telegram/functions/main_settings/settings.py @@ -38,7 +38,7 @@ async def main_settings_message(id, message, state): - Размер кредитного плеча: х{data['size_leverage']} - Начальная ставка: {data['starting_quantity']} - Коэффициент мартингейла: {data['martingale_factor']} -- Максимальное количесиво ставок в серии: {data['maximal_quantity']} +- Максимальное количество ставок в серии: {data['maximal_quantity']} """, parse_mode='html', reply_markup=inline_markup.main_settings_markup) async def trading_mode_message(message, state): @@ -189,7 +189,7 @@ async def state_margin_type(callback: CallbackQuery, state): async def starting_quantity_message (message, state): await state.set_state(update_main_settings.starting_quantity) - await message.edit_text("Введите началаьную ставку:", parse_mode='html', reply_markup=inline_markup.back_btn_list_settings_markup) + await message.edit_text("Введите начальную ставку:", parse_mode='html', reply_markup=inline_markup.back_btn_list_settings_markup) @router_main_settings.message(update_main_settings.starting_quantity) async def state_starting_quantity(message: Message, state):