Git Product home page Git Product logo

invest-openapi-java-sdk's Introduction

Release

OpenAPI SDK для Java

РЕПОЗИТОРИЙ ЗАМОРОЖЕН! В связи с выходом новой реализации API, которая радикально отличается от той, с которой работает данный SDK, дальнейшее развитие этого репозитория остановлено. Для нового API создан новый репозиторий.

Данный проект представляет собой инструментарий на языке Java для работы с OpenAPI Тинькофф Инвестиции, который можно использовать для создания торговых роботов.

Начало работы

Для сборки библиотеки понадобится Apache Maven версии не ниже 3, а также JDK версии не ниже 8. Затем в терминале перейдите в директорию проекта и выполните следующую команду

mvn clean package

Или с помощью docker

# Linux/Mac версия

docker run -it --rm --name invest-openapi-java-sdk -v "$PWD":/usr/src/invest-openapi-java-sdk -w /usr/src/invest-openapi-java-sdk maven:3.6-jdk-11-slim mvn clean package
# Windows PowerShell версия

docker run -it --rm --name invest-openapi-java-sdk -v "$(pwd):/usr/src/invest-openapi-java-sdk".ToLower() -w /usr/src/invest-openapi-java-sdk maven:3.6-jdk-11-slim mvn clean package

Скорее всего вы увидите ошибки, связанные с подпроектом example - он требует JDK версии 11. Однако, сам SDK должен скомпилироваться.

После успешной сборки в поддиректории sdk-java8\target появится jar-файл openapi-java-sdk-java8-<version>, который можно подключить к любому другому Java-проекту (или Java-совместимому, например, на таких языках, как Kotlin и Scala).

Где взять токен аутентификации?

В разделе инвестиций вашего личного кабинета tinkoff. Далее:

  • Перейдите в настройки
  • Проверьте, что функция "Подтверждение сделок кодом" отключена
  • Выпустите токен для торговли на бирже и режима "песочницы" (sandbox)
  • Скопируйте токен и сохраните, токен отображается только один раз, просмотреть его позже не получится, тем не менее вы можете выпускать неограниченное количество токенов

Документация

Для проекта можно сгенерировать javadoc-документацию с помощью команды

mvn javadoc:javadoc

Или с помощью docker

# Linux/Mac версия

docker run -it --rm --name invest-openapi-java-sdk -v "$PWD":/usr/src/invest-openapi-java-sdk -w /usr/src/invest-openapi-java-sdk maven:3.6-jdk-11-slim mvn javadoc:javadoc

Проект разделён на 3 части:

  • core - содержит интерфейсы всех частей REST API и Streaming API, а также модели данных, которые они используют;
  • sdk-java8 - содержит реализацию core-интерфейсов с использованием http-клиента из библиотеки OkHttp;
  • example - простой пример использования core-интерфесов, реализованных в sdk-java8 (для компиляции необходим jdk11).

Модели данных core-части подготовлены для работы с JSON при помощи Jackson аннотаций.

Документацию непосредственно по OpenAPI можно найти по ссылке.

Каждая часть может быть подключена в качестве зависимости

<dependency>
  <groupId>ru.tinkoff.invest</groupId>
  <artifactId>openapi-java-sdk-core</artifactId>
<!--  <artifactId>openapi-java-sdk-java8</artifactId>-->
<!--  <artifactId>openapi-java-sdk-example</artifactId>-->
  <version>0.4.1</version>
</dependency>

А если вкратце?

Для непосредственного взаимодействия с OpenAPI нужно создать подключение.

import org.reactivestreams.Subscriber;
import ru.tinkoff.invest.openapi.OpenApi;
import ru.tinkoff.invest.openapi.okhttp.OkHttpOpenApi;
import ru.tinkoff.invest.openapi.model.rest.*;
import ru.tinkoff.invest.openapi.model.streaming.*;

import java.util.concurrent.Executors;

class Example {
    public static void main(String[] args) {
      String token = "super_token"; // токен авторизации
      boolean sandboxMode = true;
      OpenApi api = new OkHttpOpenApi(token, sandboxMode);

      if (api.isSandboxMode()) {
        api.getSandboxContext().performRegistration(new SandboxRegisterRequest()).join();
      }

      Subscriber<StreamingEvent> listener = new Subscriber() { /* ваш вариант слушателя */ };
      api.getStreamingContext().subscribe(listener);

      // оформляем подписку на поток "свечей"
      api.getStreamingContext().sendRequest(StreamingRequest.subscribeCandle("<какой-то figi>", CandleInterval.FIVE_MIN));

      // Вся работа происходит через объекты контекста, все запросы асинхронны
      Portfolio portfolio = api.getPortfolioContext.getPortfolio().join(); // получить текущий портфель
    }
}

