Tinkoff / investAPI

399 stars 136 forks source link

gRPC на nodejs. MarketDataStream присылает только ping #52

Closed polkila closed 2 years ago

polkila commented 2 years ago

Аутентификация:

const authHeaders = new grpc.Metadata();
authHeaders.add('Authorization', 'Bearer '+config.tcs.token);

const channelCred = grpc.credentials.combineChannelCredentials(grpc.credentials.createSsl(), grpc.credentials.createFromMetadataGenerator(function(_params, callback){
    callback(null, authHeaders);
}));
const client = new tcs.MarketDataService(config.tcs.grpc_server, channelCred);

Обращение к методу GetOrderBook:

client.GetOrderBook({figi:'BBG000B9XRY4', depth:2}, function(err, response){
    console.log('err', err);
    console.log('response', response);
});

даёт результат:

{
  figi: 'BBG000B9XRY4',
  depth: 2,
  bids: [
    { price: [Object], quantity: [Long] },
    { price: [Object], quantity: [Long] }
  ],
  asks: [
    { price: [Object], quantity: [Long] },
    { price: [Object], quantity: [Long] }
  ],
  lastPrice: {
    units: Long { low: 163, high: 0, unsigned: false },
    nano: 230000000
  },
  closePrice: {
    units: Long { low: 159, high: 0, unsigned: false },
    nano: 780000000
  }
}

Вот такая аутентификация тоже срабатывает:

const client = new tcs.MarketDataService(config.tcs.grpc_server, grpc.credentials.createSsl());
client.GetOrderBook({figi:'BBG000B9XRY4', depth:2}, authHeaders, function(err, response){
    console.log('err', err);
    console.log('response', response);
});

Подключение к стриму не получает данные — только ping:

const channel = new tcs.MarketDataStreamService(config.tcs.grpc_server, channelCred);
const call = channel.MarketDataStream(function(err, response){
    console.log('err', err);
    console.log('response', response);
});
call.on('data', function(response){
    console.log('subscribe_order_book_request', response); // { ping: { time: { seconds: [Long], nanos: 428634000 } } }
});
call.on('end',function(){
    console.log('subscribe_order_book_request end');
});
call.write({subscribe_order_book_request:{subscription_action:'SUBSCRIPTION_ACTION_SUBSCRIBE', instruments:[{figi:'BBG000C2V3D6', depth:2},{figi:'BBG000B9XRY4', depth:2}]}});

Также:

const call2 = channel.MarketDataStream({subscribe_info_request:{subscription_action:'SUBSCRIPTION_ACTION_SUBSCRIBE', instruments:[{figi:'BBG000C2V3D6'},{figi:'BBG000B9XRY4'}]}}, function(err, response){
    console.log('err 2', err);
    console.log('response 2', response);
});
call2.on('data', function(response){
    console.log('subscribe_info_request2', response); // { ping: { time: { seconds: [Long], nanos: 428634000 } } }
});
call2.on('end',function(){
    console.log('subscribe_info_request2 end');
});

Добавление authHeaders в MarketDataStream ничего не меняет:

const call2 = channel.MarketDataStream({subscribe_info_request:{subscription_action:'SUBSCRIPTION_ACTION_SUBSCRIBE', instruments:[{figi:'BBG000C2V3D6'},{figi:'BBG000B9XRY4'}]}}, authHeaders, function(err, response){
    console.log('err2', err);
    console.log('response2', response);
});
SinnerUfa commented 2 years ago

Возможно это https://github.com/Tinkoff/investAPI/issues/20, хотя могу ошибаться:) Или лучше: https://github.com/Tinkoff/investAPI/blob/main/src/docs/head-marketdata.md Глубина стакана только определенная (10, 20, 30, 40 или 50) и подписки только по одному типу за запрос.

polkila commented 2 years ago

К сожалению не помогло. orderbook и info присылают одинаково ничего, кроме пинга.

Глубина стакана только определенная (10, 20, 30, 40 или 50)

пробовал

подписки только по одному типу за запрос

пробовал

betslus1 commented 2 years ago

посмотрите sdk, там работало все. в частности example для stream (думаю сразу увидите ошибку) https://github.com/betslus1/unofficial-tinkoff-invest-api_v2-lazy-sdk-NODEJS

