Данное sdk предназначено для взаимодействия с OpenApi Тинькофф Инвестиций. Так как на момент публикации официального sdk больше половины работы над данным проектом было закончено, я решил, что буду пользоваться им и поддерживать по мере возможности. Вопросы и предложения прошу в Issues.
Для начала вам необходимо получить токен, процедура подробно описана здесь
Взаимодействие с API происходит через следующие сервисы:
- MarketService - Получение информации об инструментах (Rest, реализует IMarketService)
- OrderService - Получение информации о лимитных заявках, а также их размещение (Rest, реализует IOrderService)
- PortfolioService - Получение информации о портфолио (Rest, реализует IPortfolioService)
- OperationService - Получение информации об операциях (Rest, реализует IOperationService)
- SandboxService - Взаимодействие с песочницей (Rest, реализует ISandboxService)
- StreamMarketService - Взаимодействие с API по протоколу WebSocket (WebSocket, Реализует IStreamMarketService)
Все Rest сервисы инициализируются объектом конфигурации типа RestConfiguration:
- string AccessToken - Токен доступа к API
- string BaseUrl - Базовый адрес API, default = "https://api-invest.tinkoff.ru"
- bool SandboxMode - Признак активна ли песочница, default = true
StreamMarketService инициализируется объектом конфигурации типа StreamConfiguration:
- string AccessToken - Токен доступа к API
- string Address - Адрес, по которому доступен WebSocket, default = "wss://api-invest.tinkoff.ru/openapi/md/v1/md-openapi/ws"
Механизм взаимодействия взят из официального sdk. StreamMarketService реализует интерфейс IStreamMarketService:
public interface IStreamMarketService
{
Task Send(IWsMessage message);
IObservable<WsMessage> AsObservable();
}
Соотвественно метод Send служит для отправки сообщений на подписку/отписку от событий. Типы исходящих сообщений реализуют интерфейс IWsMessage: SubscribeCandleMessage, UnsubscribeCandleMessage, SubscribeOrderBookMessage, UnsubscribeOrderBookMessage, SubscribeInstrumentInfoMessage, UnsubscribeInstrumentInfoMessage; Метод AsObservable() реализован с помощью System.Reactive, а именно с помощью Observable.FromEventPattern, благодаря этому вы получаете Push коллекцию, в которую будут приходить сообщения типа WsMessage: CandleMessage, OrderBookMessage, InstrumentInfoMessage. На выходе сообщения десериализуются в правильный тип на основе свойства Event, вы можете использовать Pattern Matching. Пример кода:
public sealed class Program {
private StreamConfiguration _config;
public Program(StreamConfiguration config) {
if(config == null)
throw new ArgumentNullException(nameof(config));
_config = config;
}
public async Task DoWork() {
using (var client = new StreamMarketService(_config))
{
IDisposable subscription = client
.AsObservable()
.Do(x =>
{
switch (x)
{
case CandleMessage message:
Console.WriteLine($"type: {message}, figi: {message.Payload.Figi}");
break;
default:
Console.WriteLine("Unknown message type");
break;
}
}, ex => { throw ex; })
.Subscribe();
await client.Send(new SubscribeCandleMessage
{
Figi = "{figi}",
Interval = CandleInterval.Minute
});
await Task.Delay(1000 * 5);
await client.Send(new UnsubscribeCandleMessage()
{
Figi = "{figi}",
Interval = CandleInterval.Minute
});
subscription?.Dispose();
}
}
}
Вы можете запустить примитивные тесты для Rest сервисов добавив в файл Insight.Tinkoff.Invest.Tests/appsettings.json токен для сандбокса. По дефолту изменения файла игнорируются в .gitignore