А пример готового робота есть?

Пример готового робота пока отсутствует, но планируется к добавлению.

У меня есть вопрос

Основной репозиторий с документацией - в нем вы можете задать вопрос в Issues и получать информацию о релизах в Releases.

Если возникают вопросы по данному SDK, нашёлся баг или есть предложения по улучшению, то можно задать его в Issues.

invest-openapi-java-sdk's People

Contributors

alx-ef avatar luckman avatar nikitamelnikov avatar nprudnikov avatar sergeevpavel avatar vlakuc avatar xkrt avatar zlumyo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

invest-openapi-java-sdk's Issues

Предложение по архитектуре

Предлагаю ввести следующие понятия в SDK

  1. Диспечер (DM). Занимается копированием событий в StrategyManager и получает от StrategyManager информацию о подписках. Скрытый в контексте. Мониторит изменения в подписках StrategyManager.
  2. StrategyManager. Создает копии Стратегий для подключенных инструментов и отправляет им stream с фильтрацией по инструменту. Отправляет изменения по подпискам на Тикеры в Диспетчер.
  3. Шаблон стратегии - описание поведения стратегии в рамках некого конкретного Тикера.

Пример Псевдокода

StrategyManager <StrategyOne> Manager1 = new StrategyManager<>();
StrategyManager <StrategyTwo> Manager2 = new StrategyManager<>();

Manager1.addTicker("Ticker1");
Manager1.addTicker("Ticker2");
Manager2.addTicker("Ticker2");
Manager2.addTicker("Ticker3");
Manager2.add(Instrument1);


context.addSM(Manager1);
context.addSM(Manager2);


Итого происходит подписка на Ticker1 (данные копируются в SM1), Ticker2 (данные копируются в SM1,SM2), Ticker3 (данные копируются в SM2).

Каждый SM как бы по шаблону <StrategyOne> создает для каждого Ticker (при add) копию стратегии по шаблону и данные по этому Ticker проксируються в эту стратегию.

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

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

Шаблон стратегии описывает поведение по T инструменту. При этом не надо делать return как решение по стратегии. Не забывайте, что в рамках стратегии может быть множество ордеров сразу. Лучше дать возможность в момент создания Order указать класс ожидания OrderResult с результатами (ордер по T инструменту установлен, снят, выполнен, отменен, на частичном выполнении). Так будет более универсально и удобно для среднего разработчика.

Внутри шаблона стратегии должна быть возможность "закончить стратегию по инструменту", чтобы SM автоматически остановил стратегию, отписался от событий по ней и удалил копию стратегии по инструменту. Например когда инструмент мы продали и лимитный ордер положительно исполнился мы выполняем команду finish() и SM и Диспечер дальше все сам делает на основе событий.

При addTicker и addSM не забываем выставлять ссылку на context внутрь объекта, для того, чтобы разработчик внутри стратегии имел доступ к глобальным ApiCalls. Также изнутри стратегии надо уметь понимать по какому инструменту идет работа, т.е. при создании копии стратегии в него передается ссылка контекст (может быть null пока SM не добавят в DM) и инструмент.

Программирования среднему джависту на 2-3 дня с тестированием :)

По коду типа того:

Class StrategyOne implemets StraregyTempalte {
onPortfolioChange(Portfoilo old, Portfoilo new);
onOrderBookChange(OrderBook old, OrderBook new);
onOrderChange(Order old, Order new);
onInstrumentInfoChange(InstrumentInfo old,InstrumentInfo new);
....
}

Class OrderResult {
onSuccesPost(...);// отправка удалась
onFailedPost(...);// отправка не удалась
onCancelingByUser(...); // в процессе отмены пользователем
onCanceledByUser(...); // снят пользователем
onCanceledBySystem(...); // снят системой
onComplited(...); // исполненный
onPartComplited(...); // частично исполненный
}

[SEVERE ] Что-то пошло не так в подписке на стрим StreamingEvent.

[2019-09-23 19:04:46] [SEVERE ] Что-то пошло не так в подписке на стрим StreamingEvent.

замечено что такая ошибка появляется при не очень стабильном интернете (возможно из-за таймаутов...).
Хотя может и не связано с этим...

Очень хотелось бы может что-нибудь по подробнее в ошибке..

Появляется редко - раньше было гораздно чаще (до версии 0.2)

Caused by: javax.net.ssl.SSLException: No PSK available. Unable to resume.

Через раз подобная ошибка.

Caused by: javax.net.ssl.SSLException: No PSK available. Unable to resume.

Указание "-Dhttps.protocols=TLSv1.1,TLSv1.2" не помогает.
Работаю с песочницей.
Необходимо в SDK добавить обработку исключения и реконнект.

Непонятный ответ /market/orderbook (облигации)

