Crypto Funds

Как построить систему коллективных инвестиций в криптовалюту с нулями

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

Технологии

Для полноцепочки коллективных инвестиций будет использоваться следующие технологии:

  • Telegram Bot - точка входа условного клиента. Где он может войти в коллективные инвестиции или/и выйти
  • REST API для взаимодействия с RabbitMQ - отдельный сервис будет работать с очередями запросов на вход в коллективные инвестиции (аналогично с выходом), а так же анализировать состояние ордера на покупку/продажу криптовалюты
  • Обработчик очередей RabbitMQ - необходим код, который будет обрабатывать очереди (вход в коллективные инвестиции, выход из коллективных инвестиций, обработка ордера на Binance
  • Binance API - покупка/продажа криптовалюты будет осуществляться на Binance. Для взаимодействия с биржей у них есть свой API
  • REST API для взаимодействия с базой - отдельный сервис будет помогать писать в базу заявки, оформленных операции, считать инвестиции.

При всем выше описанной не описанным будет взаимодействия между клиентом и биржей - как перевести деньги на бирже, как вывести и перевести их условному клиенту

Binance API + RabbitMQ

Для покупки и продажи в фонд будет использоваться биржа Binance. У нее есть возможность с помощью API выставлять ордера за покупку и продажу.

У Binance есть тестовое окружение, где можно провести все необходимые эксперименты.

На странице Binance Testnet нужно пройти регистрацию с помощью Github и получить ключи для взаимодействия с API. Взаимодействие в Binance будет происходить из обработчика очередей RabbitMQ и будет использоваться для выставления нового ордера и получения статуса ордера. А все взаимодействие будет через отдельную бибилиотеку для Python - python-binance

Пример создания ордера на покупку криптовалюты:


crypto_symbol = "BTCBUSD"
precision = 5
avg_price = client.get_avg_price(symbol=crypto_symbol)
crypto_price = float(avg_price["price"])
user_amount = 1
crypto_amount = round(data["amount"]/crypto_price, precision)
order = client.order_market_buy(symbol=crypto_symbol, quantity=crypto_amount)						
						

Для запуска части кода, которая взаимодействует с Binance API и RabbitMQ необходимо:

  • Установить и настроить RabbitMQ
  • Получить API_KEY для Binance API Testnet
  • Заполнить .env для переменных BINANCE_API_KEY, BINANCE_API_SECRET, RABBITMQ_USER, RABBITMQ_PWD, RABBITMQ_HOST, RABBITMQ_PORT (переменные BUY_QUEUE, SELL_QUEUE, ORDER_QUEUE можно оставить без изменения)
  • Запустить три скрипта

За что отвечает какой скрипт?

  • buy_reader.py - читает очередь new_buy и создает ордера на покупку
  • sell_reader.py - читает очередь new_sell и создает ордера на продажу
  • order_reader.py - проверяет статус ордера на бирже из очереди new_order. И в случае успеха выдает паи фонда.

REST API для работы с очередями RabbitMQ

Код Golang queue.go запускает на порту 23000 REST API для работы с тремя очередями - new_buy, new_sell и new_order

  • POST http://localhost:23000/new/invest - записывает в очередь на покупку криптовалюты
  • POST http://localhost:23000/new/sell - записывает в очередь на продажу криптовалюты
  • POST http://localhost:23000/new/order - записывает в очередь ордер, который должен выполниться. В рамках покупки/продажи криптовалюты

Пример POST запроса для /new/invest


{
    "investor": "6eb87d29-24a1-4529-a248-10468a5a429f",
    "fund": "XRP",
    "amount": 20
}					
						

Указываем ID инвестора, ID фонда и сумма в BUSD

Пример POST запроса для /new/sell


{
    "investor": "6eb87d29-24a1-4529-a248-10468a5a429f",
    "fund": "BTC",
    "qty": 20
}				
						

Указываем ID инвестора, ID фонда и сумма и количество паёв фонда к продаже.

Пример POST запроса для /new/order


{
    "order_id": "geXS3c5MoYMOW6arTiBJmo",
    "investor": "ID10000",
    "fund": "BTC",
    "qty": 0.00589
}				
						

Указываем ID ордера, ID инвестора, ID фонда и количество криптовалюты в этом ордере.

REST API для работы c базой

Код Golang queue.go запускает на порту 23001 REST API для работы с базой SQLite

  • POST http://localhost:23001/new/investor - зоздает нового "инвестора" в базе
  • GET http://localhost:23001/investor - получает из базы "инвесторм"
  • GET http://localhost:23001/portfolio - формирует портфель инвестора
  • POST http://localhost:23001/order - создание в базе ордера
  • POST http://localhost:23001/accept/order - подтверждение, что ордер исполнен

Пример POST запроса для /new/investor


{
    "tg_id": "ID10000"
}				
						

Указываем ID пользователя Telegram

Пример POST запроса для /investor


{
    "tg_id": "ID10000"
}				
						

Указываем ID пользователя Telegram

Пример POST запроса для /portfolio


{
    "tg_id": "ID10000"
}				
						

Указываем ID пользователя Telegram

Пример POST запроса для /portfolio


{
    "id": "1",
    "type": "B",
    "investor": "6eb87d29-24a1-4529-a248-10468a5a429f",
    "fund": "BTC",
    "Qty": 0.039
}			
						

Указываем ID ордера на Binance, направление ордера (покупка/продажа), ID инвестора, ID фонда и количество криптовалюты

Пример POST запроса для /accept/order


{
    "id": "2MvUOxNRI0RAsWVxL77oYU"
}			
						

Указываем ID ордера на Binance

Telegram Bot

Основное взаимодействие происходит через бота - в примере существует два фонда BTC и XRP.

Для инвестирования в фонда BTC есть команда /buy_btc или sell_btc для выхода из инвестиций. Важная особенность - в портфели инвестора количество BTC пересчитывается в количество паев фонда. То есть в портфели клиент будет указано, что он владеет 39.4 units - это означает, что он владеет примерно 0,00394 BTC (1 unit = 0.0001 BTC это указано в таблице fundsrate.

ля инвестирования в фонда XRP есть команда /buy_btc или sell_btc для выхода из инвестиций. Важная особенность - в портфели инвестора количество BTC пересчитывается в количество паев фонда. То есть в портфели клиент будет указано, что он владеет 100 units - это означает, что он владеет примерно 100 XRP (1 unit = 1 XRP это указано в таблице fundsrate.

Портфель можно посмотреть с помощью команды /portfolio - в портфеле будет показано сколько паев фондов есть в портфели, балансовая стоимость портфеля и рыночная стоимость. Для рыночной стоимости необходимо добавить свой API_KEY от cryptocompare.com.

Весь код доступен по ссылке OwnCryptoFunds