C++ client for Tinkoff invest API
Данный проект представляет собой инструментарий на языке C++ для работы с grpc-интерфейсом торговой платформы Тинькофф Инвестиции, который можно использовать для создания торговых роботов.
Клонируйте репозиторий:
git clone https://github.com/samoilovv/TinkoffInvestSDK.git
cd TinkoffInvestSDK
git submodule update --init --recursive
Перейдите в директорию проекта и выполните следующие команды:
mkdir build && cd build
cmake ..
cmake --build .
Первый запуск CMake вызовет скачивание зависимостей, что может занять некоторое время.
Примеры доступны здесь. Для запуска примеров необходимо добавить токен в переменную окружения.
$ export TOKEN=YOUR_TOKEN
Пример использования унарных запросов: открытие счета в песочнице и получение информации о нем.
InvestApiClient сlient("invest-public-api.tinkoff.ru:443", getenv("TOKEN"));
//get pointer to sandbox service
auto sandbox = std::dynamic_pointer_cast<Sandbox>(сlient.service("sandbox"));
//open account
sandbox->OpenSandboxAccount();
//print info about your account
auto accounts = sandbox->GetSandboxAccounts();
auto portfolio = sandbox->GetSandboxPortfolio(accounts.accountID(0));
std::cout << portfolio.ptr()->DebugString() << std::endl;
//close account
sandbox->CloseSandboxAccount(accountId);
Пример использования потокового блокирующего вызова: подписка на получение последних цен и на ленту обезличенных сделок. Каждый вызов необходимо помещать в отдельный поток.
using namespace std;
void marketStreamCallBack(ServiceReply reply)
{
cout << reply.ptr()->DebugString() << endl;
}
int main()
{
InvestApiClient client("invest-public-api.tinkoff.ru:443", getenv("TOKEN"));
//get pointer to MarketDataStream service
auto marketdata = dynamic_pointer_cast<MarketDataStream>(client.service("marketdatastream"));
//subscribe to NVIDIA and Tesla Motors prices and start streaming
thread th1([marketdata](){
marketdata->SubscribeLastPrice({"BBG000BBJQV0", "BBG000N9MNX3"}, marketStreamCallBack);
}
);
//subscribe to Bashneft (BANE) and Moscow Exchange (MOEX) shares transactions and start streaming
thread th2([marketdata](){
marketdata->SubscribeTradesAsync({"BBG004S68758", "BBG004730JJ5"}, marketStreamCallBack);
}
);
th1.join();
th2.join();
return 0;
}
Пример использования потокового асинхронного запроса: подписка на получение последних цен и на ленту обезличенных сделок. Клиент обрабатывает ответы сервера в единственном потоке, что существенно повышает производительность системы при большом количестве запросов.
using namespace std;
void marketStreamCallBack(ServiceReply reply)
{
cout << reply.ptr()->DebugString() << endl;
}
int main()
{
InvestApiClient сlient("invest-public-api.tinkoff.ru:443", getenv("TOKEN"));
//get pointer to MarketDataStream service
auto marketdata = dynamic_pointer_cast<MarketDataStream>(сlient.service("marketdatastream"));
//subscribe to British American Tobacco and Visa Inc. prices
marketdata->SubscribeLastPriceAsync({"BBG000BWPXQ8", "BBG00844BD08"}, marketStreamCallBack);
//subscribe to Bashneft (BANE) and Moscow Exchange (MOEX) shares transactions
marketdata->SubscribeTradesAsync({"BBG004S68758", "BBG004730JJ5"}, marketStreamCallBack);
return 0;
}
Вывод:
subscribe_last_price_response {
tracking_id: "628164edf8495c0"
last_price_subscriptions {
figi: "BBG000BWPXQ8"
subscription_status: SUBSCRIPTION_STATUS_SUCCESS
}
last_price_subscriptions {
figi: "BBG00844BD08"
subscription_status: SUBSCRIPTION_STATUS_SUCCESS
}
}
last_price {
figi: "BBG000BWPXQ8"
price {
units: 42
nano: 80000000
}
time {
seconds: 1652481859
nanos: 657347773
}
}
last_price {
figi: "BBG00844BD08"
price {
units: 100
nano: 120000000
}
time {
seconds: 1585063374
nanos: 334361000
}
}
subscribe_trades_response {
tracking_id: "628164ed2816ca3dab68f498d02ca29b"
trade_subscriptions {
figi: "BBG004S68758"
subscription_status: SUBSCRIPTION_STATUS_SUCCESS
}
trade_subscriptions {
figi: "BBG004730JJ5"
subscription_status: SUBSCRIPTION_STATUS_SUCCESS
}
}
Подробную документацию можно найти по ссылке. Вопросы и предложения сюда.