Git Product home page Git Product logo

invest-api-csharp-sdk's Introduction

InvestApi .NET SDK

Build NuGet version (Tinkoff Trading OpenApi) NuGet version (Tinkoff Trading OpenApi)

Данный проект представляет собой инструментарий на языке C# для работы с grpc-интерфейсом торговой платформы Тинькофф Инвестиции.

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

Nuget

SDK доступен на nuget.org, для подключения добавьте в проект зависимость Tinkoff.InvestApi.

Сборка из исходников

Если вы хотите сами собрать пакет из исходников, а не использовать Nuget, вам понадобится:

  • git
  • dotnet SDK 6.0.

Основной код сервисов генерируется по .proto файлам при сборке, для этого используются source generators. Proto файлы лежат в submodule. Поэтому необходимо клонировать репозиторий вместе с submodule, это можно сделать командой:

git clone --recurse-submodules https://github.com/Tinkoff/invest-api-csharp-sdk.git

Затем перейдите в директорию проекта и выполните следующую команду:

dotnet build -c Release

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

Подробную документацию по InvestApi можно найти по ссылке.

Быстрый старт

Для взаимодействия к InvestApi используется класс InvestApiClient, который является фасадом для grpc сервисов. Есть несколько способов его создания.

Создание через фабрику

Этот способ подходит для быстрого старта или для приложений без Generic Host, например WinForms или консольные приложения в старом стиле.

var client = InvestApiClientFactory.Create("<token>");

Создание через DI

Для проектов, использующих Generic Host, например AspNetCore или консольные приложения в новом стиле, можно зарегистрировать InvestApiClient в DI.

public void ConfigureServices(IServiceCollection services)
{
    services.AddInvestApiClient((_, settings) => settings.AccessToken = "<token>");
}

Далее InvestApiClient можно внедрить непосредственно в места использования.

class TradingBot 
{
    public TradingBot(InvestApiClient investApiClient)
    {
    }
}

Примеры

Примеры по отдельным функциям

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

Сложное приложение

Проект Tinkoff.InvestApi.Sample является примером использования SDK. При запуске будут использованы методы InvestApi, результаты будут выведены в консоль. Перед запуском сохраните свой токен в user secrets:

cd Tinkoff.InvestApi.Sample
dotnet user-secrets set "AccessToken" "<token>"

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

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

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

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

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

invest-api-csharp-sdk's People

Contributors

alexandervolkovtcs avatar oldnavy1989 avatar olsh avatar rus-art avatar tvlzh avatar vabka avatar vozyakovav 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

Watchers

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

invest-api-csharp-sdk's Issues

Кто-нибудь может поделиться примером?

Я ничего не понимаю в этом SDK. Все эти "подробные описания" лично мне ничего не описывают. Он вообще работает? Хоть кому-нибудь удалось на C# что-нибудь получить от серверов Тинькофф? Поделитесь, пожалуйста примером, который работает. Спасибо.

PortfolioStream

Господа а сабж вообще рабочий?) При попытке использовать возвращает {{ "accounts": [ { "accountId": "**********", "subscriptionStatus": "PORTFOLIO_SUBSCRIPTION_STATUS_SUCCESS" } ] }} , и при этом null в свойствах Ping и Portfolio

Добавить пример использования OrderService

  • Убеждаемся, что параметр реальной торговли включен, получаем текущую цену из #2, убеждаемся, что средств достаточно и выставляем лимитный ордер на покупку по цене (текущая цена минус 5% с учетом округления до ближайшего min_price_increment. Если ниже – то использовать limit_down), запоминаем его id
  • Получаем список активных ордеров (getOrders) и убеждаемся, что наша новая заявка там появилась
  • Отменяем заявку

А можно увидеть хоть какой-нибудь работающий пример?

Кажется единственная цель этого SDK - чтобы никто никогда и нечего не смог написать на этом API. Человек с начальными знаниями в C# просто идет н@Х... мимо. Что у вас в разделе "быстрый старт"? Это что такое? Какой, нахрен, Services? как с ним работать? Вы издеваетесь что-ли? UserSecrets - отдельный изощренный способ послать пользователя на 3 буквы. Я все понимаю - не правильно хранить токен в тексте кода, но, простите, во-первых это не вам решать, во вторых, я только что на openApi хранил его в коде, и до сих пор жив, а в третьих, дайте же хоть какой-нибудь пример, для запуска которого не нужно штудировать отвлеченные темы в программировании.

