Almost telegram integration + Bybit started
This commit is contained in:
159
src/main.py
159
src/main.py
@ -1,4 +1,3 @@
|
||||
import time
|
||||
import asyncio
|
||||
|
||||
from aiogram import Bot, Dispatcher
|
||||
@ -6,126 +5,158 @@ from aiogram.filters import Command
|
||||
from aiogram.types import Message
|
||||
from aiogram.client.default import DefaultBotProperties
|
||||
from aiogram.enums import ParseMode
|
||||
from aiogram.types import BotCommand, BotCommandScopeDefault
|
||||
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram import Router, F
|
||||
from aiogram.fsm.state import State, StatesGroup
|
||||
from aiogram.fsm.storage.memory import MemoryStorage
|
||||
from aiogram.utils.chat_action import ChatActionSender
|
||||
|
||||
import bybit
|
||||
import arbus
|
||||
|
||||
import credentials
|
||||
import options
|
||||
import strings
|
||||
import options
|
||||
|
||||
|
||||
# Custom types and vars
|
||||
|
||||
paramsLines = ['highEnd',
|
||||
'lowEnd',
|
||||
'highBreak',
|
||||
'lowBreak',
|
||||
'netLevelsAmount',
|
||||
'netStep',
|
||||
'takeDelta',
|
||||
'stopDelta',
|
||||
'orderSize'
|
||||
]
|
||||
|
||||
|
||||
# Custom
|
||||
|
||||
async def parseParams(params: str):
|
||||
paramsList = params.split()
|
||||
paramsDict = {}
|
||||
for i in range(len(paramsLines)):
|
||||
paramsDict(paramsLines[i]) = paramsList[i]
|
||||
return paramsDict
|
||||
|
||||
|
||||
# Bybit
|
||||
|
||||
async def strategy(pair, params):
|
||||
print(params)
|
||||
await time.sleep(5)
|
||||
print('Test succes')
|
||||
result = pair + '\n' + params
|
||||
return result
|
||||
|
||||
|
||||
# Telegram
|
||||
|
||||
# Входные поля для трейдинг-бота:
|
||||
# Верхняя граница ордеров
|
||||
# Нижняя граница ордеров
|
||||
# Верхняя граница для брейка
|
||||
# Нижняя граница для брейка
|
||||
# Количество уровней сетки
|
||||
# Шаг сетки
|
||||
# Дельта для тейка
|
||||
# Дельта для стопа
|
||||
# Размер позиции на каждом уровне
|
||||
|
||||
class Form(StatesGroup):
|
||||
|
||||
async def set_commands():
|
||||
commands = [BotCommand(command='start', description='Старт'),
|
||||
BotCommand(command='help', description='Инструкция'),
|
||||
BotCommand(command='strategy', description='Запустить стратегию'),
|
||||
BotCommand(command='stop', description='Остановить стратегию')
|
||||
]
|
||||
await bot.set_my_commands(commands, BotCommandScopeDefault())
|
||||
|
||||
|
||||
class startForm(StatesGroup):
|
||||
pair = State()
|
||||
params = State()
|
||||
|
||||
class stopForm(StatesGroup):
|
||||
pair = State()
|
||||
|
||||
|
||||
dp = Dispatcher(storage=MemoryStorage())
|
||||
bot = Bot(
|
||||
token=credentials.bot_token,
|
||||
default=DefaultBotProperties(parse_mode=ParseMode.HTML),
|
||||
)
|
||||
|
||||
strategy_router = Router()
|
||||
stop_router = Router()
|
||||
|
||||
|
||||
@dp.message(Command("start"))
|
||||
async def commandStart(message: Message) -> None:
|
||||
print("Called function commandStart")
|
||||
await message.answer(strings.startCommand)
|
||||
|
||||
@dp.message(Command("help"))
|
||||
async def commandHelp(message: Message) -> None:
|
||||
print("Called function commandHelp")
|
||||
await message.answer(strings.helpCommand)
|
||||
|
||||
|
||||
@strategy_router.message(Command("strategy"))
|
||||
async def commandStrategy(message: Message, state: FSMContext):
|
||||
print("F command strategy + capture pair")
|
||||
async with ChatActionSender.typing(bot=bot, chat_id=message.chat.id):
|
||||
await asyncio.sleep(1)
|
||||
await message.answer(strings.strategyCommand + '\n' + strings.askPair)
|
||||
await state.set_state(Form.pair)
|
||||
print("Called function commandStrategy")
|
||||
await message.answer(strings.strategyCommand + '\n' + strings.askPair)
|
||||
await state.set_state(startForm.pair)
|
||||
|
||||
@strategy_router.message(F.text, Form.pair)
|
||||
async def capture_pair(message: Message, state: FSMContext):
|
||||
print("F capture pair + capture params")
|
||||
@strategy_router.message(F.text, startForm.pair)
|
||||
async def capture_start_pair(message: Message, state: FSMContext):
|
||||
print("Called function capture_start_pair")
|
||||
await state.update_data(pair=message.text)
|
||||
async with ChatActionSender.typing(bot=bot, chat_id=message.chat.id):
|
||||
await asyncio.sleep(1)
|
||||
await message.answer(strings.askParams)
|
||||
await state.set_state(Form.params)
|
||||
data = await state.get_data()
|
||||
|
||||
@strategy_router.message(F.text, Form.params)
|
||||
t = 0
|
||||
if await arbus.checkPair(data.get("pair")) == 1:
|
||||
msg_text = (f'Стратегия на паре <b>{data.get("pair")}</b> уже запущена.\nПожалуйста остановите стратегию либо введите другую пару.')
|
||||
t = 1
|
||||
else:
|
||||
msg_text = strings.askParams
|
||||
|
||||
await message.answer(msg_text)
|
||||
if t == 1:
|
||||
print('Clearing state!')
|
||||
await state.clear()
|
||||
else:
|
||||
await state.set_state(startForm.params)
|
||||
|
||||
@strategy_router.message(F.text, startForm.params)
|
||||
async def capture_params(message: Message, state: FSMContext):
|
||||
print("F capture params + end")
|
||||
print("Called function capture_params")
|
||||
await state.update_data(params=message.text)
|
||||
|
||||
data = await state.get_data()
|
||||
t = await strategy(pair=data.get("pair"), params=data.get("params"))
|
||||
msg_text = (f'Вы запускаете стратегию на паре <b>{data.get("pair")}</b> с данными параметрами\n<b>{data.get("params")}</b>\n')
|
||||
t = await arbus.mainWrapper(pair=data.get("pair"), params=data.get("params"))
|
||||
if t == 0:
|
||||
client = await bybit.getClient(credentials.api_key, credentials.api_secret, options.testnet)
|
||||
if client == -1:
|
||||
msg_text = (f'Аутентификация не удалась, сообщите администратору если увидете данное сообщение.')
|
||||
else:
|
||||
asyncio.create_task(bybit.strategy(client, data.get("pair"), data.get("params")))
|
||||
msg_text = (f'Вы запустили стратегию на паре <b>{data.get("pair")}</b> с данными параметрами:\n<b>{data.get("params")}</b>\n')
|
||||
elif t == -1:
|
||||
msg_text = (f'Параметры введены в неверном формате, пожалуйста начните заново.')
|
||||
elif t == -2:
|
||||
msg_text = (f'Стратегия на паре <b>{data.get("pair")}</b> уже запущена.')
|
||||
else:
|
||||
msg_text = (f'Возникла непредвиденная ошибка. =(')
|
||||
await message.answer(msg_text)
|
||||
await state.clear()
|
||||
|
||||
@dp.message(Command("stop"))
|
||||
async def commandStop(message: Message) -> None:
|
||||
await message.answer(strings.stopCommand + '\n' + strings.stopStrategy)
|
||||
|
||||
@stop_router.message(Command("stop"))
|
||||
async def commandStop(message: Message, state: FSMContext):
|
||||
print("Called function commandStop")
|
||||
await message.answer(strings.stopCommand + '\n' + strings.askPair)
|
||||
await state.set_state(stopForm.pair)
|
||||
|
||||
@stop_router.message(F.text, stopForm.pair)
|
||||
async def capture_stop_pair(message: Message, state: FSMContext):
|
||||
print("Called function capture_stop_pair")
|
||||
await state.update_data(pair=message.text)
|
||||
data = await state.get_data()
|
||||
|
||||
if await arbus.checkPair(data.get("pair")) == 1:
|
||||
t = await arbus.deletePair(data.get("pair"))
|
||||
if t == 0:
|
||||
print('Deleted pair succesfuly')
|
||||
else:
|
||||
print('Error with deleting pair')
|
||||
msg_text = strings.stopStrategy
|
||||
else:
|
||||
msg_text = strings.pairNotFound
|
||||
|
||||
await message.answer(msg_text)
|
||||
await state.clear()
|
||||
|
||||
|
||||
async def start_bot():
|
||||
await set_commands()
|
||||
|
||||
async def main() -> None:
|
||||
dp.include_router(strategy_router)
|
||||
dp.include_router(stop_router)
|
||||
dp.startup.register(start_bot)
|
||||
await dp.start_polling(bot)
|
||||
|
||||
|
||||
# Main
|
||||
|
||||
async def main() -> None:
|
||||
dp.include_router(strategy_router)
|
||||
await dp.start_polling(bot)
|
||||
|
||||
if __name__ == "__main__":
|
||||
print('Started bot!')
|
||||
asyncio.run(main())
|
||||
|
||||
Reference in New Issue
Block a user