From b074d1d8a14a953e4b2953997558dd146ec13860 Mon Sep 17 00:00:00 2001 From: algizn97 Date: Fri, 19 Sep 2025 14:41:18 +0500 Subject: [PATCH] Added the ability to set a price trigger and limit --- .../functions/condition_settings/settings.py | 97 ++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/app/telegram/functions/condition_settings/settings.py b/app/telegram/functions/condition_settings/settings.py index 0f3116d..bfc9eec 100644 --- a/app/telegram/functions/condition_settings/settings.py +++ b/app/telegram/functions/condition_settings/settings.py @@ -5,7 +5,7 @@ from aiogram.types import Message, CallbackQuery from aiogram.fsm.context import FSMContext import app.telegram.database.requests as rq from app.states.States import condition_settings - +from app.states.States import state_limit_price, state_update_entry_type, state_trigger_price from logger_helper.logger_helper import LOGGING_CONFIG logging.config.dictConfig(LOGGING_CONFIG) @@ -23,8 +23,24 @@ async def reg_new_user_default_condition_settings(id): async def main_settings_message(id, message): + data = await rq.get_user_main_settings(id) + entry_order_type = data['entry_order_type'] + + if entry_order_type == "Market": + entry_order_type_rus = "Маркет" + elif entry_order_type == "Limit": + entry_order_type_rus = "Лимит" + else: + entry_order_type_rus = "Условный" + + trigger_price = data['trigger_price'] or 0.0 + limit_price = data['limit_order_price'] or 0.0 + text = f""" Условия запуска - Таймер: установить таймер / удалить таймер +- Тип позиции: {entry_order_type_rus} +- Триггер цена: {trigger_price:,.4f} +- Лимит цена: {limit_price:,.4f} """ await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.condition_settings_markup) @@ -75,6 +91,85 @@ async def delete_timer_callback(callback: CallbackQuery, state: FSMContext): await callback.answer() +@condition_settings_router.callback_query(F.data == 'clb_update_entry_type') +async def update_entry_type_message(callback: CallbackQuery, state: FSMContext) -> None: + """ + Запрашивает у пользователя тип входа в позицию (Market или Limit). + """ + 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() + + +@condition_settings_router.callback_query(lambda c: c.data and c.data.startswith('entry_order_type:')) +async def entry_order_type_callback(callback: CallbackQuery, state: FSMContext) -> None: + """ + Обработка выбора типа входа в позицию. + Если Limit, запрашивает цену лимитного ордера. + Если Market — обновляет настройки. + """ + order_type = callback.data.split(':')[1] + + if order_type not in ['Market', 'Limit']: + await callback.answer("Ошибка выбора", show_alert=True) + return + + if order_type == 'Limit': + order_type_rus = 'Лимит' + else: + order_type_rus = 'Маркет' + try: + await state.update_data(entry_order_type=order_type) + await rq.update_entry_order_type(callback.from_user.id, order_type) + await callback.message.answer(f"Выбран тип входа {order_type_rus}", + reply_markup=inline_markup.back_to_condition_settings) + await callback.answer() + except Exception as e: + logger.error("Произошла ошибка при обновлении типа входа в позицию: %s", e) + await callback.message.answer("Произошла ошибка при обновлении типа входа в позицию", + reply_markup=inline_markup.back_to_condition_settings) + await state.clear() + + +@condition_settings_router.callback_query(F.data == 'clb_change_limit_price') +async def set_limit_price_callback(callback: CallbackQuery, state: FSMContext) -> None: + await state.set_state(state_limit_price.price) + await callback.message.answer("Введите цену лимитного ордера:", reply_markup=inline_markup.cancel) + await callback.answer() + + +@condition_settings_router.message(state_limit_price.price) +async def process_limit_price_input(message: Message, state: FSMContext) -> None: + try: + price = float(message.text) + await state.update_data(price=price) + await rq.update_limit_price(tg_id=message.from_user.id, price=price) + await message.answer(f"Цена лимитного ордера установлена: {price}", reply_markup=inline_markup.back_to_condition_settings) + await state.clear() + except ValueError: + await message.reply("Пожалуйста, введите корректную цену.") + + +@condition_settings_router.callback_query(F.data == 'clb_change_trigger_price') +async def change_trigger_price_callback(callback: CallbackQuery, state: FSMContext) -> None: + await state.set_state(state_trigger_price.price) + await callback.message.answer("Введите цену триггера:", reply_markup=inline_markup.cancel) + await callback.answer() + + +@condition_settings_router.message(state_trigger_price.price) +async def process_trigger_price_input(message: Message, state: FSMContext) -> None: + try: + price = float(message.text) + await state.update_data(price=price) + await rq.update_trigger_price(tg_id=message.from_user.id, price=price) + await message.answer(f"Цена триггера установлена: {price}", reply_markup=inline_markup.back_to_condition_settings) + await state.clear() + except ValueError: + await message.reply("Пожалуйста, введите корректную цену.") + + + async def filter_volatility_message(message, state): text = '''Фильтр волатильности