forked from kodorvan/stcs
284 lines
14 KiB
Python
284 lines
14 KiB
Python
from aiogram import Router, F
|
||
|
||
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()
|
||
switch_mode_enabled = 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"""<b>Основные настройки</b>
|
||
|
||
<b>- Режим торговли:</b> {data['trading_mode']}
|
||
<b>- Режим свитч:</b> {data['switch_mode_enabled']}
|
||
<b>- Состояние свитча:</b> {data['switch_state']}
|
||
<b>- Тип маржи:</b> {data['margin_type']}
|
||
<b>- Размер кредитного плеча:</b> х{data['size_leverage']}
|
||
<b>- Начальная ставка:</b> {data['starting_quantity']}
|
||
<b>- Коэффициент мартингейла:</b> {data['martingale_factor']}
|
||
<b>- Количество ставок в серии:</b> {data['martingale_step']}
|
||
<b>- Максимальное количество ставок в серии:</b> {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("""<b>Режим торговли</b>
|
||
|
||
<b>Лонг</b> — стратегия, ориентированная на покупку актива с целью заработать на повышении его стоимости.
|
||
|
||
<b>Шорт</b> — метод продажи активов, взятых в кредит, чтобы получить прибыль от снижения цены.
|
||
|
||
<b>Смарт</b> — автоматизированный режим, который подбирает оптимальную стратегию в зависимости от текущих рыночных условий.
|
||
|
||
<em>Выберите ниже для изменений:</em>
|
||
""", 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_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 switch_mode_enabled_message(message, state):
|
||
await state.set_state(update_main_settings.switch_mode_enabled)
|
||
|
||
await message.edit_text(
|
||
"""<b>Свитч</b> — динамическое переключение между торговыми режимами для максимизации эффективности.
|
||
|
||
<em>Выберите ниже для изменений:</em>""", parse_mode='html', reply_markup=inline_markup.buttons_on_off_markup_for_switch)
|
||
|
||
|
||
|
||
|
||
@router_main_settings.callback_query(lambda c: c.data in ["clb_on_switch", "clb_off_switch"])
|
||
async def state_switch_mode_enabled(callback: CallbackQuery, state):
|
||
await callback.answer()
|
||
tg_id = callback.from_user.id
|
||
val = "Включить" if callback.data == "clb_on_switch" else "Выключить"
|
||
if val == "Включить":
|
||
await rq.update_switch_mode_enabled(tg_id, "Включено")
|
||
await callback.message.answer(f"Включено")
|
||
await main_settings_message(tg_id, callback.message, state)
|
||
else:
|
||
await rq.update_switch_mode_enabled(tg_id, "Выключено")
|
||
await callback.message.answer(f"Выключено")
|
||
await main_settings_message(tg_id, callback.message, state)
|
||
await state.clear()
|
||
|
||
|
||
@router_main_settings.callback_query(lambda c: c.data in ["clb_switch_state"])
|
||
async def state_switch_mode_enabled(callback: CallbackQuery):
|
||
await callback.answer()
|
||
await callback.message.answer("Выберите состояние свитча:", reply_markup=inline_markup.switch_state_markup)
|
||
|
||
|
||
@router_main_settings.callback_query(lambda c: c.data in ["clb_long_switch", "clb_short_switch"])
|
||
async def state_switch_mode_enabled(callback: CallbackQuery, state):
|
||
await callback.answer()
|
||
tg_id = callback.from_user.id
|
||
val = "Long" if callback.data == "clb_long_switch" else "Short"
|
||
if val == "Long":
|
||
await rq.update_switch_state(tg_id, "Long")
|
||
await callback.message.answer(f"Состояние свитча: {val}")
|
||
await main_settings_message(tg_id, callback.message, state)
|
||
else:
|
||
await rq.update_switch_state(tg_id, "Short")
|
||
await callback.message.answer(f"Состояние свитча: {val}")
|
||
await main_settings_message(tg_id, callback.message, state)
|
||
await state.clear()
|
||
|
||
|
||
|
||
async def size_leverage_message (message, state):
|
||
await state.set_state(update_main_settings.size_leverage)
|
||
|
||
await message.edit_text("Введите размер <b>кредитного плеча</b> (от 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("Введите <b>коэффициент Мартингейла:</b>", 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("""<b>Тип маржи</b>
|
||
|
||
<b>Изолированная маржа</b>
|
||
Этот тип маржи позволяет ограничить риск конкретной позиции.
|
||
При использовании изолированной маржи вы выделяете определённую сумму средств только для одной позиции.
|
||
Если позиция начинает приносить убытки, ваши потери ограничиваются этой суммой,
|
||
и остальные средства на счёте не затрагиваются.
|
||
|
||
<b>Кросс-маржа</b>
|
||
Кросс-маржа объединяет весь маржинальный баланс на счёте и использует все доступные средства для поддержания открытых позиций.
|
||
В случае убытков средства с других позиций или баланса автоматически покрывают дефицит,
|
||
снижая риск ликвидации, но увеличивая общий риск потери капитала.
|
||
|
||
<em>Выберите ниже для изменений:</em>
|
||
""", 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("Введите <b>начальную ставку:</b>", 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("Введите <b>максимальное количество серии ставок:</b>", 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) |