@@ -1,24 +1,18 @@
from aiogram import Router , F
from aiogram import Router
import logging . config
import app . telegram . Keyboards . inline_keyboards as inline_markup
import app . telegram . Keyboards . reply_keyboards as reply_markup
from pybit . unified_trading import HTTP
import app . telegram . database . requests as rq
from aiogram . types import Message , CallbackQuery
from app . states . States import update_main_settings
from logger_helper . logger_helper import LOGGING_CONFIG
# FSM - Механизм состояния
from aiogram . fsm . state import State , StatesGroup
logging . config . dictConfig ( LOGGING_CONFIG )
logger = logging . getLogger ( " main_settings " )
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 ( )
switch_mode_enabled = State ( )
async def reg_new_user_default_main_settings ( id , message ) :
tg_id = id
@@ -27,12 +21,12 @@ async def reg_new_user_default_main_settings(id, message):
margin_type = await rq . get_for_registration_margin_type ( )
await rq . set_new_user_default_main_settings ( tg_id , trading_mode , margin_type )
async def main_settings_message ( id , message , state ) :
data = await rq . get_user_main_settings ( id )
await message . answer ( f """ <b>Основные настройки</b>
async def main_settings_message ( id , message ) :
data = await rq . get_user_main_settings ( id )
await message . answer ( f """ <b>Основные настройки</b>
<b>- Режим торговли:</b> { data [ ' trading_mode ' ] }
<b>- Режим свитч:</b> { data [ ' switch_mode_enabled ' ] }
@@ -45,6 +39,7 @@ async def main_settings_message(id, message, state):
<b>- Максимальное количество ставок в серии:</b> { data [ ' maximal_quantity ' ] }
""" , parse_mode = ' html ' , reply_markup = inline_markup . main_settings_markup )
async def trading_mode_message ( message , state ) :
await state . set_state ( update_main_settings . trading_mode )
@@ -59,36 +54,37 @@ async def trading_mode_message(message, state):
<em>Выберите ниже для изменений:</em>
""" , parse_mode = ' html ' , reply_markup = inline_markup . trading_mode_markup )
@router_main_settings.callback_query ( update_main_settings . trading_mode )
async def state_trading_mode ( callback : CallbackQuery , state ) :
await callback . answer ( )
await callback . answer ( )
id = callback . from_user . id
data_settings = await rq . get_user_main_settings ( id )
id = callback . from_user . id
data_settings = await rq . get_user_main_settings ( id )
try :
match callback . data :
case ' trade_mode_long ' :
try :
match callback . data :
case ' trade_mode_long ' :
await callback . message . answer ( f " ✅ Изменено: { data_settings [ ' trading_mode ' ] } → Long " )
await rq . update_trade_mode_user ( id , ' Long ' )
await main_settings_message ( id , callback . message , state )
await main_settings_message ( id , callback . message )
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 main_settings_message ( id , callback . message , state )
await main_settings_message ( id , callback . message )
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 main_settings_message ( id , callback . message , state )
await main_settings_message ( id , callback . message )
await state . clear ( )
except Exception as e :
print ( f " error: { e } " )
await state . clear ( )
except Exception as e :
logger . error ( e )
async def switch_mode_enabled_message ( message , state ) :
@@ -97,9 +93,8 @@ async def switch_mode_enabled_message(message, state):
await message . edit_text (
""" <b>Свитч</b> — динамическое переключение между торговыми режимами для максимизации эффективности.
<em>Выберите ниже для изменений:</em> """ , parse_mode = ' html ' , reply_markup = inline_markup . buttons_on_off_markup_for_switch )
<em>Выберите ниже для изменений:</em> """ , parse_mode = ' html ' ,
reply_markup = inline_markup . buttons_on_off_markup_for_switch )
@router_main_settings.callback_query ( lambda c : c . data in [ " clb_on_switch " , " clb_off_switch " ] )
@@ -109,12 +104,12 @@ async def state_switch_mode_enabled(callback: CallbackQuery, state):
val = " Включить " if callback . data == " clb_on_switch " else " Выключить "
if val == " Включить " :
await rq . update_switch_mode_enabled ( tg_id , " Включено " )
await callback . message . answer( f " Включено " )
await main_settings_message ( tg_id , callback . message , state )
await callback . answer ( f " Включено " )
await main_settings_message ( tg_id , callback . message )
else :
await rq . update_switch_mode_enabled ( tg_id , " Выключено " )
await callback . message . answer( f " Выключено " )
await main_settings_message ( tg_id , callback . message , state )
await callback . answer ( f " Выключено " )
await main_settings_message ( tg_id , callback . message )
await state . clear ( )
@@ -132,24 +127,24 @@ async def state_switch_mode_enabled(callback: CallbackQuery, state):
if val == " Long " :
await rq . update_switch_state ( tg_id , " Long " )
await callback . message . answer ( f " Состояние свитча: { val } " )
await main_settings_message ( tg_id , callback . message , state )
await main_settings_message ( tg_id , callback . message )
else :
await rq . update_switch_state ( tg_id , " Short " )
await callback . message . answer ( f " Состояние свитча: { val } " )
await main_settings_message ( tg_id , callback . message , state )
await main_settings_message ( tg_id , callback . message )
await state . clear ( )
async def size_leverage_message ( message , state ) :
async def size_leverage_message ( message , state ) :
await state . set_state ( update_main_settings . size_leverage )
await message . edit_text ( " Введите размер <b>кредитного плеча</b> (от 1 до 100): " , parse_mode = ' html ' , reply_markup = inline_markup . back_btn_list_settings_markup )
await message . edit_text ( " Введите размер <b>кредитного плеча</b> (от 1 до 100): " , parse_mode = ' html ' ,
reply_markup = inline_markup . back_btn_list_settings_markup )
@router_main_settings.message ( update_main_settings . size_leverage )
async def state_size_leverage ( message : Message , state ) :
await state . update_data ( size_leverage = message . text )
await state . update_data ( size_leverage = message . text )
data = await state . get_data ( )
data_settings = await rq . get_user_main_settings ( message . from_user . id )
@@ -158,22 +153,26 @@ async def state_size_leverage(message: Message, state):
await message . answer ( f " ✅ Изменено: { data_settings [ ' size_leverage ' ] } → { 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 )
await state . clear ( )
else :
await message . answer ( f ' ⛔️ Ошибка: ваше значение ( { data [ ' size_leverage ' ] } ) или выше лимита (100) или вы вводите неверные символы ' )
await message . answer (
f ' ⛔️ Ошибка: ваше значение ( { data [ ' size_leverage ' ] } ) или выше лимита (100) или вы вводите неверные символы ' )
await main_settings_message ( message . from_user . id , message )
await main_settings_message ( message . from_user . id , message , state )
async def martingale_factor_message ( message , state ) :
await state . set_state ( update_main_settings . martingale_factor )
await message . edit_text ( " Введите <b>коэффициент Мартингейла:</b> " , parse_mode = ' html ' , reply_markup = inline_markup . back_btn_list_settings_markup )
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 )
await state . update_data ( martingale_factor = message . text )
data = await state . get_data ( )
data_settings = await rq . get_user_main_settings ( message . from_user . id )
@@ -182,14 +181,16 @@ async def state_martingale_factor(message: Message, state):
await message . answer ( f " ✅ Изменено: { data_settings [ ' martingale_factor ' ] } → { 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 )
await state . clear ( )
else :
await message . answer ( f ' ⛔️ Ошибка: ваше значение ( { data [ ' martingale_factor ' ] } ) или выше лимита (100) или вы вводите неверные символы ' )
await message . answer (
f ' ⛔️ Ошибка: ваше значение ( { data [ ' martingale_factor ' ] } ) или выше лимита (100) или вы вводите неверные символы ' )
await main_settings_message ( message . from_user . id , message )
await main_settings_message ( message . from_user . id , message , state )
async def margin_type_message ( message , state ) :
await state . set_state ( update_main_settings . margin_type )
@@ -209,40 +210,60 @@ async def margin_type_message(message, state):
<em>Выберите ниже для изменений:</em>
""" , parse_mode = ' html ' , reply_markup = inline_markup . margin_type_markup )
@router_main_settings.callback_query ( update_main_settings . margin_type )
async def state_margin_type ( callback : CallbackQuery , state ) :
await callback . answer ( )
tg_id = callback . from_user . id
api_key = await rq . get_bybit_api_key ( tg_id )
secret_key = await rq . get_bybit_secret_key ( tg_id )
data_settings = await rq . get_user_main_settings ( tg_id )
client = HTTP ( api_key = api_key , api_secret = secret_key )
try :
active_positions = client . get_positions ( category = ' linear ' , settleCoin = ' USDT ' )
id = callback . from_user . id
data_settings = await rq . get_user_main_settings ( id )
positions = active_positions . get ( ' result ' , { } ) . get ( ' list ' , [ ] )
except Exception as e :
logger . error ( f " error: { e } " )
positions = [ ]
try :
match callback . data :
case ' margin_type_isolated ' :
for pos in positions :
size = pos . get ( ' size ' )
if float ( size ) > 0 :
await callback . answer (
" ⚠️ Маржинальный режим нельзя менять при открытой позиции " ,
show_alert = True
)
return
try :
match callback . data :
case ' margin_type_isolated ' :
await callback . message . answer ( f " ✅ Изменено: { data_settings [ ' margin_type ' ] } → Isolated " )
await rq . update_margin_type ( id, ' Isolated ' )
await main_settings_message ( id, callback . message , state )
await rq . update_margin_type ( tg_ id, ' Isolated ' )
await main_settings_message ( tg_ id, callback . message )
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 main_settings_message ( id, callback . message , state )
await rq . update_margin_type ( tg_ id, ' Cross ' )
await main_settings_message ( tg_ id, callback . message )
await state . clear ( )
except Exception as e :
print ( f " error: { e } " )
except Exception as e :
logger . error ( f " error: { e } " )
async def starting_quantity_message ( message , state ) :
async def starting_quantity_message ( message , state ) :
await state . set_state ( update_main_settings . starting_quantity )
await message . edit_text ( " Введите <b>начальную ставку:</b> " , parse_mode = ' html ' , reply_markup = inline_markup . back_btn_list_settings_markup )
await message . edit_text ( " Введите <b>начальную ставку:</b> " , parse_mode = ' html ' ,
reply_markup = inline_markup . back_btn_list_settings_markup )
@router_main_settings.message ( update_main_settings . starting_quantity )
async def state_starting_quantity ( message : Message , state ) :
await state . update_data ( starting_quantity = message . text )
await state . update_data ( starting_quantity = message . text )
data = await state . get_data ( )
data_settings = await rq . get_user_main_settings ( message . from_user . id )
@@ -251,22 +272,25 @@ async def state_starting_quantity(message: Message, state):
await message . answer ( f " ✅ Изменено: { data_settings [ ' starting_quantity ' ] } → { 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 )
await state . clear ( )
else :
await message . answer ( f ' ⛔️ Ошибка: вы вводите неверные символы ' )
await main_settings_message ( message . from_user . id , message , state )
await main_settings_message ( message . from_user . id , message )
async def maximum_quantity_message ( message , state ) :
await state . set_state ( update_main_settings . maximal_quantity )
await message . edit_text ( " Введите <b>максимальное количество серии ставок:</b> " , parse_mode = ' html ' , reply_markup = inline_markup . back_btn_list_settings_markup )
await message . edit_text ( " Введите <b>максимальное количество серии ставок:</b> " , parse_mode = ' html ' ,
reply_markup = inline_markup . back_btn_list_settings_markup )
@router_main_settings.message ( update_main_settings . maximal_quantity )
async def state_maximal_quantity ( message : Message , state ) :
await state . update_data ( maximal_quantity = message . text )
await state . update_data ( maximal_quantity = message . text )
data = await state . get_data ( )
data_settings = await rq . get_user_main_settings ( message . from_user . id )
@@ -275,10 +299,11 @@ async def state_maximal_quantity(message: Message, state):
await message . answer ( f " ✅ Изменено: { data_settings [ ' maximal_quantity ' ] } → { 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 )
await state . clear ( )
else :
await message . answer ( f ' ⛔️ Ошибка: ваше значение ( { data [ ' maximal_quantity ' ] } ) или выше лимита (100) или вы вводите неверные символы ' )
await main_settings_message ( message . from_user . id , message , state )
await message . answer (
f ' ⛔️ Ошибка: ваше значение ( { data [ ' maximal_quantity ' ] } ) или выше лимита (100) или вы вводите неверные символы ' )
await main_settings_message ( message . from_user . id , message )