Метод /market/orderbook возвращает непонятные цены (lastPrice, closePrice) по облигациям (цена/10):
Например:
'BBG00PYL6030' (Белуга Групп)
/market/bonds
{'figi': 'BBG00PYL6030', 'ticker': 'RU000A100L63', 'isin': 'RU000A100L63', 'minPriceIncrement': 0.01, 'lot': 1, 'currency': 'RUB', 'name': 'Белуга Групп выпуск 1'}
/market/orderbook
{'figi': 'BBG00PYL6030', 'depth': 5, 'tradeStatus': 'NotAvailableForTrading', 'minPriceIncrement': 0.01, 'lastPrice': 105.47, 'closePrice': 105.47, 'bids': [], 'asks': []}
Хотя в терминале
image

Непонятно почему 'lastPrice' = Цена/10
Также непонятно, как выйти на стоимость отображаемую в терминале и мобильном приложении

Аналогичная ситуация и по остальным облигациям

Ошибка десериализации OperationType=PayIn

Привет, SDK падает при десериализации операции по внесению денег на счёт.

Используемая версия: 7fdbb61

Код:

var operations = context.getOperations(
  OffsetDateTime.parse("2019-10-01T00:00:00Z"),
  OffsetDateTime.now(),
  null).join()

Ошибка:

Exception in thread "main" java.util.concurrent.CompletionException: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `ru.tinkoff.invest.openapi.data.ExtendedOperationType` from String "PayIn": value not one of declared Enum instance names: [ServiceCommission, TaxCoupon, Sell, BrokerCommission, Coupon, MarginCommission, TaxDividend, ExchangeCommission, Dividend, PartRepayment, Buy, BuyCard]
 at [Source: (String)

Исходный JSON:

{
	"operationType": "PayIn",
	"date": "2019-10-29T12:34:20+03:00",
	"isMarginCall": false,
	"payment": 38661,
	"currency": "RUB",
	"status": "Done",
	"id": "-1"
}

См. https://github.com/TinkoffCreditSystems/invest-openapi/releases/tag/19.2

averagePositionPrice = null in portfolio

position Portfolio{positions=[PortfolioPosition{figi='BBG004730N88', ticker='SBER', isin='RU0009029540', instrumentType=Stock, balance=160.0, blocked=0, expectedYield=null, lots=16, averagePositionPrice=null, averagePositionPriceNoNkd=null}]}

Обработка неверного токена

Сейчас при использовании неверного токена (ошибочного) попытка установления websocket-соежинения приводит к появлению труднопонимаемого для пользвателя исключения. Сделать сообщение с понятным объяснением причины.

Размещение заявки в Sandbox

Доброго вечера.

Взял sdk, подключил.
Все ок.

Пытаюсь разместить в песочнице заявку на покупку - и она всегда отклонена.
Отдает трекинг id - но не очень понятно как по нему что-то отследить...

Лог (немного переделанный пример)


[2019-09-12 21:41:43] [FINE   ] Создаём подключение в режиме "песочницы"...
[2019-09-12 21:41:44] [FINE   ] Ищём по тикеру ACAD...
[2019-09-12 21:41:45] [FINE   ] Очищаем всё позиции...
[2019-09-12 21:41:45] [FINE   ] Ставим на баланс немного USD...
[2019-09-12 21:41:45] [FINE   ] Получаем активные заявки...
[2019-09-12 21:41:45] [FINE   ] Запускаем робота...
[2019-09-12 21:41:46] [FINE   ] Изменился торговый статус инструмента: normal_trading
[2019-09-12 21:41:46] [FINE   ] Новая свечка получена. Текущая цена = 39.88. Отсчётная цена = null. Сейчас нет позиции и до этого не было. Можно торговать. Размещаем лимитную заявку на покупку.
[2019-09-12 21:41:46] [INFO   ] Стратегия решила разместить Buy заявку на 1 лотов по цене 39.88 USD
[2019-09-12 21:41:46] [WARNING] Ошибка при исполнении запроса, trackingId = d8a65d33e927de65
[2019-09-12 21:41:46] [WARNING] Заявка не размещена.

На баланс там поставил больше стоимости одного лота) это проверил)

и второй вопрос с сигнатуре метода в Strategy.

public void consumeRejectedLimitOrder(OperationType operationType)

тут отдается только тип операции. а в том же consumePlacedLimitOrder есть поле reason, например. и вот оно в этом методе как то нужнее мне кажется) посмотреть почему отклонена заявка.

спасибо

Работа со стратегией по множеству инструментов

Доброго времени суток.

