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