polkila commented 2 years ago

посмотрите sdk, там работало все. в частности example для stream (думаю сразу увидите ошибку) https://github.com/betslus1/unofficial-tinkoff-invest-api_v2-lazy-sdk-NODEJS

Хорошо, посмотрю SDK. У меня не было этой ссылки. Спасибо.

polkila commented 2 years ago

посмотрите sdk, там работало все. в частности example для stream (думаю сразу увидите ошибку) https://github.com/betslus1/unofficial-tinkoff-invest-api_v2-lazy-sdk-NODEJS

В этом SDK таким же образом реализованы подключение и аутентификация. И мой код сейчас получает данные. А ещё утром не получал 🤷‍♂️. Видимо, разработчики ещё не всем открыли доступ к API.

polkila commented 2 years ago

В моём SDK

Скажите, в loadContracts сразу совершается подключение? Получается, во время инициализации создаётся 9 соединений к сервисам?

betslus1 commented 2 years ago

В моём SDK

Скажите, в loadContracts сразу совершается подключение? Получается, во время инициализации создаётся 9 соединений к сервисам?

Не должны. Только создаются обертки.

nonamegithub commented 2 years ago

посмотрите sdk, там работало все. в частности example для stream (думаю сразу увидите ошибку) https://github.com/betslus1/unofficial-tinkoff-invest-api_v2-lazy-sdk-NODEJS

Спасибо тебе за труд, добрый человек! Сэкономил немало времени. Не планируешь для OrdersStreamService пример добавить в SDK? А то не взлетело что-то с полпинка api.OrdersStreamService.TradesStream() (

betslus1 commented 2 years ago

MarketStreamService работает, значит и TradesStreamService должен работать на стороне SDK.

На всякий случай обновите proto-файлы. Но вроде кто-то писал о проблемах в самом TradesStreamService на стороне сервера ТИ. Я не изучал пока этот вопрос, могу ошибаться.

Но он должен был автоматически тоже подключиться в SDK из протофайлов.

Какая конкретно возникла проблема при попытке запросить ordersStreamService по аналогии с примером для MarketStreamService?

nonamegithub commented 2 years ago

С var call = api.OrdersStreamService.TradesStream(); вроде все понятно, а вот насчет использования call.write есть сомнения. С примером вопросы снялись бы на раз без погружения в вопрос.

betslus1 commented 2 years ago

С

var call = api.OrdersStreamService.TradesStream();

вроде все понятно, а вот насчет использования call.write есть сомнения. С примером вопросы снялись бы на раз без погружения в вопрос.

Судя по документации там ничего не надо передавать и call.write не нужен. Я думаю сразу после подключения там будет идти информация о сделках. В Kreya передаваемые данные "{}"

Если не заработает попробуйте call.write({});

В любом случае раньше понедельника не проверить.

nonamegithub commented 2 years ago

Тоже подумал, что call.write не нужен, когда с ним словил ^ TypeError: call.write is not a function Но у меня не прилетает response от Tinkoff, по типу "{"subscribe_candles_response":{"candles_subscriptions":[{"figi":"BBG005P7Q881","interval":..." P.S. А вот, возможно, и хорошая новость: прилетел ping, пока писал ответ! Точно надо ждать понедельника теперь...

nonamegithub commented 2 years ago

после var call = api.OrdersStreamService.TradesStream() должен прилететь response, судя по документации, но кроме пингов ничего нет в ответ.

nonamegithub commented 2 years ago

попробовал в Kreya - поведение один в один - идут только пинги,

AlexanderVolkovTCS commented 2 years ago

попробовал в Kreya - поведение один в один - идут только пинги,

Вы активно торгуете, выставляете ордера, но ваши сделки в OrdersStreamService.TradesStream не приходят?

nonamegithub commented 2 years ago

Всем спасибо, разобрался - сам тупанул. Ждал response сразу после подписки - по аналогии с подпиской на свечи, стакан, ленту сделок и инфо по инструментам, в качестве подтверждения факта подписки. А он прилетает только после исполнения ранее выставленной заявки. Все работает, как часы)