forked from kodorvan/stcs
Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1997b9d1c0 | ||
![]() |
e555bfa8fb | ||
![]() |
0fecb5dab7 | ||
![]() |
242be34a97 | ||
![]() |
2da3c282d1 | ||
![]() |
fb0c14aba1 | ||
127003ebe1 |
@@ -21,7 +21,6 @@
|
|||||||
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
|
<EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="app\services\Bybit\config.py" />
|
|
||||||
<Compile Include="app\services\Bybit\functions\Add_Bybit_API.py" />
|
<Compile Include="app\services\Bybit\functions\Add_Bybit_API.py" />
|
||||||
<Compile Include="app\services\Bybit\functions\balance.py" />
|
<Compile Include="app\services\Bybit\functions\balance.py" />
|
||||||
<Compile Include="app\services\Bybit\functions\functions.py" />
|
<Compile Include="app\services\Bybit\functions\functions.py" />
|
||||||
|
21
README.md
21
README.md
@@ -1 +1,20 @@
|
|||||||
abobus
|
# Чат-робот STCS
|
||||||
|
__
|
||||||
|
|
||||||
|
**Функционал:**
|
||||||
|
+ **Настройки**
|
||||||
|
+ Основные параметры *(Настроен, работает)*
|
||||||
|
+ Режим торговли Лонг/Шорт *(настроены)*, Switch/Smart *(не настроены)*
|
||||||
|
+ Тип маржи: Изолированная / Кросс *(настроено)*
|
||||||
|
+ Размер кредитного плеча: от x1 до x100 *(настроено)*
|
||||||
|
+ Начальная ставка: числовое значение *(настроено)*
|
||||||
|
+ Коэффициент мартингейла: число *(настроено)*
|
||||||
|
+ Максимальное количество ставок в серии: число *(настроено)*
|
||||||
|
+ Риск-менеджмент (Настроен, работает)
|
||||||
|
+ Процент изменения цены для фиксации прибыли (TP%): число *(настроено)*
|
||||||
|
+ Процент изменения цены для фиксации убытков (SL%): число (пример: 1%) *(настроено)*
|
||||||
|
+ Максимальный риск на сделку (в % от баланса): число (опционально) *(настроено)*
|
||||||
|
+ Условия запуска *(Не настроен)*
|
||||||
|
+ Дополнительные параметры *(Не настроен)*
|
||||||
|
+ Подключение Bybit *(настроено)*
|
||||||
|
+ Информация о правильном получении и сохранении Bybit-API keys *(настроено)*
|
||||||
|
@@ -1,9 +0,0 @@
|
|||||||
API_KEY=''
|
|
||||||
API_SECRET=''
|
|
||||||
SYMBOL=''
|
|
||||||
|
|
||||||
'''
|
|
||||||
API_KEY = 'o5854uk3qBD4lySnjv'
|
|
||||||
SECRET_KEY = 'aMFPbs0AKyOSLTgXyrqCfREDi7byjnsOd0Kj'
|
|
||||||
SYMBOL = "SHIB1000USDT"
|
|
||||||
'''
|
|
@@ -98,21 +98,6 @@ async def contract_long(tg_id, message, margin_mode):
|
|||||||
realised_pnl = float(position['unrealisedPnl'])
|
realised_pnl = float(position['unrealisedPnl'])
|
||||||
|
|
||||||
if realised_pnl > 0:
|
if realised_pnl > 0:
|
||||||
print(f'''
|
|
||||||
=====================
|
|
||||||
=====Сделка=========
|
|
||||||
===уСПЕШНЕАЯ================
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{realised_pnl}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
starting_quantity = next_quantity
|
starting_quantity = next_quantity
|
||||||
current_martingale_step = 0
|
current_martingale_step = 0
|
||||||
elif not realised_pnl:
|
elif not realised_pnl:
|
||||||
@@ -122,22 +107,6 @@ async def contract_long(tg_id, message, margin_mode):
|
|||||||
current_martingale_step += 1
|
current_martingale_step += 1
|
||||||
next_quantity = last_quantity * martingale_factor
|
next_quantity = last_quantity * martingale_factor
|
||||||
starting_quantity = next_quantity
|
starting_quantity = next_quantity
|
||||||
|
|
||||||
print(f'''
|
|
||||||
======СДЕЛКА===============
|
|
||||||
=====УБЫТОЧНАЯ==============
|
|
||||||
===================
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{realised_pnl}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Не получены позиции")
|
print("Не получены позиции")
|
||||||
next_quantity = starting_quantity
|
next_quantity = starting_quantity
|
||||||
@@ -174,22 +143,6 @@ async def contract_long(tg_id, message, margin_mode):
|
|||||||
|
|
||||||
await info_access_open_deal(message, SYMBOL, data_main_stgs['trading_mode'], margin_mode, data_main_stgs['size_leverage'], next_quantity)
|
await info_access_open_deal(message, SYMBOL, data_main_stgs['trading_mode'], margin_mode, data_main_stgs['size_leverage'], next_quantity)
|
||||||
|
|
||||||
print(f'''
|
|
||||||
=====================
|
|
||||||
===================
|
|
||||||
===================
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{r}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
|
|
||||||
except exceptions.InvalidRequestError as e:
|
except exceptions.InvalidRequestError as e:
|
||||||
await message.answer('Недостаточно баланса')
|
await message.answer('Недостаточно баланса')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -252,21 +205,6 @@ async def contract_short(tg_id, message, margin_mode):
|
|||||||
realised_pnl = float(position['unrealisedPnl'])
|
realised_pnl = float(position['unrealisedPnl'])
|
||||||
|
|
||||||
if realised_pnl > 0:
|
if realised_pnl > 0:
|
||||||
print(f'''
|
|
||||||
=====================
|
|
||||||
=====Сделка=========
|
|
||||||
===уСПЕШНЕАЯ================
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{realised_pnl}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
starting_quantity = next_quantity
|
starting_quantity = next_quantity
|
||||||
current_martingale_step = 0
|
current_martingale_step = 0
|
||||||
elif not realised_pnl:
|
elif not realised_pnl:
|
||||||
@@ -276,22 +214,6 @@ async def contract_short(tg_id, message, margin_mode):
|
|||||||
current_martingale_step += 1
|
current_martingale_step += 1
|
||||||
next_quantity = last_quantity * martingale_factor
|
next_quantity = last_quantity * martingale_factor
|
||||||
starting_quantity = next_quantity
|
starting_quantity = next_quantity
|
||||||
|
|
||||||
print(f'''
|
|
||||||
======СДЕЛКА===============
|
|
||||||
=====УБЫТОЧНАЯ==============
|
|
||||||
===================
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{realised_pnl}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Не получены позиции")
|
print("Не получены позиции")
|
||||||
next_quantity = starting_quantity
|
next_quantity = starting_quantity
|
||||||
@@ -326,22 +248,6 @@ async def contract_short(tg_id, message, margin_mode):
|
|||||||
|
|
||||||
await info_access_open_deal(message, SYMBOL, data_main_stgs['trading_mode'], margin_mode, data_main_stgs['size_leverage'], next_quantity)
|
await info_access_open_deal(message, SYMBOL, data_main_stgs['trading_mode'], margin_mode, data_main_stgs['size_leverage'], next_quantity)
|
||||||
|
|
||||||
print(f'''
|
|
||||||
=====================
|
|
||||||
===================
|
|
||||||
===================
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{r}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
|
|
||||||
except exceptions.InvalidRequestError as e:
|
except exceptions.InvalidRequestError as e:
|
||||||
await message.answer('Недостаточно баланса')
|
await message.answer('Недостаточно баланса')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@@ -13,26 +13,21 @@ async def get_balance(tg_id, message):
|
|||||||
api_secret=secret_key
|
api_secret=secret_key
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if api_key == 'None' or secret_key == 'None':
|
||||||
|
await message.answer('⚠️ Подключите платформу для торговли')
|
||||||
|
return 0
|
||||||
|
|
||||||
|
try:
|
||||||
|
check_user = client.get_wallet_balance()
|
||||||
|
|
||||||
|
if check_user:
|
||||||
try:
|
try:
|
||||||
balance = client.get_wallet_balance(accountType='UNIFIED', coin='USDT')['result']['list'][0]['coin'][0]['walletBalance']
|
balance = client.get_wallet_balance(accountType='UNIFIED', coin='USDT')['result']['list'][0]['coin'][0]['walletBalance']
|
||||||
|
|
||||||
print(f'''
|
|
||||||
=====================
|
|
||||||
=====BALANCE=========
|
|
||||||
======USDT=============
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{balance}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
|
|
||||||
return balance
|
return balance
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
await message.answer('Баланс не был получен')
|
await message.answer('⚠️ Ошибка при получении баланса пользователя')
|
||||||
|
return 0
|
||||||
|
except Exception as e:
|
||||||
|
await message.answer('⚠️ Неверные данные API, перепроверьте их')
|
||||||
return 0
|
return 0
|
@@ -18,20 +18,4 @@ async def get_min_qty(tg_id, message):
|
|||||||
price = await price_s.get_price(tg_id, message)
|
price = await price_s.get_price(tg_id, message)
|
||||||
min_qty = int(5 / price * 1.1)
|
min_qty = int(5 / price * 1.1)
|
||||||
|
|
||||||
print(f'''
|
|
||||||
=====================
|
|
||||||
=====MIN=========
|
|
||||||
=====QTY==============
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{min_qty}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
|
|
||||||
return min_qty
|
return min_qty
|
@@ -20,9 +20,9 @@ class state_update_symbol(StatesGroup):
|
|||||||
async def clb_start_bybit_trade_message(callback: CallbackQuery, state: FSMContext):
|
async def clb_start_bybit_trade_message(callback: CallbackQuery, state: FSMContext):
|
||||||
api = await rq.get_bybit_api_key(callback.from_user.id)
|
api = await rq.get_bybit_api_key(callback.from_user.id)
|
||||||
secret = await rq.get_bybit_secret_key(callback.from_user.id)
|
secret = await rq.get_bybit_secret_key(callback.from_user.id)
|
||||||
|
|
||||||
if api and secret:
|
|
||||||
balance = await get_balance(callback.from_user.id, callback.message)
|
balance = await get_balance(callback.from_user.id, callback.message)
|
||||||
|
|
||||||
|
if balance:
|
||||||
symbol = await rq.get_symbol(callback.from_user.id)
|
symbol = await rq.get_symbol(callback.from_user.id)
|
||||||
|
|
||||||
text = f'''💎 Торговля на Bybit
|
text = f'''💎 Торговля на Bybit
|
||||||
@@ -30,38 +30,33 @@ async def clb_start_bybit_trade_message(callback: CallbackQuery, state: FSMConte
|
|||||||
⚖️ Ваш баланс (USDT): {balance}
|
⚖️ Ваш баланс (USDT): {balance}
|
||||||
📊 Текущая торговая пара: {symbol}
|
📊 Текущая торговая пара: {symbol}
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Как начать торговлю?
|
Как начать торговлю?
|
||||||
|
|
||||||
1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.
|
1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.
|
||||||
2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару заглавными буквами, без лишних символов (например: BTCUSDT).
|
2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару заглавными буквами, без лишних символов (например: BTCUSDT).
|
||||||
'''
|
'''
|
||||||
await callback.message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
await callback.message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
||||||
else:
|
|
||||||
callback.message.answer('Перед началом работы, в настройках подключите bybit')
|
|
||||||
|
|
||||||
async def start_bybit_trade_message(message, state):
|
async def start_bybit_trade_message(message, state):
|
||||||
api = await rq.get_bybit_api_key(message.from_user.id)
|
api = await rq.get_bybit_api_key(message.from_user.id)
|
||||||
secret = await rq.get_bybit_secret_key(message.from_user.id)
|
secret = await rq.get_bybit_secret_key(message.from_user.id)
|
||||||
|
|
||||||
if api and secret:
|
|
||||||
balance = await get_balance(message.from_user.id, message)
|
balance = await get_balance(message.from_user.id, message)
|
||||||
|
|
||||||
|
if balance:
|
||||||
symbol = await rq.get_symbol(message.from_user.id)
|
symbol = await rq.get_symbol(message.from_user.id)
|
||||||
|
|
||||||
text = f'''Торговля на Bybit
|
text = f'''💎 Торговля на Bybit
|
||||||
|
|
||||||
<b>ваш баланс (USDT):</b> {balance}
|
⚖️ Ваш баланс (USDT): {balance}
|
||||||
<b>Текущая торговая пара: </b> {symbol}
|
📊 Текущая торговая пара: {symbol}
|
||||||
|
|
||||||
Как начать торговлю?
|
Как начать торговлю?
|
||||||
1. Внимательно проверьте и настройте все параметры в вашем профиле
|
|
||||||
2. Ниже нажмите 'Указать торговую пару' и отправьте торговую пару заглавными буквами, указав два актива без всяких лишних символов! (Пример: BTCUSDT)
|
1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.
|
||||||
|
2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару заглавными буквами, без лишних символов (например: BTCUSDT).
|
||||||
'''
|
'''
|
||||||
|
|
||||||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
||||||
else:
|
|
||||||
await message.answer('Перед началом работы, в настройках подключите bybit')
|
|
||||||
|
|
||||||
@router_functions_bybit_trade.callback_query(F.data == 'clb_update_trading_pair')
|
@router_functions_bybit_trade.callback_query(F.data == 'clb_update_trading_pair')
|
||||||
async def update_symbol_for_trade_message(callback: CallbackQuery, state: FSMContext):
|
async def update_symbol_for_trade_message(callback: CallbackQuery, state: FSMContext):
|
||||||
@@ -75,6 +70,7 @@ async def update_symbol_for_trade(message: Message, state: FSMContext):
|
|||||||
|
|
||||||
data = await state.get_data()
|
data = await state.get_data()
|
||||||
|
|
||||||
|
await message.answer('Пара была успешно обновлена')
|
||||||
await rq.update_symbol(message.from_user.id, data['symbol'])
|
await rq.update_symbol(message.from_user.id, data['symbol'])
|
||||||
await start_bybit_trade_message(message, state)
|
await start_bybit_trade_message(message, state)
|
||||||
|
|
||||||
@@ -94,10 +90,8 @@ async def make_deal_bybit (callback: CallbackQuery):
|
|||||||
else:
|
else:
|
||||||
match trade_mode:
|
match trade_mode:
|
||||||
case 'Long':
|
case 'Long':
|
||||||
print('====================================LONG=========================================')
|
|
||||||
await Futures.contract_long(callback.from_user.id, callback.message, margin_mode)
|
await Futures.contract_long(callback.from_user.id, callback.message, margin_mode)
|
||||||
case 'Short':
|
case 'Short':
|
||||||
print('====================================SHORT=========================================')
|
|
||||||
await Futures.contract_short(callback.from_user.id, callback.message, margin_mode)
|
await Futures.contract_short(callback.from_user.id, callback.message, margin_mode)
|
||||||
case 'Switch':
|
case 'Switch':
|
||||||
await callback.message.edit_text('Режим Switch пока недоступен')
|
await callback.message.edit_text('Режим Switch пока недоступен')
|
||||||
|
@@ -18,22 +18,6 @@ async def get_price(tg_id, message):
|
|||||||
try:
|
try:
|
||||||
price = float(client.get_tickers(category='linear', symbol=SYMBOL).get('result').get('list')[0].get('ask1Price'))
|
price = float(client.get_tickers(category='linear', symbol=SYMBOL).get('result').get('list')[0].get('ask1Price'))
|
||||||
|
|
||||||
print(f'''
|
|
||||||
=====================
|
|
||||||
=====PRICE=========
|
|
||||||
===================
|
|
||||||
===================
|
|
||||||
=================
|
|
||||||
|
|
||||||
{price}
|
|
||||||
|
|
||||||
===============
|
|
||||||
===============
|
|
||||||
=============
|
|
||||||
===============
|
|
||||||
==============
|
|
||||||
''')
|
|
||||||
|
|
||||||
return price
|
return price
|
||||||
except exceptions.InvalidRequestError as e:
|
except exceptions.InvalidRequestError as e:
|
||||||
await message.answer('Неверно указана торговая пара')
|
await message.answer('Неверно указана торговая пара')
|
||||||
|
@@ -1,15 +1,15 @@
|
|||||||
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
||||||
|
|
||||||
start_markup = InlineKeyboardMarkup(inline_keyboard=[
|
start_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||||
[InlineKeyboardButton(text="Торговать", callback_data="callback_profile")]
|
[InlineKeyboardButton(text="🔥 Начать торговлю", callback_data="clb_start_chatbot_message")]
|
||||||
])
|
])
|
||||||
|
|
||||||
settings_markup = InlineKeyboardMarkup(inline_keyboard=[
|
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')]
|
[InlineKeyboardButton(text="Запуск", callback_data='clb_start_trading')]
|
||||||
])
|
])
|
||||||
|
|
||||||
back_btn_profile = [InlineKeyboardButton(text="Назад", callback_data='callback_profile')]
|
back_btn_profile = [InlineKeyboardButton(text="Назад", callback_data='clb_start_chatbot_message')]
|
||||||
|
|
||||||
special_settings_markup = InlineKeyboardMarkup(inline_keyboard=[
|
special_settings_markup = InlineKeyboardMarkup(inline_keyboard=[
|
||||||
[InlineKeyboardButton(text="Основные настройки", callback_data='clb_change_main_settings'),
|
[InlineKeyboardButton(text="Основные настройки", callback_data='clb_change_main_settings'),
|
||||||
|
@@ -84,7 +84,7 @@ class User_Risk_Management_Settings(Base):
|
|||||||
|
|
||||||
price_profit = mapped_column(Integer(), default=1)
|
price_profit = mapped_column(Integer(), default=1)
|
||||||
price_loss = mapped_column(Integer(), default=1)
|
price_loss = mapped_column(Integer(), default=1)
|
||||||
max_risk_deal = mapped_column(Integer(), default=1)
|
max_risk_deal = mapped_column(Integer(), default=100)
|
||||||
|
|
||||||
class User_Condition_Settings(Base):
|
class User_Condition_Settings(Base):
|
||||||
__tablename__ = 'user_condition_settings'
|
__tablename__ = 'user_condition_settings'
|
||||||
|
@@ -2,35 +2,29 @@
|
|||||||
import app.telegram.Keyboards.reply_keyboards as reply_markup
|
import app.telegram.Keyboards.reply_keyboards as reply_markup
|
||||||
|
|
||||||
async def start_message(message):
|
async def start_message(message):
|
||||||
await message.answer(f""" Привет <b>{message.from_user.username}</b>! 👋
|
username = ''
|
||||||
|
|
||||||
Добро пожаловать в бот по трейдингу на Bibyt — вашего надежного помощника для анализа рынка и принятия взвешенных решений. Здесь вы получите:
|
if message.from_user.first_name == None:
|
||||||
<b>
|
username = message.from_user.last_name
|
||||||
📊 Анализ текущих трендов
|
elif message.from_user.last_name == None:
|
||||||
📈 Инструменты для прогнозирования и оценки рисков
|
username = message.from_user.first_name
|
||||||
⚡️ Сигналы и рекомендации по сделкам
|
else:
|
||||||
🔔 Уведомления о важных изменениях и новостях
|
username = f'{message.from_user.first_name} {message.from_user.last_name}'
|
||||||
</b>
|
await message.answer(f""" Привет <b>{username}</b>! 👋
|
||||||
Просто отправляйте интересующий вас инструмент или команду, и бот быстро предоставит актуальную информацию и аналитику.
|
|
||||||
|
|
||||||
Начнем торговать умно и эффективно вместе! 🚀
|
|
||||||
|
|
||||||
|
Добро пожаловать в чат-робот для автоматизации трейдинга — вашего надежного помощника для анализа рынка и принятия взвешенных решений.
|
||||||
""", parse_mode='html', reply_markup=inline_markup.start_markup)
|
""", parse_mode='html', reply_markup=inline_markup.start_markup)
|
||||||
|
|
||||||
async def profile_message(username, message):
|
async def profile_message(username, message):
|
||||||
await message.answer(f""" <b>{username}</b>
|
await message.answer(f""" <b>@{username}</b>
|
||||||
|
|
||||||
Баланс
|
Баланс
|
||||||
⭐️ 0
|
⭐️ 0
|
||||||
|
|
||||||
О себе
|
|
||||||
🚀 Профессиональный трейдер на платформе Bibyt с авторской стратегией и аналитикой в реальном времени.
|
|
||||||
📊 Постоянно улучшаю навыки и адаптируюсь к рыночным изменениям, чтобы максимально увеличить прибыль.
|
|
||||||
🔥 Всегда в поиске новых возможностей для роста и стабильного успеха!
|
|
||||||
""", parse_mode='html', reply_markup=inline_markup.settings_markup)
|
""", parse_mode='html', reply_markup=inline_markup.settings_markup)
|
||||||
|
|
||||||
async def check_profile_message(message):
|
async def check_profile_message(message, username):
|
||||||
await message.answer(f'Добро пожаловать {message.from_user.username}!', reply_markup=reply_markup.base_buttons_markup)
|
await message.answer(f'С возвращением, {username}!', reply_markup=reply_markup.base_buttons_markup)
|
||||||
|
|
||||||
async def settings_message(message):
|
async def settings_message(message):
|
||||||
await message.edit_text("Выберите что настроить", reply_markup=inline_markup.special_settings_markup)
|
await message.edit_text("Выберите что настроить", reply_markup=inline_markup.special_settings_markup)
|
@@ -62,25 +62,30 @@ async def state_trading_mode(callback: CallbackQuery, state):
|
|||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
id = callback.from_user.id
|
id = callback.from_user.id
|
||||||
|
data_settings = await rq.get_user_main_settings(id)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
match callback.data:
|
match callback.data:
|
||||||
case 'trade_mode_long':
|
case 'trade_mode_long':
|
||||||
|
await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Long")
|
||||||
await rq.update_trade_mode_user(id, 'Long')
|
await rq.update_trade_mode_user(id, 'Long')
|
||||||
await main_settings_message(id, callback.message, state)
|
await main_settings_message(id, callback.message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
case 'trade_mode_short':
|
case 'trade_mode_short':
|
||||||
|
await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Short")
|
||||||
await rq.update_trade_mode_user(id, 'Short')
|
await rq.update_trade_mode_user(id, 'Short')
|
||||||
await main_settings_message(id, callback.message, state)
|
await main_settings_message(id, callback.message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
case 'trade_mode_switch':
|
case 'trade_mode_switch':
|
||||||
|
await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Switch")
|
||||||
await rq.update_trade_mode_user(id, 'Switch')
|
await rq.update_trade_mode_user(id, 'Switch')
|
||||||
await main_settings_message(id, callback.message, state)
|
await main_settings_message(id, callback.message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
case 'trade_mode_smart':
|
case 'trade_mode_smart':
|
||||||
|
await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']} → Smart")
|
||||||
await rq.update_trade_mode_user(id, 'Smart')
|
await rq.update_trade_mode_user(id, 'Smart')
|
||||||
await main_settings_message(id, callback.message, state)
|
await main_settings_message(id, callback.message, state)
|
||||||
|
|
||||||
@@ -98,13 +103,18 @@ async def state_size_leverage(message: Message, state):
|
|||||||
await state.update_data(size_leverage = message.text)
|
await state.update_data(size_leverage = message.text)
|
||||||
|
|
||||||
data = await state.get_data()
|
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:
|
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 rq.update_size_leverange(message.from_user.id, data['size_leverage'])
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
else:
|
else:
|
||||||
|
await message.answer(f'⛔️ Ошибка: ваше значение ({data['size_leverage']}) или выше лимита (100) или вы вводите неверные символы')
|
||||||
|
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
async def martingale_factor_message(message, state):
|
async def martingale_factor_message(message, state):
|
||||||
@@ -117,13 +127,18 @@ async def state_martingale_factor(message: Message, state):
|
|||||||
await state.update_data(martingale_factor = message.text)
|
await state.update_data(martingale_factor = message.text)
|
||||||
|
|
||||||
data = await state.get_data()
|
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:
|
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 rq.update_martingale_factor(message.from_user.id, data['martingale_factor'])
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
else:
|
else:
|
||||||
|
await message.answer(f'⛔️ Ошибка: ваше значение ({data['martingale_factor']}) или выше лимита (100) или вы вводите неверные символы')
|
||||||
|
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
async def margin_type_message(message, state):
|
async def margin_type_message(message, state):
|
||||||
@@ -150,16 +165,20 @@ async def state_margin_type(callback: CallbackQuery, state):
|
|||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
id = callback.from_user.id
|
id = callback.from_user.id
|
||||||
print(f"sdljfngdjklfg ## {callback.data}")
|
data_settings = await rq.get_user_main_settings(id)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
match callback.data:
|
match callback.data:
|
||||||
case 'margin_type_isolated':
|
case 'margin_type_isolated':
|
||||||
|
await callback.message.answer(f"✅ Изменено: {data_settings['margin_type']} → Isolated")
|
||||||
|
|
||||||
await rq.update_margin_type(id, 'Isolated')
|
await rq.update_margin_type(id, 'Isolated')
|
||||||
await main_settings_message(id, callback.message, state)
|
await main_settings_message(id, callback.message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
case 'margin_type_cross':
|
case 'margin_type_cross':
|
||||||
|
await callback.message.answer(f"✅ Изменено: {data_settings['margin_type']} → Cross")
|
||||||
|
|
||||||
await rq.update_margin_type(id, 'Cross')
|
await rq.update_margin_type(id, 'Cross')
|
||||||
await main_settings_message(id, callback.message, state)
|
await main_settings_message(id, callback.message, state)
|
||||||
|
|
||||||
@@ -177,30 +196,40 @@ async def state_starting_quantity(message: Message, state):
|
|||||||
await state.update_data(starting_quantity = message.text)
|
await state.update_data(starting_quantity = message.text)
|
||||||
|
|
||||||
data = await state.get_data()
|
data = await state.get_data()
|
||||||
|
data_settings = await rq.get_user_main_settings(message.from_user.id)
|
||||||
|
|
||||||
if data['starting_quantity'].isdigit():
|
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 rq.update_starting_quantity(message.from_user.id, data['starting_quantity'])
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
else:
|
else:
|
||||||
|
await message.answer(f'⛔️ Ошибка: вы вводите неверные символы')
|
||||||
|
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
async def maximum_quantity_message(message, state):
|
async def maximum_quantity_message(message, state):
|
||||||
await state.set_state(update_main_settings.maximal_quantity)
|
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)
|
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)
|
@router_main_settings.message(update_main_settings.maximal_quantity)
|
||||||
async def state_maximal_quantity(message: Message, state):
|
async def state_maximal_quantity(message: Message, state):
|
||||||
await state.update_data(maximal_quantity = message.text)
|
await state.update_data(maximal_quantity = message.text)
|
||||||
|
|
||||||
data = await state.get_data()
|
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:
|
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 rq.update_maximal_quantity(message.from_user.id, data['maximal_quantity'])
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
else:
|
else:
|
||||||
|
await message.answer(f'⛔️ Ошибка: ваше значение ({data['maximal_quantity']}) или выше лимита (100) или вы вводите неверные символы')
|
||||||
|
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
@@ -25,9 +25,9 @@ async def main_settings_message(id, message, state):
|
|||||||
|
|
||||||
text = f"""<b>Риск менеджмент</b>,
|
text = f"""<b>Риск менеджмент</b>,
|
||||||
|
|
||||||
<b>- Процент изменения цены для фиксации прибыли:</b> {data['price_profit']}
|
<b>- Процент изменения цены для фиксации прибыли:</b> {data['price_profit']}%
|
||||||
<b>- Процент изменения цены для фиксации убытков:</b> {data['price_loss']}
|
<b>- Процент изменения цены для фиксации убытков:</b> {data['price_loss']}%
|
||||||
<b>- Максимальный риск на сделку (в % от баланса):</b> {data['max_risk_deal']}
|
<b>- Максимальный риск на сделку (в % от баланса):</b> {data['max_risk_deal']}%
|
||||||
"""
|
"""
|
||||||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.risk_management_settings_markup)
|
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.risk_management_settings_markup)
|
||||||
|
|
||||||
@@ -43,13 +43,18 @@ async def state_price_profit(message: Message, state):
|
|||||||
await state.update_data(price_profit = message.text)
|
await state.update_data(price_profit = message.text)
|
||||||
|
|
||||||
data = await state.get_data()
|
data = await state.get_data()
|
||||||
|
data_settings = await rq.get_user_risk_management_settings(message.from_user.id)
|
||||||
|
|
||||||
if data['price_profit'].isdigit() and int(data['price_profit']) <= 100:
|
if data['price_profit'].isdigit() and int(data['price_profit']) <= 100:
|
||||||
|
await message.answer(f"✅ Изменено: {data_settings['price_profit']}% → {data['price_profit']}%")
|
||||||
|
|
||||||
await rq.update_price_profit(message.from_user.id, data['price_profit'])
|
await rq.update_price_profit(message.from_user.id, data['price_profit'])
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
else:
|
else:
|
||||||
|
await message.answer(f'⛔️ Ошибка: ваше значение ({data['price_profit']}%) или выше лимита (100) или вы вводите неверные символы')
|
||||||
|
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
async def price_loss_message(message, state):
|
async def price_loss_message(message, state):
|
||||||
@@ -64,13 +69,18 @@ async def state_price_loss(message: Message, state):
|
|||||||
await state.update_data(price_loss = message.text)
|
await state.update_data(price_loss = message.text)
|
||||||
|
|
||||||
data = await state.get_data()
|
data = await state.get_data()
|
||||||
|
data_settings = await rq.get_user_risk_management_settings(message.from_user.id)
|
||||||
|
|
||||||
if data['price_loss'].isdigit() and int(data['price_loss']) <= 100:
|
if data['price_loss'].isdigit() and int(data['price_loss']) <= 100:
|
||||||
|
await message.answer(f"✅ Изменено: {data_settings['price_loss']}% → {data['price_loss']}%")
|
||||||
|
|
||||||
await rq.update_price_loss(message.from_user.id, data['price_loss'])
|
await rq.update_price_loss(message.from_user.id, data['price_loss'])
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
else:
|
else:
|
||||||
|
await message.answer(f'⛔️ Ошибка: ваше значение ({data['price_loss']}%) или выше лимита (100) или вы вводите неверные символы')
|
||||||
|
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
async def max_risk_deal_message(message, state):
|
async def max_risk_deal_message(message, state):
|
||||||
@@ -85,11 +95,16 @@ async def state_max_risk_deal(message: Message, state):
|
|||||||
await state.update_data(max_risk_deal = message.text)
|
await state.update_data(max_risk_deal = message.text)
|
||||||
|
|
||||||
data = await state.get_data()
|
data = await state.get_data()
|
||||||
|
data_settings = await rq.get_user_risk_management_settings(message.from_user.id)
|
||||||
|
|
||||||
if data['max_risk_deal'].isdigit() and int(data['max_risk_deal']) <= 100:
|
if data['max_risk_deal'].isdigit() and int(data['max_risk_deal']) <= 100:
|
||||||
|
await message.answer(f"✅ Изменено: {data_settings['max_risk_deal']}% → {data['max_risk_deal']}%")
|
||||||
|
|
||||||
await rq.update_max_risk_deal(message.from_user.id, data['max_risk_deal'])
|
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 main_settings_message(message.from_user.id, message, state)
|
||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
else:
|
else:
|
||||||
|
await message.answer(f'⛔️ Ошибка: ваше значение ({data['max_risk_deal']}%) или выше лимита (100) или вы вводите неверные символы')
|
||||||
|
|
||||||
await main_settings_message(message.from_user.id, message, state)
|
await main_settings_message(message.from_user.id, message, state)
|
@@ -20,7 +20,6 @@ router = Router()
|
|||||||
@router.message(CommandStart())
|
@router.message(CommandStart())
|
||||||
async def start_message(message: Message):
|
async def start_message(message: Message):
|
||||||
await rq.set_new_user_bybit_api(message.from_user.id)
|
await rq.set_new_user_bybit_api(message.from_user.id)
|
||||||
|
|
||||||
await func.start_message(message)
|
await func.start_message(message)
|
||||||
|
|
||||||
@router.message(F.text == "👤 Профиль")
|
@router.message(F.text == "👤 Профиль")
|
||||||
@@ -37,13 +36,20 @@ async def settings_msg(message: Message):
|
|||||||
if user:
|
if user:
|
||||||
await func.settings_message(message)
|
await func.settings_message(message)
|
||||||
|
|
||||||
@router.callback_query(F.data == "callback_profile")
|
@router.callback_query(F.data == "clb_start_chatbot_message")
|
||||||
async def clb_func_reg (callback: CallbackQuery):
|
async def clb_profile_msg (callback: CallbackQuery):
|
||||||
user = await rq.check_user(callback.from_user.id)
|
user = await rq.check_user(callback.from_user.id)
|
||||||
|
|
||||||
if user:
|
username = ''
|
||||||
await callback.message.answer(f'С возвращением, {callback.from_user.username}!', reply_markup=reply_markup.base_buttons_markup)
|
|
||||||
|
|
||||||
|
if callback.from_user.first_name == None:
|
||||||
|
username = callback.from_user.last_name
|
||||||
|
elif callback.from_user.last_name == None:
|
||||||
|
username = callback.from_user.first_name
|
||||||
|
else:
|
||||||
|
username = f'{callback.from_user.first_name} {callback.from_user.last_name}'
|
||||||
|
|
||||||
|
if user:
|
||||||
await func.profile_message(callback.from_user.username, callback.message)
|
await func.profile_message(callback.from_user.username, callback.message)
|
||||||
else:
|
else:
|
||||||
await rq.save_tg_id_new_user(callback.from_user.id)
|
await rq.save_tg_id_new_user(callback.from_user.id)
|
||||||
@@ -53,9 +59,9 @@ async def clb_func_reg (callback: CallbackQuery):
|
|||||||
await func_condition_settings.reg_new_user_default_condition_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 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.message.answer(f'Здравствуйте, {username}!', reply_markup=reply_markup.base_buttons_markup)
|
||||||
|
|
||||||
await func.profile_message(callback.from_user.username, callback.message)
|
await func.profile_message(username, callback.message)
|
||||||
|
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user