develop #3
@@ -1,6 +1,7 @@
|
|||||||
from aiogram import F, Router
|
from aiogram import F, Router
|
||||||
|
|
||||||
from app.services.Bybit.functions import Futures, func_min_qty
|
from app.services.Bybit.functions import Futures, func_min_qty
|
||||||
|
from app.services.Bybit.functions.Futures import open_market_order, open_limit_order
|
||||||
from app.services.Bybit.functions.balance import get_balance
|
from app.services.Bybit.functions.balance import get_balance
|
||||||
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
||||||
|
|
||||||
@@ -16,7 +17,10 @@ router_functions_bybit_trade = Router()
|
|||||||
class state_update_symbol(StatesGroup):
|
class state_update_symbol(StatesGroup):
|
||||||
symbol = State()
|
symbol = State()
|
||||||
|
|
||||||
@router_functions_bybit_trade.callback_query(F.data == 'clb_start_trading')
|
class state_update_entry_type(StatesGroup):
|
||||||
|
entry_type = State()
|
||||||
|
|
||||||
|
@router_functions_bybit_trade.callback_query(F.data.in_(['clb_start_trading', 'clb_back_to_main']))
|
||||||
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)
|
||||||
@@ -76,24 +80,97 @@ async def update_symbol_for_trade(message: Message, state: FSMContext):
|
|||||||
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
@router_functions_bybit_trade.callback_query(F.data == 'clb_open_deal')
|
|
||||||
async def make_deal_bybit (callback: CallbackQuery):
|
|
||||||
data_main_stgs = await rq.get_user_main_settings(callback.from_user.id)
|
|
||||||
|
|
||||||
trade_mode = data_main_stgs['trading_mode']
|
@router_functions_bybit_trade.callback_query(F.data == 'clb_update_entry_type')
|
||||||
qty = data_main_stgs['starting_quantity']
|
async def update_entry_type_message(callback: CallbackQuery, state: FSMContext):
|
||||||
margin_mode = data_main_stgs['margin_type']
|
await state.set_state(state_update_entry_type.entry_type)
|
||||||
qty_min = await func_min_qty.get_min_qty(callback.from_user.id, callback.message)
|
await callback.message.answer("Выберите тип входа в позицию:", reply_markup=inline_markup.entry_order_type_markup)
|
||||||
|
await callback.answer()
|
||||||
|
|
||||||
if qty < qty_min:
|
|
||||||
await callback.message.edit_text(f"Количество вашей ставки ({qty}) меньше минимального количества ({qty_min}) для данной торговой пары")
|
@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):
|
||||||
|
order_type = callback.data.split(':')[1]
|
||||||
|
|
||||||
|
if order_type not in ['Market', 'Limit']:
|
||||||
|
await callback.answer("Ошибка выбора", show_alert=True)
|
||||||
|
return
|
||||||
|
|
||||||
|
await state.update_data(entry_order_type=order_type)
|
||||||
|
await rq.update_entry_order_type(callback.from_user.id, order_type)
|
||||||
|
|
||||||
|
if order_type == 'Limit':
|
||||||
|
await callback.answer("Вы выбрали Limit. Введите цену для лимитного ордера.")
|
||||||
|
await callback.message.answer("Введите цену лимитного ордера:")
|
||||||
|
await state.update_data(awaiting_limit_price=True)
|
||||||
else:
|
else:
|
||||||
match trade_mode:
|
await callback.answer("Вы выбрали Market. Нажмите кнопку ниже, чтобы открыть сделку.")
|
||||||
case 'Long':
|
await callback.message.answer("Нажмите кнопку, чтобы открыть сделку.",
|
||||||
await Futures.contract_long(callback.from_user.id, callback.message, margin_mode)
|
reply_markup=inline_markup.open_deal_markup)
|
||||||
case 'Short':
|
await callback.message.delete()
|
||||||
await Futures.contract_short(callback.from_user.id, callback.message, margin_mode)
|
|
||||||
case 'Switch':
|
|
||||||
await callback.message.edit_text('Режим Switch пока недоступен')
|
@router_functions_bybit_trade.message()
|
||||||
case 'Smart':
|
async def process_limit_price_message(message: Message, state: FSMContext):
|
||||||
await callback.message.edit_text('Режим Smart пока недоступен')
|
data = await state.get_data()
|
||||||
|
if not data.get('awaiting_limit_price'):
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
price = float(message.text)
|
||||||
|
if price <= 0:
|
||||||
|
raise ValueError()
|
||||||
|
except ValueError:
|
||||||
|
await message.answer("Ошибка: введите корректное положительное число для цены.")
|
||||||
|
return
|
||||||
|
|
||||||
|
await state.update_data(limit_price=price, awaiting_limit_price=False)
|
||||||
|
|
||||||
|
await message.answer(f"Цена лимитного ордера установлена: {price}. Нажмите кнопку ниже, чтобы открыть сделку.",
|
||||||
|
reply_markup=inline_markup.open_deal_markup)
|
||||||
|
|
||||||
|
|
||||||
|
@router_functions_bybit_trade.callback_query(F.data == "clb_open_deal")
|
||||||
|
async def open_deal(callback: CallbackQuery, state: FSMContext):
|
||||||
|
data = await state.get_data()
|
||||||
|
order_type = await rq.get_entry_order_type(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)
|
||||||
|
|
||||||
|
if order_type == 'Market':
|
||||||
|
await open_market_order(callback.from_user.id, callback.message, api_key=api, secret_key=secret)
|
||||||
|
elif order_type == 'Limit':
|
||||||
|
price = data.get('limit_price')
|
||||||
|
if not price:
|
||||||
|
await callback.answer("Цена для лимитного ордера не задана. Введите сначала цену.")
|
||||||
|
return
|
||||||
|
|
||||||
|
await open_limit_order(callback.from_user.id, callback.message, price, api_key=api, secret_key=secret)
|
||||||
|
else:
|
||||||
|
await callback.answer("Неизвестный тип ордера.")
|
||||||
|
|
||||||
|
await callback.message.edit_reply_markup()
|
||||||
|
await state.clear()
|
||||||
|
|
||||||
|
|
||||||
|
# @router_functions_bybit_trade.callback_query(F.data == 'clb_open_deal')
|
||||||
|
# async def make_deal_bybit (callback: CallbackQuery):
|
||||||
|
# data_main_stgs = await rq.get_user_main_settings(callback.from_user.id)
|
||||||
|
#
|
||||||
|
# trade_mode = data_main_stgs['trading_mode']
|
||||||
|
# qty = data_main_stgs['starting_quantity']
|
||||||
|
# margin_mode = data_main_stgs['margin_type']
|
||||||
|
# qty_min = await func_min_qty.get_min_qty(callback.from_user.id, callback.message)
|
||||||
|
#
|
||||||
|
# if qty < qty_min:
|
||||||
|
# await callback.message.edit_text(f"Количество вашей ставки ({qty}) меньше минимального количества ({qty_min}) для данной торговой пары")
|
||||||
|
# else:
|
||||||
|
# match trade_mode:
|
||||||
|
# case 'Long':
|
||||||
|
# await Futures.contract_long(callback.from_user.id, callback.message, margin_mode)
|
||||||
|
# case 'Short':
|
||||||
|
# await Futures.contract_short(callback.from_user.id, callback.message, margin_mode)
|
||||||
|
# case 'Switch':
|
||||||
|
# await callback.message.edit_text('Режим Switch пока недоступен')
|
||||||
|
# case 'Smart':
|
||||||
|
# await callback.message.edit_text('Режим Smart пока недоступен')
|
Reference in New Issue
Block a user