from aiogram import Router import app.telegram.Keyboards.inline_keyboards as inline_markup import app.telegram.database.requests as rq from aiogram.types import Message, CallbackQuery from app.states.States import update_risk_management_settings router_risk_management_settings = Router() async def reg_new_user_default_risk_management_settings(id, message): tg_id = id await rq.set_new_user_default_risk_management_settings(tg_id) async def main_settings_message(id, message): data = await rq.get_user_risk_management_settings(id) text = f"""Риск менеджмент, - Процент изменения цены для фиксации прибыли: {data.get('price_profit', 0)}% - Процент изменения цены для фиксации убытков: {data.get('price_loss', 0)}% - Максимальный риск на сделку (в % от баланса): {data.get('max_risk_deal', 0)}% - Комиссия биржи для расчета прибыли: {data.get('commission_fee', "Да")} """ await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.risk_management_settings_markup) async def price_profit_message(message, state): await state.set_state(update_risk_management_settings.price_profit) text = 'Введите число изменения цены для фиксации прибыли: ' await message.answer(text=text, parse_mode='html', reply_markup=None) @router_risk_management_settings.message(update_risk_management_settings.price_profit) async def state_price_profit(message: Message, state): await state.update_data(price_profit=message.text) data = await state.get_data() data_settings = await rq.get_user_risk_management_settings(message.from_user.id) if data['price_profit'].isdigit() and int(data['price_profit']) <= 100: await message.answer(f"✅ Изменено: {data_settings['price_profit']}% → {data['price_profit']}%") await rq.update_price_profit(message.from_user.id, data['price_profit']) await main_settings_message(message.from_user.id, message) await state.clear() else: await message.answer( f'⛔️ Ошибка: ваше значение ({data['price_profit']}%) или выше лимита (100) или вы вводите неверные символы') await main_settings_message(message.from_user.id, message) async def price_loss_message(message, state): await state.set_state(update_risk_management_settings.price_loss) text = 'Введите число изменения цены для фиксации убытков: ' await message.answer(text=text, parse_mode='html', reply_markup=None) @router_risk_management_settings.message(update_risk_management_settings.price_loss) async def state_price_loss(message: Message, state): await state.update_data(price_loss=message.text) data = await state.get_data() data_settings = await rq.get_user_risk_management_settings(message.from_user.id) if data['price_loss'].isdigit() and int(data['price_loss']) <= 100: new_price_loss = int(data['price_loss']) old_price_loss = int(data_settings.get('price_loss', 0)) current_price_profit = data_settings.get('price_profit') # Пробуем перевести price_profit в число, если это возможно try: current_price_profit_num = int(current_price_profit) except Exception: current_price_profit_num = 0 # Флаг, если price_profit изначально равен 0 или совпадает со старым стоп-лоссом should_update_profit = (current_price_profit_num == 0) or (current_price_profit_num == abs(old_price_loss)) # Обновляем стоп-лосс await rq.update_price_loss(message.from_user.id, new_price_loss) # Если нужно, меняем тейк-профит if should_update_profit: new_price_profit = abs(new_price_loss) await rq.update_price_profit(message.from_user.id, new_price_profit) await message.answer(f"✅ Стоп-лосс изменён: {old_price_loss}% → {new_price_loss}%\n" f"Тейк-профит автоматически установлен в: {new_price_profit}%") else: await message.answer(f"✅ Стоп-лосс изменён: {old_price_loss}% → {new_price_loss}%") await main_settings_message(message.from_user.id, message) await state.clear() else: await message.answer( f'⛔️ Ошибка: ваше значение ({data["price_loss"]}%) выше лимита (100) или содержит неверные символы') await main_settings_message(message.from_user.id, message) async def max_risk_deal_message(message, state): await state.set_state(update_risk_management_settings.max_risk_deal) text = 'Введите число (процент от баланса) для изменения максимального риска на сделку: ' await message.answer(text=text, parse_mode='html', reply_markup=None) @router_risk_management_settings.message(update_risk_management_settings.max_risk_deal) async def state_max_risk_deal(message: Message, state): await state.update_data(max_risk_deal=message.text) data = await state.get_data() data_settings = await rq.get_user_risk_management_settings(message.from_user.id) if data['max_risk_deal'].isdigit() and int(data['max_risk_deal']) <= 100: await message.answer(f"✅ Изменено: {data_settings['max_risk_deal']}% → {data['max_risk_deal']}%") await rq.update_max_risk_deal(message.from_user.id, data['max_risk_deal']) await main_settings_message(message.from_user.id, message) await state.clear() else: await message.answer( f'⛔️ Ошибка: ваше значение ({data['max_risk_deal']}%) или выше лимита (100) или вы вводите неверные символы') await main_settings_message(message.from_user.id, message) async def commission_fee_message(message, state): await state.set_state(update_risk_management_settings.commission_fee) await message.answer(text="Хотите учитывать комиссию биржи:", parse_mode='html', reply_markup=inline_markup.buttons_yes_no_markup) @router_risk_management_settings.callback_query(lambda c: c.data in ["clb_yes", "clb_no"]) async def process_commission_fee_callback(callback: CallbackQuery, state): val = "Да" if callback.data == "clb_yes" else "Нет" await rq.update_commission_fee(callback.from_user.id, val) await callback.message.answer(f"✅ Изменено: {val}") await callback.answer() await main_settings_message(callback.from_user.id, callback.message) await state.clear()