forked from kodorvan/stcs
version 1 STCS
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||
|
||||
start_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Зарегистрироваться", callback_data="callback_registration")],
|
||||
[InlineKeyboardButton(text="Авторизоваться", callback_data="callback_autorisation")]
|
||||
start_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Торговать", callback_data="callback_profile")]
|
||||
])
|
||||
|
||||
settings_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Настройки", callback_data='clb_settings_message')]
|
||||
[InlineKeyboardButton(text="Настройки", callback_data='clb_settings_message')],
|
||||
[InlineKeyboardButton(text="Начать торговлю", callback_data='clb_start_trading')]
|
||||
])
|
||||
|
||||
back_btn_profile = [InlineKeyboardButton(text="Назад", callback_data='callback_autorisation')]
|
||||
back_btn_profile = [InlineKeyboardButton(text="Назад", callback_data='callback_profile')]
|
||||
|
||||
special_settings_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Основные настройки", callback_data='clb_change_main_settings'),
|
||||
@@ -18,9 +18,20 @@ special_settings_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Условия запуска", callback_data='clb_change_condition_settings'),
|
||||
InlineKeyboardButton(text="Дополнительные параметры", callback_data='clb_change_additional_settings')],
|
||||
|
||||
[InlineKeyboardButton(text="Подключить Bybit", callback_data='clb_new_user_connect_bybit_api_message')],
|
||||
|
||||
back_btn_profile
|
||||
])
|
||||
|
||||
connect_bybit_api_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Подключить Bybit", callback_data='clb_new_user_connect_bybit_api')]
|
||||
])
|
||||
|
||||
trading_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="Указать торговую пару", callback_data='clb_update_trading_pair')],
|
||||
[InlineKeyboardButton(text="Совершить сделку", callback_data='clb_open_deal')]
|
||||
])
|
||||
|
||||
back_btn_list_settings = [InlineKeyboardButton(text="Назад", callback_data='clb_back_to_special_settings_message')] # Кнопка для возврата к списку каталога настроек
|
||||
back_btn_list_settings_markup = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="Назад", callback_data='clb_back_to_special_settings_message')]]) # Клавиатура для возврата к списку каталога настроек
|
||||
|
||||
@@ -85,4 +96,17 @@ margin_type_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||
InlineKeyboardButton(text="Кросс", callback_data="margin_type_cross")],
|
||||
|
||||
back_btn_list_settings
|
||||
])
|
||||
|
||||
trigger_markup = InlineKeyboardMarkup(inline_keyboard=[ # ИЗМЕНИТЬ НА INLINE
|
||||
[InlineKeyboardButton(text='Ручной', callback_data="clb_trigger_ruchnoy"), InlineKeyboardButton(text='TradingView', callback_data="clb_trigger_tradingview")],
|
||||
[InlineKeyboardButton(text="Автоматический", callback_data="clb_trigger_auto")]
|
||||
])
|
||||
|
||||
buttons_yes_no_markup = InlineKeyboardMarkup(inline_keyboard=[ # ИЗМЕНИТЬ НА INLINE
|
||||
[InlineKeyboardButton(text='Да', callback_data="clb_yes"), InlineKeyboardButton(text='Нет', callback_data="clb_yes")]
|
||||
])
|
||||
|
||||
buttons_on_off_markup = InlineKeyboardMarkup(inline_keyboard=[ # ИЗМЕНИТЬ НА INLINE
|
||||
[InlineKeyboardButton(text='Включить', callback_data="clb_on"), InlineKeyboardButton(text='Выключить', callback_data="clb_off")]
|
||||
])
|
@@ -3,17 +3,4 @@
|
||||
base_buttons_markup = ReplyKeyboardMarkup(keyboard=[
|
||||
[KeyboardButton(text="👤 Профиль")],
|
||||
# [KeyboardButton(text="Настройки")]
|
||||
], resize_keyboard=True)
|
||||
|
||||
trigger_markup = ReplyKeyboardMarkup(keyboard=[ # ИЗМЕНИТЬ НА INLINE
|
||||
[KeyboardButton(text='Ручной'), KeyboardButton(text='TradingView')],
|
||||
[KeyboardButton(text="Автоматический")]
|
||||
], resize_keyboard=True)
|
||||
|
||||
buttons_yes_no_markup = ReplyKeyboardMarkup(keyboard=[ # ИЗМЕНИТЬ НА INLINE
|
||||
[KeyboardButton(text='Да'), KeyboardButton(text='Нет')]
|
||||
], resize_keyboard=True)
|
||||
|
||||
buttons_on_off_markup = ReplyKeyboardMarkup(keyboard=[ # ИЗМЕНИТЬ НА INLINE
|
||||
[KeyboardButton(text='Включить'), KeyboardButton(text='Выключить')]
|
||||
], resize_keyboard=True)
|
@@ -21,6 +21,25 @@ class User_Telegram_Id(Base):
|
||||
|
||||
tg_id = mapped_column(BigInteger)
|
||||
|
||||
class User_Bybit_API(Base):
|
||||
__tablename__ = 'user_bybit_api'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
tg_id = mapped_column(ForeignKey("user_telegram_id.tg_id"))
|
||||
|
||||
api_key = mapped_column(String(18), default='None')
|
||||
secret_key = mapped_column(String(36), default='None')
|
||||
|
||||
class User_Symbol(Base):
|
||||
__tablename__ = 'user_symbols'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
tg_id = mapped_column(ForeignKey("user_telegram_id.tg_id"))
|
||||
|
||||
symbol = mapped_column(String(18), default='PENGUUSDT')
|
||||
|
||||
class Trading_Mode(Base):
|
||||
__tablename__ = 'trading_modes'
|
||||
|
||||
@@ -105,7 +124,7 @@ async def async_main():
|
||||
logger.info("Заполение таблицы режима торговли")
|
||||
await conn.execute(Trading_Mode.__table__.insert().values(mode=mode))
|
||||
|
||||
types = ['Изолированный', 'Кросс']
|
||||
types = ['Isolated', 'Cross']
|
||||
for type in types:
|
||||
result = await conn.execute(select(Margin_type).where(Margin_type.type == type))
|
||||
if not result.first():
|
||||
|
@@ -4,6 +4,8 @@ logger = logging.getLogger(__name__)
|
||||
from app.telegram.database.models import async_session
|
||||
from app.telegram.database.models import User_Telegram_Id as UTi
|
||||
from app.telegram.database.models import User_Main_Settings as UMS
|
||||
from app.telegram.database.models import User_Bybit_API as UBA
|
||||
from app.telegram.database.models import User_Symbol
|
||||
from app.telegram.database.models import User_Risk_Management_Settings as URMS
|
||||
from app.telegram.database.models import User_Condition_Settings as UCS
|
||||
from app.telegram.database.models import User_Additional_Settings as UAS
|
||||
@@ -27,6 +29,32 @@ async def save_tg_id_new_user(tg_id):
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def set_new_user_bybit_api(tg_id):
|
||||
async with async_session() as session:
|
||||
user = await session.scalar(select(UBA).where(UBA.tg_id == tg_id))
|
||||
|
||||
if not user:
|
||||
session.add(UBA(
|
||||
tg_id=tg_id,
|
||||
))
|
||||
|
||||
logger.info(f"Bybit был успешно подключен")
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def set_new_user_symbol(tg_id):
|
||||
async with async_session() as session:
|
||||
user = await session.scalar(select(User_Symbol).where(User_Symbol.tg_id == tg_id))
|
||||
|
||||
if not user:
|
||||
session.add(User_Symbol(
|
||||
tg_id=tg_id
|
||||
))
|
||||
|
||||
logger.info(f"Symbol был успешно добавлен")
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def set_new_user_default_main_settings(tg_id, trading_mode, margin_type) -> None:
|
||||
async with async_session() as session:
|
||||
settings = await session.scalar(select(UMS).where(UMS.tg_id == tg_id))
|
||||
@@ -86,7 +114,22 @@ async def set_new_user_default_additional_settings(tg_id) -> None:
|
||||
async def check_user(tg_id):
|
||||
async with async_session() as session:
|
||||
user = await session.scalar(select(UTi).where(UTi.tg_id == tg_id))
|
||||
return user
|
||||
return user
|
||||
|
||||
async def get_bybit_api_key(tg_id):
|
||||
async with async_session() as session:
|
||||
api_key = await session.scalar(select(UBA.api_key).where(UBA.tg_id == tg_id))
|
||||
return api_key
|
||||
|
||||
async def get_bybit_secret_key(tg_id):
|
||||
async with async_session() as session:
|
||||
secret_key = await session.scalar(select(UBA.secret_key).where(UBA.tg_id == tg_id))
|
||||
return secret_key
|
||||
|
||||
async def get_symbol(tg_id):
|
||||
async with async_session() as session:
|
||||
symbol = await session.scalar(select(User_Symbol.symbol).where(User_Symbol.tg_id == tg_id))
|
||||
return symbol
|
||||
|
||||
async def get_for_registration_trading_mode():
|
||||
async with async_session() as session:
|
||||
@@ -128,7 +171,45 @@ async def get_user_main_settings(tg_id):
|
||||
|
||||
return data
|
||||
|
||||
# UPDATE_DB
|
||||
async def get_user_risk_management_settings(tg_id):
|
||||
async with async_session() as session:
|
||||
user = await session.scalar(select(URMS).where(URMS.tg_id == tg_id))
|
||||
|
||||
if user:
|
||||
logger.info("Получение риск-менеджмента настроек пользователя")
|
||||
|
||||
price_profit = await session.scalar(select(URMS.price_profit).where(URMS.tg_id == tg_id))
|
||||
price_loss = await session.scalar(select(URMS.price_loss).where(URMS.tg_id == tg_id))
|
||||
max_risk_deal = await session.scalar(select(URMS.max_risk_deal).where(URMS.tg_id == tg_id))
|
||||
|
||||
data = {
|
||||
'price_profit': price_profit,
|
||||
'price_loss': price_loss,
|
||||
'max_risk_deal': max_risk_deal
|
||||
}
|
||||
|
||||
return data
|
||||
|
||||
#UPDATE_SYMBOL
|
||||
async def update_symbol(tg_id, symbol) -> None:
|
||||
async with async_session() as session:
|
||||
await session.execute(update(User_Symbol).where(User_Symbol.tg_id == tg_id).values(symbol = symbol))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_api_key(tg_id, api):
|
||||
async with async_session() as session:
|
||||
api_key = await session.execute(update(UBA).where(UBA.tg_id == tg_id).values(api_key = api))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_secret_key(tg_id, api):
|
||||
async with async_session() as session:
|
||||
secret_key = await session.execute(update(UBA).where(UBA.tg_id == tg_id).values(secret_key = api))
|
||||
|
||||
await session.commit()
|
||||
|
||||
# UPDATE_MAIN_SETTINGS_DB
|
||||
async def update_trade_mode_user(tg_id, trading_mode) -> None:
|
||||
async with async_session() as session:
|
||||
mode = await session.scalar(select(Trading_Mode.mode).where(Trading_Mode.mode == trading_mode))
|
||||
@@ -171,4 +252,24 @@ async def update_maximal_quantity(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(UMS).where(UMS.tg_id == tg_id).values(maximal_quantity = num))
|
||||
|
||||
await session.commit()
|
||||
|
||||
# UPDATE_RISK_MANAGEMENT_SETTINGS_DB
|
||||
|
||||
async def update_price_profit(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(URMS).where(URMS.tg_id == tg_id).values(price_profit = num))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_price_loss(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(URMS).where(URMS.tg_id == tg_id).values(price_loss = num))
|
||||
|
||||
await session.commit()
|
||||
|
||||
async def update_max_risk_deal(tg_id, num):
|
||||
async with async_session() as session:
|
||||
await session.execute(update(URMS).where(URMS.tg_id == tg_id).values(max_risk_deal = num))
|
||||
|
||||
await session.commit()
|
@@ -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)
|
@@ -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)
|
||||
|
||||
|
||||
|
@@ -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):
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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)
|
@@ -19,6 +19,8 @@ router = Router()
|
||||
|
||||
@router.message(CommandStart())
|
||||
async def start_message(message: Message):
|
||||
await rq.set_new_user_bybit_api(message.from_user.id)
|
||||
|
||||
await func.start_message(message)
|
||||
|
||||
@router.message(F.text == "👤 Профиль")
|
||||
@@ -35,26 +37,27 @@ async def settings_msg(message: Message):
|
||||
if user:
|
||||
await func.settings_message(message)
|
||||
|
||||
@router.callback_query(F.data == "callback_registration")
|
||||
async def clb_func_reg (callback: CallbackQuery):
|
||||
await rq.save_tg_id_new_user(callback.from_user.id)
|
||||
print(callback.from_user.id)
|
||||
|
||||
await func_main_settings.reg_new_user_default_main_settings(callback.from_user.id, callback.message)
|
||||
await func_rmanagement_settings.reg_new_user_default_risk_management_settings(callback.from_user.id, callback.message)
|
||||
await func_condition_settings.reg_new_user_default_condition_settings(callback.from_user.id, callback.message)
|
||||
await func_additional_settings.reg_new_user_default_additional_settings(callback.from_user.id, callback.message)
|
||||
|
||||
await callback.message.answer(f'Регистрация прошла успешно, здравствуйте {callback.from_user.username}!', reply_markup=reply_markup.base_buttons_markup)
|
||||
|
||||
await callback.answer()
|
||||
|
||||
@router.callback_query(F.data == "callback_autorisation")
|
||||
@router.callback_query(F.data == "callback_profile")
|
||||
async def clb_func_reg (callback: CallbackQuery):
|
||||
user = await rq.check_user(callback.from_user.id)
|
||||
|
||||
if user:
|
||||
await callback.message.answer(f'С возвращением, {callback.from_user.username}!', reply_markup=reply_markup.base_buttons_markup)
|
||||
|
||||
await func.profile_message(callback.from_user.username, callback.message)
|
||||
else:
|
||||
await rq.save_tg_id_new_user(callback.from_user.id)
|
||||
|
||||
await func_main_settings.reg_new_user_default_main_settings(callback.from_user.id, callback.message)
|
||||
await func_rmanagement_settings.reg_new_user_default_risk_management_settings(callback.from_user.id, callback.message)
|
||||
await func_condition_settings.reg_new_user_default_condition_settings(callback.from_user.id, callback.message)
|
||||
await func_additional_settings.reg_new_user_default_additional_settings(callback.from_user.id, callback.message)
|
||||
|
||||
await callback.message.answer(f'Регистрация прошла успешно, здравствуйте {callback.from_user.username}!', reply_markup=reply_markup.base_buttons_markup)
|
||||
|
||||
await func.profile_message(callback.from_user.username, callback.message)
|
||||
|
||||
await callback.answer()
|
||||
|
||||
# Настройки торговли
|
||||
@router.callback_query(F.data == "clb_settings_message")
|
||||
|
Reference in New Issue
Block a user