Обзор

pot - библиотека на python, которая позволяет создавать торговых ботов осуществляющих маркет-мейкинг на криптобиржах.

Разработчику бота необходимо лишь указать на каком инструменте будет осуществляться торговля и каким образом расчитывается теоретическая цена этого инструмента. Достигается это путём создания и комбинирования нескольких объектов калькуляторов. В качестве исходных данных калькуляторы могут использовать стаканы различных инструментов с разных бирж, а так же публичные сделки.

Библиотека сделана в учебных целях, автор не несёт никакой ответственности за любые результаты от трейдинга с использованием любых компонентов этой библиотеки

Системные требования

Ресурс Требования
Операционая система Linux only. Тестировалось на Ubuntu 16.04 и более свежих дистрибутивах. Но, подойдёт любой linux дистрибутив
Оперативная память/RAM 500 MB достаточно, но лучше выделять 1 GB на бота
Диск Дисковое пространство используется только для логов. 3 GB достаточно
Python 3.8.x

Установка

Для установки, рекомендуется в начале создать python3.8 виртуальное окружение, например, с помощью Miniconda

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 Насколько далеко бот расставляет ордера от теоретической цены.

bid_order_price = theo/exp(log_offset)
ask_order_price = theo*exp(log_offset)            
            
neg_retreat_pct Бот создаёт отдельный ордер что бы закрыть ранее открытую позицию. Этот ордер может находится ближе к теоретической цене, чем задано в log_offset

bid_order_price_close = theo / exp(log_offset * (1 - neg_retreat_pct/100))
ask_order_price_close = theo * exp(log_offset * (1 - neg_retreat_pct/100))
            
pos_retreat_pct Бот может создавать множество ордеров на открытие позиции. Первый ордер находится на расстоянии log_offset от теоретической цены. Для последующих ордеров используется дополнительный отступ.

log_offset * (1 + (n - 1) * pos_retreat_pct/100)
            
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