Просто windows forms программу. Вида: Токен сюда, эта кнопка выводит в консоль список инструментов, эта кнопка выводит текущую цену такого-то figi, эта кнопка создает заявку на покупку, эта на продажу. Я слишком многого прошу?

Не получается получить историю по минутным свечам. Работает только часовые и дневные

Добрый день.
Быстрый старт в консоли:
InvestApiClient client = InvestApiClientFactory.Create(token); GetCandlesRequest getCandlesRequest = new GetCandlesRequest() { Figi = figi, From = Timestamp.FromDateTime(DateTime.UtcNow.AddDays(-6)), Interval = Tinkoff.InvestApi.V1.CandleInterval.Hour, To = Timestamp.FromDateTime(DateTime.UtcNow) }; var result = client.MarketData.GetCandles(getCandlesRequest);
Выполняется успешно.
Однако если выбрать минутные интервалы, то происходит ошибка: "Grpc.Core.RpcException: "Status(StatusCode="InvalidArgument", Detail="30014")""
К примеру:
InvestApiClient client = InvestApiClientFactory.Create(token); GetCandlesRequest getCandlesRequest = new GetCandlesRequest() { Figi = figi, From = Timestamp.FromDateTime(DateTime.UtcNow.AddDays(-6)), Interval = Tinkoff.InvestApi.V1.CandleInterval._5Min, To = Timestamp.FromDateTime(DateTime.UtcNow) }; var result = client.MarketData.GetCandles(getCandlesRequest);

Просьба добавить получение данных из объекта(не сервиса) как это реализовано в текущем java sdk и как примерно было в старом c# sdk

Привет!
Спасибо за уже проделанную работу!
Есть несколько просьб/замечаний)

  • В старом шарповом SDK, была удобная возможность получать торговые данные без прибивания себя гвоздями к потолку за яйца на сервисы ASP.
    На соседнем актуальном https://github.com/Tinkoff/invest-api-java-sdk это уже даже изобрели.

Пример из старого SDK:

using Tinkoff.Trading.OpenApi.Network;
...
// токен аутентификации
var token = "my.token";
// для работы в песочнице используйте GetSandboxConnection
var connection = ConnectionFactory.GetConnection(token);
var context = connection.Context;

// вся работа происходит асинхронно через объект контекста
var portfolio = await context.PortfolioAsync();

Просьба вернуть конструктивно схожий функционал.

  • Так же, хочется иметь возможность подписываться на обновления по инструментам.
    Пример ожидаемой семантики:
var marketClient= new MarketClient(Figi, бла, бла, бла);
marketClient.Events.Orderbook += myHandler;
marketClient.Start();
Ну или что то в этом духе.
  • Молоток, долото и пассатижи описанные в https://github.com/Tinkoff/invest-api-csharp-sdk/blob/main/CONTRIBUTING.md - это все конечно весело и интересно, но как Вы и сами можете догадаться не очень удобно. Особенно, когда планируешь пользоваться готовым NuGet...
    Просьба автоматизировать обновление/синхронизацию версий с базовым сабмодулем.
    Спасибо огромное!
    С нетерпением жду позитивных изменений!

Пример MarketDataStream не работает

Пытаюсь понять как работать со стримами.
Запускаю пример приведенный здесь:
https://github.com/Tinkoff/invest-api-csharp-sdk/tree/main/Examples/Tinkoff.InvestApi.Examples.MarketDataStream
получаю один ответ:
{"SubscribeCandlesResponse":{"TrackingId":"62fe93e1c85ebbbb2fd31637ab7a5a8d","CandlesSubscriptions":[{"Figi":"BBG004730N88","Interval":1,"SubscriptionStatus":3}]},"SubscribeOrderBookResponse":null,"SubscribeTradesResponse":null,"SubscribeInfoResponse":null,"Candle":null,"Trade":null,"Orderbook":null,"TradingStatus":null,"Ping":null,"SubscribeLastPriceResponse":null,"LastPrice":null,"PayloadCase":1}
и больше ничего не происходит.

Подскажите пожалуйста, в чем проблема?

Лимитная политика не даёт получить календарь купонов

Я хочу посмотреть график купонных выплат по всем облигациям. Если я прохожусь по всем облигациям и запрашиваю по каждой график, я получаю ResourceExhausted. Если я не указываю GetBondCouponsRequest.Figi, думая что таким образом получу все купоны всех облигаций за выбранные даты, то я получаю Grpc.Core.RpcException: "Status(StatusCode="InvalidArgument", Detail="30008")"

Добавить пример использования stream сервиса Marketdata

  • По первому стриму подписываемся на стаканы и статусы торговли по N бумагам из InstrumentsServiceSample Подписывать – двумя разными пакетами.
  • Во второму стриму – на свечи и трейды.
  • Печатаем приходящие данные