В Вашем примере все хорошо пока работаем с одним инструментом (и то по по хорошему я надо фильтровать поток в reactOnMarketChange на то, что данный по текущему инструменту

        if (instrumentInfo == null || !instrumentInfo.getFigi().equals(operatingInstrument.getFigi())) {
            return StrategyDecision.pass();
        }

А если мне надо запустить стратегию по двум сотням инструментов в портфеле?

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

            final CompletableFuture<Void> result = new CompletableFuture<>();
            List<StrategyExecutor> Ex = new ArrayList<>();
            context.getMarketStocks().join().getInstruments().stream().filter(i -> i.getCurrency() == Currency.RUB).forEach( i -> {
                final var strategy = new SlavonStrategy(i, logger, context);
                final var strategyExecutor = new StrategyExecutor(context, strategy, logger);
                strategyExecutor.run();
                Ex.add(strategyExecutor);
            });
            result.join();

то приходится в стратегиях фильтровать огромный поток по инструменту (события идут по всем инструментам, а не по назначенным стратегии).

Возможно тема отдельного тикета, но получить позицию в портфеле из стратегии без передачи туда контекста и запроса getPortfolio вроде как нельзя. Как получить текущую позицию? Срединную стоимость в портфеле? Передача контекста, получение getPortfolio в купе с запуском множества стратегий приводит к гонкам потоков и коллизиям.

Дайте пример как работать в одном приложении с сотнями инструментов сразу, пожалуйста.

Добавить возможность указания clientIndex в sendRequest

В функции

public void sendRequest(@NotNull final StreamingRequest request)

clientIndex вычисляется следующим образом

final int clientIndex = request.hashCode() % this.wsClients.length;

таким образом вероятность успешного unsubscribe стремится к нулю, т. к. hashCode экземпляров класса OrderbookSubscribeRequest и OrderbookUnsubscribeRequest (как пример) различен и следовательно отправятся через разные клиенты.

api.streamingContext.sendRequest(StreamingRequest.subscribeOrderbook(figi, depth))
api.streamingContext.sendRequest(StreamingRequest.unsubscribeOrderbook(figi, depth))

Предлагаю добавить к функции sendRequest параметр clientIndex, либо вместо использования hashCode экземпляра класса StreamingRequest использовать hash от результата функции onOffPairId().

404 No such route or hostname

Привет!
Хотелось подергать API-шку, но все попытки упираются вот во что:

404 Not Found
No such route or hostname

Это у меня не работает или у вас?

Infinity CompletableFuture in case of IOException

Для примера следующий метод: ### ru.tinkoff.invest.openapi.okhttp.MarketContextImpl#getMarketCandles

           @Override
           public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
               try {
                   final RestResponse<HistoricalCandles> result =
                           handleResponse(response, historicalCandlesTypeReference);
                   future.complete(Optional.of(result.payload));
               } catch (OpenApiException ex) {
                   if (ex.getCode().equals(INSTRUMENT_ERROR_MESSAGE_CODE)) {
                       future.complete(Optional.empty());
                   } else {
                       future.completeExceptionally(ex);
                   }
               }
           }

