investAPI icon indicating copy to clipboard operation
investAPI copied to clipboard

Добавить поле subscriptionId в MarketDataStream

Open vitalets opened this issue 2 years ago • 6 comments

Сейчас при работе с MarketDataStream не очень удобно сопоставлять запросы и ответы по разным подпискам. Например, если я создаю 2 подписки на свечи и приходит ответ со статусом != success, то чтобы понять, к какой подписке это относится приходится делать разные маневры с составным ключом figi + interval. Также при поступлении событий с данными было бы удобно понимать, к какой подписке это относится (чтобы вешать обработчики на конкретные инструменты, как это сделано у бинанс)

Предложение: Добавить в запрос подписки поле subscriptionId и возвращать его во всех событиях, связанных в этой подпиской:

// запрос подписки
{
  subscriptionId: 'xxx', // <-- идентификатор подписки
  subscribeCandlesRequest: { ... }
}

// результат подписки
{
  subscriptionId: 'xxx', // <-- идентификатор подписки
  subscribeCandlesResponse: { ... }
}

// данные по свече
{
  subscriptionId: 'xxx', // <-- идентификатор подписки
  candle: { ... }
}

vitalets avatar Aug 03 '22 12:08 vitalets

Добрый день, подскажите, а зачем вообще два раза подписываться на свечи по одному и тому же инструменту? Ведь из меньшего таймфрейма всегда можно сделать больший.

AlexanderVolkovTCS avatar Aug 15 '22 06:08 AlexanderVolkovTCS

Добрый день, подскажите, а зачем вообще два раза подписываться на свечи по одному и тому же инструменту? Ведь из меньшего таймфрейма всегда можно сделать больший.

Это уже другой вопрос, связанный с архитектурой конкретного клиента. Например, две независимые стратегии на разных интервалах. Каждая стратегия инкапсулированно управляет своей подпиской в стриме.

Дизайн API явно предполагает сущность подписки, которой вместо составного ключа нужно дать идентификатор, для четкого разделения подписок между собой. Уверен, это в будущем еще пригодится.

vitalets avatar Aug 15 '22 15:08 vitalets

Например, недавно добавился флаг waitingClose. Вопрос: как мне разделить response по следующим подпискам:

// подписка на figi с waitingClose: true
{
  subscribeCandlesResponse: { 
    instruments: [ { figi: 'xxx', interval: 1 } ],
    waitingClose: true
  }
}

// подписка на тот же figi с waitingClose: false
{
  subscribeCandlesResponse: { 
    instruments: [ { figi: 'xxx', interval: 1 } ],
    waitingClose: false
  }
}

vitalets avatar Aug 15 '22 15:08 vitalets

Идентификатор подписки добавим, спасибо.

Например, две независимые стратегии на разных интервалах ... Вопрос: как мне разделить response по следующим подпискам

При такой архитектуре упремся в лимиты: если стратегий будет много, то стримов может не хватить Мы рекомендуем разделять получение маркетдаты и ее использование в стратегиях через диспетчер. Если одна стратегия подписалась на бумагу, то другая в идеале не должна создавать новую подписку

AlexanderVolkovTCS avatar Aug 16 '22 09:08 AlexanderVolkovTCS

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

Про лимиты согласен, нужно учитывать. Хотя 300 подписок, это довольно большой запас.

Если одна стратегия подписалась на бумагу, то другая в идеале не должна создавать новую подписку

Но если другая стратегия использует другой набор figi, она же не может вклинить свои фиги в существующую подписку, поэтому придется создавать новую.

Кстати интересно, а как вы сами на бэке разруливаете подписки? Например, у клиента две подписки, в каждой по несколько figi. И теперь клиент отписывается от одной из них. Как бэкенд понимает, какую именно подписку отменить? Так же собирает составной ключ из переданных figi? Или у вас есть внутренний id подписки?

vitalets avatar Aug 17 '22 07:08 vitalets

Идентификатор подписки добавим, спасибо.

Александр, может вместо subscriptionId сделать более общее поле requestId? Это позволит добавить requestId в запрос getMySubscriptions. Без этого поля возможен race condition, если вызвать одновременно getMySubscriptions и создание новой подписки: непонятно какой ответ какому запросу соответствует.

Да и requestId для bi-directional обмена данными привычная вещь, например как в JSON RPC.

vitalets avatar Aug 23 '22 06:08 vitalets