├── .editorconfig ├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── README.md ├── babel.config.js ├── contracts ├── grpc │ └── tradeapi │ │ └── v1 │ │ ├── candles.proto │ │ ├── events.proto │ │ ├── orders.proto │ │ ├── portfolios.proto │ │ ├── securities.proto │ │ └── stops.proto └── proto │ └── tradeapi │ └── v1 │ ├── candles.proto │ ├── common.proto │ ├── events.proto │ ├── orders.proto │ ├── portfolios.proto │ ├── security.proto │ └── stops.proto ├── docs ├── common-info.md ├── examples │ ├── _category_.json │ ├── golang.md │ ├── hackathon.md │ └── python.md ├── faq.md ├── getting-started.md ├── grpc │ ├── _category_.json │ ├── events.md │ ├── img │ │ ├── img_1.png │ │ ├── img_2.png │ │ ├── img_3.png │ │ ├── img_4.png │ │ ├── img_5.png │ │ ├── img_6.png │ │ └── img_7.png │ ├── orders.md │ ├── portfolios.md │ ├── recommendations.md │ ├── securities.md │ └── stops.md ├── limits.md ├── rest-api │ ├── _category_.json │ ├── api.md │ ├── candles.md │ ├── common-types.md │ ├── orders.md │ ├── portfolios.md │ ├── securities.md │ └── stops.md ├── tokens.md └── usage.md ├── docusaurus.config.js ├── package-lock.json ├── package.json ├── sidebars.js ├── src └── custom.css ├── static ├── .nojekyll └── img │ ├── favicon.ico │ ├── logo.png │ └── meta-image.png └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | charset = utf-8 3 | end_of_line = lf 4 | indent_style = space 5 | indent_size = 2 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | 9 | [*.{ts,tsx}] 10 | max_line_length = 120 11 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | deploy: 10 | name: Deploy to GitHub Pages 11 | if: github.repository == 'FinamWeb/trade-api-docs' 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | - uses: actions/setup-node@v3 16 | with: 17 | node-version: 18 18 | cache: npm 19 | 20 | - name: Install dependencies 21 | run: npm ci 22 | - name: Build website 23 | run: npm run build 24 | 25 | # Popular action to deploy to GitHub Pages: 26 | # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus 27 | - name: Deploy to GitHub Pages 28 | uses: peaceiris/actions-gh-pages@v3 29 | with: 30 | github_token: ${{ secrets.GITHUB_TOKEN }} 31 | # Build output to publish to the `gh-pages` branch: 32 | publish_dir: ./build 33 | # The following lines assign commit authorship to the official 34 | # GH-Actions bot for deploys to `gh-pages` branch: 35 | # https://github.com/actions/checkout/issues/13#issuecomment-724415212 36 | # The GH actions bot is used by default if you didn't specify the two fields. 37 | # You can swap them out with your own user credentials. 38 | user_name: github-actions[bot] 39 | user_email: 41898282+github-actions[bot]@users.noreply.github.com 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Общая информация 2 | 3 | Trade API — это gRPC и REST API, предназначенные для организации взаимодействия пользовательских приложений с сервером TRANSAQ. Является развитием TXmlConnector.dll, выпущенного в виде библиотеки функций. 4 | 5 | ## Возможности API: 6 | 7 | - Разработка алгоритмов; 8 | - Тестирование стратегий; 9 | - Создание торговых роботов и собственных терминалов; 10 | - Подключение созданных торговых систем к TRANSAQ и оперативное получение рыночной информации; 11 | - Изучение котировок в режиме реального времени и выгрузка исторических данных; 12 | - Отдача торговых приказов и отслеживание их исполнения. 13 | 14 | ## Преимущества Trade API: 15 | 16 | - **Удобство**. Пользоваться Trade API могут как опытные алготрейдеры, так и инвесторы, которые только осваивают автоматизированную торговлю. Спецификация Trade API реализована на базе Swagger UI, позволяющего интерактивно просматривать информацию о методах открытого программного интерфейса и отправлять запросы; 17 | - **Функциональность**. В Trade API уже есть все, что может понадобиться трейдеру для реализации самых разных автоматизированных стратегий торговли. В планах команды разработчиков «Финама» — дальнейшее совершенствование продукта за счет добавления новых функций и интеграций; 18 | - **Универсальность**. Взаимодействие с TRANSAQ осуществляется через интернет-протокол (на ПК или мобильном устройстве), что обеспечивает возможность создания торговых и информационных приложений на любом языке программирования и на устройстве с любой операционной системой; 19 | - **Безопасность**. Для работы с Trade API пользователь получает токен — уникальный цифровой код, в котором зашифрованы данные о клиенте и выбранных счетах. Токен позволяет идентифицировать клиента и предназначен для авторизации в системе, а также для подтверждения операций с торговым счётом; 20 | - **Стабильность**. «Финам» — надежный брокер, который может обеспечить бесперебойное функционирование торговых приложений даже при пиковых нагрузках. Используя Trade API, клиенты могут быть уверены в стабильной работе ПО, а также всегда могут рассчитывать на оперативную помощь службы техподдержки; 21 | - **Доступность**. Пользоваться Trade API могут бесплатно все клиенты «Финама», зарегистрированные в сервисе Comon.ru и получившие токен. 22 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /contracts/grpc/tradeapi/v1/candles.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package grpc.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Grpc.V1"; 6 | 7 | import "proto/tradeapi/v1/candles.proto"; 8 | 9 | service Candles { 10 | // Returns the list of day candles. 11 | // Возвращает дневные свечи. 12 | rpc GetDayCandles(proto.tradeapi.v1.GetDayCandlesRequest) returns (proto.tradeapi.v1.GetDayCandlesResult); 13 | 14 | // Returns the list of intraday candles. 15 | // Возвращает внутридневные свечи. 16 | rpc GetIntradayCandles(proto.tradeapi.v1.GetIntradayCandlesRequest) returns (proto.tradeapi.v1.GetIntradayCandlesResult); 17 | } -------------------------------------------------------------------------------- /contracts/grpc/tradeapi/v1/events.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package grpc.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Grpc.V1"; 6 | 7 | import "proto/tradeapi/v1/events.proto"; 8 | 9 | service Events { 10 | // Event Service sends events after explicit subscription. 11 | // Сервис событий. Отправляет события после вызова соответствующих методов подписки. 12 | rpc GetEvents (stream proto.tradeapi.v1.SubscriptionRequest) returns (stream proto.tradeapi.v1.Event); 13 | } -------------------------------------------------------------------------------- /contracts/grpc/tradeapi/v1/orders.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package grpc.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Grpc.V1"; 6 | 7 | import "proto/tradeapi/v1/orders.proto"; 8 | 9 | service Orders { 10 | // Creates new order. 11 | // Order placement in OrderBook takes some time due to processing speed, 12 | // that is why this method returns transaction_id, which can be used 13 | // to find corresponding order in GetOrdersRequest or in OrderEvent message 14 | // of Events service (EventResponse.event.order). 15 | // Создать новую заявку. 16 | // На обработку нового поручения по размещению заявки в биржевой стакан 17 | // требуется некоторое время, поэтому этот метод возвращает структуру с 18 | // transaction_id, которая может быть использована для поиска соответствующей 19 | // заявки через GetOrdersRequest или в сообщении OrderEvent от сервиса событий 20 | // (EventResponse.event.order). 21 | rpc NewOrder(proto.tradeapi.v1.NewOrderRequest) returns (proto.tradeapi.v1.NewOrderResult); 22 | // Cancels order. 23 | // Отменяет заявку. 24 | rpc CancelOrder(proto.tradeapi.v1.CancelOrderRequest) returns (proto.tradeapi.v1.CancelOrderResult); 25 | // Returns the list of orders. 26 | // Возвращает список заявок. 27 | rpc GetOrders(proto.tradeapi.v1.GetOrdersRequest) returns (proto.tradeapi.v1.GetOrdersResult); 28 | } -------------------------------------------------------------------------------- /contracts/grpc/tradeapi/v1/portfolios.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package grpc.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Grpc.V1"; 6 | 7 | import "proto/tradeapi/v1/portfolios.proto"; 8 | 9 | 10 | service Portfolios { 11 | // Returns portfolio. 12 | // Возвращает портфель. 13 | rpc GetPortfolio(proto.tradeapi.v1.GetPortfolioRequest) returns (proto.tradeapi.v1.GetPortfolioResult); 14 | } -------------------------------------------------------------------------------- /contracts/grpc/tradeapi/v1/securities.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package grpc.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Grpc.V1"; 6 | 7 | import "proto/tradeapi/v1/security.proto"; 8 | import "google/protobuf/wrappers.proto"; 9 | 10 | // Securities list request. 11 | // Запрос списка инструментов. 12 | message GetSecuritiesRequest { 13 | // Trading Board. 14 | // Режим торгов 15 | google.protobuf.StringValue board = 1; 16 | // Security Code. 17 | // Тикер инструмента. 18 | google.protobuf.StringValue seccode = 2; 19 | } 20 | 21 | // Result of get security lists request. 22 | // Результат выполнения запроса списка инструментов. 23 | message GetSecuritiesResult { 24 | // Securities list. 25 | // Список инструментов. 26 | repeated proto.tradeapi.v1.Security securities = 1; 27 | } 28 | 29 | service Securities { 30 | // Securities table. 31 | // Справочник инструментов. 32 | rpc GetSecurities(GetSecuritiesRequest) returns (GetSecuritiesResult); 33 | } 34 | -------------------------------------------------------------------------------- /contracts/grpc/tradeapi/v1/stops.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package grpc.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Grpc.V1"; 6 | 7 | import "proto/tradeapi/v1/stops.proto"; 8 | 9 | service Stops { 10 | // Returns the list of Stop Orders. 11 | // Возвращает список стоп-заявок. 12 | rpc GetStops(proto.tradeapi.v1.GetStopsRequest) returns (proto.tradeapi.v1.GetStopsResult); 13 | // Cancels Stop Order. 14 | // Снимает стоп-заявку. 15 | rpc CancelStop(proto.tradeapi.v1.CancelStopRequest) returns (proto.tradeapi.v1.CancelStopResult); 16 | // Creates new Stop Order. 17 | // Выставляет стоп-заявку. 18 | rpc NewStop(proto.tradeapi.v1.NewStopRequest) returns (proto.tradeapi.v1.NewStopResult); 19 | } -------------------------------------------------------------------------------- /contracts/proto/tradeapi/v1/candles.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Proto.V1"; 6 | 7 | import "google/protobuf/timestamp.proto"; 8 | import "google/type/date.proto"; 9 | import "proto/tradeapi/v1/common.proto"; 10 | 11 | // Day candle. 12 | // Дневная свеча. 13 | message DayCandle { 14 | // Date (local time). 15 | // Дата (по времени биржи). 16 | google.type.Date date = 1; 17 | // Open price. 18 | // Цена открытия. 19 | Decimal open = 2; 20 | // Close price. 21 | // Цена закрытия. 22 | Decimal close = 3; 23 | // High price. 24 | // Максимальная цена. 25 | Decimal high = 4; 26 | // Low price. 27 | // Минимальная цена. 28 | Decimal low = 5; 29 | // Volume. 30 | // Объем торгов. 31 | int64 volume = 6; 32 | } 33 | 34 | // Intraday candle. 35 | // Внетридневная свеча. 36 | message IntradayCandle { 37 | // Time (UTC). 38 | // Время (по UTC). 39 | google.protobuf.Timestamp timestamp = 1; 40 | // Open price. 41 | // Цена открытия. 42 | Decimal open = 2; 43 | // Close price. 44 | // Цена закрытия. 45 | Decimal close = 3; 46 | // High price. 47 | // Максимальная цена. 48 | Decimal high = 4; 49 | // Low price. 50 | // Минимальная цена. 51 | Decimal low = 5; 52 | // Volume. 53 | // Объем торгов. 54 | int64 volume = 6; 55 | } 56 | 57 | // Timeframe. 58 | // Временной интервал. 59 | enum IntradayCandleTimeFrame { 60 | // Value is not specified. Do not use. 61 | // Значение не указано. Не использовать. 62 | INTRADAYCANDLE_TIMEFRAME_UNSPECIFIED = 0; 63 | // 1 minute. 64 | // 1 минута. 65 | INTRADAYCANDLE_TIMEFRAME_M1 = 1; 66 | // 5 minutes. 67 | // 5 минут. 68 | INTRADAYCANDLE_TIMEFRAME_M5 = 2; 69 | // 15 minutes. 70 | // 15 минут. 71 | INTRADAYCANDLE_TIMEFRAME_M15 = 3; 72 | // 1 hour. 73 | // 1 час. 74 | INTRADAYCANDLE_TIMEFRAME_H1 = 4; 75 | } 76 | 77 | // Timeframe for day candle. 78 | // Временной интервал дневной свечи. 79 | enum DayCandleTimeFrame { 80 | // Value is not specified. Do not use. 81 | // Значение не указано. Не использовать. 82 | DAYCANDLE_TIMEFRAME_UNSPECIFIED = 0; 83 | // 1 day. 84 | // 1 день. 85 | DAYCANDLE_TIMEFRAME_D1 = 1; 86 | // 1 week. 87 | // 1 неделя. 88 | DAYCANDLE_TIMEFRAME_W1 = 2; 89 | } 90 | 91 | // Day candles interval. 92 | // Интервал запроса дневных свечей. 93 | message DayCandleInterval { 94 | // Date from. 95 | // Дата начала. 96 | google.type.Date from = 1; 97 | // Date to. 98 | // Дата окончания. 99 | google.type.Date to = 2; 100 | // Candles count limit. 101 | // Количество свечей. 102 | int32 count = 3; 103 | } 104 | 105 | // Intraday candles interval. 106 | // Интервал запроса внутридневных свечей. 107 | message IntradayCandleInterval { 108 | // Date from. 109 | // Дата начала. 110 | google.protobuf.Timestamp from = 1; 111 | // Date to. 112 | // Дата окончания. 113 | google.protobuf.Timestamp to = 2; 114 | // Candles count limit. 115 | // Количество свечей. 116 | int32 count = 3; 117 | } 118 | 119 | // Get day candles request. 120 | // Запрос дневных свечей. 121 | message GetDayCandlesRequest { 122 | // Trading Board. 123 | // Режим торгов. 124 | string security_board = 1; 125 | // Security Code. 126 | // Тикер инструмента. 127 | string security_code = 2; 128 | // Timeframe. 129 | // Временной интервал. 130 | DayCandleTimeFrame time_frame = 3; 131 | // Interval. 132 | // Интервал. 133 | DayCandleInterval interval = 4; 134 | } 135 | 136 | // GetDayCandlesRequest result. 137 | // Результат GetDatCandlesRequest. 138 | message GetDayCandlesResult { 139 | // Candles list. 140 | // Список свечей. 141 | repeated DayCandle candles = 1; 142 | } 143 | 144 | // Get intraday candles request. 145 | // Запрос внутридневных свечей. 146 | message GetIntradayCandlesRequest { 147 | // Trading Board. 148 | // Режим торгов. 149 | string security_board = 1; 150 | // Security Code. 151 | // Тикер инструмента. 152 | string security_code = 2; 153 | // Timeframe. 154 | // Временной интервал. 155 | IntradayCandleTimeFrame time_frame = 3; 156 | // Interval. 157 | // Интервал. 158 | IntradayCandleInterval interval = 4; 159 | } 160 | 161 | // GetIntradayCandlesRequest result. 162 | // Результат GetIntradayCandlesRequest. 163 | message GetIntradayCandlesResult { 164 | // Candles list. 165 | // Список свечей. 166 | repeated IntradayCandle candles = 1; 167 | } -------------------------------------------------------------------------------- /contracts/proto/tradeapi/v1/common.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Proto.V1"; 6 | 7 | import "google/protobuf/timestamp.proto"; 8 | 9 | // Market. 10 | // Рынок. 11 | enum Market { 12 | // Value is not specified. Do not use. 13 | // Значение не указано. Не использовать. 14 | MARKET_UNSPECIFIED = 0; 15 | // Moscow Exchange Stock market. 16 | // Фондовый рынок Московской Биржи. 17 | MARKET_STOCK = 1; 18 | // Moscow Exchange Derivative market. 19 | // Срочный рынок Московской Биржи. 20 | MARKET_FORTS = 4; 21 | // Saint-Petersburg Exchange. 22 | // Санкт-Петербургская биржа. 23 | MARKET_SPBEX = 7; 24 | // US Stock market. 25 | // Фондовый рынок США. 26 | MARKET_MMA = 14; 27 | // Moscow Exchange Currency market. 28 | // Валютный рынок Московской Биржи. 29 | MARKET_ETS = 15; 30 | // Moscow Exchange Bond market. 31 | // Долговой рынок Московской Биржи. 32 | MARKET_BONDS = 20; 33 | // Moscow Exchange option market. 34 | // Рынок опционов Московской Биржи. 35 | MARKET_OPTIONS = 21; 36 | } 37 | 38 | // Request execution result. 39 | // Результат выполнения запроса. 40 | message ResponseEvent { 41 | // Request ID. 42 | // Идентификатор запроса. 43 | string request_id = 1; 44 | // Request execution result. 45 | // Результат выполнения запроса. 46 | bool success = 2; 47 | // Errors in request execution. 48 | // Ошибки выполнения запроса. 49 | repeated Error errors = 3; 50 | } 51 | 52 | // Error data. 53 | // Данные об ошибке. 54 | message Error { 55 | // Error code. 56 | // Код ошибки. 57 | string code = 1; 58 | // Error message. 59 | // Сообщение об ошибке. 60 | string message = 2; 61 | } 62 | 63 | // Transaction direction. 64 | // Направление сделки. 65 | enum BuySell { 66 | // Value is not specified. Do not use. 67 | // Значение не указано. Не использовать. 68 | BUY_SELL_UNSPECIFIED = 0; 69 | // Sell. 70 | // Продажа. 71 | BUY_SELL_SELL = 1; 72 | // Buy. 73 | // Покупка. 74 | BUY_SELL_BUY = 2; 75 | } 76 | 77 | // Time validation for order. 78 | // Установка временных рамок действия заявки. 79 | enum OrderValidBeforeType { 80 | // Value is not specified. Do not use. 81 | // Значение не указано. Не использовать. 82 | ORDER_VALID_BEFORE_TYPE_UNSPECIFIED = 0; 83 | // Order is valid till the end of the current session. 84 | // Заявка действует до конца сессии. 85 | ORDER_VALID_BEFORE_TYPE_TILL_END_SESSION = 1; 86 | // Order is valid till cancellation. 87 | // Заявка действует, пока не будет отменена. 88 | ORDER_VALID_BEFORE_TYPE_TILL_CANCELLED = 2; 89 | // Order is valid till specified moment. OrderValidBefore.time parameter must be set. 90 | // Заявка действует до указанного времени. Параметр OrderValidBefore.time должно быть установлен. 91 | ORDER_VALID_BEFORE_TYPE_EXACT_TIME = 3; 92 | } 93 | 94 | // Order time condition. 95 | // Условие по времени действия заявки. 96 | message OrderValidBefore { 97 | // Condition type. 98 | // Тип условия. 99 | OrderValidBeforeType type = 1; 100 | // Order lifetime. 101 | // Время действия заявки. 102 | google.protobuf.Timestamp time = 2; 103 | } 104 | 105 | // Real number with fixed precision (including integers). 106 | // The total value is calculated as follows: num * 10^-scale. 107 | // https://en.wikipedia.org/wiki/Scientific_notation 108 | // Example: 109 | // The number "250.655" is Decimal type with num = 250655 and scale = 3, 250.655 = 250655 * 10^-3 110 | message Decimal { 111 | // Mantissa. 112 | // Мантисса. 113 | int64 num = 1; 114 | 115 | // exponent for base 10. 116 | // Экспонента. 117 | uint32 scale = 2; 118 | } -------------------------------------------------------------------------------- /contracts/proto/tradeapi/v1/events.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Proto.V1"; 6 | 7 | import "proto/tradeapi/v1/common.proto"; 8 | import "proto/tradeapi/v1/orders.proto"; 9 | import "proto/tradeapi/v1/portfolios.proto"; 10 | import "google/protobuf/timestamp.proto"; 11 | 12 | // Timeframe. 13 | // Таймфрейм. 14 | message TimeFrame { 15 | enum Unit { 16 | // Value is not specified. Do not use. 17 | // Значение не указано. Не использовать. 18 | UNIT_UNSPECIFIED = 0; 19 | // Munute. 20 | // Минута. 21 | UNIT_MINUTE = 1; 22 | // Hour. 23 | // Час. 24 | UNIT_HOUR = 2; 25 | // Day. 26 | // День. 27 | UNIT_DAY = 3; 28 | // Week. 29 | // Неделя. 30 | UNIT_WEEK = 4; 31 | // Month. 32 | // Месяц. 33 | UNIT_MONTH = 5; 34 | // Quarter. 35 | // Квартал. 36 | UNIT_QUARTER = 6; 37 | // Year. 38 | // Год. 39 | UNIT_YEAR = 7; 40 | } 41 | 42 | // Timeframe units. 43 | // Единицы измерения таймфрейма. 44 | Unit time_unit = 1; 45 | } 46 | 47 | // Subscription/unsubscription. 48 | // Подписка/отписка. 49 | message SubscriptionRequest { 50 | // Set only one parameter. 51 | // Определите только одно из полей. 52 | oneof payload { 53 | // OrderBook subscription request. 54 | // Запрос подписки на стакан. 55 | proto.tradeapi.v1.OrderBookSubscribeRequest order_book_subscribe_request = 1; 56 | // OrderBook unsubscribe request. 57 | // Запрос на отписку от стакана. 58 | proto.tradeapi.v1.OrderBookUnsubscribeRequest order_book_unsubscribe_request = 2; 59 | // Subscribe for trades and orders. 60 | // Запрос подписки на ордера и сделки. 61 | proto.tradeapi.v1.OrderTradeSubscribeRequest order_trade_subscribe_request = 3; 62 | // Cancel all previous subscription for trades and orders. 63 | // Отменить все предыдущие запросы на подписки на ордера и сделки. 64 | proto.tradeapi.v1.OrderTradeUnsubscribeRequest order_trade_unsubscribe_request = 4; 65 | // Keep-alive request. 66 | // Keep-alive запрос. 67 | proto.tradeapi.v1.KeepAliveRequest keep_alive_request = 5; 68 | } 69 | } 70 | 71 | // Event. 72 | // Событие. 73 | message Event { 74 | // It is possible to set the only field. 75 | // Только одно из полей может быть заполнено. 76 | oneof payload { 77 | // Order event. 78 | // Событие с заявкой. 79 | proto.tradeapi.v1.OrderEvent order = 1; 80 | // Trade event. 81 | // Событие со сделкой. 82 | proto.tradeapi.v1.TradeEvent trade = 2; 83 | // OrderBook event. 84 | // Событие стакана. 85 | proto.tradeapi.v1.OrderBookEvent order_book = 3; 86 | // Portfolio event. 87 | // Событие портфеля. 88 | proto.tradeapi.v1.PortfolioEvent portfolio = 5; 89 | // Request execution result. 90 | // Результат выполнения запроса. 91 | proto.tradeapi.v1.ResponseEvent response = 10; 92 | } 93 | } 94 | 95 | // OrderBook subscribe request. 96 | // Запрос подписки на стакан. 97 | message OrderBookSubscribeRequest { 98 | // Request ID. 99 | // Идентификатор запроса. 100 | string request_id = 1; 101 | // Security Code. 102 | // Тикер инструмента. 103 | string security_code = 2; 104 | // Trading Board. 105 | // Режим торгов. 106 | string security_board = 3; 107 | } 108 | 109 | // OrderBook unsubscribe request. 110 | // Запрос на отписку от стакана. 111 | message OrderBookUnsubscribeRequest { 112 | // Request ID. 113 | // Идентификатор запроса. 114 | string request_id = 1; 115 | // Security Code. 116 | // Тикер инструмента. 117 | string security_code = 2; 118 | // Trading Board. 119 | // Режим торгов. 120 | string security_board = 3; 121 | } 122 | 123 | // Subscribe for trades and orders. 124 | // Запрос подписки на ордера и сделки. 125 | message OrderTradeSubscribeRequest { 126 | // Request ID. 127 | // Идентификатор запроса. 128 | string request_id = 1; 129 | // Включить сделки в подписку. 130 | bool include_trades = 2; 131 | // Включить заявки в подписку. 132 | // Тикер инструмента. 133 | bool include_orders = 3; 134 | // Торговые коды счетов. 135 | repeated string client_ids = 4; 136 | } 137 | 138 | // Cancel all previous subscription for trades and orders. 139 | // Отменить все предыдущие запросы на подписки на ордера и сделки. 140 | message OrderTradeUnsubscribeRequest { 141 | // Request ID. 142 | // Идентификатор запроса. 143 | string request_id = 1; 144 | } 145 | 146 | // Portfolio subscription. 147 | // Подписка на портфель. 148 | message PortfolioSubscription { 149 | // Trade Account ID. 150 | // Идентификатор торгового счёта. 151 | string client_id = 1; 152 | // What kind of data the response contains. 153 | // Какие данные будут в ответе. 154 | proto.tradeapi.v1.PortfolioContent content = 2; 155 | } 156 | 157 | // Order event. 158 | // Событие с заявкой. 159 | message OrderEvent { 160 | // Order No. Appear only when an order is placed in OrderBook. 161 | // Биржевой номер заявки. Появляется после того, как заявка попадает в стакан. 162 | int64 order_no = 1; 163 | // Transaction Id . Assigned when a command for new order creation is sent. 164 | // Идентификатор транзакции. Назначается после подачи команды на создание новой заявки. 165 | int32 transaction_id = 2; 166 | // Security Code. 167 | // Тикер инструмента. 168 | string security_code = 3; 169 | // Trade Account ID. 170 | // Идентификатор торгового счёта. 171 | string client_id = 4; 172 | // Order status. 173 | // Состояние заявки. 174 | OrderStatus status = 5; 175 | // Transaction direction. 176 | // Направление сделки. 177 | BuySell buy_sell = 6; 178 | // Time of Order placement in UTC. 179 | // Время регистрации заявки на бирже. В UTC. 180 | google.protobuf.Timestamp created_at = 7; 181 | // Lot price. 182 | // Цена за лот. 183 | double price = 8; 184 | // Volume in lots. 185 | // Количество, в лотах. 186 | int32 quantity = 9; 187 | // Residual volume in lots. 188 | // Неисполненный остаток, в лотах. 189 | int32 balance = 10; 190 | // Rejection reason or conditional order resolution. 191 | // Причина отказа или вердикт по условной заявке. 192 | string message = 11; 193 | // Price currency. 194 | // Валюта цены инструмента. 195 | string currency = 12; 196 | // Conditional order properties. 197 | // Параметры условной заявки. 198 | OrderCondition condition = 13; 199 | // Order lifetime. 200 | // Время действия заявки. 201 | OrderValidBefore valid_before = 14; 202 | // Time of order registration on the server in UTC. 203 | // Время, когда заявка была зарегистрирована на сервере. В UTC. 204 | google.protobuf.Timestamp accepted_at = 15; 205 | } 206 | 207 | // Trade event. 208 | // Событие со сделкой. 209 | message TradeEvent { 210 | // Security Code. 211 | // Тикер инструмента. 212 | string security_code = 1; 213 | // Trade No. 214 | // Номер сделки. 215 | int64 trade_no = 2; 216 | // Order No. 217 | // Номер заявки. 218 | int64 order_no = 3; 219 | // Trade Account ID. 220 | // Идентификатор торгового счёта. 221 | string client_id = 4; 222 | // Time of trade registration on stock exchange in UTC. 223 | // Время исполнения сделки на бирже. В UTC. 224 | google.protobuf.Timestamp created_at = 5; 225 | // Volume in lots. 226 | // Количество, в лотах. 227 | int64 quantity = 6; 228 | // Trade Price. 229 | // Цена сделки. 230 | double price = 7; 231 | // Trade currency value. 232 | // Объём сделки в валюте инструмента. 233 | double value = 8; 234 | // Transaction direction. 235 | // Направление сделки. 236 | proto.tradeapi.v1.BuySell buy_sell = 9; 237 | // Fee, RUB. 238 | // Комиссия, в рублях. 239 | double commission = 10; 240 | // Trade currency. 241 | // Валюта сделки. 242 | string currency = 11; 243 | // Accrued interest. 244 | // НКД сделки. 245 | double accrued_interest = 12; 246 | } 247 | 248 | // Order book row. 249 | // Строка стакана. 250 | message OrderBookRow 251 | { 252 | // Price. 253 | // Цена. 254 | double price = 1 [json_name = "p"]; 255 | // Lots. 256 | // Количество лотов. 257 | int64 quantity = 2 [json_name = "q"]; 258 | } 259 | 260 | // OrderBook event. 261 | // Событие стакана. 262 | message OrderBookEvent { 263 | // Security Code. 264 | // Тикер инструмента. 265 | string security_code = 1; 266 | // Trading Board. 267 | // Режим торгов. 268 | string security_board = 2; 269 | // Asks. 270 | // Заявки на продажу. 271 | repeated OrderBookRow asks = 3; 272 | // Bids. 273 | // Заявки на покупку. 274 | repeated OrderBookRow bids = 4; 275 | } 276 | 277 | // Portfolio event. 278 | // Событие портфеля. 279 | message PortfolioEvent { 280 | // Trade Account ID. 281 | // Идентификатор торгового счёта. 282 | string client_id = 1; 283 | // What kind of data portfolio event contains. 284 | // Какие данные находятся в событии портфеля. 285 | proto.tradeapi.v1.PortfolioContent content = 2; 286 | // Current equity, RUB. 287 | // Текущая оценка портфеля в рублях. 288 | double equity = 3; 289 | // Open Equity, RUB. 290 | // Входящая оценка портфеля в рублях. 291 | double balance = 4; 292 | // DEPO positions. 293 | // Позиции DEPO. 294 | repeated PositionRow positions = 5; 295 | // Currency positions. 296 | // Валютные позиции. 297 | repeated CurrencyRow currencies = 6; 298 | // Money positions. 299 | // Денежные позиции. 300 | repeated MoneyRow money = 7; 301 | } 302 | 303 | // Keep-alive request. 304 | // Keep-alive запрос. 305 | message KeepAliveRequest { 306 | // Request ID. 307 | // Идентификатор запроса. 308 | string request_id = 1; 309 | } -------------------------------------------------------------------------------- /contracts/proto/tradeapi/v1/orders.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Proto.V1"; 6 | 7 | import "google/protobuf/timestamp.proto"; 8 | import "google/protobuf/wrappers.proto"; 9 | import "proto/tradeapi/v1/common.proto"; 10 | 11 | // Order placement properties. 12 | // Поведение заявки при выставлении в стакан. 13 | enum OrderProperty { 14 | // Value is not specified. Do not use. 15 | // Значение не указано. Не использовать. 16 | ORDER_PROPERTY_UNSPECIFIED = 0; 17 | // The residual of partially matched order is to stay in OrderBook. 18 | // Неисполненная часть заявки помещается в очередь заявок биржи. 19 | ORDER_PROPERTY_PUT_IN_QUEUE = 1; 20 | // The residual of partially matched order is to be cancelled. 21 | // Неисполненная часть заявки снимается с торгов. 22 | ORDER_PROPERTY_CANCEL_BALANCE = 2; 23 | // Filling the order only in case the posibility of immediate and full execution. 24 | // Сделки совершаются только в том случае, если заявка может быть удовлетворена полностью и сразу при выставлении. 25 | ORDER_PROPERTY_IMM_OR_CANCEL = 3; 26 | } 27 | 28 | // Conditional order types. 29 | // Типы условных ордеров. 30 | enum OrderConditionType { 31 | // Value is not specified. Do not use. 32 | // Значение не указано. Не использовать. 33 | ORDER_CONDITION_TYPE_UNSPECIFIED = 0; 34 | // Best Bid. 35 | // Лучшая цена покупки. 36 | ORDER_CONDITION_TYPE_BID = 1; 37 | // Best Bid or Last trade price and higher. 38 | // Лучшая цена покупки или сделка по заданной цене и выше. 39 | ORDER_CONDITION_TYPE_BID_OR_LAST = 2; 40 | // Best Ask. 41 | // Лучшая цена продажи. 42 | ORDER_CONDITION_TYPE_ASK = 3; 43 | // Best Ask or Last trade price and lower. 44 | // Лучшая цена продажи или сделка по заданной цене и ниже. 45 | ORDER_CONDITION_TYPE_ASK_OR_LAST = 4; 46 | // Placement time. Parameter OrderCondition.time must be set. 47 | // Время выставления заявки на Биржу. Параметр OrderCondition.time должен быть установлен. 48 | ORDER_CONDITION_TYPE_TIME = 5; 49 | // Coverage below specified. 50 | // Обеспеченность ниже заданной. 51 | ORDER_CONDITION_TYPE_COV_DOWN = 6; 52 | // Coverage above specified. 53 | // Обеспеченность выше заданной. 54 | ORDER_CONDITION_TYPE_COV_UP = 7; 55 | // Last trade price and higher. 56 | // Сделка на рынке по заданной цене или выше. 57 | ORDER_CONDITION_TYPE_LAST_UP = 8; 58 | // Last trade price and lower. 59 | // Сделка на рынке по заданной цене или ниже. 60 | ORDER_CONDITION_TYPE_LAST_DOWN = 9; 61 | } 62 | 63 | // Order placement properties. 64 | // Свойства выставления заявок. 65 | message OrderCondition { 66 | // Condition type. 67 | // Тип условия. 68 | OrderConditionType type = 1; 69 | // Conditional value. 70 | // Значение для условия. 71 | double price = 2; 72 | // Placement time. 73 | // Время выставления. 74 | google.protobuf.Timestamp time = 3; 75 | } 76 | 77 | // New Order Request. 78 | // Запрос на создание заявки. 79 | message NewOrderRequest { 80 | // Trade Account ID. 81 | // Идентификатор торгового счёта. 82 | string client_id = 1; 83 | // Trading Board. 84 | // Режим торгов. 85 | string security_board = 2; 86 | // Security Code. 87 | // Тикер инструмента. 88 | string security_code = 3; 89 | // Transaction direction. 90 | // Направление сделки. 91 | BuySell buy_sell = 4; 92 | // Order volume in lots. 93 | // Количество лотов инструмента для заявки. 94 | int32 quantity = 5; 95 | // Use credit. Not available in derivative market. 96 | // Использовать кредит. Недоступно для срочного рынка. 97 | bool use_credit = 6; 98 | // Order price. Use "null" to place Market Order. 99 | // Цена заявки. Используйте "null", чтобы выставить рыночную заявку. 100 | google.protobuf.DoubleValue price = 7; 101 | // Unfilled order execution property. 102 | // Свойства исполнения частично исполненных заявок. 103 | OrderProperty property = 8; 104 | // Order placement properties. 105 | // Свойства выставления заявок. 106 | OrderCondition condition = 9; 107 | // Order lifetime condition. 108 | // Условие по времени действия заявки. 109 | OrderValidBefore valid_before = 10; 110 | } 111 | 112 | // NewOrderRequest result. 113 | // Результат выполнения NewOrderRequest. 114 | message NewOrderResult { 115 | // Trade Account Id. 116 | // Идентификатор торгового счёта. 117 | string client_id = 1; 118 | // Transaction Id, which can be used to cancel order or find corresponding order_no in Event service. 119 | // Идентификатор транзакции, который может быть использован для отмены заявки или определения номера заявки в сервисе событий. 120 | int32 transaction_id = 2; 121 | // Security Code. 122 | // Тикер инструмента. 123 | string security_code = 3; 124 | } 125 | 126 | // Cancel Order Request. 127 | // Запрос на отмену заявки. 128 | message CancelOrderRequest { 129 | // Trade Account Id. 130 | // Идентификатор торгового счёта. 131 | string client_id = 1; 132 | // Transaction Id, which can be used to cancel order or find corresponding order_no in Event service. 133 | // Идентификатор транзакции, который может быть использован для отмены заявки или определения номера заявки в сервисе событий. 134 | int32 transaction_id = 2; 135 | } 136 | 137 | // CancelOrderRequest result. 138 | // Результат выполнения CancelOrderRequest. 139 | message CancelOrderResult { 140 | // Trade Account Id. 141 | // Идентификатор торгового счёта. 142 | string client_id = 1; 143 | // Transaction Id, which can be used to cancel order or find corresponding order_no in Event service. 144 | // Идентификатор транзакции, который может быть использован для отмены заявки или определения номера заявки в сервисе событий. 145 | int32 transaction_id = 2; 146 | } 147 | 148 | // Get Orders Request. 149 | // Запрос списка заявок. 150 | message GetOrdersRequest { 151 | // Trade Account ID. 152 | // Идентификатор торгового счёта. 153 | string client_id = 1; 154 | // Include executed orders in response. 155 | // Вернуть исполненные заявки. 156 | bool include_matched = 2; 157 | // Include canceled orders in response. 158 | // Вернуть отмененные заявки. 159 | bool include_canceled = 3; 160 | // Include active orders in response. 161 | // Вернуть активные заявки. 162 | bool include_active = 4; 163 | } 164 | 165 | // Order status. 166 | // Состояние заявки. 167 | enum OrderStatus { 168 | // Value is not specified. Do not use. 169 | // Значение не указано. Не использовать. 170 | ORDER_STATUS_UNSPECIFIED = 0; 171 | // Order is not in OrderBook. 172 | // Заявка не выставлена. 173 | ORDER_STATUS_NONE = 1; 174 | // Order is in OrderBook. 175 | // Заявка выставлена. 176 | ORDER_STATUS_ACTIVE = 2; 177 | // Order is canceled. 178 | // Заявка отменена. 179 | ORDER_STATUS_CANCELLED = 3; 180 | // Order is matched. 181 | // Заявка исполнена. 182 | ORDER_STATUS_MATCHED = 4; 183 | } 184 | 185 | // Order. 186 | // Заявка. 187 | message Order { 188 | // Order No. Appear only when an order is placed in OrderBook. 189 | // Биржевой номер заявки. Появляется после того, как заявка попадает в стакан. 190 | int64 order_no = 1; 191 | // Transaction Id . Assigned when a command for new order creation is sent. 192 | // Идентификатор транзакции. Назначается после подачи команды на создание новой заявки. 193 | int32 transaction_id = 2; 194 | // Security Code. 195 | // Тикер инструмента. 196 | string security_code = 3; 197 | // Trade Account ID. 198 | // Идентификатор торгового счёта. 199 | string client_id = 4; 200 | // Order status. 201 | // Состояние заявки. 202 | OrderStatus status = 5; 203 | // Transaction direction. 204 | // Направление сделки. 205 | BuySell buy_sell = 6; 206 | // Time of Order placement in UTC. 207 | // Время регистрации заявки на бирже. В UTC. 208 | google.protobuf.Timestamp created_at = 7; 209 | // Lot price. 210 | // Цена за лот. 211 | double price = 8; 212 | // Volume in lots. 213 | // Количество, в лотах. 214 | int32 quantity = 9; 215 | // Residual volume in lots. 216 | // Неисполненный остаток, в лотах. 217 | int32 balance = 10; 218 | // Rejection reason or conditional order resolution. 219 | // Причина отказа или вердикт по условной заявке. 220 | string message = 11; 221 | // Price currency. 222 | // Валюта цены. 223 | string currency = 12; 224 | // Conditional order properties. 225 | // Параметры условной заявки. 226 | OrderCondition condition = 13; 227 | // Order lifetime. 228 | // Время действия заявки. 229 | OrderValidBefore valid_before = 14; 230 | // Time of order registration on the server in UTC. 231 | // Время, когда заявка была зарегистрирована на сервере. В UTC. 232 | google.protobuf.Timestamp accepted_at = 15; 233 | // Security Board. 234 | // Основной режим торгов инструмента. 235 | string security_board = 16; 236 | // Market. 237 | // Рынок. 238 | proto.tradeapi.v1.Market market = 17; 239 | } 240 | 241 | // GetOrdersRequest result. 242 | // Результат GetOrdersRequest. 243 | message GetOrdersResult { 244 | // Trade Account ID. 245 | // Идентификатор торгового счёта. 246 | string client_id = 1; 247 | // Orders list. 248 | // Список заявок. 249 | repeated Order orders = 2; 250 | } 251 | -------------------------------------------------------------------------------- /contracts/proto/tradeapi/v1/portfolios.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Proto.V1"; 6 | 7 | import "proto/tradeapi/v1/common.proto"; 8 | 9 | // What kind of data the response contains. 10 | // Какие данные будут в ответе. 11 | message PortfolioContent { 12 | // Currency positions. 13 | // Валютные позиции. 14 | bool include_currencies = 1; 15 | // Money positions. 16 | // Денежные позиции. 17 | bool include_money = 2; 18 | // DEPO positions. 19 | // Позиции DEPO. 20 | bool include_positions = 3; 21 | // Buy and Sell limits. 22 | // Лимиты покупки и продажи. 23 | bool include_max_buy_sell = 4; 24 | } 25 | 26 | // DEPO position. 27 | // Позиция DEPO. 28 | message PositionRow { 29 | // Security Code. 30 | // Тикер инструмента. 31 | string security_code = 1; 32 | // Security market. 33 | // Рынок инструмента. 34 | proto.tradeapi.v1.Market market = 2; 35 | // Current position, items. 36 | // Текущая позиция, шт. 37 | int64 balance = 3; 38 | // Current price in price_currency. 39 | // Текущая цена в валюте цены инструмента. 40 | double current_price = 4; 41 | // Positions equity. 42 | // Оценка позиции по инструменту в валюте риска. 43 | double equity = 5; 44 | // Balanced price of security in price_currency. 45 | // Балансовая цена в валюте цены инструмента. 46 | double average_price = 6; 47 | // Risk currency. 48 | // Валюта риска. 49 | string currency = 7; 50 | // P/L for initial position, in risk currency. 51 | // Прибыль/убыток по входящей позиции, в валюте риска. 52 | double accumulated_profit = 8; 53 | // Daily P/L, in risk currency. 54 | // Прибыль/убыток по сделкам за день, в валюте риска. 55 | double today_profit = 9; 56 | // Unrealized P/L, in average_price_currency. 57 | // Нереализованные прибыль/убытки по балансовой цене в валюте инструмента. 58 | double unrealized_profit = 10; 59 | // P/L in price_currency. 60 | // Прибыль/убытки в валюте цены инструмента. 61 | double profit = 11; 62 | // Max lots to buy. 63 | // Максимальное кол-во лотов, доступных для покупки. 64 | int64 max_buy = 12; 65 | // Max lots to sell. 66 | // Максимальное кол-во лотов, доступных для продажи. 67 | int64 max_sell = 13; 68 | // Security price currency. 69 | // Валюта цены инструмента. 70 | string price_currency = 14; 71 | // Balanced price currency. 72 | // Валюта балансовой цены. 73 | string average_price_currency = 15; 74 | // Risk Currency to Price currency Cross rate. 75 | // Кросс-курс валюты балансовой цены к валюте риска. 76 | double average_rate = 16; 77 | } 78 | 79 | // Currency position. 80 | // Валютная позиция. 81 | message CurrencyRow { 82 | // Currency code. 83 | // Код валюты. 84 | string name = 1; 85 | // Current position. 86 | // Текущая позиция. 87 | double balance = 2; 88 | // Currency rate for RUB. 89 | // Курс валюты к рублю. 90 | double cross_rate = 3; 91 | // Equity in RUB. 92 | // Оценка в рублях. 93 | double equity = 4; 94 | // Unrealized P/L, in RUB. 95 | // Нереализованные прибыль/убытки в рублях. 96 | double unrealized_profit = 5; 97 | } 98 | 99 | // Money position. 100 | // Денежная позиция. 101 | message MoneyRow { 102 | // Position market. 103 | // Рынок позиции. 104 | proto.tradeapi.v1.Market market = 1; 105 | // Currency code. 106 | // Код валюты. 107 | string currency = 2; 108 | // Current position. 109 | // Текущая позиция. 110 | double balance = 3; 111 | } 112 | 113 | // Get Portfolio Request. 114 | // Запрос портфеля. 115 | message GetPortfolioRequest { 116 | // Trade Account ID. 117 | // Идентификатор торгового счёта. 118 | string client_id = 1; 119 | // What data to return by request. 120 | // Какие данные возвращать в ответе. 121 | PortfolioContent content = 2; 122 | } 123 | 124 | // GetPortfolioRequest result. 125 | // Результат GetPortfolioRequest. 126 | message GetPortfolioResult { 127 | // Trade Account ID. 128 | // Идентификатор торгового счёта. 129 | string client_id = 1; 130 | // What kind of data the response contains. 131 | // Какие данные будут в ответе. 132 | PortfolioContent content = 2; 133 | // Current equity, RUB. 134 | // Текущая оценка портфеля в рублях. 135 | double equity = 3; 136 | // Open Equity, RUB. 137 | // Входящая оценка портфеля в рублях. 138 | double balance = 4; 139 | // DEPO positions. 140 | // Позиции DEPO. 141 | repeated PositionRow positions = 5; 142 | // Currency positions. 143 | // Валютные позиции. 144 | repeated CurrencyRow currencies = 6; 145 | // Money positions. 146 | // Денежные позиции. 147 | repeated MoneyRow money = 7; 148 | } -------------------------------------------------------------------------------- /contracts/proto/tradeapi/v1/security.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Proto.V1"; 6 | 7 | import "proto/tradeapi/v1/common.proto"; 8 | 9 | // Security price sign. 10 | // Разрешенный знак цены у инструмента. 11 | enum PriceSign { 12 | // Value is not specified. Do not use. 13 | // Значение не указано. Не использовать. 14 | // Это поле используется, когда информация о цене не задана (новейшие IPO, которые еще не начали торговаться, последствия после "падения" сервера). 15 | PRICE_SIGN_UNSPECIFIED = 0; 16 | // Positive. 17 | // Положительная цена. 18 | // Указывает на то, что цена акции положительна. Тicker с таким значением подразумевает, что стоимость акции выше нуля и органично подходит для биржевой торговли (акции, облигации, фонды). 19 | PRICE_SIGN_POSITIVE = 1; 20 | // Non negative. 21 | // Не отрицательная цена. 22 | // Обозначает, что цена может быть нулевой или положительной. Такое значение подразумевает отсутствие активной торговли по определённой цене или временное приостановление (криптовалюты, облигации с нулевым купоном). 23 | PRICE_SIGN_NON_NEGATIVE = 2; 24 | // Any. 25 | // Любая цена, без ограничения на знак. 26 | // Позволяет произвольное значение цены, как положительное, так и отрицательное (фьючерсы, опционы). 27 | PRICE_SIGN_ANY = 3; 28 | } 29 | 30 | // Security. 31 | // Инструмент. 32 | message Security { 33 | // Security code. 34 | // Код инструмента. 35 | string code = 1; 36 | // Security board. 37 | // Основной режим торгов инструмента. 38 | string board = 2; 39 | // Market. 40 | // Рынок инструмента. 41 | Market market = 3; 42 | // Number of decimal digits in the price value. 43 | // Количество знаков в дробной части цены. 44 | sint32 decimals = 4; 45 | // Lot size. 46 | // Размер лота. 47 | sint32 lot_size = 5; 48 | // Price min step. 49 | // Минимальный шаг цены. 50 | sint32 min_step = 6; 51 | // Currency. 52 | // Валюта номинала инструмента. 53 | string currency = 7; 54 | // Instrument code (not used). 55 | // Код инструмента (не используется). 56 | reserved 8; 57 | reserved "instrument_code"; 58 | // Security name. 59 | // Название инструмента. 60 | string short_name = 9; 61 | // Параметры инструмента. Значение представлено в виде битовой маски. 62 | // 0 Нет параметров. 63 | // 1 Инструмент торгуется на Бирже. 64 | // 2 Инструмент допущен к торгам у Брокера - существенно для НЕ ГЛАВНЫХ трейдеров, главным доступны все инструменты, торгуемые на биржах. 65 | // 4 Рыночные заявки (без ограничения по цене) разрешены. 66 | // 8 Признак маржинальности бумаги. 67 | // 16 Опцион Call. 68 | // 32 Опцион Put. 69 | // 48 Фьючерс: Call | Put. 70 | // 64 Разрешен для резидентов. 71 | // 128 Разрешен для нерезидентов. 72 | int32 properties = 10; 73 | // Timezone name. 74 | // Имя таймзоны. 75 | string time_zone_name = 11; 76 | // The price unit cost for one security (not for the lot)), excluding accrued interest. 77 | // Стоимость пункта цены одного инструмента (не лота), без учета НКД. 78 | double bp_cost = 12; 79 | // Current accrued interest. 80 | // Текущий НКД. 81 | double accrued_interest = 13; 82 | // Allowed price: positive, non negative, any. 83 | // Допустимая цена: положительная, неотрицательная, любая. 84 | PriceSign price_sign = 14; 85 | // Ticker. 86 | // Код инструмента (тикер) на биржевой площадке листинга. 87 | string ticker = 15; 88 | // The split ratio of a security in one standard lot. 89 | // Коэффициент дробления ценной бумаги в одном стандартном лоте. 90 | sint32 lot_divider = 16; 91 | } -------------------------------------------------------------------------------- /contracts/proto/tradeapi/v1/stops.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package proto.tradeapi.v1; 4 | 5 | option csharp_namespace = "Finam.TradeApi.Proto.V1"; 6 | 7 | import "google/protobuf/timestamp.proto"; 8 | import "proto/tradeapi/v1/common.proto"; 9 | 10 | // Stop order status. 11 | // Состояние заявки. 12 | enum StopStatus { 13 | // Value is not specified. Do not use. 14 | // Значение не указано. Не использовать. 15 | STOP_STATUS_UNSPECIFIED = 0; 16 | // Order is not in OrderBook. 17 | // Заявка не выставлена. 18 | STOP_STATUS_NONE = 1; 19 | // Order is in OrderBook. 20 | // Заявка выставлена. 21 | STOP_STATUS_ACTIVE = 2; 22 | // Order is cancelled. 23 | // Заявка отменена. 24 | STOP_STATUS_CANCELLED = 3; 25 | // Order is executed. 26 | // Заявка выполнена. 27 | STOP_STATUS_EXECUTED = 4; 28 | } 29 | 30 | // Stop Order. 31 | // Стоп-заявка. 32 | message Stop { 33 | // Stop Order Id. 34 | // Идентификатор стоп-заявки. 35 | int32 stop_id = 1; 36 | // Security Code. 37 | // Тикер инструмента. 38 | string security_code = 2; 39 | // Security Board. 40 | // Основной режим торгов инструмента. 41 | string security_board = 3; 42 | // Market. 43 | // Рынок. 44 | proto.tradeapi.v1.Market market = 4; 45 | // Trade Account ID. 46 | // Идентификатор торгового счёта. 47 | string client_id = 5; 48 | // Transaction direction. 49 | // Направление сделки. 50 | BuySell buy_sell = 6; 51 | // Expiration date for FORTS order. 52 | // Дата экспирации заявки FORTS. 53 | google.protobuf.Timestamp expiration_date = 7; 54 | // Linked order ID. 55 | // Биржевой номер связанной (активной) заявки. 56 | int64 link_order = 8; 57 | // Order lifetime. 58 | // Время действия заявки. 59 | proto.tradeapi.v1.OrderValidBefore valid_before = 9; 60 | // Order status. 61 | // Состояние заявки. 62 | StopStatus status = 10; 63 | // Rejection reason or conditional order resolution. 64 | // Причина отказа или вердикт по условной заявке. 65 | string message = 11; 66 | // Order No. 67 | // Номер заявки, полученной в результате исполнения стопа. 68 | int64 order_no = 12; 69 | // Trade No. 70 | // Номер сделки, которая привела к исполнению стопа. 71 | int64 trade_no = 13; 72 | // Time of order registration on the server in UTC. 73 | // Время, когда заявка была зарегистрирована на сервере. В UTC. 74 | google.protobuf.Timestamp accepted_at = 14; 75 | // Time of order canceled on the server in UTC. 76 | // Время, когда заявка была отменена на сервере. В UTC. 77 | google.protobuf.Timestamp canceled_at = 15; 78 | // Price currency. 79 | // Валюта цены. 80 | string currency = 16; 81 | // Take profit: local extremum. 82 | // Тейк профит: текущий локальный экстремум. 83 | double take_profit_extremum = 17; 84 | // Take profit: correction level. 85 | // Тейк профит: текущий уровень коррекции. 86 | double take_profit_level = 18; 87 | // Stop loss. 88 | // Стоп лосс. 89 | StopLoss stop_loss = 19; 90 | // Take profit. 91 | // Тейк профит. 92 | TakeProfit take_profit = 20; 93 | } 94 | 95 | // StopLoss order. 96 | // Стоп лосс заявка. 97 | message StopLoss { 98 | // Activation price. 99 | // Цена активации. 100 | double activation_price = 1; 101 | // Price. 102 | // Цена заявки. 103 | double price = 2; 104 | // Market price. 105 | // По рынку. 106 | bool market_price = 3; 107 | // Quantity. 108 | // Количество. 109 | StopQuantity quantity = 4; 110 | // Time, seconds. 111 | // Защитное время, сек. 112 | int32 time = 5; 113 | // Use credit. 114 | // Использовать кредит. 115 | bool use_credit = 6; 116 | } 117 | 118 | // TakeProfit order. 119 | // Тейк профит заявка. 120 | message TakeProfit { 121 | // Activation price. 122 | // Цена активации. 123 | double activation_price = 1; 124 | // Correction. 125 | // Коррекция. 126 | StopPrice correction_price = 2; 127 | // Spread price. 128 | // Защитный спрэд. 129 | StopPrice spread_price = 3; 130 | // Market price. 131 | // По рынку. 132 | bool market_price = 4; 133 | // Quantity. 134 | // Количество. 135 | StopQuantity quantity = 5; 136 | // Time, seconds. 137 | // Защитное время, сек. 138 | int32 time = 6; 139 | // Use credit. 140 | // Использовать кредит. 141 | bool use_credit = 7; 142 | } 143 | 144 | // Stop quantity. 145 | // Объем стоп-заявки. 146 | message StopQuantity { 147 | // Value. 148 | // Значение объема. 149 | double value = 1; 150 | // Units. 151 | // Единицы объема. 152 | StopQuantityUnits units = 2; 153 | } 154 | 155 | // Stop quantity units. 156 | // Единицы объема стоп-заявки. 157 | enum StopQuantityUnits { 158 | // Value is not specified. Do not use. 159 | // Значение не указано. Не использовать. 160 | STOP_QUANTITY_UNITS_UNSPECIFIED = 0; 161 | // Percent. 162 | // Значение а процентах. 163 | STOP_QUANTITY_UNITS_PERCENT = 1; 164 | // Lots. 165 | // Значение в лотах. 166 | STOP_QUANTITY_UNITS_LOTS = 2; 167 | } 168 | 169 | // Stop price. 170 | // Цена стоп-заявки. 171 | message StopPrice { 172 | // Value. 173 | // Значение цены. 174 | double value = 1; 175 | // Units. 176 | // Единицы цены. 177 | StopPriceUnits units = 2; 178 | } 179 | 180 | // Stop price units. 181 | // Единицы цены стоп-заявки. 182 | enum StopPriceUnits { 183 | // Value is not specified. Do not use. 184 | // Значение не указано. Не использовать. 185 | STOP_PRICE_UNITS_UNSPECIFIED = 0; 186 | // Percent. 187 | // Значение а процентах. 188 | STOP_PRICE_UNITS_PERCENT = 1; 189 | // Lots. 190 | // Значение в единицах цены. 191 | STOP_PRICE_UNITS_PIPS = 2; 192 | } 193 | 194 | // Request for Stop Order cancellation. 195 | // Запрос на снятие стоп-заявки. 196 | message CancelStopRequest { 197 | // Trade Account ID. 198 | // Идентификатор торгового счёта. 199 | string client_id = 1; 200 | // Stop Order Id. 201 | // Идентификатор стоп-заявки. 202 | int32 stop_id = 2; 203 | } 204 | 205 | // Result of Stop Order cancellation. 206 | // Результат отмены стоп-заявки. 207 | message CancelStopResult { 208 | // Trade Account ID. 209 | // Идентификатор торгового счёта. 210 | string client_id = 1; 211 | // Stop Order Id. 212 | // Идентификатор стоп-заявки. 213 | int32 stop_id = 2; 214 | } 215 | 216 | // Request for the list of Stop Orders. 217 | // Запрос стоп-заявок. 218 | message GetStopsRequest { 219 | // Trade Account ID. 220 | // Идентификатор торгового счёта. 221 | string client_id = 1; 222 | // Include executed stops in response. 223 | // Вернуть исполненные стоп-заявки. 224 | bool include_executed = 2; 225 | // Include canceled stops in response. 226 | // Вернуть отмененные стоп-заявки. 227 | bool include_canceled = 3; 228 | // Include active stops in response. 229 | // Вернуть активные стоп-заявки. 230 | bool include_active = 4; 231 | } 232 | 233 | // Result of Stop Orders request. 234 | // Результат запроса стоп-заявок. 235 | message GetStopsResult { 236 | // Trade Account ID. 237 | // Идентификатор торгового счёта. 238 | string client_id = 1; 239 | // Stop Orders List. 240 | // Список стоп-заявок. 241 | repeated Stop stops = 2; 242 | } 243 | 244 | // New Stop Order request. 245 | // Запрос на выставление стоп заявки. 246 | message NewStopRequest { 247 | // Trade Account ID. 248 | // Идентификатор торгового счёта. 249 | string client_id = 1; 250 | // Trading Board. 251 | // Режим торгов. 252 | string security_board = 2; 253 | // Security Code. 254 | // Тикер инструмента. 255 | string security_code = 3; 256 | // Transaction direction. 257 | // Направление сделки. 258 | BuySell buy_sell = 4; 259 | // Stop loss. 260 | // Стоп лосс. 261 | StopLoss stop_loss = 5; 262 | // Take profit. 263 | // Тейк профит. 264 | TakeProfit take_profit = 6; 265 | // Expiration date for FORTS order. 266 | // Дата экспирации заявки FORTS. 267 | google.protobuf.Timestamp expiration_date = 7; 268 | // Linked order ID. 269 | // Биржевой номер связанной (активной) заявки. 270 | int64 link_order = 8; 271 | // Order lifetime. 272 | // Время действия заявки. 273 | proto.tradeapi.v1.OrderValidBefore valid_before = 9; 274 | } 275 | 276 | // Result of new Stop Order request. 277 | // Результат выставления стоп заявки. 278 | message NewStopResult { 279 | // Trade Account Id. 280 | // Идентификатор торгового счёта. 281 | string client_id = 1; 282 | // Stop Order Id. 283 | // Идентификатор стоп заявки. 284 | int32 stop_id = 2; 285 | // Security Code. 286 | // Тикер инструмента. 287 | string security_code = 3; 288 | // Trading Board. 289 | // Режим торгов. 290 | string security_board = 4; 291 | } -------------------------------------------------------------------------------- /docs/common-info.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | slug: / 4 | --- 5 | 6 | # Общая информация 7 | 8 | :::danger Внимание 9 | 10 | Мы выпустили новую улучшенную версию Trade API – посмотреть документацию и начать пользоваться сервисом можно здесь: https://tradeapi.finam.ru 11 | 12 | Выпуск новых токенов текущей версии отключим в течение месяца ввиду её нестабильности и остановки развития. 13 | 14 | Поддержку активных пользователей продолжим вплоть до полного вывода текущей версии из эксплуатации. Плановая дата – декабрь 2025 года. 15 | 16 | ::: 17 | 18 | Trade API — это gRPC и REST API, предназначенные для организации взаимодействия пользовательских приложений с сервером TRANSAQ. Является развитием TXmlConnector.dll, выпущенного в виде библиотеки функций. 19 | 20 | ## Возможности API 21 | 22 | :::danger Внимание 23 | 24 | Внимание! С 1 апреля 2025 года получение доступа к данной версии Trade Api невозможно для клиентов категории КНУР (клиент начального уровня риска). 25 | 26 | ::: 27 | 28 | - Разработка алгоритмов; 29 | - Тестирование стратегий; 30 | - Создание торговых роботов и собственных терминалов; 31 | - Подключение созданных торговых систем к TRANSAQ и оперативное получение рыночной информации; 32 | - Анализ котировок в режиме реального времени и выгрузка исторических данных; 33 | - Выставление торговых заявок и отслеживание их исполнения. 34 | 35 | ## Преимущества Trade API 36 | 37 | - **Удобство**. Пользоваться Trade API могут как опытные алготрейдеры, так и инвесторы, которые только осваивают автоматизированную торговлю. Спецификация Trade API реализована на базе Swagger UI, позволяющего интерактивно просматривать информацию о методах открытого программного интерфейса и отправлять запросы; 38 | - **Функциональность**. В Trade API уже есть, все, что может понадобиться трейдеру для реализации самых разных автоматизированных стратегий торговли. В планах команды разработчиков «Финама» — дальнейшее совершенствование продукта за счет добавления новых функций и интеграций; 39 | - **Универсальность**. Взаимодействие с TRANSAQ осуществляется через интернет-протокол (на ПК или мобильном устройстве), что обеспечивает возможность создания торговых и информационных приложений на любом языке программирования и на устройстве с любой операционной системой; 40 | - **Безопасность**. Для работы с Trade API пользователь получает токен — уникальный цифровой код, в котором зашифрованы данные о клиенте и выбранных счетах. Токен позволяет идентифицировать клиента и предназначен для авторизации в системе, а также для подтверждения операций с торговым счётом; 41 | - **Стабильность**. «Финам» — надежный брокер, который может обеспечить бесперебойное функционирование торговых приложений даже при пиковых нагрузках. Используя Сomon Trade API, клиенты могут быть уверены в стабильной работе ПО, а также всегда могут рассчитывать на оперативную помощь службы техподдержки; 42 | - **Доступность**. Пользоваться Trade API могут бесплатно все клиенты «Финама», зарегистрированные в сервисе Comon.ru и получившие токен. -------------------------------------------------------------------------------- /docs/examples/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Примеры использования", 3 | "position": 9, 4 | "link": { 5 | "type": "generated-index" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /docs/examples/golang.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 11 3 | --- 4 | 5 | # Golang 6 | 7 | - https://github.com/DBoyara/FinamTradeApiGo 8 | -------------------------------------------------------------------------------- /docs/examples/hackathon.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 9 3 | --- 4 | 5 | # Хакатон Финам Trade API. Победители 6 | 7 | ## Алгоритмические торговые системы — торговые роботы 8 | 9 | ### Шульц Илья Игоревич 10 | 11 | - **Номинация**: Лучший пример самописного ПО для мобильных устройств 12 | - **Ссылка на проект на GitHub**: https://github.com/ZooM3000/Hackathon_Finam.git 13 | 14 | ### Шпагин Олег Павлович 15 | 16 | - **Номинация**: Лучший пример самописного ПО для Desktop 17 | - **Ссылка на проект на GitHub**: https://github.com/WISEPLAT/Hackathon-Finam-NN-Trade-Robot 18 | 19 | ## Неторговые разработки на основе Trade API 20 | 21 | ### Васютинский Олег Николаевич 22 | 23 | - **Номинация**: Лучший пример самописного ПО для мобильных устройств 24 | - **Ссылка на проект на GitHub**: https://github.com/polkila/Finambotik 25 | 26 | ### Команда "WealthWizards": Литвинов Сергей Алексеевич, Прокофьев Максим Игоревич 27 | 28 | - **Номинация**: Лучший пример самописного ПО для Desktop 29 | - **Ссылка на проект на GitHub**: https://github.com/madddmax/FunnyTrade/ 30 | 31 | ## Самое оригинальное использование Trade API 32 | 33 | ### Арбузов Вячеслав Олегович 34 | 35 | - **Номинация**: Специальный приз 36 | - **Ссылка на проект на GitHub**: https://github.com/arbuzovv/rusquant/tree/master/examples/Finam_Trade_API_Hackathon 37 | -------------------------------------------------------------------------------- /docs/examples/python.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 9 3 | --- 4 | 5 | # Python 6 | 7 | - https://github.com/cia76/FinamPy 8 | - https://github.com/DBoyara/FinamTradeApiPy 9 | -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 20 3 | --- 4 | 5 | # FAQ 6 | 7 | ## Где взять proto файлы? 8 | 9 | Вот [здесь](https://github.com/FinamWeb/trade-api-docs/tree/master/contracts). 10 | 11 | ## Что означает ошибка: _"Invalid parameter 'szUnion'"_? 12 | 13 | Счет не зарегистрирован в системе TRASAQ или счет не является единым. 14 | 15 | ## Как посмотреть, какие счета закреплены за токеном доступа? 16 | 17 | В личном кабинете. 18 | 19 | ## Есть ли какие-то ограничения на количество запросов? 20 | 21 | Да, существуют лимиты на количество запросов в минуту на пользователя (не на токен доступа): 22 | 23 | - `/orders` - 100 запросов в минуту; 24 | - `/portfolios` - 100 запросов в минуту; 25 | - `/securities` - 1 запрос в минуту; 26 | - `/subscriptions`- 100 запросов в минуту. 27 | 28 | ## Поддерживает ли сервис иностранные акции на NYSE и Nasdaq? Какие инструменты доступны для работы через API? 29 | 30 | Список доступных инструментов можно получить через [API](rest-api/securities.md#получение-списка-инструментов). 31 | 32 | ## Возможно ли через API получать брокерские отчёты и онлайн-историю операций по счёту? 33 | 34 | Нет. 35 | 36 | ## Поддерживаете ли вы FIX/FAST или другие открытые сетевые протоколы? 37 | 38 | Нет, только REST API и gRPC. 39 | 40 | ## Есть ли у вас библиотеки или SDK под линукс? 41 | 42 | Нет, но протокол взаимодействия с сервисом позволяет реализовать клиента под любую платформу. 43 | 44 | ## Как запросить последнюю 10-минутную свечу и ее данные? 45 | 46 | Запросить свечи можно через [API](rest-api/candles.md#запрос-свечей). 47 | 48 | ## Через какое API можно получить данные по открытому интересу во фьючерсе? 49 | 50 | Биржевой индикатор открытого интереса в API не выводится. Вы можете посмотреть его на сайте московской биржи по конкретному инструменту (например, https://www.moex.com/ru/contract.aspx?code=Si-12.22 ). 51 | 52 | ## Возможно ли предоставить доступ только на чтение по счету? 53 | 54 | Да, для этого необходимо создать _просмотровый_ [токен доступа](tokens.md). 55 | 56 | ## Что делать, если на запрос сервис отвечает ошибкой "Service temporarily unavailable"? 57 | 58 | Такая ошибка возникает в случае долгого таймаута ответа TRANSAQ. В случае её возникновения стоит обработать ошибку на уровне кода и повторить запрос ещё раз спустя небольшое количество времени. При запросе, меняющем состояние системы (например: новая заявка или отмена заявки), необходимо сверить состояние сервиса. 59 | -------------------------------------------------------------------------------- /docs/getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Как начать пользоваться 6 | 7 | 1. [Открыть счет в «Финаме»](https://open.finam.ru/registration). 8 | 2. Зарегистрироваться в сервисе [Comon](https://www.comon.ru/). 9 | 3. В личном кабинете Comon [получить токен](https://www.comon.ru/my/trade-api/tokens). 10 | 4. Ознакомиться с документацией по: 11 | - [REST API](https://finamweb.github.io/trade-api-docs/category/rest-api), 12 | - [gRPC API](https://finamweb.github.io/trade-api-docs/category/grpc). 13 | -------------------------------------------------------------------------------- /docs/grpc/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "gRPC", 3 | "position": 8, 4 | "link": { 5 | "type": "generated-index" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /docs/grpc/events.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | --- 4 | # GetEvents 5 | 6 | ### Подписка на заявки и сделки 7 | ```json 8 | { 9 | "order_trade_subscribe_request": { 10 | "request_id": "ffc38cb7-2072", 11 | "client_ids": [ 12 | "YOUR_TRADE_CODE" 13 | ], 14 | "include_trades": true, 15 | "include_orders": true 16 | } 17 | } 18 | ``` 19 | 20 | ### Удаление подписки на заявки и сделки 21 | ```json 22 | { 23 | "order_trade_unsubscribe_request": { 24 | "request_id": "ffc38cb7-2072" 25 | } 26 | } 27 | ``` 28 | 29 | ### Подписка на биржевой стакан 30 | ```json 31 | { 32 | "order_book_subscribe_request": { 33 | "request_id": "32ef5786-e887", 34 | "security_board": "TQBR", 35 | "security_code": "GAZP" 36 | } 37 | } 38 | ``` 39 | 40 | ### Удаление подписки на биржевой стакан 41 | ```json 42 | { 43 | "order_book_unsubscribe_request": { 44 | "request_id": "32ef5786-e887", 45 | "security_board": "TQBR", 46 | "security_code": "GAZP" 47 | } 48 | } 49 | ``` 50 | 51 | ### Лимит количества подписок на биржевой стакан 52 | 53 | Для предотвращения повышенной нагрузки на сервис количество подписок на биржевой стакан от пользователя ограничено. 54 | 55 | Допускается не более 300 подписок на сессию. 56 | 57 | При попытке превысить заданный лимит пользователю вернется ошибка с кодом `BAD_REQUEST` и сообщением `"OrderBook's subscriptions limit reached 300"`. 58 | 59 | ### Keep-Alive 60 | 61 | При установлении длительного соединения с сервером, между клиентом и сервером могут находиться различные proxy-сервера, которые могут принудительно разрывать соединение при отсутствии активности в нем. 62 | 63 | Для поддержания активности необходимо с неким интервалом (например, раз в 3 минуты) отправлять сообщение `proto.tradeapi.v1.KeepAliveRequest`. 64 | 65 | На каждое сообщение `proto.tradeapi.v1.KeepAliveRequest` сервер должен отвечать подтверждающим сообщением `proto.tradeapi.v1.ResponseEvent`. 66 | -------------------------------------------------------------------------------- /docs/grpc/img/img_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/docs/grpc/img/img_1.png -------------------------------------------------------------------------------- /docs/grpc/img/img_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/docs/grpc/img/img_2.png -------------------------------------------------------------------------------- /docs/grpc/img/img_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/docs/grpc/img/img_3.png -------------------------------------------------------------------------------- /docs/grpc/img/img_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/docs/grpc/img/img_4.png -------------------------------------------------------------------------------- /docs/grpc/img/img_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/docs/grpc/img/img_5.png -------------------------------------------------------------------------------- /docs/grpc/img/img_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/docs/grpc/img/img_6.png -------------------------------------------------------------------------------- /docs/grpc/img/img_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/docs/grpc/img/img_7.png -------------------------------------------------------------------------------- /docs/grpc/orders.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | # NewOrder 5 | 6 | ### Рыночная заявка 7 | 8 | ```json 9 | { 10 | "client_id": "YOUR_TRADE_CODE", 11 | "security_board": "TQBR", 12 | "security_code": "SBER", 13 | "buy_sell": "BUY_SELL_BUY", 14 | "quantity": 1, 15 | "property": "ORDER_PROPERTY_PUT_IN_QUEUE" 16 | } 17 | ``` 18 | 19 | ### Лимитная заявка 20 | 21 | ```json 22 | { 23 | "client_id": "YOUR_TRADE_CODE", 24 | "security_board": "TQBR", 25 | "security_code": "SBER", 26 | "buy_sell": "BUY_SELL_SELL", 27 | "quantity": 1, 28 | "property": "ORDER_PROPERTY_PUT_IN_QUEUE", 29 | "price": {"value": 150} 30 | } 31 | ``` 32 | 33 | ### Условная заявка 34 | 35 | ```json 36 | { 37 | "client_id": "YOUR_TRADE_CODE", 38 | "security_board": "TQBR", 39 | "security_code": "SBER", 40 | "buy_sell": "BUY_SELL_BUY", 41 | "quantity": 5, 42 | "property": "ORDER_PROPERTY_PUT_IN_QUEUE", 43 | "condition": { 44 | "type": "ORDER_CONDITION_TYPE_LAST_UP", 45 | "price": 150 46 | } 47 | } 48 | ``` 49 | 50 | # GetOrders 51 | 52 | Получение списка заявок (активных, отмененных, исполненных). 53 | Отмененные и исполненные заявки хранятся в разрезе одной торговой сессии. 54 | 55 | ```json 56 | { 57 | "client_id": "YOUR_TRADE_CODE", 58 | "include_active": true, 59 | "include_canceled": true, 60 | "include_matched": true 61 | } 62 | ``` 63 | 64 | # CancelOrder 65 | 66 | Отмена активной заявки 67 | 68 | ```json 69 | { 70 | "client_id": "YOUR_TRADE_CODE", 71 | "transaction_id": 216517182 72 | } 73 | ``` -------------------------------------------------------------------------------- /docs/grpc/portfolios.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | # GetPortfolios 5 | Получение структуры портфеля 6 | 7 | ```json 8 | { 9 | "client_id": "YOUR_TRADE_CODE", 10 | "content": { 11 | "include_currencies": true, 12 | "include_max_buy_sell": true, 13 | "include_money": true, 14 | "include_positions": true 15 | } 16 | } 17 | ``` -------------------------------------------------------------------------------- /docs/grpc/recommendations.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | --- 4 | 5 | # Рекомендации по тестированию методов Trade API 6 | 7 | **Postman** [Скачать](https://www.postman.com/downloads/?utm_source=postman-home) 8 | 9 | 1. После запуска Postman нажмите `New` и выберите `gRPC Request`. 10 | ![Шаг_1](img/img_1.png) 11 | 2. Укажите адрес сервиса `trade-api.finam.ru` и перейдите на вкладку `Service definition`. 12 | ![Шаг_2](img/img_2.png) 13 | 3. В разделе `Service definition` нажмите на значок обновления для использования `Reflection` со стороны сервера. В 14 | данном случае загружать самостоятельно proto-файлы не придется. 15 | ![Шаг_3](img/img_3.png) 16 | 4. В поле `Select a method` отображаются доступные запросы. 17 | ![Шаг_4](img/img_4.png) 18 | 5. После подготовительных действий Вы можете приступить к отправке запросов к сервису. 19 | 6. Для получения информации по портфелю в списке методов выберите `GetPortfolio` и нажмите `Use example message`. 20 | ![Шаг_6](img/img_5.png) 21 | 7. Отредактируйте «Message». В поле `client_id` необходимо передать trade code (номер счета), с помощью которого был 22 | сгенерирован токен. 23 | 8. Далее перейти на вкладку `Metadata`, здесь передается информация о токене 24 | `X-Api-Key` и сгенерированный токен из сервиса Comon. 25 | ![Шаг_8](img/img_6.png) 26 | 9. После заполнения `Metadata` и `Message` отправить запрос, нажав `Invoke`. 27 | ![Шаг_9](img/img_7.png) 28 | -------------------------------------------------------------------------------- /docs/grpc/securities.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | # GetSecurities 5 | Получение списка инструментов. 6 | 7 | ```json 8 | { 9 | "board": "TQBR", 10 | "seccode": "SBER" 11 | } 12 | ``` 13 | 14 | `board` - Режим торгов (необязательное поле для фильтрации) 15 | 16 | `seccode` - Тикер инструмента (необязательное поле для фильтрации) -------------------------------------------------------------------------------- /docs/grpc/stops.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | # NewStop 5 | 6 | ### Тейк-профит (Следящий) 7 | 8 | ```json 9 | { 10 | "buy_sell": "BUY_SELL_SELL", 11 | "client_id": "YOUR_TRADE_CODE", 12 | "security_board": "TQBR", 13 | "security_code": "SBER", 14 | "take_profit": { 15 | "activation_price": 160, 16 | "correction_price": { 17 | "units": "STOP_PRICE_UNITS_PIPS", 18 | "value": 2 19 | }, 20 | "market_price": false, 21 | "quantity": { 22 | "units": "STOP_QUANTITY_UNITS_LOTS", 23 | "value": 7 24 | }, 25 | "spread_price": { 26 | "units": "STOP_PRICE_UNITS_PIPS", 27 | "value": 1 28 | }, 29 | "use_credit": false 30 | } 31 | } 32 | ``` 33 | 34 | ### Тейк-профит (Простой) 35 | 36 | ```json 37 | { 38 | "buy_sell": "BUY_SELL_BUY", 39 | "client_id": "YOUR_TRADE_CODE", 40 | "security_board": "TQBR", 41 | "security_code": "SBER", 42 | "take_profit": { 43 | "activation_price": 162, 44 | "market_price": true, 45 | "quantity": { 46 | "units": "STOP_QUANTITY_UNITS_LOTS", 47 | "value": 1 48 | } 49 | } 50 | } 51 | ``` 52 | 53 | ### Стоп-лосс 54 | 55 | ```json 56 | { 57 | "buy_sell": 1, 58 | "client_id": "YOUR_TRADE_CODE", 59 | "security_board": "TQBR", 60 | "security_code": "AFLT", 61 | "stop_loss": { 62 | "activation_price": 25, 63 | "market_price": false, 64 | "price": 25, 65 | "quantity": { 66 | "units": "STOP_QUANTITY_UNITS_LOTS", 67 | "value": 2 68 | }, 69 | "use_credit": false 70 | }, 71 | "valid_before": { 72 | "type": 2 73 | } 74 | } 75 | ``` 76 | 77 | # GetStops 78 | Получение списка всех стоп-заявок 79 | 80 | ```json 81 | { 82 | "client_id": "YOUR_TRADE_CODE", 83 | "include_active": true, 84 | "include_canceled": true, 85 | "include_executed": true 86 | } 87 | ``` 88 | 89 | # CancelStop 90 | Отмена активной стоп-заявки 91 | 92 | ```json 93 | { 94 | "client_id": "YOUR_TRADE_CODE", 95 | "stop_id": 1730 96 | } 97 | ``` -------------------------------------------------------------------------------- /docs/limits.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 6 3 | --- 4 | 5 | # Лимитная политика 6 | 7 | Для предотвращения повышенной нагрузки на сервис количество запросов от пользователя лимитировано. 8 | 9 | Лимит распространяется на пользователя, а не на [токен доступа](tokens.md), таким образом запросы выполненные под разными токенами одного и того же пользователя будут расходовать один и тот же лимит. 10 | 11 | В случае превышения лимита пользователю будет отправлена ошибка **TOO_MANY_REQUESTS** с кодом 429, а его запрос будет отменен. В этом случае необходимо будет немного подождать и повторить запрос. 12 | 13 | ## Таблица лимитов 14 | | Сервис | Количество запросов в минуту | 15 | |--------------|:----------------------------:| 16 | | securities | 1 | 17 | | portfolio | 100 | 18 | | orders/stops | 100 | 19 | | candles | 120 | 20 | -------------------------------------------------------------------------------- /docs/rest-api/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "REST API", 3 | "position": 7, 4 | "link": { 5 | "type": "generated-index" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /docs/rest-api/api.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # REST API 6 | 7 | ## Авторизация 8 | 9 | Авторизация клиента в сервисе производится на основании [токена доступа](../tokens.md). 10 | 11 | При совершении действий в сервисе, токен доступа необходимо передавать в HTTP заголовке `X-Api-Key`. 12 | 13 | ## Формат ответа 14 | 15 | Ответ сервиса имеет следующий формат: 16 | 17 | ```json 18 | { 19 | "error": { 20 | "code": "string", 21 | "message": "string", 22 | "data": "string" 23 | }, 24 | "data": ... 25 | } 26 | ``` 27 | 28 | Поле `data` содержит результат выполнения запроса в случае его успешности. В случае ошибки поле `data` будет равно `null`. 29 | 30 | Поле `error` описывает ошибку, возникшую в результате выполнения запроса, где: 31 | 32 | - `code` - код ошибки, 33 | - `message` - сообщение об ошибке, 34 | - `data` - данные, связанные с ошибкой. 35 | 36 | В случае успешного выполнения запроса поле `error` будет равно `null`. 37 | -------------------------------------------------------------------------------- /docs/rest-api/candles.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 7 3 | --- 4 | 5 | # Свечи 6 | 7 | Сервис предоставляет API для запроса двух типов свечей: [внутридневные](#intradaycandle) и [дневные](#daycandle). 8 | 9 | Доступные таймфреймы для [внутридневных](#intradaycandle) свечей: 10 | - `M1` - 1 минута 11 | - `M5` - 5 минут 12 | - `M15` - 15 минут 13 | - `H1` - 1 час 14 | 15 | Доступные таймфреймы для [дневных](#daycandle) свечей: 16 | - `D1` - 1 день 17 | - `W1` - 1 неделя 18 | 19 | ## DayCandle 20 | Объект дневная свеча описывается следующим объектом: 21 | 22 | ```json 23 | { 24 | "date": "string", 25 | "open": { 26 | "num": 0, 27 | "scale": 0 28 | }, 29 | "close": { 30 | "num": 0, 31 | "scale": 0 32 | }, 33 | "high": { 34 | "num": 0, 35 | "scale": 0 36 | }, 37 | "low": { 38 | "num": 0, 39 | "scale": 0 40 | }, 41 | "volume": 0 42 | } 43 | ``` 44 | `date` - дата свечи в формате `yyyy-MM-dd` (в локальном времени биржи); 45 | 46 | `open` - цена открытия (тип [Decimal](common-types.md#decimal)); 47 | 48 | `close` - цена закрытия (тип [Decimal](common-types.md#decimal)); 49 | 50 | `high` - максимальная цена (тип [Decimal](common-types.md#decimal)); 51 | 52 | `low` - минимальная цена (тип [Decimal](common-types.md#decimal)); 53 | 54 | `volume` - объем торгов. 55 | 56 | ## IntradayCandle 57 | 58 | Объект внутридневная свеча описывается следующим объектом: 59 | 60 | ```json 61 | { 62 | "timestamp": "string", 63 | "open": { 64 | "num": 0, 65 | "scale": 0 66 | }, 67 | "close": { 68 | "num": 0, 69 | "scale": 0 70 | }, 71 | "high": { 72 | "num": 0, 73 | "scale": 0 74 | }, 75 | "low": { 76 | "num": 0, 77 | "scale": 0 78 | }, 79 | "volume": 0 80 | } 81 | ``` 82 | `timestamp` - дата и время свечи в формате `yyyy-MM-ddTHH:mm:ssZ` в поясе UTC; 83 | 84 | `open` - цена открытия (тип [Decimal](common-types.md#decimal)); 85 | 86 | `close` - цена закрытия (тип [Decimal](common-types.md#decimal)); 87 | 88 | `high` - максимальная цена (тип [Decimal](common-types.md#decimal)); 89 | 90 | `low` - минимальная цена (тип [Decimal](common-types.md#decimal)); 91 | 92 | `volume` - объем торгов. 93 | 94 | ## Запрос свечей 95 | 96 | Для получения списка свечей необходимо выполнить `GET` запрос на `/api/v1/day-candles/` или `/api/v1/intraday-candles`. 97 | 98 | Необходимо указать `securityCode`, `securityBoard` и `timeFrame`. 99 | 100 | Запросить можно как определенное количество свечей так и за интервал. 101 | 102 | Для запроса количества свечей в запросе необходимо указать `count` и либо `from` (начиная с указанной даты) либо `to` (до указанной даты). 103 | 104 | Для запроса за интервал необходимо указать`from` и `to`. 105 | 106 | Для дневных свечей в `from` и `to` указывается дата в формате `yyyy-MM-dd`, а для внутридневных свечей в формате `yyyy-MM-ddTHH:mm:ssZ` в часовом поясе UTC. 107 | 108 | Ограничения на запрос: 109 | - Максимальное значение `count` 500 штук 110 | - Для дневных свечей максимальный интервал 365 дней 111 | - Для внутридневных свечей максимальный интервал 30 дней 112 | -------------------------------------------------------------------------------- /docs/rest-api/common-types.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Описание общих типов 6 | 7 | ## Market 8 | 9 | Определяет рынок, на котором торгуется инструмент. Принимает следующие значения: 10 | 11 | - `Stock` - фондовый рынок Московской биржи; 12 | - `Forts` - срочный рынок Московской биржи; 13 | - `Spbex` - Санкт-Петербургская биржа; 14 | - `Mma` - фондовый рынок США; 15 | - `Ets` - валютный рынок Московской биржи; 16 | - `Bonds` - рынок облигаций Московской биржи; 17 | - `Options` - рынок опционов Московской биржи. 18 | 19 | ## BuySell 20 | 21 | Определяет тип операции: покупка или продажа. Принимает следующие значения: 22 | 23 | - `Buy` - покупка, 24 | - `Sell`- продажа. 25 | 26 | ## OrderValidBefore 27 | 28 | Обозначает время действия заявки. Тип условия определяет значение поля `type`, которое принимает следующие параметры: 29 | 30 | - `TillEndSession` - заявка действует до конца сессии; 31 | - `TillCancelled` - заявка действует, пока не будет отменена; 32 | - `ExactTime` - заявка действует до указанного времени. Параметр `time` должен быть задан. 33 | 34 | ## Decimal 35 | 36 | Представляет десятичное число с плавающей запятой: 37 | 38 | ```json 39 | { 40 | "num": 0, 41 | "scale": 0 42 | } 43 | ``` 44 | `num` - мантисса; 45 | 46 | `scale` - экспонента по основанию 10. 47 | 48 | Итоговое значение вычисляется по формуле: `num * 10^(-scale)`. Где `^` оператор возведение в степень. 49 | 50 | Например: для `num = 250655` и `scale = 3` итоговое значение будет `250.655`. -------------------------------------------------------------------------------- /docs/rest-api/orders.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Заявки 6 | 7 | ## Order 8 | 9 | Объект заявка описывается следующими полями: 10 | 11 | ```json 12 | { 13 | "orderNo": 0, 14 | "transactionId": 0, 15 | "securityCode": "string", 16 | "clientId": "string", 17 | "status": "None", 18 | "buySell": "Sell", 19 | "createdAt": "2023-03-02T07:25:11.226Z", 20 | "price": 0, 21 | "quantity": 0, 22 | "balance": 0, 23 | "message": "string", 24 | "currency": "string", 25 | "condition": { 26 | "type": "Bid", 27 | "price": 0, 28 | "time": "2023-03-02T07:25:11.226Z" 29 | }, 30 | "validBefore": { 31 | "type": "TillEndSession", 32 | "time": "2023-03-02T07:25:11.226Z" 33 | }, 34 | "acceptedAt": "2023-03-02T07:25:11.226Z", 35 | "securityBoard": "string", 36 | "market": "Stock" 37 | } 38 | ``` 39 | 40 | `orderNo` - уникальный идентификатор заявки на бирже. Задается после того, как заявка будет принята биржей (см. поле `status`); 41 | 42 | `transactionId` - внутренний идентификатор заявки в системе TRANSAQ (для чужой заявки значение всегда равно **0**); 43 | 44 | `securityCode` - код инструмента; 45 | 46 | `clientId` - торговый код клиента; 47 | 48 | `status` - текущий статус заявки. Тип [OrderStatus](#orderstatus); 49 | 50 | `buySell` - тип [BuySell](common-types.md#buysell); 51 | 52 | `createdAt` - время регистрации заявки на бирже (UTC); 53 | 54 | `price` - цена исполнения условной заявки. Для рыночной заявки значение всегда равно **0**; 55 | 56 | :::info 57 | 58 | В последующих версиях API поле `price` для рыночных заявок будет равно **null**, а не **0**. 59 | 60 | ::: 61 | 62 | `quantity` - объем заявки в лотах; 63 | 64 | `balance` - неисполненный остаток, в лотах. Изначально равен `quantity`, но по мере исполнения заявки (совершения сделок) будет уменьшаться на объем сделки. Значение **0** будет соответствовать полностью исполненной заявке (см. поле `status`); 65 | 66 | `message` - содержит сообщение об ошибке, возникшей при обработке заявки. Заявка может быть отклонена по разным причинам сервером TRANSAQ или биржей с выставлением поля `status`; 67 | 68 | `currency` - код валюты цены; 69 | 70 | `condition` - свойства выставления заявок. Тип [OrderCondition](#ordercondition); 71 | 72 | `validBefore` - условие по времени действия заявки. Тип [OrderValidBefore](common-types.md#ordervalidbefore-type); 73 | 74 | `acceptedAt` - время регистрации заявки на сервере TRANSAQ (UTC); 75 | 76 | `securityBoard` - основной режим торгов инструмента; 77 | 78 | `market` - рынок инструмента. Тип [Market](common-types.md#market). 79 | 80 | ## OrderStatus 81 | 82 | Статус заявки. Принимает следующие значения: 83 | 84 | - `None` - заявка принята сервером TRANSAQ, и заявке присвоен `transactionId`; 85 | - `Active` - заявка принята биржей, и заявке присвоен `orderNo`; 86 | - `Matched` - заявка полностью исполнилась (выполнилась); 87 | - `Cancelled` - заявка была отменена (снята) пользователем или биржей. 88 | 89 | ## OrderCondition 90 | 91 | Свойства выставления заявок. Тип условия определяет значение поля `type`, которое принимает следующие значения: 92 | 93 | - `Bid` - лучшая цена покупки; 94 | - `BidOrLast`- лучшая цена покупки или сделка по заданной цене и выше; 95 | - `Ask` - лучшая цена продажи; 96 | - `AskOrLast` - лучшая цена продажи или сделка по заданной цене и ниже; 97 | - `Time` - время выставления заявки на Биржу (параметр `time` должен быть установлен); 98 | - `CovDown` - обеспеченность ниже заданной; 99 | - `CovUp` - обеспеченность выше заданной; 100 | - `LastUp` - сделка на рынке по заданной цене или выше; 101 | - `LastDown`- сделка на рынке по заданной цене или ниже. 102 | 103 | ## Выставление новой заявки 104 | 105 | Для выставления новой заявки необходимо отправить `POST` запрос на `/api​/v1​/orders`, передав тело запроса в формате `json`: 106 | 107 | ```json 108 | { 109 | "clientId": "string", 110 | "securityBoard": "string", 111 | "securityCode": "string", 112 | "buySell": "Sell", 113 | "quantity": 0, 114 | "useCredit": true, 115 | "price": 0, 116 | "property": "PutInQueue", 117 | "condition": { 118 | "type": "Bid", 119 | "price": 0, 120 | "time": "2023-03-02T07:25:11.226Z" 121 | }, 122 | "validBefore": { 123 | "type": "TillEndSession", 124 | "time": "2023-03-02T07:25:11.226Z" 125 | } 126 | } 127 | ``` 128 | 129 | `clientId` - торговый код клиента; 130 | 131 | `securityBoard` - основной режим торгов для инструмента; 132 | 133 | `securityCode` - код инструмента; 134 | 135 | `buySell` - тип [BuySell](common-types.md#buysell); 136 | 137 | `quantity` - объем заявки в лотах; 138 | 139 | `useCredit` - использование кредита (недоступно для срочного рынка). Указать значение `true`, если необходимо использовать кредит, иначе `false`. 140 | 141 | `price` - цена исполнения заявки. Для рыночной заявки указать значение **null** (или не передавать это поле). Для условной заявки необходимо указать цену исполнения; 142 | 143 | :::info 144 | 145 | Для рыночных заявок в объекте [Order](#order) поле `price` будет равное **0**, а не **null**, как это ожидается. В последующих версиях API данное поведение будет изменено. 146 | 147 | ::: 148 | 149 | `property` - свойства исполнения частично исполненных заявок. Принимает следующие значения: 150 | 151 | - `PutInQueue` - неисполненная часть заявки помещается в очередь заявок биржи; 152 | - `CancelBalance` - неисполненная часть заявки снимается с торгов; 153 | - `ImmOrCancel` - сделки совершаются только в том случае, если заявка может быть удовлетворена полностью и сразу при выставлении. 154 | 155 | `condition` - свойства выставления заявок. Тип [OrderCondition](#ordercondition); 156 | 157 | `validBefore` - условие по времени действия заявки. Тип [OrderValidBefore](common-types.md#ordervalidbefore-type). 158 | 159 | В случае успешного выполнения запроса сервис вернет `transactionId` выставленной заявки. 160 | 161 | ## Получение заявок 162 | 163 | Для получения списка заявок необходимо выполнить `GET` запрос на `/api/v1/orders/`, указав критерии выбора в строке запроса: 164 | 165 | `clientId` - торговый код клиента (обязательный); 166 | 167 | `includeMatched` - вернуть исполненные заявки; 168 | 169 | `includeCanceled` - вернуть отмененные заявки; 170 | 171 | `includeActive` - вернуть активные заявки. 172 | 173 | В случае успешного выполнения запроса сервис вернет список заявок. 174 | 175 | ## Отмена заявки 176 | 177 | Для отмены выставленной заявки необходимо выполнить `DELETE` запрос на `/api​/v1​/orders/`, передав тело запроса в формате `json`: 178 | 179 | ```json 180 | { 181 | "clientId": "string", 182 | "transactionId": 0 183 | } 184 | ``` 185 | 186 | `clientId` - торговый код клиента; 187 | 188 | `transactionId` - идентификатор отменяемой заявки. 189 | -------------------------------------------------------------------------------- /docs/rest-api/portfolios.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | --- 4 | 5 | # Портфели 6 | 7 | Объект портфель описывается следующими полями: 8 | 9 | ## Portfolio 10 | 11 | ```json 12 | { 13 | "clientId": "string", 14 | "content": { 15 | "includeCurrencies": true, 16 | "includeMoney": true, 17 | "includePositions": true, 18 | "includeMaxBuySell": true 19 | }, 20 | "equity": 0, 21 | "balance": 0, 22 | "positions": [ 23 | { 24 | "securityCode": "string", 25 | "market": "Stock", 26 | "balance": 0, 27 | "currentPrice": 0, 28 | "equity": 0, 29 | "averagePrice": 0, 30 | "currency": "string", 31 | "accumulatedProfit": 0, 32 | "todayProfit": 0, 33 | "unrealizedProfit": 0, 34 | "profit": 0, 35 | "maxBuy": 0, 36 | "maxSell": 0, 37 | "priceCurrency": "string", 38 | "averagePriceCurrency": "string", 39 | "averageRate": 0 40 | } 41 | ], 42 | "currencies": [ 43 | { 44 | "name": "string", 45 | "balance": 0, 46 | "crossRate": 0, 47 | "equity": 0, 48 | "unrealizedProfit": 0 49 | } 50 | ], 51 | "money": [ 52 | { 53 | "market": "Stock", 54 | "currency": "string", 55 | "balance": 0 56 | } 57 | ] 58 | } 59 | ``` 60 | 61 | `clientId` - торговый код клиента; 62 | 63 | `content` - наполнение портфеля; 64 | 65 | `equity` - текущая оценка портфеля; 66 | 67 | `balance` - входящая оценка стоимости портфеля; 68 | 69 | `positions` - позиции портфеля. Массив объектов типа [PositionRow](#positionrow). Запрашиваются выставлением флага `includePositions` равным `true`; 70 | 71 | `currencies` - валюта портфеля. Массив объектов типа [CurrencyRow](#currencyrow). Запрашивается выставлением флага `includeCurrencies` равным `true`; 72 | 73 | `money` - денежные позиции. Массив объектов типа [MoneyRow](#moneyrow). Запрашивается выставлением флага `includeMoney` равным `true`. 74 | 75 | ## PositionRow 76 | 77 | Объект позиция описывается следующими полями: 78 | 79 | ```json 80 | { 81 | "securityCode": "string", 82 | "market": "Stock", 83 | "balance": 0, 84 | "currentPrice": 0, 85 | "equity": 0, 86 | "averagePrice": 0, 87 | "currency": "string", 88 | "accumulatedProfit": 0, 89 | "todayProfit": 0, 90 | "unrealizedProfit": 0, 91 | "profit": 0, 92 | "maxBuy": 0, 93 | "maxSell": 0, 94 | "priceCurrency": "string", 95 | "averagePriceCurrency": "string", 96 | "averageRate": 0 97 | } 98 | ``` 99 | 100 | `securityCode` - код инструмента; 101 | 102 | `market` - рынок инструмента. Тип [Market](common-types.md#market); 103 | 104 | `currentPrice` - текущая цена в валюте инструмента; 105 | 106 | `equity` - текущая оценка инструмента; 107 | 108 | `averagePrice` - средняя цена; 109 | 110 | `currency` - код валюты риска; 111 | 112 | `accumulatedProfit` - прибыль/убыток по входящим; 113 | 114 | `todayProfit` - прибыль/убыток по сделкам; 115 | 116 | `unrealizedProfit` - нереализованная прибыль/убыток; 117 | 118 | `profit` - прибыль/убыток; 119 | 120 | `maxBuy`/`maxSell` - максимально возможное количество лотов на покупку/продажу (вычисляется, если указать флаг `includeMaxBuySell` в `true`, иначе значение будет равно **0**); 121 | 122 | `priceCurrency` - код валюты цены; 123 | 124 | `averagePriceCurrency` - код валюты балансовой цены; 125 | 126 | `averageRate` - кросс-курс валюты балансовой цены к валюте риска. 127 | 128 | ## CurrencyRow 129 | 130 | Объект валюта портфеля описывается следующими полями: 131 | 132 | ```json 133 | { 134 | "name": "string", 135 | "balance": 0, 136 | "crossRate": 0, 137 | "equity": 0, 138 | "unrealizedProfit": 0 139 | } 140 | ``` 141 | 142 | `name` - код валюты; 143 | 144 | `balance` - текущая позиция; 145 | 146 | `crossRate` - курс валюты; 147 | 148 | `equity` - оценка позиции; 149 | 150 | `unrealizedProfit` - нереализованная прибыль/убыток. 151 | 152 | ## MoneyRow 153 | 154 | Объект денежная позиция описывается следующими полями: 155 | 156 | ```json 157 | { 158 | "market": "Stock", 159 | "currency": "string", 160 | "balance": 0 161 | } 162 | ``` 163 | 164 | `market` - рынок. Тип [Market](common-types.md#market); 165 | 166 | `currency` - код валюты; 167 | 168 | `balance` - текущая позиция. 169 | 170 | ## Получение портфеля 171 | 172 | Для получения портфеля необходимо выполнить `GET` запрос на `/api/v1/portfolio/`, указав торговый код клиента и выбрав наполнение портфеля: 173 | 174 | `clientId` - торговый код клиента (обязательный); 175 | 176 | `includeCurrencies` - запросить информацию по валютам портфеля; 177 | 178 | `includeMoney` - запросить информацию по денежным позициям портфеля; 179 | 180 | `includePositions` - запросить информацию по позициям портфеля; 181 | 182 | `includeMaxBuySell` - запросить информацию о максимальном доступном объеме на покупку/продажу. 183 | 184 | В случае успешного выполнения запроса сервис вернет портфель клиента. -------------------------------------------------------------------------------- /docs/rest-api/securities.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | --- 4 | 5 | # Инструменты 6 | 7 | ## Security 8 | 9 | Объект инструмент описывается следующими полями: 10 | 11 | ```json 12 | { 13 | "code": "string", 14 | "board": "string", 15 | "market": "Stock", 16 | "decimals": 0, 17 | "lotSize": 0, 18 | "minStep": 0, 19 | "currency": "string", 20 | "shortName": "string", 21 | "properties": 0, 22 | "timeZoneName": "string", 23 | "bpCost": 0, 24 | "accruedInterest": 0, 25 | "priceSign": "Positive", 26 | "ticker": "string", 27 | "lotDivider": 0 28 | } 29 | ``` 30 | 31 | `code` - код инструмента; 32 | 33 | `board` - основной режим торгов инструмента; 34 | 35 | `market` - рынок инструмента. Тип [Market](common-types.md#market); 36 | 37 | `decimals` - количество знаков в дробной части цены; 38 | 39 | `lotSize` - размер лота; 40 | 41 | `minStep` - минимальный шаг цены; 42 | 43 | `currency` - код валюты номинала цены; 44 | 45 | `shortName` - название инструмента; 46 | 47 | `properties` - параметры инструмента. Значение представлено в виде битовой маски: 48 | 49 | - **0** - нет параметров; 50 | - **1** - инструмент торгуется на бирже; 51 | - **2** - инструмент допущен к торгам у брокера - существенно для НЕ ГЛАВНЫХ трейдеров. Главным доступны все инструменты, торгуемые на биржах; 52 | - **4** - рыночные заявки (без ограничения по цене) разрешены; 53 | - **8** - признак маржинальности бумаги; 54 | - **16** - опцион Call; 55 | - **32** - опцион Put; 56 | - **48** - фьючерс Call | Put; 57 | - **64** - разрешен для резидентов; 58 | - **128** - разрешен для нерезидентов. 59 | 60 | Инструкция по определению параметра "properties" представлена ниже. 61 | 62 | `timeZoneName` - имя таймзоны; 63 | 64 | `bpCost` - стоимость пункта цены одного инструмента (не лота), без учета НКД; 65 | 66 | `accruedInterest` - текущий НКД; 67 | 68 | `priceSign` - допустимая цена инструмента. Принимает следующие значения: 69 | 70 | - `Unspecified` — это поле используется, когда информация о цене не задана (новейшие IPO, которые еще не начали торговаться, последствия после "падения" сервера). 71 | - `Positive` — указывает на то, что цена акции положительна. Тicker с таким значением подразумевает, что стоимость акции выше нуля и органично подходит для биржевой торговли (акции, облигации, фонды). 72 | - `NonNegative` — обозначает, что цена может быть нулевой или положительной. Такое значение подразумевает отсутствие активной торговли по определённой цене или временное приостановление (криптовалюты, облигации с нулевым купоном). 73 | - `Any` — позволяет произвольное значение цены, как положительное, так и отрицательное (фьючерсы, опционы). 74 | 75 | `ticker` - тикер инструмента на биржевой площадке листинга; 76 | 77 | `lotDivider` - коэффициент дробления ценной бумаги в одном стандартном лоте. 78 | 79 | ## Получение списка инструментов 80 | 81 | Для получения списка инструментов необходимо выполнить `GET` запрос на `/api/v1/securities/`. 82 | 83 | ```json 84 | { 85 | "board": "string", 86 | "seccode": "string" 87 | } 88 | ``` 89 | 90 | `board` - Режим торгов (необязательное поле для фильтрации) 91 | 92 | `seccode` - Тикер инструмента (необязательное поле для фильтрации) 93 | 94 | ## Инструкция по определению параметров инструмента по числу "properties" 95 | 96 | Шаг 1: Преобразование числа в двоичное представление 97 | 1. Посмотрите на число, полученное в графе "properties". 98 | 2. Преобразуйте это число в двоичное представление. Это можно сделать вручную или использовать калькулятор, поддерживающий двоичное представление. 99 | 100 | Шаг 2: Определение включенных битов 101 | 1. После преобразования числа в двоичное представление посмотрите на каждый бит в этом числе. Биты индексируются справа налево, начиная с нуля. 102 | 2. Если бит равен 1, значит, соответствующий параметр включен. Если бит равен 0, значит, соответствующий параметр не включен. 103 | 104 | 105 | Шаг 3: Сопоставление битов с параметрами 106 | 107 | Используйте следующее сопоставление: 108 | - Бит 0 (2^0 = 1, 0x01) - Инструмент торгуется на бирже 109 | - Бит 1 (2^1 = 2, 0x02) - Инструмент допущен к торгам у брокера 110 | - Бит 2 (2^2 = 4, 0x04) - Рыночные заявки (без ограничения по цене) разрешены 111 | - Бит 3 (2^3 = 8, 0x08) - Признак маржинальности бумаги 112 | - Бит 4 (2^4 = 16, 0x10) - Фьючерс Call 113 | - Бит 5 (2^5 = 32, 0x20) - Фьючерс Put 114 | - Бит 6 (2^6 = 64, 0x40) - Разрешен для резидентов 115 | - Бит 7 (2^7 = 128, 0x80) - Разрешен для нерезидентов 116 | 117 | Рассмотрим пример для числа 197. 118 | 1. Преобразование числа 197 в двоичное представление: 197 в двоичной системе это 11000101. 119 | 2. Анализ двоичного представления: 120 | - Бит 0 = 1 (2^0 = 1) - включен 121 | - Бит 1 = 0 (2^1 = 2) - не включен 122 | - Бит 2 = 1 (2^2 = 4) - включен 123 | - Бит 3 = 0 (2^3 = 8) - не включен 124 | - Бит 4 = 0 (2^4 = 16) - не включен 125 | - Бит 5 = 0 (2^5 = 32) - не включен 126 | - Бит 6 = 1 (2^6 = 64) - включен 127 | - Бит 7 = 1 (2^7 = 128) - включен 128 | 129 | 3. Сопоставление битов с параметрами: 130 | - 1 (бит 0) - Инструмент торгуется на бирже 131 | - 4 (бит 2) - Рыночные заявки (без ограничения по цене) разрешены 132 | - 64 (бит 6) - Разрешен для резидентов 133 | - 128 (бит 7) - Разрешен для нерезидентов 134 | 135 | Таким образом, для числа 197 параметры следующие: 136 | - Инструмент торгуется на бирже 137 | - Рыночные заявки (без ограничения по цене) разрешены 138 | - Разрешен для резидентов 139 | - Разрешен для нерезидентов 140 | 141 | Этот процесс можно использовать для любого числа, чтобы определить, какие параметры включены для конкретного инструмента. -------------------------------------------------------------------------------- /docs/rest-api/stops.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 6 3 | --- 4 | 5 | # Стоп-заявки 6 | 7 | ## Stop 8 | 9 | Объект стоп-заявка описывается следующими полями: 10 | 11 | ```json 12 | { 13 | "stopId": 0, 14 | "securityCode": "string", 15 | "securityBoard": "string", 16 | "market": "Stock", 17 | "clientId": "string", 18 | "buySell": "Sell", 19 | "expirationDate": "2023-03-02T07:25:11.226Z", 20 | "linkOrder": 0, 21 | "validBefore": { 22 | "type": "TillEndSession", 23 | "time": "2023-03-02T07:25:11.226Z" 24 | }, 25 | "status": "None", 26 | "message": "string", 27 | "orderNo": 0, 28 | "tradeNo": 0, 29 | "acceptedAt": "2023-03-02T07:25:11.226Z", 30 | "canceledAt": "2023-03-02T07:25:11.226Z", 31 | "currency": "string", 32 | "takeProfitExtremum": 0, 33 | "takeProfitLevel": 0, 34 | "stopLoss": { 35 | "activationPrice": 0, 36 | "price": 0, 37 | "marketPrice": true, 38 | "quantity": { 39 | "value": 0, 40 | "units": "Percent" 41 | }, 42 | "time": 0, 43 | "useCredit": true 44 | }, 45 | "takeProfit": { 46 | "activationPrice": 0, 47 | "correctionPrice": { 48 | "value": 0, 49 | "units": "Percent" 50 | }, 51 | "spreadPrice": { 52 | "value": 0, 53 | "units": "Percent" 54 | }, 55 | "marketPrice": true, 56 | "quantity": { 57 | "value": 0, 58 | "units": "Percent" 59 | }, 60 | "time": 0, 61 | "useCredit": true 62 | } 63 | } 64 | ``` 65 | 66 | `stopId` - идентификатор стоп-заявки; 67 | 68 | `securityCode` - код инструмента; 69 | 70 | `securityBoard` - основной режим торгов инструмента; 71 | 72 | `market` - рынок инструмента. Тип [Market](common-types.md#market); 73 | 74 | `clientId` - торговый код клиента; 75 | 76 | `buySell` - тип [BuySell](common-types.md#buysell); 77 | 78 | `expirationDate` - дата экспирации заявки FORTS; 79 | 80 | `linkOrder` - биржевой номер связанной (активной) заявки; 81 | 82 | `validBefore` - условие по времени действия заявки. Тип [OrderValidBefore](common-types.md#ordervalidbefore-type). 83 | 84 | `status` - текущий статус стоп-заявки. Тип [StopStatus](#stopstatus); 85 | 86 | `message` - содержит сообщение об ошибке, возникшей при обработке заявки. Заявка может быть отклонена по разным причинам сервером TRANSAQ или биржей с выставлением поля `status`; 87 | 88 | `orderNo` - номер заявки, полученной в результате исполнения стоп-заявки; 89 | 90 | `tradeNo` - номер сделки, которая привела к исполнению стоп-заявки; 91 | 92 | `acceptedAt` - время регистрации заявки на сервере TRANSAQ (UTC); 93 | 94 | `canceledAt` - время отмены заявки на сервере TRANSAQ (UTC); 95 | 96 | `currency` - валюта цены; 97 | 98 | `takeProfitExtremum` - текущий локальный экстремум для TP; 99 | 100 | `takeProfitLevel` - текущий уровень коррекции для TP; 101 | 102 | `stopLoss` - информация об stop-loss. Тип [StopLoss](#stoploss); 103 | 104 | `takeProfit` - информация об take-profit. Тип [TakeProfit](#takeprofit). 105 | 106 | ## StopStatus 107 | 108 | Статус стоп-заявки. Принимает следующие значения: 109 | 110 | - `Active` - заявка сервером TRANSAQ; 111 | - `Executed` - заявка исполнилась (выполнилась); 112 | - `Cancelled` - заявка была отменена (снята) пользователем или биржей. 113 | 114 | ## StopLoss 115 | 116 | Объект stop-loss (SL) описывается следующими полями: 117 | 118 | ```json 119 | { 120 | "activationPrice": 0, 121 | "price": 0, 122 | "marketPrice": true, 123 | "quantity": { 124 | "value": 0, 125 | "units": "Percent" 126 | }, 127 | "time": 0, 128 | "useCredit": true 129 | } 130 | ``` 131 | 132 | `activationPrice` - цена активации; 133 | 134 | `price` - цена условной заявки. В случае рыночной цены значение должно быть **0**; 135 | 136 | `marketPrice` - значение `true` указывает на то, что необходимо выставить рыночную заявку, иначе выставляется условная заявка с ценой `price`; 137 | 138 | `quantity` - объем заявки. Тип [StopQuantity](#stopquantity); 139 | 140 | `time` - защитное время (секунды); 141 | 142 | `useCredit` - использование кредита (недоступно для срочного рынка). Указать значение `true`, если необходимо использовать кредит, иначе `false`. 143 | 144 | ## TakeProfit 145 | 146 | Объект take-profit (TP) описывается следующими полями: 147 | 148 | ```json 149 | { 150 | "activationPrice": 0, 151 | "correctionPrice": { 152 | "value": 0, 153 | "units": "Percent" 154 | }, 155 | "spreadPrice": { 156 | "value": 0, 157 | "units": "Percent" 158 | }, 159 | "marketPrice": true, 160 | "quantity": { 161 | "value": 0, 162 | "units": "Percent" 163 | }, 164 | "time": 0, 165 | "useCredit": true 166 | } 167 | ``` 168 | 169 | `activationPrice` - цена активации; 170 | 171 | `correctionPrice` - коррекция. Тип [StopPrice](#stopprice); 172 | 173 | `spreadPrice` - защитный спред. В случае рыночной цены значение должно быть **0**. Тип [StopPrice](#stopprice); 174 | 175 | `marketPrice` - значение `true` указывает на то, что необходимо выставить рыночную заявку, иначе выставляется условная заявка с ценой `price`; 176 | 177 | `quantity` - объем заявки. Тип [StopQuantity](#stopquantity); 178 | 179 | `time` - защитное время (секунды); 180 | 181 | `useCredit` - использование кредита (недоступно для срочного рынка). Указать значение `true`, если использовать кредит, иначе `false`. 182 | 183 | ## StopQuantity 184 | 185 | Объем стоп-заявки описывается следующими полями: 186 | 187 | ```json 188 | { 189 | "value": 0, 190 | "units": "Percent" 191 | } 192 | ``` 193 | 194 | `value` - значение объема, единицы измерения которого зависят от значения поля `units`; 195 | 196 | `units` - единицы измерения объема. Принимает следующие значения: 197 | 198 | - `Percent` - проценты, 199 | - `Lots` - лоты. 200 | 201 | ## StopPrice 202 | 203 | Цена стоп-заявки описывается следующими полями: 204 | 205 | ```json 206 | { 207 | "value": 0, 208 | "units": "Percent" 209 | } 210 | ``` 211 | 212 | `value` - значение цены, единицы измерения которой зависят от значения поля `units`; 213 | 214 | `units` - единицы измерения цены. Принимает следующие значения: 215 | 216 | - `Percent` - проценты, 217 | - `Pips` - единицы цены. 218 | 219 | ## Выставление стоп-заявки 220 | 221 | Для выставления новой стоп-заявки необходимо отправить `POST` запрос на `/api​/v1​/stops`, передав тело запроса в формате `json`: 222 | 223 | ```json 224 | { 225 | "clientId": "string", 226 | "securityBoard": "string", 227 | "securityCode": "string", 228 | "buySell": "Sell", 229 | "stopLoss": { 230 | "activationPrice": 0, 231 | "price": 0, 232 | "marketPrice": true, 233 | "quantity": { 234 | "value": 0, 235 | "units": "Percent" 236 | }, 237 | "time": 0, 238 | "useCredit": true 239 | }, 240 | "takeProfit": { 241 | "activationPrice": 0, 242 | "correctionPrice": { 243 | "value": 0, 244 | "units": "Percent" 245 | }, 246 | "spreadPrice": { 247 | "value": 0, 248 | "units": "Percent" 249 | }, 250 | "marketPrice": true, 251 | "quantity": { 252 | "value": 0, 253 | "units": "Percent" 254 | }, 255 | "time": 0, 256 | "useCredit": true 257 | }, 258 | "expirationDate": "2023-03-02T07:25:11.226Z", 259 | "linkOrder": 0, 260 | "validBefore": { 261 | "type": "TillEndSession", 262 | "time": "2023-03-02T07:25:11.226Z" 263 | } 264 | } 265 | ``` 266 | 267 | `clientId` - торговый код клиента; 268 | 269 | `securityBoard` - основной режим торгов инструмента; 270 | 271 | `securityCode` - код инструмента; 272 | 273 | `buySell` - тип [BuySell](common-types.md#buysell); 274 | 275 | `stopLoss` - информация о stop-loss. Тип [StopLoss](#stoploss); 276 | 277 | `takeProfit` - информация о take-profit. Тип [TakeProfit](#takeprofit); 278 | 279 | `expirationDate` - дата экспирации заявки FORTS; 280 | 281 | `linkOrder` - биржевой номер связанной (активной) заявки; 282 | 283 | `validBefore` - условие по времени действия заявки. Тип [OrderValidBefore](common-types.md#ordervalidbefore-type); 284 | 285 | `status` - текущий статус стоп-заявки. Тип [StopStatus](#stopstatus). 286 | 287 | ## Получение стоп-заявок 288 | 289 | Для получения списка стоп-заявок необходимо выполнить `GET` запрос на `/api/v1/stops`, указав критерии выбора в строке запроса: 290 | 291 | `clientId` - торговый код клиента (обязательный); 292 | 293 | `includeExecuted` - вернуть исполненные заявки; 294 | 295 | `includeCanceled` - вернуть отмененные заявки; 296 | 297 | `includeActive` - вернуть активные заявки. 298 | 299 | В случае успешного выполнения запроса сервис вернет список стоп-заявок. 300 | 301 | ## Отмена стоп-заявки 302 | 303 | Для отмены выставленной стоп-заявки необходимо выполнить `DELETE` запрос на `/api​/v1​/stops`, передав тело запроса в формате `json`: 304 | 305 | ```json 306 | { 307 | "clientId": "string", 308 | "stopId": 0 309 | } 310 | ``` 311 | 312 | `clientId` - торговый код клиента; 313 | 314 | `stopId` - идентификатор отменяемой стоп-заявки. 315 | -------------------------------------------------------------------------------- /docs/tokens.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | --- 4 | 5 | # Токены доступа 6 | 7 | Trade API предоставляет следующие типы токенов: 8 | 9 | - **Просмотровый**. Позволяет получать информацию по клиентскому счету без возможности подачи торговых поручений (выставления / снятия заявок); 10 | - **Торговый**. Предоставляет полный доступ к счету с возможностью совершения торговых операций по клиентскому счету. 11 | 12 | Для каждого токена необходимо задать _название_ и выбрать _период срока действия_. Сейчас предусмотрены два варианта срока действия: бессрочный или с указанием конкретной даты. 13 | 14 | ## Получение нового токена 15 | 16 | 1. Нажать кнопку `+ Создать токен`; 17 | 2. Выбрать счет(а). Можно выбрать как один, так и несколько счетов; 18 | 3. Указать название, тип токена, период срока действия и нажать `Создать токен`; 19 | 4. Подтвердить действие; 20 | 5. Скопировать и сохранить полученный токен. 21 | 22 | :::danger Внимание 23 | 24 | Токен показывается единожды, в случае его утери или компрометации необходимо получить новый. 25 | 26 | ::: 27 | 28 | 6. После получения токена можно переходить к работе с самим API. 29 | 30 | ## Другие возможности управления токенами: 31 | 32 | - Просмотр списка всех своих токенов; 33 | - Удаление токена; 34 | - История. Содержит историю действий по токену; 35 | - Архив. Содержит историю выданных токенов. 36 | -------------------------------------------------------------------------------- /docs/usage.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | --- 4 | 5 | # Использование 6 | 7 | Описание всех текущих методов API и параметров их вызова доступно по адресу https://trade-api.finam.ru/swagger/index.html. Там же можно выполнить запросы по токену прямо в браузере. 8 | 9 | Все методы можно разделить на группы. Далее идет описание групп и основных методов. 10 | 11 | Важно: Все запросы к нашему API должны включать обязательный заголовок "User-Agent" для повышения безопасности и эффективности обработки. Убедитесь, что ваше приложение отправляет уникальный и специфичный "User-Agent", иначе запросы будут отклонены. 12 | 13 | ### Адреса подключения: 14 | - gRPC: trade-api.finam.ru:443 15 | - RestAPI: https://trade-api.finam.ru 16 | 17 | ## Авторизация 18 | 19 | Для выполнения методов API необходимо передавать токен доступа в каждом запросе. 20 | 21 | Формат заголовка: `Authorization: Bearer <токен_доступа>`. 22 | 23 | ## Рыночная информация 24 | 25 | Сюда относятся методы получения текущей рыночной информации: 26 | 27 | - Получение информации о доступных инструментах и их параметрах `GET ​/api​/v1​/securities`; 28 | - Получение информации об истории торгов по инструменту (график); 29 | - Получение потоковой информации market data. Реализовано в виде методов подписки на события. Можно подписываться на следующие события: 30 | - биржевой стакан, 31 | - заявки, 32 | - сделки. 33 | 34 | ## Клиентский счет 35 | 36 | Trade API позволяет получить доступ только к Единым счетам, открытым в АО "Финам". Оперирование идет по торговому коду, который вы видите в ИТС TRANSAQ. Торговый код необходимо использовать в поле `ClientID`. 37 | 38 | Сюда относятся методы: 39 | 40 | - Получения текущего состояния счета `GET ​/api​/v1​/portfolio`; 41 | - Получение информации о заявках `GET ​/api​/v1​/orders` или стоп-заявках `GET ​/api​/v1​/stops` по счетам; 42 | - Получение информации о сделках по счетам. 43 | 44 | ## Торговые операции 45 | 46 | Сюда относятся методы: 47 | 48 | - Выставить новую заявку (рыночную / лимитированную условную) по счету `POST ​/api​/v1​/orders`; 49 | - Отменить заявку `DELETE ​/api​/v1​/orders` или стоп-заявку `DELETE ​/api​/v1​/stops`. 50 | 51 | На обработку нового поручения по размещению заявки в биржевой стакан требуется некоторое время, поэтому этот метод возвращает структуру с `transaction_id`, которая может быть использована для поиска соответствующей заявки через `GetOrdersRequest` или в сообщении `OrderEvent` от сервиса событий (`EventResponse.event.order`). 52 | 53 | :::info Справка 54 | 55 | `transaction_id` - это целочисленный номер, который однозначно идентифицирует транзакцию внутри текущего сеанса связи с сервером. 56 | 57 | ::: 58 | 59 | После того как в результате транзакции на Бирже появится соответствующий объект (заявка), основным идентификатором этого объекта становится регистрационный номер Биржи. Transaction_id является также основным идентификатором условной заявки (результата транзакции) до тех пор, пока заявка не будет выставлена на Биржу и не приобретёт регистрационный номер Биржи. 60 | 61 | Значения property: 62 | 63 | - **PutInQueue**: неисполненная часть заявки помещается в очередь заявок Биржи; 64 | - **FOK**: сделки совершаются только в том случае, если заявка может быть удовлетворена полностью; 65 | - **IOC**: неисполненная часть заявки снимается с торгов; 66 | - Для выставления рыночной заявки достаточно указать в поле `price` значение **0**. 67 | 68 | Допустимые типы условия условных заявок: 69 | 70 | - **Bid**: лучшая цена покупки; 71 | - **BidOrLast**: лучшая цена покупки или сделка по заданной цене и выше; 72 | - **Ask**: лучшая цена продажи; 73 | - **AskOrLast**: лучшая цена продажи или сделка по заданной цене и ниже; 74 | - **CovDown**: обеспеченность ниже заданной; 75 | - **CovUp**: обеспеченность выше заданной; 76 | - **LastUp**: сделка на рынке по заданной цене или выше; 77 | - **LastDown**: сделка на рынке по заданной цене или ниже. 78 | 79 | Такие поля как, например, `condition` или `validbefore` являются необязательными. Их можно не указывать в запросе. 80 | 81 | Для отмены заявки нужно также указать `transaction_id`. 82 | 83 | ## Стоп-заявки 84 | 85 | Cтоп-заявка в системе TRANSAQ (или cтоп) — это распоряжение, предписывающее серверу TRANSAQ выполнить в автоматизированном режиме транзакционные действия, реализующие логику стоп-лосс или тейк-профит в зависимости от ценовых условий на рынке. 86 | 87 | Основное предназначение стоп-заявок — автоматизировать управление существующей или потенциальной позицией клиента, которое заключается в своевременном выполнении одного из следующих действий: 88 | 89 | - своевременно закрыть позицию при неблагоприятном изменении цены, ограничив убытки заранее определённой величиной (исполнить стоп-лосс); 90 | - зафиксировать прибыль после достижения ценой достаточно прибыльного уровня при возникновении признаков окончания благоприятного тренда (исполнить тейк-профит). 91 | 92 | Cтоп-заявки могут также с успехом применяться для автоматизированного открытия новой позиции при определённых условиях, например, при возникновении признаков смены тренда или, наоборот, для открытия позиции «по тренду». 93 | 94 | Стоп-заявка состоит из двух частей: 95 | 96 | - Стоп-лосс (далее — **SL**), 97 | - Тейк-профит (далее — **TP**). 98 | 99 | > При выполнении условия для одной части стоп-заявки вторая ее часть снимается. Вторая часть стоп-заявки снимается даже в том случае, если попытка выставить заявку на Биржу при исполнении оказалась неуспешной. Допускаются стоп-заявки, содержащие только одну часть (SL или TP). Для закрытия коротких позиций следует выставлять стопы на покупку, для закрытия длинных позиций - стопы на продажу. Обе части стоп-заявки допускают использование признака «по рынку». 100 | 101 | ## Cтоп-лосс 102 | 103 | SL предназначен для закрытия позиций с целью ограничения убытков от удержания позиции при неблагоприятном движении цены на рынке. Следовательно: 104 | 105 | - для стопа на продажу часть SL активируется, когда цена на рынке станет меньше либо равна цене активации стоп-лосса; 106 | - для стопа на покупку часть SL активируется, когда цена на рынке станет больше либо равна цене активации стоп-лосса. 107 | 108 | При выставлении SL необходимо задать _цену активации_ и _цену заявки_, которая будет отправлена на Биржу при достижении рынком цены активации. 109 | 110 | Использование необязательного параметра _защитное время_ позволяет предотвратить исполнение стопа при «проколах» на рынке, т.е. в таких ситуациях, когда цены на рынке лишь кратковременно достигают уровня цены активации и вскоре возвращаются обратно. В частности, такие явления наблюдаются при интервенциях или ошибках крупных участников, когда на рынке внезапно регистрируется значительное отклонение цен произошедших сделок, но реальной возможности совершить сделки по таким ценам на рынке не возникает. 111 | 112 | Защитное время задаётся в целых секундах и отсчитывается от времени получения сервером первой сделки, удовлетворяющей цене активации. Если в течение защитного времени на рынке будут зафиксированы сделки, не подтверждающие наступление уровня цены активации (т.е. сделки по цене выше цены активации для SL на продажу, либо по цене ниже цены активации для SL на покупку), то стоп-лосс возвращается в состояние «Ожидает активации». 113 | 114 | Если защитное время не задано, то даже одна сделка на рынке по цене, удовлетворяющей цене активации, приводит к исполнению стоп-лосса. 115 | 116 | ## Тейк-профит 117 | 118 | TP предназначен для закрытия позиций с фиксацией прибыли. Следовательно: 119 | 120 | - для стопа на продажу часть TP активируется, когда цена на рынке станет больше либо равна цене активации; 121 | - для стопа на покупку часть TP активируется, когда цена на рынке станет меньше либо равна цене активации. 122 | 123 | ### Простой TP 124 | 125 | Для ввода простого TP достаточно задать _цену активации_ и _количество_. 126 | 127 | В этом случае на Биржу будет отправлена заявка с ценой, равной цене первой же сделки на рынке, которая удовлетворяет цене активации. 128 | 129 | Можно увеличить вероятность совершения сделки при исполнении стопа, задав _защитный спрэд_. Для определения цены заявки, исполняющей TP на покупку, защитный спрэд прибавляется к цене рынка. Для определения цены заявки, исполняющей TP на продажу, защитный спрэд вычитается из цены рынка. 130 | 131 | Для простого TP также можно установить защитное время (см. выше описание SL). 132 | 133 | > При использовании защитного времени в качестве цены рынка (от которой определяется цена заявки, исполняющей TP) принимается цена последней по времени сделки, полученной сервером в течение защитного времени. 134 | 135 | ### Следящий (trailing) TP 136 | 137 | Позволяет выставить на Биржу заявку, закрывающую позицию в момент появления признаков окончания благоприятного тренда на рынке. 138 | 139 | Для того чтобы включить механизм отслеживания тренда, необходимо при выставлении TP задать значение поля _коррекция_. 140 | 141 | Это значение используется сервером TRANSAQ для определения момента окончания благоприятного тренда следующим образом: 142 | 143 | - для TP на продажу считается, что растущий тренд заканчивается в тот момент, когда после того, как рынок вырос до уровня цены активации или выше, он снизится на величину коррекции от максимальной цены; 144 | - для TP на покупку считается, что нисходящий тренд заканчивается в тот момент, когда после того, как рынок снизился до уровня цены активации или ниже, он вырастет на величину коррекции от минимальной цены; 145 | Величина коррекции может быть задана как в виде абсолютного изменения цены, так и в виде процента от цены. Для следящего TP также могут быть заданы _защитный спрэд_ и/или _защитное время_. 146 | 147 | Если для следящего TP задано _защитное время_, то оно действует как при определении факта достижения цены активации, так и при определении факта окончания тренда (достижения заданного уровня коррекции). 148 | 149 | ## Связанные заявки 150 | 151 | Любая стоп-заявка может иметь _«связь по исполнению»_ с активной заявкой на бирже. Такая связь означает, что действие стоп-заявки начнётся не с момента её ввода в TRANSAQ, а в тот момент, когда соответствующая активная заявка исполнится (или частично исполнится) на Бирже. «Связь по исполнению» удобно применять в тех случаях, когда необходимо обеспечить стоп-процессинг для позиции, которая ещё не открыта, но может быть открыта при исполнении активной заявки. 152 | 153 | Несколько стоп-заявок могут иметь связь по исполнению с одной и той же активной заявкой. Это позволяет организовать ступенчатое закрытие позиции частями на разных ценовых уровнях в заданных пропорциях. 154 | 155 | При снятии активной заявки до её (полного или частичного) исполнения на Бирже все стоп-заявки, имеющие с нею связь по исполнению, также автоматически будут сняты. 156 | 157 | При вводе связанного стопа его направление (покупка/продажа) устанавливается противоположным направлению активной заявки. 158 | 159 | _Инструмент_, _Режим_ и _Клиент_ также копируются из активной заявки, но при необходимости могут быть изменены. 160 | 161 | Если в момент ввода связанного стопа заявка уже исполнена (в т.ч. частично), то он сразу переходит в состояние ожидания активации. 162 | 163 | Связь по исполнению может быть использована как способ автоматизации торговых операций в одном финансовом инструменте по условию цены в другом инструменте. Выставляется «триггерная» заявка на минимальный объём в индикативном инструменте и к ней привязывается стоп по исполнению, открывающий или закрывающий позицию в торговом инструменте. К этой же «триггерной» заявке можно привязать стоп, который автоматически закроет позицию, возникшую при ее исполнении. 164 | -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Note: type annotations allow type checking and IDEs autocompletion 3 | 4 | const lightCodeTheme = require("prism-react-renderer/themes/github"); 5 | const darkCodeTheme = require("prism-react-renderer/themes/dracula"); 6 | 7 | const domain = "https://finamweb.github.io"; 8 | const pathname = "/trade-api-docs/"; 9 | const metaImageUrl = `${domain}${pathname}img/meta-image.png`; 10 | 11 | /** @type {import('@docusaurus/types').Config} */ 12 | const config = { 13 | title: "Trade API", 14 | tagline: 15 | "Сервис для организации взаимодействия пользовательских приложений с сервером TRANSAQ", 16 | url: domain, 17 | baseUrl: pathname, 18 | onBrokenLinks: "throw", 19 | onBrokenMarkdownLinks: "warn", 20 | favicon: "img/favicon.ico", 21 | trailingSlash: false, 22 | 23 | // GitHub pages deployment config. 24 | // If you aren't using GitHub pages, you don't need these. 25 | organizationName: "finamweb", // Usually your GitHub org/user name. 26 | projectName: "trade-api-docs", // Usually your repo name. 27 | deploymentBranch: "gh-pages", 28 | 29 | // Even if you don't use internalization, you can use this field to set useful 30 | // metadata like html lang. For example, if your site is Chinese, you may want 31 | // to replace "en" with "zh-Hans". 32 | i18n: { 33 | defaultLocale: "ru", 34 | locales: ["ru"], 35 | }, 36 | 37 | presets: [ 38 | [ 39 | "classic", 40 | /** @type {import('@docusaurus/preset-classic').Options} */ 41 | ({ 42 | docs: { 43 | // Serve the docs at the site's root 44 | routeBasePath: "/", 45 | sidebarPath: require.resolve("./sidebars.js"), 46 | }, 47 | blog: false, 48 | theme: { 49 | customCss: require.resolve("./src/custom.css"), 50 | }, 51 | }), 52 | ], 53 | ], 54 | 55 | themeConfig: 56 | /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ 57 | ({ 58 | metadata: [ 59 | { name: "twitter:card", content: "summary_large_image" }, 60 | { 61 | name: "twitter:image", 62 | content: metaImageUrl, 63 | }, 64 | { 65 | property: "og:image:secure_url", 66 | content: metaImageUrl, 67 | }, 68 | { 69 | property: "og:image", 70 | content: metaImageUrl, 71 | }, 72 | { 73 | property: "og:image:width", 74 | content: "1200", 75 | }, 76 | { 77 | property: "og:image:height", 78 | content: "630", 79 | }, 80 | { 81 | property: "og:image:alt", 82 | content: "Trade API — Все самое необходимое для алготрейдинга", 83 | }, 84 | ], 85 | navbar: { 86 | title: "Trade API", 87 | logo: { 88 | alt: "Trade API Logo", 89 | src: "img/logo.png", 90 | }, 91 | items: [ 92 | { 93 | type: "doc", 94 | docId: "common-info", 95 | position: "left", 96 | label: "Документация", 97 | }, 98 | { 99 | href: "https://trade-api.finam.ru/swagger/index.html", 100 | label: "Swagger", 101 | position: "left", 102 | }, 103 | { 104 | href: "https://vk.com/finam_trade_api", 105 | label: "Trade API VK", 106 | position: "right", 107 | }, 108 | { 109 | href: "mailto:trade_api@corp.finam.ru", 110 | label: "Обратная связь", 111 | position: "right", 112 | }, 113 | { 114 | href: "https://github.com/FinamWeb/trade-api-docs", 115 | label: "GitHub", 116 | position: "right", 117 | }, 118 | ], 119 | }, 120 | footer: { 121 | style: "dark", 122 | links: [ 123 | { 124 | label: "Документация", 125 | to: "/", 126 | }, 127 | { 128 | label: "Swagger", 129 | href: "https://trade-api.finam.ru/swagger/index.html", 130 | }, 131 | ], 132 | }, 133 | colorMode: { 134 | respectPrefersColorScheme: true, 135 | }, 136 | prism: { 137 | theme: lightCodeTheme, 138 | darkTheme: darkCodeTheme, 139 | }, 140 | }), 141 | }; 142 | 143 | module.exports = config; 144 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "trade-api-docs", 3 | "scripts": { 4 | "docusaurus": "docusaurus", 5 | "start": "docusaurus start", 6 | "build": "docusaurus build", 7 | "swizzle": "docusaurus swizzle", 8 | "deploy": "docusaurus deploy", 9 | "clear": "docusaurus clear", 10 | "serve": "docusaurus serve", 11 | "write-translations": "docusaurus write-translations", 12 | "write-heading-ids": "docusaurus write-heading-ids", 13 | "typecheck": "tsc" 14 | }, 15 | "dependencies": { 16 | "@docusaurus/core": "2.0.1", 17 | "@docusaurus/preset-classic": "2.0.1", 18 | "@mdx-js/react": "^1.6.22", 19 | "clsx": "^1.2.1", 20 | "prism-react-renderer": "^1.3.5", 21 | "react": "^17.0.2", 22 | "react-dom": "^17.0.2" 23 | }, 24 | "devDependencies": { 25 | "@docusaurus/module-type-aliases": "2.0.1", 26 | "@tsconfig/docusaurus": "^1.0.5", 27 | "typescript": "^4.7.4" 28 | }, 29 | "browserslist": { 30 | "production": [ 31 | ">0.5%", 32 | "not dead", 33 | "not op_mini all" 34 | ], 35 | "development": [ 36 | "last 1 chrome version", 37 | "last 1 firefox version", 38 | "last 1 safari version" 39 | ] 40 | }, 41 | "engines": { 42 | "node": ">=16.14" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Creating a sidebar enables you to: 3 | - create an ordered group of docs 4 | - render a sidebar for each doc of that group 5 | - provide next/previous navigation 6 | 7 | The sidebars can be generated from the filesystem, or explicitly defined here. 8 | 9 | Create as many sidebars as you want. 10 | */ 11 | 12 | // @ts-check 13 | 14 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 15 | const sidebars = { 16 | // By default, Docusaurus generates a sidebar from the docs folder structure 17 | tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], 18 | 19 | // But you can create a sidebar manually 20 | /* 21 | tutorialSidebar: [ 22 | { 23 | type: 'category', 24 | label: 'Tutorial', 25 | items: ['hello'], 26 | }, 27 | ], 28 | */ 29 | }; 30 | 31 | module.exports = sidebars; 32 | -------------------------------------------------------------------------------- /src/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Any CSS included here will be global. The classic template 3 | * bundles Infima by default. Infima is a CSS framework designed to 4 | * work well for content-centric websites. 5 | */ 6 | 7 | /* You can override the default Infima variables here. */ 8 | :root { 9 | --ifm-color-primary: #ba5b12; 10 | --ifm-color-primary-dark: #a75210; 11 | --ifm-color-primary-darker: #9e4d0f; 12 | --ifm-color-primary-darkest: #82400d; 13 | --ifm-color-primary-light: #cd6414; 14 | --ifm-color-primary-lighter: #d66915; 15 | --ifm-color-primary-lightest: #e97720; 16 | } 17 | 18 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 19 | [data-theme='dark'] { 20 | --ifm-color-primary: #e66e15; 21 | --ifm-color-primary-dark: #cf6313; 22 | --ifm-color-primary-darker: #c35d12; 23 | --ifm-color-primary-darkest: #a14d0f; 24 | --ifm-color-primary-light: #eb7c29; 25 | --ifm-color-primary-lighter: #ec8334; 26 | --ifm-color-primary-lightest: #f09857; 27 | } 28 | 29 | .footer__links { 30 | margin-bottom: 0; 31 | } 32 | -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/static/.nojekyll -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/static/img/logo.png -------------------------------------------------------------------------------- /static/img/meta-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FinamWeb/trade-api-docs/7186e2bc1959c20b98ddfce86833250af4302087/static/img/meta-image.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@tsconfig/docusaurus/tsconfig.json", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | } 7 | } 8 | --------------------------------------------------------------------------------