future.completeExceptionally будет вызвана только в случае OpenApiException.
Реализация okHttp:
okhttp3.RealCall.AsyncCall#execute

      boolean signalledCallback = false;
      transmitter.timeoutEnter();
      try {
        Response response = getResponseWithInterceptorChain();
        signalledCallback = true;
        responseCallback.onResponse(RealCall.this, response);
      } catch (IOException e) {
        if (signalledCallback) {
          // Do not signal the callback twice!
          Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
        } else {
          responseCallback.onFailure(RealCall.this, e);
        }
      } catch (Throwable t) {

в случае IOException не будет исполнен responseCallback.onFailure и CompletableFuture "зависнет".
Okhttp ответ разработчиков
square/okhttp#3458
This is working as designed. Use a try/catch block to recover from failures in onResponse().

Подобная проблема есть и в других запросах (не только getMarketCandles)

Несколько тикеров

Вопрос - Strategy в SDK задумывалось под работу с одним тикером одновременно?

Я хотел использовать несколько - и было два варианта:

  1. Либо запускать несколько StrategyExecutor'ов c разными стратегиями.

  2. Либо делать стратегию-сплиттер (которая по тикеру проксирует запросы в другие стратегии).

Вариант 1 не прокатил - я во всех стратегиях получал одни и те же свечи - то есть все тикеры кидались во все стратегии.

Вариант 2 - тут проблема что, например, в PlacedLimitOrder нету признака (ни figi, ни тикера ).
При этом figi есть в LimitOrder....

Попытка восстановления Streaming API клиента #

При запуске куска кода из Example
var api = fac.createOpenApiClient(se -> logger.info("stream up"),
ex -> logger.severe("stream drop"));
api.marketContext.getMarketBonds().join();

получаю в логах:

INFO: Логгер запущен
февр. 12, 2020 7:37:13 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #5 подключён
февр. 12, 2020 7:37:13 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #1 подключён
февр. 12, 2020 7:37:13 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #4 подключён
февр. 12, 2020 7:37:13 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #6 подключён
февр. 12, 2020 7:37:13 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #3 подключён
февр. 12, 2020 7:37:13 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #2 подключён
февр. 12, 2020 7:37:14 PM okhttp3.internal.platform.Platform log
INFO: Callback failure for call to https://api-invest.tinkoff.ru/...
com.fasterxml.jackson.databind.exc.MismatchedInputException: Missing required creator property 'type' (index 7)
at [Source: (okio.RealBufferedSource$inputStream$1); line: 1, column: 225] (through reference chain: ru.tinkoff.invest.openapi.models.RestResponse["payload"]->ru.tinkoff.invest.openapi.models.market.InstrumentsList["instruments"]->java.util.ArrayList[0]->ru.tinkoff.invest.openapi.models.market.Instrument["type"])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1456)
at com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer._findMissing(PropertyValueBuffer.java:194)
at com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer.getParameters(PropertyValueBuffer.java:160)
at com.fasterxml.jackson.databind.deser.ValueInstantiator.createFromObjectWith(ValueInstantiator.java:229)
at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:198)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:488)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:530)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:528)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:417)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:530)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:528)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:417)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3250)
at ru.tinkoff.invest.openapi.okhttp.BaseContextImpl.handleResponse(BaseContextImpl.java:72)
at ru.tinkoff.invest.openapi.okhttp.MarketContextImpl$6.onResponse(MarketContextImpl.java:98)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #4
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #4
февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #6
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #6
февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #5
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #5
февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #3
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #3
февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #2
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #2
февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #1
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:14 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #1
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #4 активно 0 подписок
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #6 активно 0 подписок
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #5 активно 0 подписок
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #3 активно 0 подписок
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #1 активно 0 подписок
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #2 активно 0 подписок
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #1 подключён
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #2 подключён
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #4 подключён
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #6 подключён
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #3 подключён
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #5 подключён
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #2
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #2
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #1
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #1
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #5
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #5
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #4
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #4
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #6
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #6
февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #3
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:15 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #3
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #2 активно 0 подписок
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #1 активно 0 подписок
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #5 активно 0 подписок
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #4 активно 0 подписок
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #6 активно 0 подписок
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: У клиента #3 активно 0 подписок
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #1 подключён
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #5 подключён
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onOpen
INFO: Streaming API клиент #2 подключён
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #6
java.net.ProtocolException: Expected HTTP 101 response but was '429 Too Many Requests'
at okhttp3.internal.ws.RealWebSocket.checkUpgradeSuccess$okhttp(RealWebSocket.kt:185)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:156)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #6
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #3
java.net.ProtocolException: Expected HTTP 101 response but was '429 Too Many Requests'
at okhttp3.internal.ws.RealWebSocket.checkUpgradeSuccess$okhttp(RealWebSocket.kt:185)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:156)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #3
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #4
java.net.ProtocolException: Expected HTTP 101 response but was '429 Too Many Requests'
at okhttp3.internal.ws.RealWebSocket.checkUpgradeSuccess$okhttp(RealWebSocket.kt:185)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:156)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #4
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #2
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #5
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #5
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #2
февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener onFailure
SEVERE: Что-то произошло в Streaming API клиенте #1
java.io.EOFException
at okio.RealBufferedSource.require(RealBufferedSource.kt:201)
at okio.RealBufferedSource.readByte(RealBufferedSource.kt:210)
at okhttp3.internal.ws.WebSocketReader.readHeader(WebSocketReader.kt:113)
at okhttp3.internal.ws.WebSocketReader.processNextFrame(WebSocketReader.kt:96)
at okhttp3.internal.ws.RealWebSocket.loopReader(RealWebSocket.kt:240)
at okhttp3.internal.ws.RealWebSocket$connect$1.onResponse(RealWebSocket.kt:170)
at okhttp3.RealCall$AsyncCall.run(RealCall.kt:140)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:830)

февр. 12, 2020 7:37:16 PM ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl restore
INFO: Попытка восстановления Streaming API клиента #1

Мониторинг состояния заявки

В текущей реализации StrategyExecutor, после успешного выставления заявки отсутствует механизм проверки её судьбы (успешно исполнилась или нет). Необходимо разработать такой механизм, а также сформировать реакцию не неудачное исполнение.

Не соответствующие аннотации @NotNull

  1. Метод OperationsContext.getOperations
    параметр figi может быть null, так как есть возможность получать все операции
  2. Класс Instrument
    ....
    // @JsonProperty(value = "type", required = true)
    @JsonProperty(value = "type") // MY CHANGE!!! This property is not obligatory for some reason!!!
    @NotNull
    final InstrumentType type
    ....
    Например, если я получаю InstrumentList по методу marketContext.getMarketStocks() то приходит в респонсе intrumentList.instrument[i].type = null

