1
0
forked from kodorvan/stcs

version 1 STCS

This commit is contained in:
Kirill Strelnikov
2025-07-21 13:40:33 +07:00
parent 14088503ea
commit ed67ed78c0
20 changed files with 976 additions and 110 deletions

View File

@@ -1,5 +1,4 @@
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
@@ -8,34 +7,32 @@ async def reg_new_user_default_additional_settings(id, message):
await rq.set_new_user_default_additional_settings(tg_id)
async def main_settings_message(message):
async def main_settings_message(id, message, state):
text = '''<b>Дополнительные параметры</b>
Сохранить как шаблон стратегии: да / нет
<b>- Сохранить как шаблон стратегии:</b> да / нет
<b>- Автозапуск после сохранения:</b> да / нет
<b>- Уведомления в Telegram:</b> включено / отключено '''
Автозапуск после сохранения: да / нет
Уведомления в Telegram: включено / отключено '''
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.additional_settings_markup)
await message.edit_text(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)
await message.answer(text=text, parse_mode='html', reply_markup=inline_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)
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_yes_no_markup)
async def notifications_message(message, state):
text = '''<b>Уведомления</b>
text = '''<b>Уведомления</b>
Описание... '''
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.buttons_on_off_markup)
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_on_off_markup)

View File

@@ -1,5 +1,4 @@
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
@@ -10,25 +9,17 @@ async def reg_new_user_default_condition_settings(id, message):
await rq.set_new_user_default_condition_settings(tg_id, trigger)
async def main_settings_message(message):
async def main_settings_message(id, message, state):
text = """ <b>Условия запуска</b>
Триггер: Ручной запуск / Сигнал TradingView / Полностью автоматический
Фильтр времени: диапазон по дням недели и времени суток
Фильтр волатильности / объёма: включить/отключить
Интеграции и внешние сигналы:
Использовать сигналы TradingView: да / нет
Использовать AI-аналитику от ChatGPT: да / нет
Webhook URL для сигналов (если используется TradingView).
<b>- Триггер:</b> Ручной запуск / Сигнал TradingView / Полностью автоматический
<b>- Фильтр времени: </b> диапазон по дням недели и времени суток
<b>- Фильтр волатильности / объёма: </b> включить/отключить
<b>- Интеграции и внешние сигналы: </b>
<b>- Использовать сигналы TradingView:</b> да / нет
<b>- Использовать AI-аналитику от ChatGPT:</b> да / не
<b>- Webhook URL для сигналов (если используется TradingView): </b>
"""
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.condition_settings_markup)
async def trigger_message(message, state):
@@ -36,7 +27,7 @@ async def trigger_message(message, state):
Описание ручного запуска, сигналов, автоматического режима '''
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.trigger_markup)
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.trigger_markup)
async def filter_time_message(message, state):
text = '''Фильтр времени
@@ -51,7 +42,7 @@ async def filter_volatility_message(message, state):
Описание... '''
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.buttons_on_off_markup)
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>
@@ -65,7 +56,7 @@ async def trading_cues_message(message, state):
Описание... '''
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.buttons_yes_no_markup)
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): '''
@@ -77,6 +68,6 @@ async def ai_analytics_message(message, state):
Описание... '''
await message.answer(text=text, parse_mode='html', reply_markup=reply_markup.buttons_yes_no_markup)
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.buttons_yes_no_markup)

View File

@@ -20,11 +20,13 @@ async def start_message(message):
async def profile_message(username, message):
await message.answer(f""" <b>{username}</b>
Баланс:
Баланс
⭐️ 0
Описание:
Активный трейдер на платформе Bibyt с индивидуальной стратегией и аналитикой в реальном времени. Постоянно улучшает навыки и следит за рыночными тенденциями для максимальной прибыли.
О себе
🚀 Профессиональный трейдер на платформе Bibyt с авторской стратегией и аналитикой в реальном времени.
📊 Постоянно улучшаю навыки и адаптируюсь к рыночным изменениям, чтобы максимально увеличить прибыль.
🔥 Всегда в поиске новых возможностей для роста и стабильного успеха!
""", parse_mode='html', reply_markup=inline_markup.settings_markup)
async def check_profile_message(message):

View File

@@ -12,12 +12,12 @@ 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() #
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
@@ -31,18 +31,14 @@ async def reg_new_user_default_main_settings(id, message):
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>
await message.answer(f"""<b>Основные настройки</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']}
""", parse_mode='html', reply_markup=inline_markup.main_settings_markup)
async def trading_mode_message(message, state):
@@ -66,7 +62,6 @@ 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:
@@ -116,7 +111,7 @@ 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)
@@ -160,12 +155,12 @@ async def state_margin_type(callback: CallbackQuery, state):
try:
match callback.data:
case 'margin_type_isolated':
await rq.update_margin_type(id, 'Изолированный')
await rq.update_margin_type(id, 'Isolated')
await main_settings_message(id, callback.message, state)
await state.clear()
case 'margin_type_cross':
await rq.update_margin_type(id, 'Кросс')
await rq.update_margin_type(id, 'Cross')
await main_settings_message(id, callback.message, state)
await state.clear()
@@ -183,7 +178,7 @@ async def state_starting_quantity(message: Message, state):
data = await state.get_data()
if data['starting_quantity'].isdigit() and int(data['starting_quantity']) <= 100:
if data['starting_quantity'].isdigit():
await rq.update_starting_quantity(message.from_user.id, data['starting_quantity'])
await main_settings_message(message.from_user.id, message, state)

View File

@@ -1,37 +1,95 @@
import app.telegram.Keyboards.inline_keyboards as inline_markup
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_risk_management_settings = Router()
class update_risk_management_settings(StatesGroup):
price_profit = State()
price_loss = State()
max_risk_deal = State()
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)
await rq.set_new_user_default_risk_management_settings(tg_id)
async def main_settings_message(id, message, state):
data = await rq.get_user_risk_management_settings(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)
<b>- Процент изменения цены для фиксации прибыли:</b> {data['price_profit']}
<b>- Процент изменения цены для фиксации убытков:</b> {data['price_loss']}
<b>- Максимальный риск на сделку (в % от баланса):</b> {data['max_risk_deal']}
"""
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()
if data['price_profit'].isdigit() and int(data['price_profit']) <= 100:
await rq.update_price_profit(message.from_user.id, data['price_profit'])
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 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()
if data['price_loss'].isdigit() and int(data['price_loss']) <= 100:
await rq.update_price_loss(message.from_user.id, data['price_loss'])
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 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)
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()
if data['max_risk_deal'].isdigit() and int(data['max_risk_deal']) <= 100:
await rq.update_max_risk_deal(message.from_user.id, data['max_risk_deal'])
await main_settings_message(message.from_user.id, message, state)
await state.clear()
else:
await main_settings_message(message.from_user.id, message, state)