Paradex Delta Neutral Bot
Этот софт предназначен для открытия нейтральных позиций на множестве аккаунтов Paradex. Например, когда 3 аккаунта открыты в лонг и 4 в шорт, общий баланс токенов остаётся нулевым, что создаёт нейтральную позицию. Количество лонг и шорт аккаунтов всегда одинаково или отличается максимум на один, однако объёмы токенов на каждом аккаунте могут различаться.
Бот автоматически анализирует LTV после открытия позиций. При необходимости он закрывает нейтральные позиции и останавливает процесс, предоставляя пользователю возможность корректировать маржу на аккаунтах перед продолжением.
Настройка бота
- Качаем репозиторий:
git clone https://github.com/Pastfin/Paradex-delta-neutral-bot - Открываем папку через VSC и устанавливаем зависимости через команду
pip install -r requirements.txt. Это самый сложный пункт, потому что могут возникнуть проблемы на Windows с установкой библиотеки starknet_py, которая используется для Paradex. Если произошла проблема, тогда есть два наиболее простых пути: - Скачать Docker и запустить софт через контейнер. Команды для докера я оставлю в конце статьи.
- Арендовать сервер на Linux, где всё просто установится
- Далее мы будем заполнять несколько нужных обязательных файлов:
Остальные файлы в data/ не трогаем.
data/accounts.xlsx
Excel файл, который содержит ваши аккаунты Paradex. Обязательные колонки к заполнению: private_key, address, proxy, is_active. Остальные колонки софт будет заполнять автоматически!
private_key и address получаем в личном кабинете Paradex:
proxy формат обязательно должен быть ProxyIP:ProxyPort:ProxyLog:ProxyPwd
is_active формат должен быть записан как булевое значение. Если английская версия Excel, то TRUE или FALSE. Если русская версия, то ПРАВДА или ЛОЖЬ.
data/active_pairs.xlsx
Эксель файл с торговыми парами Paradex, вам необходимо просто оставить нужные пары, которые будут случайным образом выбираться и торговаться. Ненужные пары просто удаляем. Для удобства анализа и выбора я сделал колонку Tier, которая классифицирует торговые пары в зависимости от торгового объема за последние 24 часа.
data/config.json
Средний объём позиции, открываемой одним аккаунтом. Например, если указаны значения min = 200 USD и max = 300 USD, то могут быть выбраны 2 аккаунта с лонг-позициями по 300 USD и 3 аккаунта с шорт-позициями по 200 USD. Важно учитывать, что софт использует случайные значения в этом диапазоне, поэтому суммы не обязательно будут круглыми и могут быть меньше минимального значения, указанного в конфиге.
Количество аккаунтов, участвующих в одном торговом цикле. Например, если указано 5 аккаунтов, то может быть 3 лонг и 2 шорт. Если 6 аккаунтов — то 3 лонг и 3 шорт. Софт случайным образом выбирает количество аккаунтов в пределах заданного диапазона min и max.
Продолжительность одной позиции в минутах. Paradex начисляет больше очков за более продолжительное удержание позиций. Например, если ты фармишь на протяжении 12-16 часов, то указываешь диапазон 720 - 960 минут.
delay_between_trading_cycles_min
Время (в минутах), которое должно пройти перед началом нового торгового цикла с нейтральными позициями.
delay_between_opening_orders_sec
Задержка (в секундах) между открытием отдельных ордеров в одном нейтральном цикле. Например, если используется 5 аккаунтов, то бот сначала открывает лонг на одном аккаунте, ждёт указанное время, затем открывает шорт и так далее.
Частота проверки LTV сделки (в секундах). Софт берёт актуальную цену токена с Paradex и сравнивает её с ценой ликвидации для определения уровня риска.
Ограничение на максимальное значение позиции в USD для подстраховки, если баланс USDC на аккаунте недостаточен. Например, при max_leverage = 2 и балансе на аккаунте 200 USD, максимальная позиция будет 400 USD. Реальный размер позиции определяется параметром order_value_usd, а этот параметр используется только для предотвращения превышения допустимого плеча.
Порог LTV, который софт мониторит на протяжении сделок. Проверка выполняется каждые ltv_checks_sec. Если хотя бы на одном аккаунте достигается критический уровень LTV, бот закрывает все нейтральные позиции и завершает работу, чтобы пользователь мог скорректировать маржу.
LTV рассчитывается на основе текущей рыночной цены и цены ликвидации для каждой активной позиции. Информация о цене ликвидации записывается в момент открытия позиции и после данные не обновляются. То есть если капает фандинг, информация о цене ликвидации обновляться не будет.
- Если позиция в
SELL, LTV вычисляется какcurrent_price / liq_price * 100. - Если позиция в
BUY, LTV вычисляется какliq_price / current_price * 100.
Показатель случайности распределения позиций. Чем выше значение, тем больше разница в размерах позиций.
- Пример: Если
orders_distribution_noise = 0, то распределение будет равномерным (1, 1, 1для лонга и шорта). - Если
orders_distribution_noise = 0.15, распределение будет более случайным (0.9, 0.8, 1.3).
Этот параметр можно не изменять, если тебя устраивает равномерное распределение.
Максимальное количество попыток выполнения одного действия в случае неудачи. Например, если сделка не открылась или не закрылась с первого раза, софт предпримет дополнительные попытки в пределах указанного числа.
"INFO"— стандартный режим использования."DEBUG"— детализированный режим для отладки, когда возникают проблемы с кодом. Логи на уровнеDEBUGзаписываются в потенциально проблемных участках кода для упрощения поиска ошибок.
Функционал бота при запуске
Start trading
Открывает позиции на указанных аккаунтах. Перед открытием проверяется, что на аккаунте нет активных позиций — если позиция уже открыта, софт завершает работу. На одном аккаунте может быть только одна активная позиция одновременно.
Fetch market data and update active trading pairs (data/active_pairs.xlsx)
Перезаписывает файл data/active_pairs.xlsx и технический файл data/pairs.json. Обновляет все расчётные колонки, чтобы пользователь мог выбрать подходящие торговые пары для дальнейшей работы.
Update account balances and check for open positions (data/accounts.xlsx)
Обновляет текущий баланс аккаунтов и фиксирует информацию о любых открытых позициях. Результаты записываются в файл data/accounts.xlsx.
Close all currently open positions
Закрывает все активные позиции на всех аккаунтах.
Step by step
- Скачиваем софт с гитхаба.
- Устанавливаем библиотеки.
- Заполняем все файлы, которые указаны в инструкции выше. Сначала тестируем с позициями по 50-100$.
- Запускаем софт и выбираем пункт 1: Start trading.
- Проверяем в логах и UI вручную, что нет никаких проблем. После запуска пункта "Start trading" выполняются базовые проверки ваших файлов и прокси.
- Чтобы остановить процесс, останавливаем софт, запускаем его заново и выбираем пункт: Close all currently open positions.
Docker команды
Запуск
docker build -t paradex-image .— Создаёт Docker-образ с именемparadex-imageна основе текущей директории (.), где находитсяDockerfile.docker run -dit --name paradex-container -v "${PWD}/data:/app/data" -v "${PWD}/logs:/app/logs" paradex-image— Создаёт и запускает контейнер с именемparadex-containerв фоновом режиме (-d). Примонтирует локальные папкиdataиlogsв контейнер (/app/dataи/app/logsсоответственно) для сохранения данных и логов. Запускает контейнер на основе созданного образаparadex-image.docker exec -it paradex-container /bin/bash— Открывает интерактивную оболочку внутри работающего контейнераparadex-container. Позволяет выполнять команды вручную.python main.py— Запускает основной код внутри контейнера.
Выход
exit — Выход из контейнера, завершение интерактивной сессии. Контейнер продолжает работать, если был запущен в фоновом режиме.
docker stop paradex-container — Останавливает работающий контейнер paradex-container. Процесс внутри контейнера прекращается.
docker rm paradex-container — Удаляет остановленный контейнер paradex-container. Используй эту команду, если контейнер больше не нужен.
docker rmi paradex-image — Удаляет Docker-образ paradex-image. Используй эту команду, если образ больше не требуется.
Чистка
docker stop $(docker ps -q) — Останавливает все запущенные контейнеры.
docker rm $(docker ps -a -q) — Удаляет все контейнеры, включая остановленные.
docker rmi $(docker images -q) --force — Удаляет все Docker-образы. Параметр --force принудительно удаляет образы, даже если они используются контейнерами.
docker volume prune -f — Удаляет все неиспользуемые тома. Параметр -f пропускает запрос на подтверждение.
docker network prune -f — Удаляет все неиспользуемые сети. Параметр -f пропускает запрос на подтверждение.
docker system prune -a --volumes -f — Полная очистка системы. Удаляет все неиспользуемые контейнеры, образы, тома и кэш. Параметр -a также удаляет образы без тегов. Параметр --volumes включает удаление неиспользуемых томов. Параметр -f пропускает запрос на подтверждение.
TG канал: https://t.me/PastFinCoding