Fixed
This commit is contained in:
@@ -2,17 +2,17 @@
|
||||
import logging.config
|
||||
from aiogram import F, Router
|
||||
|
||||
from app.telegram.functions.main_settings.settings import main_settings_message
|
||||
from logger_helper.logger_helper import LOGGING_CONFIG
|
||||
|
||||
from app.services.Bybit.functions.Futures import (close_user_trade, set_take_profit_stop_loss, \
|
||||
get_active_positions_by_symbol, get_active_orders_by_symbol,
|
||||
get_active_positions, get_active_orders, cancel_all_tp_sl_orders,
|
||||
trading_cycle, open_position, close_trade_after_delay,
|
||||
trading_cycle, open_position, close_trade_after_delay, safe_float,
|
||||
)
|
||||
from app.services.Bybit.functions.balance import get_balance
|
||||
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
||||
|
||||
from pybit.unified_trading import HTTP
|
||||
import app.telegram.database.requests as rq
|
||||
from aiogram.types import Message, CallbackQuery
|
||||
from app.services.Bybit.functions.price_symbol import get_price
|
||||
@@ -37,10 +37,10 @@ async def clb_start_bybit_trade_message(callback: CallbackQuery) -> None:
|
||||
"""
|
||||
user_id = callback.from_user.id
|
||||
balance = await get_balance(user_id, callback.message)
|
||||
price = await get_price(user_id)
|
||||
|
||||
if balance:
|
||||
symbol = await rq.get_symbol(user_id)
|
||||
price = await get_price(user_id, symbol=symbol)
|
||||
|
||||
text = (
|
||||
f"💎 Торговля на Bybit\n\n"
|
||||
@@ -61,10 +61,10 @@ async def start_bybit_trade_message(message: Message) -> None:
|
||||
вместе с инструкциями по началу торговли.
|
||||
"""
|
||||
balance = await get_balance(message.from_user.id, message)
|
||||
price = await get_price(message.from_user.id)
|
||||
|
||||
if balance:
|
||||
symbol = await rq.get_symbol(message.from_user.id)
|
||||
price = await get_price(message.from_user.id, symbol=symbol)
|
||||
|
||||
text = (
|
||||
f"💎 Торговля на Bybit\n\n"
|
||||
@@ -124,7 +124,6 @@ async def update_entry_type_message(callback: CallbackQuery, state: FSMContext)
|
||||
await callback.answer()
|
||||
|
||||
|
||||
|
||||
@router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith('entry_order_type:'))
|
||||
async def entry_order_type_callback(callback: CallbackQuery, state: FSMContext) -> None:
|
||||
"""
|
||||
@@ -192,43 +191,11 @@ async def start_trading_process(callback: CallbackQuery) -> None:
|
||||
message = callback.message
|
||||
|
||||
data_main_stgs = await rq.get_user_main_settings(tg_id)
|
||||
api_key = await rq.get_bybit_api_key(tg_id)
|
||||
secret_key = await rq.get_bybit_secret_key(tg_id)
|
||||
symbol = await rq.get_symbol(tg_id)
|
||||
margin_mode = data_main_stgs.get('margin_type', 'Isolated')
|
||||
trading_mode = data_main_stgs.get('trading_mode')
|
||||
switch_mode = data_main_stgs.get('switch_mode_enabled')
|
||||
|
||||
if not api_key or not secret_key:
|
||||
await message.answer("❗️ У вас не настроены API ключи для Bybit.")
|
||||
await callback.answer()
|
||||
return
|
||||
|
||||
if trading_mode not in ['Long', 'Short', 'Smart']:
|
||||
await message.answer(f"❗️ Некорректный торговый режим: {trading_mode}")
|
||||
await callback.answer()
|
||||
return
|
||||
|
||||
if margin_mode not in ['Isolated', 'Cross']:
|
||||
margin_mode = 'Isolated'
|
||||
|
||||
client = HTTP(api_key=api_key, api_secret=secret_key)
|
||||
|
||||
try:
|
||||
positions_resp = client.get_positions(category='linear', symbol=symbol)
|
||||
positions = positions_resp.get('result', {}).get('list', [])
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при получении позиций: {e}")
|
||||
positions = []
|
||||
|
||||
for pos in positions:
|
||||
size = pos.get('size')
|
||||
existing_margin_mode = pos.get('margin_mode')
|
||||
if size and float(size) > 0 and existing_margin_mode and existing_margin_mode != margin_mode:
|
||||
await callback.answer(
|
||||
f"⚠️ Маржинальный режим нельзя менять при открытой позиции "
|
||||
f"(текущий режим: {existing_margin_mode})", show_alert=True)
|
||||
return
|
||||
starting_quantity = safe_float(data_main_stgs.get('starting_quantity'))
|
||||
|
||||
side = None
|
||||
if switch_mode == 'Включено':
|
||||
@@ -247,7 +214,6 @@ async def start_trading_process(callback: CallbackQuery) -> None:
|
||||
|
||||
await message.answer("Начинаю торговлю с использованием текущих настроек...")
|
||||
|
||||
|
||||
timer_data = await rq.get_user_timer(tg_id)
|
||||
if isinstance(timer_data, dict):
|
||||
timer_minute = timer_data.get('timer_minutes', 0)
|
||||
@@ -255,11 +221,12 @@ async def start_trading_process(callback: CallbackQuery) -> None:
|
||||
timer_minute = timer_data or 0
|
||||
|
||||
if timer_minute > 0:
|
||||
await trading_cycle(tg_id, message)
|
||||
await trading_cycle(tg_id, message, side=side, margin_mode=margin_mode, symbol=symbol,
|
||||
starting_quantity=starting_quantity)
|
||||
await message.answer(f"Торговля начнётся через {timer_minute} мин.")
|
||||
await rq.update_user_timer(tg_id, minutes=0)
|
||||
else:
|
||||
await open_position(tg_id, message, side, margin_mode)
|
||||
await open_position(tg_id, message, side, margin_mode, symbol=symbol, quantity=starting_quantity)
|
||||
|
||||
await callback.answer()
|
||||
|
||||
@@ -290,6 +257,7 @@ async def show_my_trades_callback(callback: CallbackQuery):
|
||||
logger.error(f"Произошла ошибка при выборе сделки: {e}")
|
||||
await callback.message.answer("Произошла ошибка при выборе сделки", reply_markup=inline_markup.back_to_main)
|
||||
|
||||
|
||||
@router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith("show_deal_"))
|
||||
async def show_deal_callback(callback_query: CallbackQuery) -> None:
|
||||
"""
|
||||
@@ -303,7 +271,8 @@ async def show_deal_callback(callback_query: CallbackQuery) -> None:
|
||||
await get_active_positions_by_symbol(tg_id, symbol, message=callback_query.message)
|
||||
except Exception as e:
|
||||
logger.error(f"Произошла ошибка при выборе сделки: {e}")
|
||||
await callback_query.message.answer("Произошла ошибка при выборе сделки", reply_markup=inline_markup.back_to_main)
|
||||
await callback_query.message.answer("Произошла ошибка при выборе сделки",
|
||||
reply_markup=inline_markup.back_to_main)
|
||||
|
||||
|
||||
@router_functions_bybit_trade.callback_query(F.data == "clb_open_orders")
|
||||
@@ -333,7 +302,8 @@ async def show_limit_callback(callback_query: CallbackQuery) -> None:
|
||||
await get_active_orders_by_symbol(tg_id, symbol, message=callback_query.message)
|
||||
except Exception as e:
|
||||
logger.error(f"Произошла ошибка при выборе сделки: {e}")
|
||||
await callback_query.message.answer("Произошла ошибка при выборе сделки", reply_markup=inline_markup.back_to_main)
|
||||
await callback_query.message.answer("Произошла ошибка при выборе сделки",
|
||||
reply_markup=inline_markup.back_to_main)
|
||||
|
||||
|
||||
@router_functions_bybit_trade.callback_query(F.data == "clb_set_tp_sl")
|
||||
@@ -407,7 +377,7 @@ async def close_trade_callback(callback: CallbackQuery) -> None:
|
||||
symbol = callback.data.split(':')[1]
|
||||
tg_id = callback.from_user.id
|
||||
|
||||
result = await close_user_trade(tg_id, symbol, message=callback.message)
|
||||
result = await close_user_trade(tg_id, symbol)
|
||||
|
||||
if result:
|
||||
logger.info(f"Сделка {symbol} успешно закрыта.")
|
||||
@@ -480,6 +450,7 @@ async def reset_martingale(callback: CallbackQuery) -> None:
|
||||
tg_id = callback.from_user.id
|
||||
await rq.update_martingale_step(tg_id, 0)
|
||||
await callback.answer("Сброс шагов выполнен.")
|
||||
await main_settings_message(tg_id, callback.message)
|
||||
|
||||
|
||||
@router_functions_bybit_trade.callback_query(F.data == "clb_stop_trading")
|
||||
@@ -492,6 +463,7 @@ async def confirm_stop_trading(callback: CallbackQuery):
|
||||
)
|
||||
await callback.answer()
|
||||
|
||||
|
||||
@router_functions_bybit_trade.callback_query(F.data == "stop_immediately")
|
||||
async def stop_immediately(callback: CallbackQuery):
|
||||
"""
|
||||
@@ -503,6 +475,7 @@ async def stop_immediately(callback: CallbackQuery):
|
||||
await callback.message.answer("Торговля остановлена.", reply_markup=inline_markup.back_to_main)
|
||||
await callback.answer()
|
||||
|
||||
|
||||
@router_functions_bybit_trade.callback_query(F.data == "stop_with_timer")
|
||||
async def stop_with_timer_start(callback: CallbackQuery, state: FSMContext):
|
||||
"""
|
||||
@@ -510,9 +483,11 @@ async def stop_with_timer_start(callback: CallbackQuery, state: FSMContext):
|
||||
"""
|
||||
|
||||
await state.set_state(CloseTradeTimerState.waiting_for_delay)
|
||||
await callback.message.answer("Введите задержку в минутах перед остановкой торговли:", reply_markup=inline_markup.cancel)
|
||||
await callback.message.answer("Введите задержку в минутах перед остановкой торговли:",
|
||||
reply_markup=inline_markup.cancel)
|
||||
await callback.answer()
|
||||
|
||||
|
||||
@router_functions_bybit_trade.message(CloseTradeTimerState.waiting_for_delay)
|
||||
async def process_stop_delay(message: Message, state: FSMContext):
|
||||
"""
|
||||
|
Reference in New Issue
Block a user