forked from kodorvan/stcs
add files project
This commit is contained in:
41
app/telegram/functions/additional_settings/settings.py
Normal file
41
app/telegram/functions/additional_settings/settings.py
Normal file
@@ -0,0 +1,41 @@
|
||||
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
|
||||
|
||||
async def reg_new_user_default_additional_settings(id, message):
|
||||
tg_id = id
|
||||
|
||||
await rq.set_new_user_default_additional_settings(tg_id)
|
||||
|
||||
async def main_settings_message(message):
|
||||
text = '''<b>Дополнительные параметры</b>
|
||||
|
||||
Сохранить как шаблон стратегии: да / нет
|
||||
|
||||
Автозапуск после сохранения: да / нет
|
||||
|
||||
Уведомления в Telegram: включено / отключено '''
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.additional_settings_markup)
|
||||
|
||||
async def save_pattern_message(message, state):
|
||||
text = '''<b>Сохранение шаблона</b>
|
||||
|
||||
Описание... '''
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.buttons_yes_no_markup)
|
||||
|
||||
async def auto_start_message(message, state):
|
||||
text = '''<b>Автозапуск</b>
|
||||
|
||||
Описание... '''
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.buttons_yes_no_markup)
|
||||
|
||||
async def notifications_message(message, state):
|
||||
text = '''<b>Уведомления</b>
|
||||
|
||||
Описание... '''
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.buttons_on_off_markup)
|
82
app/telegram/functions/condition_settings/settings.py
Normal file
82
app/telegram/functions/condition_settings/settings.py
Normal file
@@ -0,0 +1,82 @@
|
||||
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
|
||||
|
||||
async def reg_new_user_default_condition_settings(id, message):
|
||||
tg_id = id
|
||||
|
||||
trigger = await rq.get_for_registration_trigger()
|
||||
|
||||
await rq.set_new_user_default_condition_settings(tg_id, trigger)
|
||||
|
||||
async def main_settings_message(message):
|
||||
text = """ <b>Условия запуска</b>
|
||||
|
||||
Триггер: Ручной запуск / Сигнал TradingView / Полностью автоматический
|
||||
|
||||
Фильтр времени: диапазон по дням недели и времени суток
|
||||
|
||||
Фильтр волатильности / объёма: включить/отключить
|
||||
|
||||
Интеграции и внешние сигналы:
|
||||
|
||||
Использовать сигналы TradingView: да / нет
|
||||
|
||||
Использовать AI-аналитику от ChatGPT: да / нет
|
||||
|
||||
Webhook URL для сигналов (если используется TradingView).
|
||||
|
||||
"""
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.condition_settings_markup)
|
||||
|
||||
async def trigger_message(message, state):
|
||||
text = '''Триггер
|
||||
|
||||
Описание ручного запуска, сигналов, автоматического режима '''
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.trigger_markup)
|
||||
|
||||
async def filter_time_message(message, state):
|
||||
text = '''Фильтр времени
|
||||
|
||||
???
|
||||
'''
|
||||
|
||||
await message.answer(text=text)
|
||||
|
||||
async def filter_volatility_message(message, state):
|
||||
text = '''Фильтр волатильности
|
||||
|
||||
Описание... '''
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=reply_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=reply_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=reply_markup.buttons_yes_no_markup)
|
||||
|
||||
|
34
app/telegram/functions/functions.py
Normal file
34
app/telegram/functions/functions.py
Normal file
@@ -0,0 +1,34 @@
|
||||
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
||||
import app.telegram.Keyboards.reply_keyboards as reply_markup
|
||||
|
||||
async def start_message(message):
|
||||
await message.answer(f""" Привет <b>{message.from_user.username}</b>! 👋
|
||||
|
||||
Добро пожаловать в бот по трейдингу на Bibyt — вашего надежного помощника для анализа рынка и принятия взвешенных решений. Здесь вы получите:
|
||||
<b>
|
||||
📊 Анализ текущих трендов
|
||||
📈 Инструменты для прогнозирования и оценки рисков
|
||||
⚡️ Сигналы и рекомендации по сделкам
|
||||
🔔 Уведомления о важных изменениях и новостях
|
||||
</b>
|
||||
Просто отправляйте интересующий вас инструмент или команду, и бот быстро предоставит актуальную информацию и аналитику.
|
||||
|
||||
Начнем торговать умно и эффективно вместе! 🚀
|
||||
|
||||
""", parse_mode='html', reply_markup=inline_markup.start_markup)
|
||||
|
||||
async def profile_message(username, message):
|
||||
await message.answer(f""" <b>{username}</b>
|
||||
|
||||
Баланс:
|
||||
⭐️ 0
|
||||
|
||||
Описание:
|
||||
Активный трейдер на платформе Bibyt с индивидуальной стратегией и аналитикой в реальном времени. Постоянно улучшает навыки и следит за рыночными тенденциями для максимальной прибыли.
|
||||
""", parse_mode='html', reply_markup=inline_markup.settings_markup)
|
||||
|
||||
async def check_profile_message(message):
|
||||
await message.answer(f'Добро пожаловать {message.from_user.username}!', reply_markup=reply_markup.base_buttons_markup)
|
||||
|
||||
async def settings_message(message):
|
||||
await message.edit_text("Выберите что настроить", reply_markup=inline_markup.special_settings_markup)
|
211
app/telegram/functions/main_settings/settings.py
Normal file
211
app/telegram/functions/main_settings/settings.py
Normal file
@@ -0,0 +1,211 @@
|
||||
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"""<b>Основные настройки</b>
|
||||
Режим торговли: <b>{data['trading_mode']}</b>
|
||||
|
||||
Тип маржи: <b>{data['margin_type']}</b>
|
||||
|
||||
Размер кредитного плеча: <b>х{data['size_leverage']}</b>
|
||||
|
||||
Начальная ставка: <b>{data['starting_quantity']}</b>
|
||||
|
||||
Коэффициент мартингейла: <b>{data['martingale_factor']}</b>
|
||||
|
||||
Максимальное количесиво ставок в серии: <b>{data['maximal_quantity']}</b>
|
||||
""", 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> — автоматизированный режим, который подбирает оптимальную стратегию в зависимости от текущих рыночных условий.
|
||||
|
||||
<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
|
||||
print(f"sdljfngdjklfg ## {callback.data}")
|
||||
|
||||
try:
|
||||
match callback.data:
|
||||
case 'trade_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 rq.update_trade_mode_user(id, 'Short')
|
||||
await main_settings_message(id, callback.message, state)
|
||||
|
||||
await state.clear()
|
||||
case 'trade_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 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("Введите размер <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()
|
||||
|
||||
if data['size_leverage'].isdigit() and int(data['size_leverage']) <= 100:
|
||||
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 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()
|
||||
|
||||
if data['martingale_factor'].isdigit() and int(data['martingale_factor']) <= 100:
|
||||
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 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
|
||||
print(f"sdljfngdjklfg ## {callback.data}")
|
||||
|
||||
try:
|
||||
match callback.data:
|
||||
case 'margin_type_isolated':
|
||||
await rq.update_margin_type(id, 'Изолированный')
|
||||
await main_settings_message(id, callback.message, state)
|
||||
|
||||
await state.clear()
|
||||
case 'margin_type_cross':
|
||||
await rq.update_margin_type(id, 'Кросс')
|
||||
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()
|
||||
|
||||
if data['starting_quantity'].isdigit() and int(data['starting_quantity']) <= 100:
|
||||
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 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()
|
||||
|
||||
if data['maximal_quantity'].isdigit() and int(data['maximal_quantity']) <= 100:
|
||||
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 main_settings_message(message.from_user.id, message, state)
|
37
app/telegram/functions/risk_management_settings/settings.py
Normal file
37
app/telegram/functions/risk_management_settings/settings.py
Normal file
@@ -0,0 +1,37 @@
|
||||
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
|
||||
|
||||
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(message):
|
||||
text = f"""<b>Риск менеджмент</b>,
|
||||
|
||||
Процент изменения цены для фиксации прибыли: 0
|
||||
|
||||
Процент изменения цены для фиксации убытков: 0
|
||||
|
||||
Максимальный риск на сделку (в % от баланса): 0
|
||||
"""
|
||||
|
||||
await message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.risk_management_settings_markup)
|
||||
|
||||
async def price_profit_message(message, state):
|
||||
text = 'Введите число изменения цены для фиксации прибыли: '
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=None)
|
||||
|
||||
async def price_loss_message(message, state):
|
||||
text = 'Введите число изменения цены для фиксации убытков: '
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=None)
|
||||
|
||||
async def max_risk_deal_message(message, state):
|
||||
text = 'Введите число (процент от баланса) для изменения максимального риска на сделку: '
|
||||
|
||||
await message.answer(text=text, parse_mode='html', reply_markup=None)
|
Reference in New Issue
Block a user