2
0
forked from kodorvan/stcs
This commit is contained in:
algizn97
2025-10-04 11:03:49 +05:00
parent 220c45d54c
commit 01fe339d56
5 changed files with 82 additions and 39 deletions

View File

@@ -123,7 +123,7 @@ async def start_trading_cycle(
"Order does not meet minimum order value", "Order does not meet minimum order value",
"position idx not match position mode", "position idx not match position mode",
"Qty invalid", "Qty invalid",
"The number of contracts exceeds maximum limit allowed" "The number of contracts exceeds maximum limit allowed",
} }
else None else None
) )
@@ -241,7 +241,7 @@ async def trading_cycle(
"Risk is too high for this trade", "Risk is too high for this trade",
"ab not enough for new order", "ab not enough for new order",
"InvalidRequestError", "InvalidRequestError",
"The number of contracts exceeds maximum limit allowed" "The number of contracts exceeds maximum limit allowed",
} }
else None else None
) )

View File

@@ -163,9 +163,7 @@ class TelegramMessageHandler:
auto_trading = ( auto_trading = (
user_auto_trading.auto_trading if user_auto_trading else False user_auto_trading.auto_trading if user_auto_trading else False
) )
user_symbols = ( user_symbols = user_auto_trading.symbol if user_auto_trading else None
user_auto_trading.symbol if user_auto_trading else None
)
if ( if (
auto_trading auto_trading
@@ -181,10 +179,16 @@ class TelegramMessageHandler:
r_side = "Sell" r_side = "Sell"
else: else:
r_side = "Buy" r_side = "Buy"
await rq.set_auto_trading(tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side) await rq.set_auto_trading(
user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side
)
user_deals_data = await rq.get_user_deal_by_symbol(
tg_id=tg_id, symbol=symbol
)
if user_deals_data and user_deals_data.switch_side_mode: if user_deals_data and user_deals_data.switch_side_mode:
await rq.set_auto_trading(tg_id=tg_id, symbol=symbol, auto_trading=False, side=side) await rq.set_auto_trading(
tg_id=tg_id, symbol=symbol, auto_trading=False, side=side
)
else: else:
open_order_text = "\n❗️ Сделка закрылась в минус, открываю новую сделку с увеличенной ставкой.\n" open_order_text = "\n❗️ Сделка закрылась в минус, открываю новую сделку с увеличенной ставкой.\n"
await self.telegram_bot.send_message( await self.telegram_bot.send_message(
@@ -214,10 +218,15 @@ class TelegramMessageHandler:
await rq.set_auto_trading( await rq.set_auto_trading(
tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side
) )
user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) user_deals_data = await rq.get_user_deal_by_symbol(
tg_id=tg_id, symbol=symbol
)
if user_deals_data and user_deals_data.switch_side_mode: if user_deals_data and user_deals_data.switch_side_mode:
await rq.set_auto_trading( await rq.set_auto_trading(
tg_id=tg_id, symbol=symbol, auto_trading=False, side=side tg_id=tg_id,
symbol=symbol,
auto_trading=False,
side=side,
) )
await self.telegram_bot.send_message( await self.telegram_bot.send_message(
chat_id=tg_id, chat_id=tg_id,

View File

@@ -146,7 +146,6 @@ async def get_liquidation_price(
risk_level = risk_list[0] if risk_list else {} risk_level = risk_list[0] if risk_list else {}
maintenance_margin_rate = safe_float(risk_level.get("maintenanceMargin")) maintenance_margin_rate = safe_float(risk_level.get("maintenanceMargin"))
liq_price_long = entry_price * (1 - 1 / leverage + maintenance_margin_rate) liq_price_long = entry_price * (1 - 1 / leverage + maintenance_margin_rate)
liq_price_short = entry_price * (1 + 1 / leverage - maintenance_margin_rate) liq_price_short = entry_price * (1 + 1 / leverage - maintenance_margin_rate)

View File

@@ -186,7 +186,9 @@ async def settings_for_margin_type(
try: try:
await state.clear() await state.clear()
await callback_query.message.edit_text( await callback_query.message.edit_text(
text="Выберите тип маржи:", reply_markup=kbi.margin_type text="Выберите тип маржи:\n\n"
"Примечание: Если у вас есть открытые позиции, то маржа примениться ко всем позициям",
reply_markup=kbi.margin_type
) )
logger.debug( logger.debug(
"Command margin_type processed successfully for user: %s", "Command margin_type processed successfully for user: %s",

View File

@@ -5,13 +5,17 @@ from aiogram import F, Router
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery from aiogram.types import CallbackQuery
from app.telegram.tasks.tasks import add_start_task_merged, cancel_start_task_merged, add_start_task_switch, \
cancel_start_task_switch
import app.telegram.keyboards.inline as kbi import app.telegram.keyboards.inline as kbi
import database.request as rq import database.request as rq
from app.bybit.get_functions.get_positions import get_active_positions_by_symbol from app.bybit.get_functions.get_positions import get_active_positions_by_symbol
from app.bybit.open_positions import start_trading_cycle from app.bybit.open_positions import start_trading_cycle
from app.helper_functions import safe_float from app.helper_functions import safe_float
from app.telegram.tasks.tasks import (
add_start_task_merged,
add_start_task_switch,
cancel_start_task_merged,
cancel_start_task_switch,
)
from logger_helper.logger_helper import LOGGING_CONFIG from logger_helper.logger_helper import LOGGING_CONFIG
logging.config.dictConfig(LOGGING_CONFIG) logging.config.dictConfig(LOGGING_CONFIG)
@@ -50,30 +54,30 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non
if position_idx != 0 and safe_float(size) > 0 and trade_mode == "Merged_Single": if position_idx != 0 and safe_float(size) > 0 and trade_mode == "Merged_Single":
await callback_query.answer( await callback_query.answer(
text="У вас есть активная позиция в режиме хеджирования. " text="У вас есть активная позиция в режиме хеджирования. "
"Открытие сделки в одностороннем режиме невозможно.", "Открытие сделки в одностороннем режиме невозможно.",
) )
return return
if position_idx == 0 and safe_float(size) > 0 and trade_mode == "Both_Sides": if position_idx == 0 and safe_float(size) > 0 and trade_mode == "Both_Sides":
await callback_query.answer( await callback_query.answer(
text="У вас есть активная позиция в одностороннем режиме. " text="У вас есть активная позиция в одностороннем режиме. "
"Открытие сделки в режиме хеджирования невозможно.", "Открытие сделки в режиме хеджирования невозможно.",
) )
return return
if trade_mode == "Merged_Single": if trade_mode == "Merged_Single":
await callback_query.message.edit_text( await callback_query.message.edit_text(
text="Выберите режим торговли:\n\n" text="Выберите режим торговли:\n\n"
"Лонг - все сделки серии открываются на покупку.\n" "Лонг - все сделки серии открываются на покупку.\n"
"Шорт - все сделки серии открываются на продажу.\n" "Шорт - все сделки серии открываются на продажу.\n"
"Свитч - направление каждой сделки серии меняется по переменно.\n", "Свитч - направление каждой сделки серии меняется по переменно.\n",
reply_markup=kbi.merged_start_trading, reply_markup=kbi.merged_start_trading,
) )
else: # trade_mode == "Both_Sides": else: # trade_mode == "Both_Sides":
await callback_query.message.edit_text( await callback_query.message.edit_text(
text="Выберите режим торговли:\n\n" text="Выберите режим торговли:\n\n"
"Лонг - все сделки открываются на покупку.\n" "Лонг - все сделки открываются на покупку.\n"
"Шорт - все сделки открываются на продажу.\n", "Шорт - все сделки открываются на продажу.\n",
reply_markup=kbi.both_start_trading, reply_markup=kbi.both_start_trading,
) )
logger.debug( logger.debug(
@@ -144,7 +148,10 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) -
await asyncio.sleep(timer_start * 60) await asyncio.sleep(timer_start * 60)
await rq.set_auto_trading( await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=side tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=True,
side=side,
) )
res = await start_trading_cycle( res = await start_trading_cycle(
tg_id=callback_query.from_user.id, tg_id=callback_query.from_user.id,
@@ -170,10 +177,15 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) -
await state.clear() await state.clear()
else: else:
await rq.set_auto_trading( await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, side=side tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=False,
side=side,
) )
text = error_messages.get(res, "Произошла ошибка при запуске торговли") text = error_messages.get(res, "Произошла ошибка при запуске торговли")
await callback_query.message.edit_text(text=text, reply_markup=kbi.profile_bybit) await callback_query.message.edit_text(
text=text, reply_markup=kbi.profile_bybit
)
await callback_query.message.edit_text("Запуск торговли...") await callback_query.message.edit_text("Запуск торговли...")
task = asyncio.create_task(delay_start()) task = asyncio.create_task(delay_start())
@@ -192,7 +204,7 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) -
@router_start_trading.callback_query(lambda c: c.data == "switch") @router_start_trading.callback_query(lambda c: c.data == "switch")
async def start_trading_switch( async def start_trading_switch(
callback_query: CallbackQuery, state: FSMContext callback_query: CallbackQuery, state: FSMContext
) -> None: ) -> None:
""" """
Handles the "switch" callback query. Handles the "switch" callback query.
@@ -205,10 +217,10 @@ async def start_trading_switch(
await state.clear() await state.clear()
await callback_query.message.edit_text( await callback_query.message.edit_text(
text="Выберите направление первой сделки серии:\n\n" text="Выберите направление первой сделки серии:\n\n"
"Лонг - открывается первая сделка на покупку.\n" "Лонг - открывается первая сделка на покупку.\n"
"Шорт - открывается первая сделка на продажу.\n" "Шорт - открывается первая сделка на продажу.\n"
"По направлению - сделка открывается в направлении последней сделки предыдущей серии.\n" "По направлению - сделка открывается в направлении последней сделки предыдущей серии.\n"
"Противоположно - сделка открывается в противоположном направлении последней сделки предыдущей серии.\n", "Противоположно - сделка открывается в противоположном направлении последней сделки предыдущей серии.\n",
reply_markup=kbi.switch_side, reply_markup=kbi.switch_side,
) )
except Exception as e: except Exception as e:
@@ -222,7 +234,7 @@ async def start_trading_switch(
@router_start_trading.callback_query( @router_start_trading.callback_query(
lambda c: c.data lambda c: c.data
in {"switch_long", "switch_short", "switch_direction", "switch_opposite"} in {"switch_long", "switch_short", "switch_direction", "switch_opposite"}
) )
async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None: async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None:
""" """
@@ -298,13 +310,21 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None
) )
await asyncio.sleep(timer_start * 60) await asyncio.sleep(timer_start * 60)
await rq.set_auto_trading( await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=side tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=True,
side=side,
) )
if side == "Buy": if side == "Buy":
r_side = "Sell" r_side = "Sell"
else: else:
r_side = "Buy" r_side = "Buy"
await rq.set_auto_trading(tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=r_side) await rq.set_auto_trading(
tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=True,
side=r_side,
)
res = await start_trading_cycle( res = await start_trading_cycle(
tg_id=callback_query.from_user.id, tg_id=callback_query.from_user.id,
side=side, side=side,
@@ -329,16 +349,25 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None
await state.clear() await state.clear()
else: else:
await rq.set_auto_trading( await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, side=side tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=False,
side=side,
) )
if side == "Buy": if side == "Buy":
r_side = "Sell" r_side = "Sell"
else: else:
r_side = "Buy" r_side = "Buy"
await rq.set_auto_trading(tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, await rq.set_auto_trading(
side=r_side) tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=False,
side=r_side,
)
text = error_messages.get(res, "Произошла ошибка при запуске торговли") text = error_messages.get(res, "Произошла ошибка при запуске торговли")
await callback_query.message.edit_text(text=text, reply_markup=kbi.profile_bybit) await callback_query.message.edit_text(
text=text, reply_markup=kbi.profile_bybit
)
await callback_query.message.edit_text("Запуск торговли...") await callback_query.message.edit_text("Запуск торговли...")
task = asyncio.create_task(delay_start()) task = asyncio.create_task(delay_start())
@@ -354,9 +383,11 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None
) )
@router_start_trading.callback_query(lambda c: c.data == "cancel_timer_merged" or c.data == "cancel_timer_switch") @router_start_trading.callback_query(
lambda c: c.data == "cancel_timer_merged" or c.data == "cancel_timer_switch"
)
async def cancel_start_trading( async def cancel_start_trading(
callback_query: CallbackQuery, state: FSMContext callback_query: CallbackQuery, state: FSMContext
) -> None: ) -> None:
""" """
Handles the "cancel_timer" callback query. Handles the "cancel_timer" callback query.
@@ -371,7 +402,9 @@ async def cancel_start_trading(
cancel_start_task_merged(user_id=callback_query.from_user.id) cancel_start_task_merged(user_id=callback_query.from_user.id)
elif callback_query.data == "cancel_timer_switch": elif callback_query.data == "cancel_timer_switch":
cancel_start_task_switch(user_id=callback_query.from_user.id) cancel_start_task_switch(user_id=callback_query.from_user.id)
await callback_query.message.edit_text(text="Запуск торговли отменен", reply_markup=kbi.profile_bybit) await callback_query.message.edit_text(
text="Запуск торговли отменен", reply_markup=kbi.profile_bybit
)
except Exception as e: except Exception as e:
await callback_query.answer("Произошла ошибка при отмене запуска торговли") await callback_query.answer("Произошла ошибка при отмене запуска торговли")
logger.error( logger.error(