Статус API

Есть в планах реализовать ручку по которой можно будет делать health check, чтобы если всё плохо, то останавливать автоматическую торговлю?

Lot quantity 0 is not positive

Если объём используемых средств меньше цены за один лот, то появляется ошибка:

ru.tinkoff.invest.openapi.exceptions.OpenApiException: Lot quantity 0 is not positive
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at com.fasterxml.jackson.databind.introspect.AnnotatedConstructor.call(AnnotatedConstructor.java:124)
	at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:283)
	at com.fasterxml.jackson.databind.deser.ValueInstantiator.createFromObjectWith(ValueInstantiator.java:229)
	at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:195)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:422)
	at com.fasterxml.jackson.databind.deser.std.ThrowableDeserializer.deserializeFromObject(ThrowableDeserializer.java:65)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:530)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:528)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:417)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3023)
	at ru.tinkoff.invest.openapi.wrapper.impl.ContextImpl.handleResponse(ContextImpl.java:326)
	at ru.tinkoff.invest.openapi.wrapper.impl.ContextImpl.lambda$sendPostRequest$18(ContextImpl.java:311)
	at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:610)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:840)
	at java.base/java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:479)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)

Бесконечное восстановление Streaming API клиента

Добрый день, а подскажите, пожалуйста, я пытаюсь подключиться с некорректным токеном, получаю соотв. ошибку, закрываю OpenApi объект, но почему-то дальше начинается бесконечная попытка что-то восстановить:

У клиента #3 активно 0 подписок
Что-то произошло в Streaming API клиенте #4
java.io.InterruptedIOException: executor rejected
at okhttp3.RealCall$AsyncCall.executeOn(RealCall.java:157) ~[okhttp-3.14.7.jar:na]
at okhttp3.Dispatcher.promoteAndExecute(Dispatcher.java:204) ~[okhttp-3.14.7.jar:na]
at okhttp3.Dispatcher.enqueue(Dispatcher.java:144) ~[okhttp-3.14.7.jar:na]
at okhttp3.RealCall.enqueue(RealCall.java:93) ~[okhttp-3.14.7.jar:na]
at okhttp3.internal.ws.RealWebSocket.connect(RealWebSocket.java:190) ~[okhttp-3.14.7.jar:na]
at okhttp3.OkHttpClient.newWebSocket(OkHttpClient.java:409) ~[okhttp-3.14.7.jar:na]
at ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl.restore(StreamingContextImpl.java:301) ~[openapi-java-sdk-java8-0.4.1.jar:na]
at ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl$StreamingApiListener.onFailure(StreamingContextImpl.java:372) ~[openapi-java-sdk-java8-0.4.1.jar:na]
at okhttp3.internal.ws.RealWebSocket.failWebSocket(RealWebSocket.java:570) ~[okhttp-3.14.7.jar:na]
at okhttp3.internal.ws.RealWebSocket$1.onResponse(RealWebSocket.java:199) ~[okhttp-3.14.7.jar:na]
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174) ~[okhttp-3.14.7.jar:na]
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) ~[okhttp-3.14.7.jar:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.util.concurrent.RejectedExecutionException: Task okhttp3.RealCall$AsyncCall@25a9b823 rejected from java.util.concurrent.ThreadPoolExecutor@11c1a6f4[Shutting down, pool size = 6, active threads = 6, queued tasks = 0, completed tasks = 1]
at java.base/java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2055) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:825) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1355) ~[na:na]
at okhttp3.RealCall$AsyncCall.executeOn(RealCall.java:154) ~[okhttp-3.14.7.jar:na]
... 14 common frames omitted

Что это такое и как с этим быть?

Cannot deserialize value of type `ru.tinkoff.invest.openapi.models.user.BrokerAccountType` from String "TinkoffIis"

INFO: Callback failure for call to https://api-invest.tinkoff.ru/...
com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `ru.tinkoff.invest.openapi.models.user.BrokerAccountType` from String "TinkoffIis": not one of the values accepted for Enum class: [TinkoffIis , Tinkoff]
 at [Source: (okio.RealBufferedSource$inputStream$1); line: 1, column: 78] (through reference chain: ru.tinkoff.invest.openapi.models.RestResponse["payload"]->ru.tinkoff.invest.openapi.models.user.AccountsList["accounts"]-

grpc

сделайте grpc с нормальным стримингом, там все из коробки, ничего клиентского писать вообще не надо, только примеры. сэкономите нервы и бабки и себе и людям

"Что-то пошло не так в подписке на стрим StreamingEvent."

2019-09-13 13:19:55] [SEVERE ] Что-то пошло не так в подписке на стрим StreamingEvent.