Отсутствие поля CurrentNkd в классе Bond

В классе PortfolioPosition имеется переменная .CurrentNkd;
В классе Bond переменная отсутствует;

Это неправильно и переменную .CurrentNkd нужно целиком перенести в класс Bond т.к. класс PortfolioPosition относится ко всем активам при этом НКД у акций нет.

Добавить пример использования unary методов MarketdataService

  • Получаем свечи по разным таймфреймам (минута, час, день) getcandles для дешевых бумаг
  • Получаем lastPrice (для конкретной бумаги для всех бумаг (при пустых параметрах)
  • Получаем Стакан (orderbook) и текущий статус торговли (gettradingstatus)
  • Покупки включены и средств хватает

В качестве конкретных бумаг можно использовать:

RUB(лотность = 1, 1-2 рубля за лот)

  • BBG00RPRPX12
  • BBG00V7649K4
  • BBG00V9V16J8
  • BBG00R980XY3
  • BBG00R9805F5

USD(лотность = 1, 1-2 доллара за лот):

  • BBG00PVNWFM6
  • BBG000BTYP37
  • BBG00JN4FXG8
  • BBG00PVNWQ15

Добавить пример использования SandboxService

  • Проверяем количество средств на счете песочницы, при недостаточности - пополняем
  • По логике из #4 выставляем ордер и отменяем в песочнице
  • Дополнительно выставляем рыночный ордер в песочнице
  • Проверяем, что ордера появились в списке операций песочницы.

InvestAPi.Sample не работает.

Если делать по вашему мануалу , то на этом шаге:

Сборка

Для сборки вам потребуется dotnet SDK 6.0. Перейдите в директорию проекта и выполните следующую команду:

dotnet build -c Release

Основной код сервисов генерируется по .proto файлам при сборке, для этого используются source generators.

Выдаётся куча ошибок, типа:
error CS0246: The type or namespace name 'MarketDataService' could not be found (are you missing a us
ing directive or an assembly reference?)

Т.е. у вас в мануале какой-то промежуточный шаг пропущен...

Добавить пример использования TradeStream сервиса OrderService

  • Подписываемся на TradeStream сервиса OrderService
  • Убеждаемся, что параметр реальной торговли включен, получаем текущую цену #2, убеждаемся, что средств достаточно и выставляем рыночный ордер на покупку
  • Получаем трейды по нашему ордеру в стриме и печатаем их

Подключение к Sandbox endpoint

В настройках клиента нет возможности указать адрес endpoint'а и, соответственно, нет возможности нормально работать с песочницей. Можно ли добавить в конфигурацию AddInvestApiClient возможность указать адрес endpoint'а?

Версия релиза.

Поясните по версиям. Сейчас на git-е официальная последняя версия:
image
В основном репозитории:
image
При этом по версии csharp-а я не нашёл каких либо описаний последних изменений. И как версия csharp соотносится с версией в основном репозитории?
Также необходимо указать версию на странице в поле Releases:
image

Почему не работает аутентификация по Sandbox токену?

Выдает такую ошибку:

fail: Microsoft.Extensions.Hosting.Internal.Host[9]
      BackgroundService failed
      Grpc.Core.RpcException: Status(StatusCode="Unauthenticated", Detail="")
         at Grpc.Net.Client.Internal.Retry.RetryCallBase`2.GetResponseAsync()
         at Tinkoff.InvestApi.Sample.UsersServiceSample.GetUserInfoDescriptionAsync(CancellationToken cancellationToken) in C:\Projects\invest-api-csharp-sdk-main\Tinkoff.InvestApi.Sample\UsersServiceSample.cs:line 17
         at Tinkoff.InvestApi.Sample.AsyncSample.ExecuteAsync(CancellationToken stoppingToken) in C:\Projects\invest-api-csharp-sdk-main\Tinkoff.InvestApi.Sample\AsyncSample.cs:line 18
         at Microsoft.Extensions.Hosting.Internal.Host.TryExecuteBackgroundServiceAsync(BackgroundService backgroundService)

P.S. обычный токен работает

Не причины ошибки при выставлении поручения в песочнице

Не причины ошибки при выставлении поручения в песочнице
Пример торгового поручения

03/09/2023 18:06:01 +03:00 -
MRKY: BBG000C7P5M7 -
ордер Limit цена за лот - 412,5. Лотов: 48. Цена текущая: 0.0417. lotSize: 10000 priceStep: 0.00005. Результат - ошибка. Status(StatusCode="FailedPrecondition", Detail="90001")

Т.е. почему-при торговле всеми инструментами, цена которых меньше единицы я получаю ошибку 90001 (требуется подтверждение операции).
При этом подробностей, как обещает документация api в тексте ошибке нет. Просто текст :
Detail="90001

Ранняя валидация токена.

Не плохо было бы сделать метод ранней валидации токена, чтобы он проверялся на этапе добавления сервиса в asp net, типа:
builder.Services.AddInvestApiClien(бла, бла, бла).ValidateOnStart();
Сейчас получается, только после startup-а можно провалидировать.

Ошибка при получении котировок (GetCandlesAsync) на малом временном интервале при большом таймфрейме

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

  • старт = 21.01.2022 03:00:00
  • финиш = 21.01.2022 04:00:00
  • таймфрейм = 1 день

Получаю Grpc.Core.RpcException: "Status(StatusCode="InvalidArgument", Detail="30014")"
Ожидаю пустую коллекцию элементов.

Поясню зачем такой "странный" запрос. Встроил в софт кеширующий механизм, который обновляет только те данные, которые ещё не выкачивались, чтобы снизить нагрузку на сервера. Соответственно, кейс, когда запрос на обновление котировок инициируется через час с предыдущего обновления. Понятно, что за это время данных новых не пришло (если не было перехода через сутки). Ожидаю, что и вернётся мне пустая коллекция, а не exception.
Не очень, пожалуй, разумно во всех клиентах SDK добавлять логику проверки на такой случай. Логичнее, на мой взгляд, сделать это в самом SDK.
Экономии на доступе к ресурсам точно не добиться, аргументируя тем, что "у нас такие правила, следуйте им, мы экономим". Разработчики скорее всего будут по прежнему использовать те же методы SDK и при возникновении исключения говорить, что "новых данных нет", но обращение и нагрузка на сервер всё равно будет.

Есть ли способ интерактивного взаимодействия с либой?

Я так понимаю, все тут заточено под сервисы и т. д. Очень хотелось бы, чтобы можно было из юпитер ноутбука со своим портфелем играться. Планируется ли такое API?

В старом API свой портфель можно было получить тремя строчками:

var connection = ConnectionFactory.GetConnection(token);
var context = connection.Context;
var portfolio = await context.PortfolioAsync();

но теперь оно выдает ошибку Tinkoff.Trading.OpenApi.Network.OpenApiException: Unauthorized: You have no access to that resource.., я так понимаю, это апи закрыли. А в новом такой красоты я не нашел, если я, конечно, все правильно понимаю.

Не устанавливается цена исполнения стоп-ордера

tp=90; PostStopOrderRequest postStopOrderRequest = new PostStopOrderRequest(); postStopOrderRequest.AccountId = accountID; postStopOrderRequest.Direction = StopOrderDirection.Sell; postStopOrderRequest.Figi = pos.Figi; postStopOrderRequest.Quantity = (long)ConvertQuotationToDecimal(pos.QuantityLots); postStopOrderRequest.StopOrderType = StopOrderType.TakeProfit; postStopOrderRequest.ExpirationType = StopOrderExpirationType.GoodTillDate; postStopOrderRequest.ExpireDate = DateTime.SpecifyKind(DateTime.Now.AddDays(stopOrdersLifeTime), DateTimeKind.Utc).ToTimestamp(); Quotation p = new Quotation(); p.Units = (long)Math.Truncate((decimal)tp); p.Nano = (int)Math.Truncate(1000000000 * ((decimal)tp - p.Units)); postStopOrderRequest.Price = p; postStopOrderRequest.StopPrice = p; client.StopOrders.PostStopOrder(postStopOrderRequest);
Цена активации = 99, цена исполнения = 0, несмотря на указанное значение postStopOrderRequest.Price

gRPC клиент для подключения к серверам Тинькофф.

Мне удалось подключиться через программу Kreya, которая описана в документации. Пытаюсь теперь создать на C# gRPC клиента, который подключится к серверам и выполнит нужные мне запросы.
Создаю приложение Windows Forms .NET 6, загружаю NuGet`ы - Google.Protobuf, Grpc.Net.Client, Grpc.Tools. Копирую все Proto-файлы в папку Protos. В коде пишу using Grpc.Net.Client; а в событии нажатия на кнопку using var chanel = GrpcChannel.ForAddress("https://invest-public-api.tinkoff.ru:443"); и если дальше следовать учебникам из YouTube, нужно написать строку var client = new <имя пэкеджа из Proto файла>.InstrumentsService(chanel); - и вот это уже не срабатывает. Имя пэкеджа в файле instruments.proto = "tinkoff.public.invest.api.contract.v1", если попытаться написать var client = new tinkoff.public.invest.api.contract.v1.InstrumentsService(chanel); шарп шлет лесом. Что делать не понятно - может переименовать покороче? К тому же не понятно, нужно ли proto-файлам в свойствах назначать Build action = Protobuf compiler, или нет. Кажется, что нужно, но если делаю так, при сборке вываливаются десятки ошибок из этих файлов.

Кто-то может подсказать, как пройти дальше? Я в тупике!

Получить стоимость актива (к примеру курс доллара к рублю)

Как получить курс доллара к рублю или стоимость любого актива?

  1. Вот способ, но единственный ли он?
    GetCandlesRequest candlesRequest = new GetCandlesRequest()
    {
    Figi = "BBG0013HGFT4",
    Interval = CandleInterval._15Min,
    From = DateTime.Now.AddDays(-1).ToUniversalTime().ToTimestamp(),
    To = DateTime.Now.ToUniversalTime().ToTimestamp()
    };
    var usd = clients[0].MarketData.GetCandles(candlesRequest);
    Console.WriteLine(usd.Candles.Last().Close);

  2. Как использовать .MarketData.GetLastPrices(GetLastPricesRequest), если у GetLastPricesRequest figi только get{}?

Ошибка Grpc.Core.RpcException: Unauthenticated

  1. Создал новый VS2022 Solution, подключил к нему проект Tinkoff.InvestApi.Sample
  2. Добавил в Dependencies-Packages пакет Tinkoff.InvestAPI 0.1.0
  3. Создал токен для sandbox по инструкции, добавил его в секреты проекта
  4. Собрал и запустил проект - ошибка ниже.
  5. Попробовал вместо использования секрета явно указать токен, как тут - ошибка такая же

Grpc.Core.RpcException HResult=0x80131500 Message=Status(StatusCode="Unauthenticated", Detail="") Source=System.Private.CoreLib StackTrace: at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult()
at Grpc.Net.Client.Internal.Retry.RetryCallBase2.<GetResponseAsync>d__63.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()
at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method2 method, String host, CallOptions options, TRequest request) at Grpc.Core.Interceptors.InterceptingCallInvoker.<BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext2 ctx)
at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext2 context, BlockingUnaryCallContinuation2 continuation)
at Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method2 method, String host, CallOptions options, TRequest request) at Tinkoff.InvestApi.V1.UsersService.UsersServiceClient.GetAccounts(GetAccountsRequest request, CallOptions options) at Tinkoff.InvestApi.V1.UsersService.UsersServiceClient.GetAccounts(GetAccountsRequest request, Metadata headers, Nullable1 deadline, CancellationToken cancellationToken)
at Tinkoff.InvestApi.V1.UsersService.UsersServiceClient.GetAccounts(CancellationToken cancellationToken)
at Tinkoff.InvestApi.Sample.UsersServiceSample.GetUserInfoDescription() in ___\Tinkoff.InvestApi.Sample\UsersServiceSample.cs:line 38
at Tinkoff.InvestApi.Sample.SyncSample.ExecuteAsync(CancellationToken stoppingToken) in ___\Tinkoff.InvestApi.Sample\SyncSample.cs:line 18
at Microsoft.Extensions.Hosting.BackgroundService.StartAsync(CancellationToken cancellationToken)
at Microsoft.Extensions.Hosting.Internal.Host.d__12.MoveNext()
`

Добавить пример использования StopOrderService

  • Убеждаемся, что параметр реальной торговли включен, получаем текущую цену из #2 и выставляем стопордер на покупку по цене (текущая – 10%), запоминаем его id
  • Получаем список стопзаявок и убеждаемся, что наша новая заявка там появилась
  • Отменяем созданный стоп-ордер

C# ругается на PostOrderRequest.Price - не могу создать запрос на операцию.

var client2 = new Tinkoff.InvestApi.V1.SandboxService.SandboxServiceClient(chanel);

PostOrderRequest r = new PostOrderRequest();

        r.Figi = "BBG0047315Y7";
        r.OrderId = "1";
        r.Price.Units = 1185;
        r.Price.Nano = 0;
        r.Direction = OrderDirection.Buy;
        r.OrderType = OrderType.Limit;

        var rep = client2.PostSandboxOrder(r , headers);

Ругается на строку r.Price.Units = 1185; говорит Object reference not set! Как это исправить?

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.