March 29

Paradex Delta Neutral Bot

Этот софт предназначен для открытия нейтральных позиций на множестве аккаунтов Paradex. Например, когда 3 аккаунта открыты в лонг и 4 в шорт, общий баланс токенов остаётся нулевым, что создаёт нейтральную позицию. Количество лонг и шорт аккаунтов всегда одинаково или отличается максимум на один, однако объёмы токенов на каждом аккаунте могут различаться.

Бот автоматически анализирует LTV после открытия позиций. При необходимости он закрывает нейтральные позиции и останавливает процесс, предоставляя пользователю возможность корректировать маржу на аккаунтах перед продолжением.

Настройка бота

  1. Качаем репозиторий: git clone https://github.com/Pastfin/Paradex-delta-neutral-bot
  2. Открываем папку через VSC и устанавливаем зависимости через команду pip install -r requirements.txt . Это самый сложный пункт, потому что могут возникнуть проблемы на Windows с установкой библиотеки starknet_py, которая используется для Paradex. Если произошла проблема, тогда есть два наиболее простых пути:
    1. Скачать Docker и запустить софт через контейнер. Команды для докера я оставлю в конце статьи.
    2. Арендовать сервер на Linux, где всё просто установится
  3. Далее мы будем заполнять несколько нужных обязательных файлов:
  • data/accounts.xlsx
  • data/active_pairs.xlsx
  • data/config.json

Остальные файлы в 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

order_value_usd

Средний объём позиции, открываемой одним аккаунтом. Например, если указаны значения min = 200 USD и max = 300 USD, то могут быть выбраны 2 аккаунта с лонг-позициями по 300 USD и 3 аккаунта с шорт-позициями по 200 USD. Важно учитывать, что софт использует случайные значения в этом диапазоне, поэтому суммы не обязательно будут круглыми и могут быть меньше минимального значения, указанного в конфиге.

accounts_per_trade

Количество аккаунтов, участвующих в одном торговом цикле. Например, если указано 5 аккаунтов, то может быть 3 лонг и 2 шорт. Если 6 аккаунтов — то 3 лонг и 3 шорт. Софт случайным образом выбирает количество аккаунтов в пределах заданного диапазона min и max.

order_duration_min

Продолжительность одной позиции в минутах. Paradex начисляет больше очков за более продолжительное удержание позиций. Например, если ты фармишь на протяжении 12-16 часов, то указываешь диапазон 720 - 960 минут.

delay_between_trading_cycles_min

Время (в минутах), которое должно пройти перед началом нового торгового цикла с нейтральными позициями.

delay_between_opening_orders_sec

Задержка (в секундах) между открытием отдельных ордеров в одном нейтральном цикле. Например, если используется 5 аккаунтов, то бот сначала открывает лонг на одном аккаунте, ждёт указанное время, затем открывает шорт и так далее.

ltv_checks_sec

Частота проверки LTV сделки (в секундах). Софт берёт актуальную цену токена с Paradex и сравнивает её с ценой ликвидации для определения уровня риска.

max_leverage

Ограничение на максимальное значение позиции в USD для подстраховки, если баланс USDC на аккаунте недостаточен. Например, при max_leverage = 2 и балансе на аккаунте 200 USD, максимальная позиция будет 400 USD. Реальный размер позиции определяется параметром order_value_usd, а этот параметр используется только для предотвращения превышения допустимого плеча.

max_position_ltv

Порог LTV, который софт мониторит на протяжении сделок. Проверка выполняется каждые ltv_checks_sec. Если хотя бы на одном аккаунте достигается критический уровень LTV, бот закрывает все нейтральные позиции и завершает работу, чтобы пользователь мог скорректировать маржу.

LTV рассчитывается на основе текущей рыночной цены и цены ликвидации для каждой активной позиции. Информация о цене ликвидации записывается в момент открытия позиции и после данные не обновляются. То есть если капает фандинг, информация о цене ликвидации обновляться не будет.

  • Если позиция в SELL, LTV вычисляется как current_price / liq_price * 100.
  • Если позиция в BUY, LTV вычисляется как liq_price / current_price * 100.

orders_distribution_noise

Показатель случайности распределения позиций. Чем выше значение, тем больше разница в размерах позиций.

  • Пример: Если orders_distribution_noise = 0, то распределение будет равномерным (1, 1, 1 для лонга и шорта).
  • Если orders_distribution_noise = 0.15, распределение будет более случайным (0.9, 0.8, 1.3).

Этот параметр можно не изменять, если тебя устраивает равномерное распределение.

retries

Максимальное количество попыток выполнения одного действия в случае неудачи. Например, если сделка не открылась или не закрылась с первого раза, софт предпримет дополнительные попытки в пределах указанного числа.

debug_level

Уровень логирования.

  • "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

  1. Скачиваем софт с гитхаба.
  2. Устанавливаем библиотеки.
  3. Заполняем все файлы, которые указаны в инструкции выше. Сначала тестируем с позициями по 50-100$.
  4. Запускаем софт и выбираем пункт 1: Start trading.
  5. Проверяем в логах и UI вручную, что нет никаких проблем. После запуска пункта "Start trading" выполняются базовые проверки ваших файлов и прокси.
  6. Чтобы остановить процесс, останавливаем софт, запускаем его заново и выбираем пункт: Close all currently open positions.

Docker команды

Запуск

  1. docker build -t paradex-image . — Создаёт Docker-образ с именем paradex-image на основе текущей директории (.), где находится Dockerfile.
  2. 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.
  3. docker exec -it paradex-container /bin/bash — Открывает интерактивную оболочку внутри работающего контейнера paradex-container. Позволяет выполнять команды вручную.
  4. 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