Собственно, это сообщение теперь всегда) в примере из sdk для java.
Хотя работало сегодня утром.

Может тех работы ведутся сейчас какие-то ?

executedPrice в PlacedLimitOrder

нужна цена executedPrice в PlacedLimitOrder
тк он содержит executedLots
из портфеля вытаскивать среднюю цену неудобно
цена лимитного ордера часто другая чем executed

Активные заявки по валюте не возвращаются.

Метод OrdersContext.getOrders(String brokerAccountId) не возвращает список активных заявок по валюте.
Воспроизводство:

  1. Создаем лимитный ордер на покупку $1к за 70 рублей
  2. OrdersContext.getOrders() возвращает пустой список.

Через какое-то время перестают приходить апдейты

Сейчас заметил что вначале все ок.
Но если оставить минут на 5 висеть - то апдейты в
consumeCandle
и в consumeOrderbook
перестают приходить.

Просто все подвисает и ничего не происходит.
Ошибок нет.

image

Видел пулл реквест на новую версию - на ней, соответственно, не проверял еще. Может там исправится

OkHttp проблемы с зависимостями в openapi-java-sdk-java8

При старте приложение на Spring Boot 2.2+ получаю следующую ошибку

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    ru.tinkoff.invest.openapi.okhttp.SandboxContextImpl.performRegistration(SandboxContextImpl.java:45)

