Это тестовый торговый бот для биржи Binance. Он подключается к Binance TestNet, и использует Websockets для всех взаимодействий с биржей. Это намеренная версия без использования REST API в качестве эксперимента. Для стабильности и прозрачности в продакшн-реди окружениях я бы рекомендовал использовать связку rest+wss.
P.S. В текущей версии бот не рассчитан на работу более 24 часов, из-за особенностей реализации клиента userDataStream.
- подключаемся к бирже, проводим базовую инициализацию (балансы, мин. размеры позиции)
- покупаем заданный объем (env
POSITION_QUANTITY
) на заданном рынке (envSYMBOL
) - следим за изменениями цены и при достижении заданных уровней (стоп-лосс, тейк-профит,
env
POSITION_SL_PERCENT
/POSITION_TP_PERCENT
) закрывает позицию. - Если ценовые уровни не достигнуты, позиция закрывается по истечении времени (env
POSITION_HOLD_TIME
). - После закрытия позиции бот спит заданное время (задается через env
POSITION_SLEEP_TIME
) и затем покупает новую позицию.
env | description | default | Required |
---|---|---|---|
API_KEY | binance api key | None | True |
PRIVATE_KEY_BASE64 | base64 encoded private key | None | True |
SYMBOL | symbol for trading | BTCUSDT | False |
POSITION_QUANTITY | quantity for position | 0.001 | False |
POSITION_SL_PERCENT | stop loss (percent) | 0.25 | False |
POSITION_TP_PERCENT | take profit (percent) | 0.25 | False |
POSITION_HOLD_TIME | position hold time (seconds) | 60 | False |
POSITION_SLEEP_TIME | sleep time after exit (seconds) | 30 | False |
LOGLEVEL | log level, max available DEBUG | INFO | False |
JSON_LOGS | json log formatter for log systems like elk | False | False |
SAVE_LOG_FILE | save logs to file (bool) | False | False |
LOG_FILE_PATH | path to log file | /app/logs/bot.log | False |
VERSION | bot version | 0.0.1 | False |
ENVIRONMENT | environment name | development | False |
Из зависимостей захотелось взять все что популярно и быстро)) в проекте используются:
- python 3.12
- uvloop (event loop на максималках)
- aiohttp (для работы с wss)
- msgspec (ну оч быстрый json сериализатор/десериализатор)
- structlog (просто оч удобная либа для логирования)
- pydantic-settings (для удобной работы с переменными окружения и settings)
ну и вишенкой на торте все что помогает разработке:
- ruff (экстримально быстрый линтер/форматтер)
- uv (экстримально быстрый резолв и установка зависимостей)
- mypy (для статической типизации)
- pre-commit (для автоматической проверки кода перед коммитом)
- pytest
В проекте бота используется авторизация через Ed25519
для подписи запросов к бирже. Для работы
бота вам
необходимо создать приватный и публичные ключи, затем загрузить публичный ключ на биржу и получить apiKey
связанный с вашим ключом. После этого приватный ключ нужно закодировать в base64 и передать в переменную окружения.
-
процесс создания и загрузки ключей на binance хорошо описан в это мануале от binance.
-
Загрузить ключи нужно будет в TestNet, предварительно произведя вход через github.
-
После загрузки ключа на binance testnet вам выдадут ApiKey который вам нужно будет сохранить для работы бота.
-
Получить BASE64 приватного ключа можно через команду
base64 -i private_key.pem
и сохранить его в переменную окруженияPRIVATE_KEY_BASE64
.base64 -i privatekey.pem
Для запуска на AWS EC2, лучше всего использовать Amazon Linux 2 AMI. Я рекомендую использовать docker, для этого есть подготовленный Dockerfile и это описание для сборки и запуска контейнера.
- Создайте новый EC2 инстанс на Amazon Linux 2 AMI (самого маленького t4g.nano будет достаточно), я рекомендую
использовать AWS регион Tokyo (
ap-northeast-1
), тк сама биржа Binance находится в этом регионе и это обеспечит низкие задержки до 5мс. При создании инстанса ec2 можно выбрать архитектуруarm
, а для автоматической установки и настройки docker при запуске удобно задать ему скриптuser data
(см. ниже)#!/bin/bash sudo yum update -y sudo yum install docker git make htop -q -y sudo usermod -a -G docker ec2-user sudo systemctl enable docker.service sudo systemctl start docker.service
- Подключитесь к инстансу по ssh
ssh -i "your-key.pem" ec2-user@<ec2 ip address>
- Подготовьте переменные окружения для запуска бота:
export API_KEY=<your-binance-api-key> export PRIVATE_KEY_BASE64=<your-binance-private-key-base64>
- Скачайте репозиторий с кодом бота:
git clone https://github.com/zwastler/binance-testbot.git && cd binance-testbot
- Соберите докер-образ с ботом:
make build
- Запустите робота с базовыми настройками:
docker run --rm -it -e API_KEY=$API_KEY -e PRIVATE_KEY_BASE64=$PRIVATE_KEY_BASE64 --name test_bot test_bot_binance
Если вы решите запустить бота без докера, вам нужно установить python 3.12
, python-pip
(или uv
) и установить
зависимости проекта:
pip install -r requirements.txt
В проекте используется structlog
. Стандартный вывод логов доступен при уровне INFO
, в логах вы можете
встретить поле latency
в котором высчитывается разницу между локальным (при получении) и биржевым (при
отправке) временем события (если оно доступно). Также как контекст для всех логов передаются: version
, environment
которые
задаются в settings.py
или через переменные окружения.
По умолчанию все логи пишутся в STDOUT, если вам нужно настроить сохранение логов в файл (что не рекомендуется делать внутри контейнера) ниже будет инструкция как это сделать.
При включении LOGLEVEL
= DEBUG
в логах появятся подробности:
- все полученные и отправленные сообщения в публичном/приватном каналах для wss сообщений
- другие подробности по мере обогащения данных
При включении env SAVE_LOG_FILE
логи будут дублироваться в файл, путь к файлу можно задать через LOG_FILE_PATH
.
Если используете в контейнере не забывайте пробросить путь к файлу через volume.
В проекте используется python 3.12 и uv для компилирования зависимостей. Для запуска тестов и линтеров вам понадобится:
- Установить python 3.12 (если еще не установлен). Я рекомендую использовать
pyenv
. - Установить make (если не установлен)
brew install make
для MacOS. - Выполнить
make requirements-dev
для компилирования и установки всех (в т.ч. тестовых) зависимостей проекта. - Для запуска тестов запустить
make test
. - Для разработки используются pre-commit-hooks которые устанавливаются командой
make pre-commit
. - Подготовить ключи и переменные окружения для запуска бота (см. выше). Я рекомендую использовать
direnv
.
- Переделать работу с userDataStream и обновленим listen_key (и пересозданием при необходимости через 24часа)
- Заменить человекопонятный id на uuid, сделать процессинг сообщений / ордеров
- Сделать сохранение стейта в sqlite/redis (для сохранения стейта при перезапуске)
- Сделать обработку ошибок отправленных но неисполненных ордеров (400)