pot - библиотека на python, которая позволяет создавать торговых ботов осуществляющих маркет-мейкинг на криптобиржах.
Разработчику бота необходимо лишь указать на каком инструменте будет осуществляться торговля и каким образом расчитывается теоретическая цена этого инструмента. Достигается это путём создания и комбинирования нескольких объектов калькуляторов. В качестве исходных данных калькуляторы могут использовать стаканы различных инструментов с разных бирж, а так же публичные сделки.
Библиотека сделана в учебных целях, автор не несёт никакой ответственности за любые результаты от трейдинга с использованием любых компонентов этой библиотеки
| Ресурс | Требования |
|---|---|
| Операционая система | Linux only. Тестировалось на Ubuntu 16.04 и более свежих дистрибутивах. Но, подойдёт любой linux дистрибутив |
| Оперативная память/RAM | 500 MB достаточно, но лучше выделять 1 GB на бота |
| Диск | Дисковое пространство используется только для логов. 3 GB достаточно |
| Python | 3.8.x |
conda create -n py38 python=3.8
conda activate py38
Далее необходимо скачать последнюю версию wheel библиотеки и установить
pip install pot-8.0-cp38-cp38-linux_x86_64.whl
Для создания маркет-мейкера достаточно лишь указать как расчитывать теоретическую цену и задать ряд параметров регулирующих поведение бота. Достигается это путём создания нескольких файлов в отдельном каталоге
mkdir configuration
cd configuration
Первым делом создаём класс бота
from pot.bot_base.calculators.theo_function import LogEmaTheoCalculator
from pot.bot_base.calculators.theo_order_book_based import MidTheoCalculator
from pot.bot_base.skeleton import Skeleton
from pot.marketlinks.bitfinex.utils import BITFINEX_NAME
# Все конкретные реализации ботов наследуются от базового класса
# Задача конкретной реализации определить где торгует бот и задать формулу теоретической цены
class BitfinexBtcUsd(Skeleton):
# Указывает каким инструментом и на какой бирже будет торговать бот
TRADING_SPOT = (BITFINEX_NAME, "btc_usd")
def __init__(self, executors_per_exch, name, cache, **kwargs):
# В конструкторе необходимо определить формулу теоретической цены
# MidTheoCalculator расчитывает mid price на основе торговой книги заданного инструмента
spot_calculator = MidTheoCalculator(cache, self.TRADING_SPOT)
# kwargs - словарь который содержит все параметры робота.
# В том числе там есть ref_spot который определяет откуда взять референсную цену
hedge_calculator = MidTheoCalculator(cache, kwargs["ref_spot"])
# Созданные ранее калькуляторы можно комбинировать.
# Здесь мы создаём новый калькулятор который будет считать EMA отношения hedge/spot
# и возвращать теоретическую цену spot, расчитанную как hedge/EMA(hedge/spot)
# Размер окна для EMA задаётся в секундах параметром ema_halflife
theo_calculator = LogEmaTheoCalculator(hedge_calculator, spot_calculator, **kwargs)
# Полученный калькулятор теоретической цены передаём в базовый класс.
super().__init__(executors_per_exch, name,
theo_calculator,
**kwargs)
Теперь зададим параметры
from pot.marketlinks.bybit import BYBIT_NAME
from bots.bitfinex import BitfinexBtcUsd
strategies = {
"bfx_btcusd_against_bybit": {
"bot": BitfinexBtcUsd,
"key_section_name": "bitfinex_test_account",
"params": {'ref_spot': (BYBIT_NAME, 'btc_usd'),
'max_visible_amount': 0.4,
'position_limit': 0.2,
'theo_inaccuracy_rel': 0.0001,
'log_offset': 0.001,
'neg_retreat_pct': 0,
'pos_retreat_pct': 0,
'ema_halflife': 1500
}
}
}
И, наконец, зададим API ключи для доступа к биржам
# Задаём ключи от аккаунта на bitfinex.
# Ссылаемся на имя bitfinex_test_account из configs.py, поле key_section_name
keys = {
"bitfinex_test_account": [{"key": "", "secret": "", "affilate": ""}]
}
zmqkey = b"="
Пример конфигурации с рекомендуемой структурой каталогов можно скачать здесь
cd configuration
strategy_runner --strategy bfx_btcusd_against_bybit
Доступные ключи командной строки можно посмотреть с помощью --help
strategy_runner --help
| Биржа | Info | Execution |
|---|---|---|
| bitfinex | ■ |
■ |
| okex | ■ |
■ |
| bybit | ■ |
■ |
| bitmex | ■ |
■ |
| deribit | ■ |
■ |
| bitfinex | ■ |
■ |
| binance | ■ |
■ |
| kraken | ■ |
■ |
| bitstamp | ■ |
■ |
| Имя | Значение |
|---|---|
| log_offset | Насколько далеко бот расставляет ордера от теоретической цены.
|
| neg_retreat_pct | Бот создаёт отдельный ордер что бы закрыть ранее открытую позицию.
Этот ордер может находится ближе к теоретической цене, чем задано в log_offset
|
| pos_retreat_pct | Бот может создавать множество ордеров на открытие позиции.
Первый ордер находится на расстоянии log_offset от теоретической цены.
Для последующих ордеров используется дополнительный отступ.
|
| position_limit | Максимальный размер позиции, который разрешено занимать боту |
| max_visible_amount | Какой объем боту разрешено показать в торговой книге |
| max_order_amount | Максимальный размер ордера |
| theo_inaccuracy_rel | Относительное изменение теоретической цены которое считается значительным.
При значительном изменении теоретической цены бот пересоздаёт ордера. По умолчанию: log_offset/3 |
| adjust_to_market | Оптимизировать ордера бота прижимаясь к уже существующим ордерам в торговой книге |
| adjust_to_market_cooldown_sec | Оптимизировать ордера не чаще чем задано этим параметром |
| ema_halflife | Задаёт время полураспада для скользящей средней в LogEmaTheoCalculator |