The following method did not exist:

    okhttp3.RequestBody.create([B)Lokhttp3/RequestBody;

The method's class, okhttp3.RequestBody, is available from the following locations:

    jar:file:/home/agavrilov/.m2/repository/com/squareup/okhttp3/okhttp/3.14.7/okhttp-3.14.7.jar!/okhttp3/RequestBody.class

It was loaded from the following location:

    file:/home/agavrilov/.m2/repository/com/squareup/okhttp3/okhttp/3.14.7/okhttp-3.14.7.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody

Разных версии okhttp в classpath нет. Зависимость только одна в самом SDK

$ mvn dependency:tree 
[INFO] ru.malltshik:tinkoff-invest:jar:0.0.1-SNAPSHOT
[INFO] +- ru.tinkoff.invest:openapi-java-sdk-java8:jar:0.4.1:compile
[INFO] |  +- ru.tinkoff.invest:openapi-java-sdk-core:jar:0.4.1:compile
.....
[INFO] |  +- org.reactivestreams:reactive-streams:jar:1.0.3:compile
[INFO] |  \- com.squareup.okhttp3:okhttp:jar:3.14.7:compile
[INFO] |     \- com.squareup.okio:okio:jar:1.17.2:compile
...

В okhttp:jar:3.14.7 нет тех методов, которые вы используете в openapi-java-sdk-java8

В openapi-java-sdk-java8 вы используете

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.3.1</version>
        </dependency>

В общем если не добавить себе в проект зависимость на okhttp 4.3.1 то работать не будет

java8 sdk, подписка на свечи - ничего не приходит

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

final Logger logger =  Logger.getLogger(this.getClass().getName());

        logger.info("Starting...");

        final String token = "<my main token>";
        OkHttpOpenApiFactory factory = new OkHttpOpenApiFactory(token, logger);
        try (final OpenApi api = factory.createOpenApiClient(Executors.newFixedThreadPool(4))) {
            api.getStreamingContext().getEventPublisher().subscribe(new Subscriber<StreamingEvent>() {
                @Override
                public void onSubscribe(Subscription s) {
                    logger.info("Subscribed");
                }

                @Override
                public void onNext(StreamingEvent streamingEvent) {
                    logger.info("event: " + streamingEvent);
                }

                @Override
                public void onError(Throwable t) {
                    logger.severe("failed: " + t);
                }

                @Override
                public void onComplete() {
                    logger.info("completed");
                }
            });

            // оформляем подписку на поток "свечей"
            final String sberFigi = "BBG004730N88"; // ticker=SBER
            api.getStreamingContext().sendRequest(StreamingRequest.subscribeCandle(sberFigi, CandleInterval.ONE_MIN));

            final String boeingFigi = "BBG000BCSST7"; // ticker=BA
            api.getStreamingContext().sendRequest(StreamingRequest.subscribeCandle(sberFigi, CandleInterval.ONE_MIN));

            MINUTES.sleep(10);
        } catch (Exception e) {
            logger.severe("failed: " + e);
        }

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

2020-04-16 18:25:24.684  INFO   --- [           main] ru.yac.jhktvue.MyTests                   : Starting...
2020-04-16 18:25:25.109  INFO   --- [pool-2-thread-1] ru.yac.jhktvue.MyTests                   : Subscribed
2020-04-16 18:25:25.422  INFO   --- [.tinkoff.ru/...] ru.yac.jhktvue.MyTests                   : Streaming API клиент #6 подключён
2020-04-16 18:25:25.423  INFO   --- [.tinkoff.ru/...] ru.yac.jhktvue.MyTests                   : Streaming API клиент #2 подключён
2020-04-16 18:25:25.436  INFO   --- [.tinkoff.ru/...] ru.yac.jhktvue.MyTests                   : Streaming API клиент #4 подключён
2020-04-16 18:25:25.439  INFO   --- [.tinkoff.ru/...] ru.yac.jhktvue.MyTests                   : Streaming API клиент #1 подключён
2020-04-16 18:25:25.439  INFO   --- [.tinkoff.ru/...] ru.yac.jhktvue.MyTests                   : Streaming API клиент #3 подключён
2020-04-16 18:25:25.440  INFO   --- [.tinkoff.ru/...] ru.yac.jhktvue.MyTests                   : Streaming API клиент #5 подключён

подключение через мавен:

<dependency>
            <groupId>ru.tinkoff.invest</groupId>
<!--            <artifactId>openapi-java-sdk-core</artifactId>-->
              <artifactId>openapi-java-sdk-java8</artifactId>
            <!--  <artifactId>openapi-java-sdk-example</artifactId>-->
            <version>0.4.1</version>
        </dependency>

Что не так?

429 Too Many Requests на простом получении списка акций

Простой перебор инструментов и их статусов вызывает ответ 429 на песочнице. При этом в коде SDK такой ответ не отрабатывается и падает в Exceptions.

            context.getMarketStocks().join().getInstruments().stream().filter(i -> i.getCurrency() == Currency.RUB).sorted(new Comparator<Instrument>() {
                @Override
                public int compare(Instrument o1, Instrument o2) {
                    return o1.getName().compareTo(o2.getName());
                }
            }).sequential().forEach(i -> {
                final Orderbook ins;
                ins = context.getMarketOrderbook(i.getFigi(),1).join();
                final var O = new Object[]{i.getName(), i.getTicker(), i.getCurrency(), i.getIsin(), i.getLot(), i.getMinPriceIncrement(), ins.getTradeStatus().toString()};
                model.addRow(O);
            });

Получение operations выбрасывает исключение

Привет,

Код падает с исключением:

var connection = ConnectionFactory.connect(token, sdkLogger).join()
var context = connection.context();
var operations = context.getOperations(LocalDate.parse("2019-09-01"), OperationInterval.MONTH, "").join()

Exception:

Exception in thread "main" java.util.concurrent.CompletionException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
 at [Source: (String)"{"trackingId":"451a9dd77b00f414","payload":{"operations":[]},"status":"Ok"}"; line: 1, column: 44] (through reference chain: ru.tinkoff.trading.openapi.data.OpenApiResponse["payload"])
	at java.base/java.util.concurrent.CompletableFuture.encodeRelay(CompletableFuture.java:367)
	at java.base/java.util.concurrent.CompletableFuture.completeRelay(CompletableFuture.java:376)
	at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1074)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.postFire(CompletableFuture.java:610)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:840)
	at java.base/java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:479)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
 at [Source: (String)"{"trackingId":"451a9dd77b00f414","payload":{"operations":[]},"status":"Ok"}"; line: 1, column: 44] (through reference chain: ru.tinkoff.trading.openapi.data.OpenApiResponse["payload"])
	at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
	at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139)
	at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
	at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:530)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:528)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:417)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1287)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3023)
	at ru.tinkoff.trading.openapi.wrapper.impl.ContextImpl.handleResponse(ContextImpl.java:228)
	at ru.tinkoff.trading.openapi.wrapper.impl.ContextImpl.lambda$sendGetRequest$14(ContextImpl.java:195)
	at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)

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

Добавить sdk в репозиторий

Было бы здорово, если sdk появился в публичных репозиториях maven/gradle, чтобы не приходилось подкладывать jar'ник вручную.

Несоответствие README

Добрый день.

Ещё 6-го февраля всё было ОК, сегодня после чистого git clone и ./gradlew build
получаем
./core/build/libs/core-0.4-SNAPSHOT.jar размером 66КБ
который в 2 раза меньше, чем старый sdk-0.4-SNAPSHOT.jar (106КБ)

Проект с новым jar-файлом ожидаемо не компилируется, всё красное.

ещё какие-то файлы, тоже 55КБ
./sdk-java8/build/libs/lib/core-0.4-SNAPSHOT.jar
./sdk-java8/build/libs/sdk-java8-0.4-SNAPSHOT.jar

Прошу обновить документацию, сейчас там написано про sdk/build/libs
Этого пути уже нет.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.