From 99b51d4cc04594aa217b4acf53e65f304d37e651 Mon Sep 17 00:00:00 2001 From: algizn97 Date: Thu, 21 Aug 2025 13:46:12 +0500 Subject: [PATCH] Added limit and market orders functions --- app/services/Bybit/functions/functions.py | 117 ++++++++++++++++++---- 1 file changed, 97 insertions(+), 20 deletions(-) diff --git a/app/services/Bybit/functions/functions.py b/app/services/Bybit/functions/functions.py index 86ff692..a2ca431 100644 --- a/app/services/Bybit/functions/functions.py +++ b/app/services/Bybit/functions/functions.py @@ -1,6 +1,7 @@ from aiogram import F, Router from app.services.Bybit.functions import Futures, func_min_qty +from app.services.Bybit.functions.Futures import open_market_order, open_limit_order from app.services.Bybit.functions.balance import get_balance import app.telegram.Keyboards.inline_keyboards as inline_markup @@ -15,8 +16,11 @@ router_functions_bybit_trade = Router() class state_update_symbol(StatesGroup): symbol = State() - -@router_functions_bybit_trade.callback_query(F.data == 'clb_start_trading') + +class state_update_entry_type(StatesGroup): + entry_type = State() + +@router_functions_bybit_trade.callback_query(F.data.in_(['clb_start_trading', 'clb_back_to_main'])) async def clb_start_bybit_trade_message(callback: CallbackQuery, state: FSMContext): api = await rq.get_bybit_api_key(callback.from_user.id) secret = await rq.get_bybit_secret_key(callback.from_user.id) @@ -76,24 +80,97 @@ async def update_symbol_for_trade(message: Message, state: FSMContext): await state.clear() -@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) - 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) +@router_functions_bybit_trade.callback_query(F.data == 'clb_update_entry_type') +async def update_entry_type_message(callback: CallbackQuery, state: FSMContext): + await state.set_state(state_update_entry_type.entry_type) + await callback.message.answer("Выберите тип входа в позицию:", reply_markup=inline_markup.entry_order_type_markup) + await callback.answer() - if qty < qty_min: - await callback.message.edit_text(f"Количество вашей ставки ({qty}) меньше минимального количества ({qty_min}) для данной торговой пары") + +@router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith('entry_order_type:')) +async def entry_order_type_callback(callback: CallbackQuery, state: FSMContext): + order_type = callback.data.split(':')[1] + + if order_type not in ['Market', 'Limit']: + await callback.answer("Ошибка выбора", show_alert=True) + return + + await state.update_data(entry_order_type=order_type) + await rq.update_entry_order_type(callback.from_user.id, order_type) + + if order_type == 'Limit': + await callback.answer("Вы выбрали Limit. Введите цену для лимитного ордера.") + await callback.message.answer("Введите цену лимитного ордера:") + await state.update_data(awaiting_limit_price=True) else: - match trade_mode: - case 'Long': - await Futures.contract_long(callback.from_user.id, callback.message, margin_mode) - case 'Short': - await Futures.contract_short(callback.from_user.id, callback.message, margin_mode) - case 'Switch': - await callback.message.edit_text('Режим Switch пока недоступен') - case 'Smart': - await callback.message.edit_text('Режим Smart пока недоступен') \ No newline at end of file + await callback.answer("Вы выбрали Market. Нажмите кнопку ниже, чтобы открыть сделку.") + await callback.message.answer("Нажмите кнопку, чтобы открыть сделку.", + reply_markup=inline_markup.open_deal_markup) + await callback.message.delete() + + +@router_functions_bybit_trade.message() +async def process_limit_price_message(message: Message, state: FSMContext): + data = await state.get_data() + if not data.get('awaiting_limit_price'): + return + + try: + price = float(message.text) + if price <= 0: + raise ValueError() + except ValueError: + await message.answer("Ошибка: введите корректное положительное число для цены.") + return + + await state.update_data(limit_price=price, awaiting_limit_price=False) + + await message.answer(f"Цена лимитного ордера установлена: {price}. Нажмите кнопку ниже, чтобы открыть сделку.", + reply_markup=inline_markup.open_deal_markup) + + +@router_functions_bybit_trade.callback_query(F.data == "clb_open_deal") +async def open_deal(callback: CallbackQuery, state: FSMContext): + 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) + + if order_type == 'Market': + await open_market_order(callback.from_user.id, callback.message, api_key=api, secret_key=secret) + 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("Неизвестный тип ордера.") + + await callback.message.edit_reply_markup() + await state.clear() + + +# @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) +# +# 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) +# +# if qty < qty_min: +# await callback.message.edit_text(f"Количество вашей ставки ({qty}) меньше минимального количества ({qty_min}) для данной торговой пары") +# else: +# match trade_mode: +# case 'Long': +# await Futures.contract_long(callback.from_user.id, callback.message, margin_mode) +# case 'Short': +# await Futures.contract_short(callback.from_user.id, callback.message, margin_mode) +# case 'Switch': +# await callback.message.edit_text('Режим Switch пока недоступен') +# case 'Smart': +# await callback.message.edit_text('Режим Smart пока недоступен') \ No newline at end of file