209 lines
8.6 KiB
Python
209 lines
8.6 KiB
Python
import logging.config
|
||
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
||
from aiogram import Router, F
|
||
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)
|
||
logger = logging.getLogger("condition_settings")
|
||
|
||
condition_settings_router = Router()
|
||
|
||
|
||
async def reg_new_user_default_condition_settings(id):
|
||
tg_id = id
|
||
|
||
trigger = await rq.get_for_registration_trigger(tg_id)
|
||
|
||
await rq.set_new_user_default_condition_settings(tg_id, trigger)
|
||
|
||
|
||
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""" <b>Условия запуска</b>
|
||
<b>- Таймер: </b> установить таймер / удалить таймер
|
||
<b>- Тип позиции:</b> {entry_order_type_rus}
|
||
<b>- Триггер цена: </b> {trigger_price:,.4f}
|
||
<b>- Лимит цена: </b> {limit_price:,.4f}
|
||
"""
|
||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.condition_settings_markup)
|
||
|
||
|
||
async def timer_message(id, message: Message, state: FSMContext):
|
||
await state.set_state(condition_settings.timer)
|
||
|
||
timer_info = await rq.get_user_timer(id)
|
||
if timer_info is None:
|
||
await message.answer("Таймер не установлен.", reply_markup=inline_markup.timer_markup)
|
||
return
|
||
|
||
await message.answer(
|
||
f"Таймер установлен на: {timer_info['timer_minutes']} мин\n",
|
||
reply_markup=inline_markup.timer_markup
|
||
)
|
||
|
||
|
||
@condition_settings_router.callback_query(F.data == "clb_set_timer")
|
||
async def set_timer_callback(callback: CallbackQuery, state: FSMContext):
|
||
await state.set_state(condition_settings.timer) # состояние для ввода времени
|
||
await callback.message.answer("Введите время работы в минутах (например, 60):", reply_markup=inline_markup.cancel)
|
||
await callback.answer()
|
||
|
||
|
||
@condition_settings_router.message(condition_settings.timer)
|
||
async def process_timer_input(message: Message, state: FSMContext):
|
||
try:
|
||
minutes = int(message.text)
|
||
if minutes <= 0:
|
||
await message.reply("Введите число больше нуля.")
|
||
return
|
||
|
||
await rq.update_user_timer(message.from_user.id, minutes)
|
||
logger.info("Timer set for user %s: %s minutes", message.from_user.id, minutes)
|
||
await timer_message(message.from_user.id, message, state)
|
||
await state.clear()
|
||
except ValueError:
|
||
await message.reply("Пожалуйста, введите корректное число.")
|
||
|
||
|
||
@condition_settings_router.callback_query(F.data == "clb_delete_timer")
|
||
async def delete_timer_callback(callback: CallbackQuery, state: FSMContext):
|
||
await state.clear()
|
||
await rq.update_user_timer(callback.from_user.id, 0)
|
||
logger.info("Timer deleted for user %s", callback.from_user.id)
|
||
await timer_message(callback.from_user.id, callback.message, state)
|
||
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 = '''Фильтр волатильности
|
||
|
||
Описание... '''
|
||
|
||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_on_off_markup)
|
||
|
||
|
||
async def external_cues_message(message, state):
|
||
text = '''<b>Внешние сигналы</b>
|
||
|
||
Описание... '''
|
||
|
||
await message.answer(text=text, parse_mode='html', reply_markup=None)
|
||
|
||
|
||
async def trading_cues_message(message, state):
|
||
text = '''<b>Использование сигналов</b>
|
||
|
||
Описание... '''
|
||
|
||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_yes_no_markup)
|
||
|
||
|
||
async def webhook_message(message, state):
|
||
text = '''Скиньте ссылку на <b>webhook</b> (если есть trading view): '''
|
||
|
||
await message.answer(text=text, parse_mode='html')
|
||
|
||
|
||
async def ai_analytics_message(message, state):
|
||
text = '''<b>ИИ - Аналитика</b>
|
||
|
||
Описание... '''
|
||
|
||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_yes_no_markup)
|