from aiogram import Router import app.telegram.Keyboards.inline_keyboards as inline_markup import app.telegram.Keyboards.reply_keyboards as reply_markup import app.telegram.database.requests as rq from aiogram.types import Message, CallbackQuery # FSM - Механизм состояния from aiogram.fsm.state import State, StatesGroup router_main_settings = Router() class update_main_settings(StatesGroup): trading_mode = State() size_leverage = State() margin_type = State() martingale_factor = State() starting_quantity = State() maximal_quantity = State() async def reg_new_user_default_main_settings(id, message): tg_id = id trading_mode = await rq.get_for_registration_trading_mode() margin_type = await rq.get_for_registration_margin_type() await rq.set_new_user_default_main_settings(tg_id, trading_mode, margin_type) async def main_settings_message(id, message, state): data = await rq.get_user_main_settings(id) await message.answer(f"""Основные настройки - Режим торговли: {data['trading_mode']} - Тип маржи: {data['margin_type']} - Размер кредитного плеча: х{data['size_leverage']} - Начальная ставка: {data['starting_quantity']} - Коэффициент мартингейла: {data['martingale_factor']} - Количество ставок в серии: {data['martingale_step']} - Максимальное количество ставок в серии: {data['maximal_quantity']} """, parse_mode='html', reply_markup=inline_markup.main_settings_markup) async def trading_mode_message(message, state): await state.set_state(update_main_settings.trading_mode) await message.edit_text("""Режим торговли Лонг — стратегия, ориентированная на покупку актива с целью заработать на повышении его стоимости. Шорт — метод продажи активов, взятых в кредит, чтобы получить прибыль от снижения цены. Смарт — автоматизированный режим, который подбирает оптимальную стратегию в зависимости от текущих рыночных условий. Свитч — динамическое переключение между торговыми режимами для максимизации эффективности. Выберите ниже для изменений: """, parse_mode='html', reply_markup=inline_markup.trading_mode_markup) @router_main_settings.callback_query(update_main_settings.trading_mode) async def state_trading_mode(callback: CallbackQuery, state): await callback.answer() id = callback.from_user.id data_settings = await rq.get_user_main_settings(id) try: match callback.data: case 'trade_mode_long': await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Long") await rq.update_trade_mode_user(id, 'Long') await main_settings_message(id, callback.message, state) await state.clear() case 'trade_mode_short': await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Short") await rq.update_trade_mode_user(id, 'Short') await main_settings_message(id, callback.message, state) await state.clear() case 'trade_mode_switch': await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Switch") await rq.update_trade_mode_user(id, 'Switch') await main_settings_message(id, callback.message, state) await state.clear() case 'trade_mode_smart': await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Smart") await rq.update_trade_mode_user(id, 'Smart') await main_settings_message(id, callback.message, state) await state.clear() except Exception as e: print(f"error: {e}") async def size_leverage_message (message, state): await state.set_state(update_main_settings.size_leverage) await message.edit_text("Введите размер кредитного плеча (от 1 до 100): ", parse_mode='html', reply_markup=inline_markup.back_btn_list_settings_markup) @router_main_settings.message(update_main_settings.size_leverage) async def state_size_leverage(message: Message, state): await state.update_data(size_leverage = message.text) data = await state.get_data() data_settings = await rq.get_user_main_settings(message.from_user.id) if data['size_leverage'].isdigit() and int(data['size_leverage']) <= 100: await message.answer(f"✅ Изменено: {data_settings['size_leverage']} → {data['size_leverage']}") await rq.update_size_leverange(message.from_user.id, data['size_leverage']) await main_settings_message(message.from_user.id, message, state) await state.clear() else: await message.answer(f'⛔️ Ошибка: ваше значение ({data['size_leverage']}) или выше лимита (100) или вы вводите неверные символы') await main_settings_message(message.from_user.id, message, state) async def martingale_factor_message(message, state): await state.set_state(update_main_settings.martingale_factor) await message.edit_text("Введите коэффициент Мартингейла:", parse_mode='html', reply_markup=inline_markup.back_btn_list_settings_markup) @router_main_settings.message(update_main_settings.martingale_factor) async def state_martingale_factor(message: Message, state): await state.update_data(martingale_factor = message.text) data = await state.get_data() data_settings = await rq.get_user_main_settings(message.from_user.id) if data['martingale_factor'].isdigit() and int(data['martingale_factor']) <= 100: await message.answer(f"✅ Изменено: {data_settings['martingale_factor']} → {data['martingale_factor']}") await rq.update_martingale_factor(message.from_user.id, data['martingale_factor']) await main_settings_message(message.from_user.id, message, state) await state.clear() else: await message.answer(f'⛔️ Ошибка: ваше значение ({data['martingale_factor']}) или выше лимита (100) или вы вводите неверные символы') await main_settings_message(message.from_user.id, message, state) async def margin_type_message(message, state): await state.set_state(update_main_settings.margin_type) await message.edit_text("""Тип маржи Изолированная маржа Этот тип маржи позволяет ограничить риск конкретной позиции. При использовании изолированной маржи вы выделяете определённую сумму средств только для одной позиции. Если позиция начинает приносить убытки, ваши потери ограничиваются этой суммой, и остальные средства на счёте не затрагиваются. Кросс-маржа Кросс-маржа объединяет весь маржинальный баланс на счёте и использует все доступные средства для поддержания открытых позиций. В случае убытков средства с других позиций или баланса автоматически покрывают дефицит, снижая риск ликвидации, но увеличивая общий риск потери капитала. Выберите ниже для изменений: """, parse_mode='html', reply_markup=inline_markup.margin_type_markup) @router_main_settings.callback_query(update_main_settings.margin_type) async def state_margin_type(callback: CallbackQuery, state): await callback.answer() id = callback.from_user.id data_settings = await rq.get_user_main_settings(id) try: match callback.data: case 'margin_type_isolated': await callback.message.answer(f"✅ Изменено: {data_settings['margin_type']} → Isolated") await rq.update_margin_type(id, 'Isolated') await main_settings_message(id, callback.message, state) await state.clear() case 'margin_type_cross': await callback.message.answer(f"✅ Изменено: {data_settings['margin_type']} → Cross") await rq.update_margin_type(id, 'Cross') await main_settings_message(id, callback.message, state) await state.clear() except Exception as e: print(f"error: {e}") 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) @router_main_settings.message(update_main_settings.starting_quantity) async def state_starting_quantity(message: Message, state): await state.update_data(starting_quantity = message.text) data = await state.get_data() data_settings = await rq.get_user_main_settings(message.from_user.id) if data['starting_quantity'].isdigit(): await message.answer(f"✅ Изменено: {data_settings['starting_quantity']} → {data['starting_quantity']}") await rq.update_starting_quantity(message.from_user.id, data['starting_quantity']) await main_settings_message(message.from_user.id, message, state) await state.clear() else: await message.answer(f'⛔️ Ошибка: вы вводите неверные символы') await main_settings_message(message.from_user.id, message, state) async def maximum_quantity_message(message, state): await state.set_state(update_main_settings.maximal_quantity) await message.edit_text("Введите максимальное количество серии ставок:", parse_mode='html', reply_markup=inline_markup.back_btn_list_settings_markup) @router_main_settings.message(update_main_settings.maximal_quantity) async def state_maximal_quantity(message: Message, state): await state.update_data(maximal_quantity = message.text) data = await state.get_data() data_settings = await rq.get_user_main_settings(message.from_user.id) if data['maximal_quantity'].isdigit() and int(data['maximal_quantity']) <= 100: await message.answer(f"✅ Изменено: {data_settings['maximal_quantity']} → {data['maximal_quantity']}") await rq.update_maximal_quantity(message.from_user.id, data['maximal_quantity']) await main_settings_message(message.from_user.id, message, state) await state.clear() else: await message.answer(f'⛔️ Ошибка: ваше значение ({data['maximal_quantity']}) или выше лимита (100) или вы вводите неверные символы') await main_settings_message(message.from_user.id, message, state)