Updated
This commit is contained in:
@@ -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
|
||||||
)
|
)
|
||||||
|
@@ -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,
|
||||||
|
@@ -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)
|
||||||
|
|
||||||
|
@@ -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",
|
||||||
|
@@ -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(
|
||||||
|
Reference in New Issue
Block a user