Merge pull STCS #2

Merged
Arsen Mirzaev Tatyano-Muradovich merged 7 commits from Pixe1lz/stcs:stable into stable 2025-07-30 14:32:50 +07:00
20 changed files with 916 additions and 134 deletions
Showing only changes of commit 1997b9d1c0 - Show all commits

View File

@@ -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" />

View File

@@ -71,7 +71,7 @@ async def contract_long(tg_id, message, margin_mode):
setMarginMode=margin_mode # margin_type setMarginMode=margin_mode # margin_type
) )
martingale_factor = float(data_main_stgs['martingale_factor']) martingale_factor = float(data_main_stgs['martingale_factor']) # Исправлено: было maximal_quantity
max_martingale_steps = int(data_main_stgs['maximal_quantity']) max_martingale_steps = int(data_main_stgs['maximal_quantity'])
starting_quantity = float(data_main_stgs['starting_quantity']) starting_quantity = float(data_main_stgs['starting_quantity'])
max_risk_percent = float(data_risk_management_stgs['max_risk_deal']) max_risk_percent = float(data_risk_management_stgs['max_risk_deal'])
@@ -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
@@ -209,7 +178,7 @@ async def contract_short(tg_id, message, margin_mode):
setMarginMode=margin_mode # margin_type setMarginMode=margin_mode # margin_type
) )
martingale_factor = float(data_main_stgs['martingale_factor']) martingale_factor = float(data_main_stgs['martingale_factor']) # Исправлено: было maximal_quantity
max_martingale_steps = int(data_main_stgs['maximal_quantity']) max_martingale_steps = int(data_main_stgs['maximal_quantity'])
starting_quantity = float(data_main_stgs['starting_quantity']) starting_quantity = float(data_main_stgs['starting_quantity'])
max_risk_percent = float(data_risk_management_stgs['max_risk_deal']) max_risk_percent = float(data_risk_management_stgs['max_risk_deal'])
@@ -235,17 +204,16 @@ 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:
starting_quantity = next_quantity starting_quantity = next_quantity
current_martingale_step = 0 current_martingale_step = 0
elif not realised_pnl: elif not realised_pnl:
next_quantity = starting_quantity next_quantity = starting_quantity
current_martingale_step += 1 current_martingale_step += 1
else: # Убыточная сделка else:
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
except Exception as e: except Exception as e:
print("Не получены позиции") print("Не получены позиции")
next_quantity = starting_quantity next_quantity = starting_quantity

View File

@@ -13,10 +13,21 @@ async def get_balance(tg_id, message):
api_secret=secret_key api_secret=secret_key
) )
try: if api_key == 'None' or secret_key == 'None':
balance = client.get_wallet_balance(accountType='UNIFIED', coin='USDT')['result']['list'][0]['coin'][0]['walletBalance'] await message.answer('⚠️ Подключите платформу для торговли')
return 0
return balance
except Exception as e: try:
await message.answer('Баланс не был получен, подключите платформу') check_user = client.get_wallet_balance()
if check_user:
try:
balance = client.get_wallet_balance(accountType='UNIFIED', coin='USDT')['result']['list'][0]['coin'][0]['walletBalance']
return balance
except Exception as e:
await message.answer('⚠️ Ошибка при получении баланса пользователя')
return 0
except Exception as e:
await message.answer('⚠️ Неверные данные API, перепроверьте их')
return 0 return 0

View File

@@ -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)
balance = await get_balance(callback.from_user.id, callback.message)
if api and secret: if balance:
balance = await get_balance(callback.from_user.id, callback.message)
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)
balance = await get_balance(message.from_user.id, message)
if api and secret: if balance:
balance = await get_balance(message.from_user.id, message)
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)

View File

@@ -62,29 +62,34 @@ 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 rq.update_trade_mode_user(id, 'Smart') await callback.message.answer(f"✅ Изменено: {data_settings['trading_mode']}Smart")
await main_settings_message(id, callback.message, state) await rq.update_trade_mode_user(id, 'Smart')
await main_settings_message(id, callback.message, state)
await state.clear() await state.clear()
except Exception as e: except Exception as e:
print(f"error: {e}") print(f"error: {e}")
@@ -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)

View File

@@ -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)