# Tiger API

## Назначение

Tiger API — локальный сервер сигналов (WebSocket) для связи скринеров и других внешних сервисов с терминалом Tiger.com Windows.&#x20;

В текущей версии принимает команду setLinkSymbol и мгновенно открывает переданный тикер в указанной группе линковки, чтобы инструмент на графике и/или стакане обновился без ручных действий.&#x20;

## Где включать в терминале

1. Откройте меню: Настройки → Локальный сервер сигналов → Включить сервер сигналов → Сохранить.&#x20;
2. По умолчанию для WebSocket-сервера используется порт 7819.&#x20;

Подключив тумблер, можно использовать команду setLinkSymbol и другие WS-сообщения, описанные ниже.&#x20;

## Текущий формат запроса

<mark style="color:blue;">{</mark>\
&#x20;  <mark style="color:blue;">"type": "setLinkSymbol",</mark>\
&#x20;  <mark style="color:blue;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:blue;">"m": "SPOT",</mark>\
&#x20;  <mark style="color:blue;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:blue;">"linkGroup": "A"</mark>\ <mark style="color:blue;">}</mark>

### Правила валидации

* Все поля обязательные;
* Регистр значений не важен (сервер нормализует и эхо-возвращает в каноническом виде, см. примеры ниже);
* `m`: только SPOT или FUTURES (в ответе нормализуется в Spot/Futures);
* `linkGroup`: строка (буква A–Z или цифра 0–11; словари групп см. справочник ниже)

## Примеры запросов и ответов

### Успешный запрос

<details>

<summary>Пример</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT","linkGroup":"A"}');</mark>

<mark style="color:$success;">{</mark>\
&#x20;  <mark style="color:$success;">"title": "Successful request",</mark>\
&#x20;  <mark style="color:$success;">"message": "Symbol linked successfully.",</mark>\
&#x20;  <mark style="color:$success;">"request": {</mark>\
&#x20;  <mark style="color:$success;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$success;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$success;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:$success;">"linkGroup": "A",</mark>\ <mark style="color:$success;">"   type": "SetLinkSymbol"</mark>\ <mark style="color:$success;">},</mark>\
&#x20;  <mark style="color:$success;">"response": {</mark>\
&#x20;  <mark style="color:$success;">"type": "successfully",</mark>\
&#x20;  <mark style="color:$success;">"timestamp": "2025-09-01T13:18:50.2327892+03:00"</mark>\
&#x20;   <mark style="color:$success;">}</mark>\ <mark style="color:$success;">}</mark>

</details>

### Неверный тип команды или битый JSON

<details>

<summary>Пример 1: неизвестный тип (ключи валидные, но значение поля type неверно)</summary>

<mark style="color:blue;">socket.send('{"type":"InvalidType","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT","linkGroup":"A"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Invalid JSON (syntax error)",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Invalid JSON. Connection will close.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "InvalidType",</mark>\
&#x20;  <mark style="color:$danger;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$danger;">"m": "SPOT",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "A"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "Invalid JSON format", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:20:30.6586708+03:00"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"connection\_close": { "code": 1007, "reason": "Invalid JSON format" }</mark>\ <mark style="color:$danger;">}</mark>

</details>

<details>

<summary>Пример 2: невалидный JSON </summary>

<mark style="color:blue;">socket.send('"type": "InvalidType", "e": "BINANCE", "m": "SPOT", "symbol": "BTCUSDT", "linkGroup": "A"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Invalid JSON (syntax error)",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Invalid JSON. Connection will close.",</mark>\
&#x20;  <mark style="color:$danger;">"request": null,</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "Invalid JSON format", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:21:21.996182+03:00"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"connection\_close": { "code": 1007, "reason": "Invalid JSON format" }</mark>\ <mark style="color:$danger;">}</mark>

</details>

Поведение соединения: при синтаксической ошибке JSON сервер присылает ошибку и закрывает соединение с кодом 1007.

### Ошибка валидации полей (соединение не закрывается)

<details>

<summary>Пропущены обязательные поля</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"","m":"SPOT","symbol":"","linkGroup":""}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Missing required fields",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Some fields are missing.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"e": "",</mark>\
&#x20;  <mark style="color:$danger;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "",</mark>\
&#x20;  <mark style="color:$danger;">"type": "SetLinkSymbol"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": {</mark>\
&#x20;     <mark style="color:$danger;">"message": "'e' is empty, 'symbol' is empty, 'linkGroup' is empty",</mark>\
&#x20;   <mark style="color:$danger;">"code": 400</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:26:53.6306133+03:00"</mark>\ <mark style="color:$danger;">}</mark>\ <mark style="color:$danger;">}</mark>

</details>

<details>

<summary>Несуществующий символ</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT1","linkGroup":"A"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Symbol not found",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Trading symbol not found.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$danger;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "BTCUSDT1",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "A",</mark>\
&#x20;  <mark style="color:$danger;">"type": "SetLinkSymbol"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "Symbol not found", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:28:10.9152168+03:00"</mark>\ <mark style="color:$danger;">}</mark>\ <mark style="color:$danger;">}</mark>

</details>

<details>

<summary>Некорректная группа линковки</summary>

<mark style="color:blue;">socket.send('{"type":"setLinkSymbol","e":"BINANCE","m":"SPOT","symbol":"BTCUSDT","linkGroup":"AX"}');</mark>

<mark style="color:$danger;">{</mark>\
&#x20;  <mark style="color:$danger;">"title": "Invalid link group",</mark>\
&#x20;  <mark style="color:$danger;">"message": "Link group not found.",</mark>\
&#x20;  <mark style="color:$danger;">"request": {</mark>\
&#x20;  <mark style="color:$danger;">"e": "BINANCE",</mark>\
&#x20;  <mark style="color:$danger;">"m": "Spot",</mark>\
&#x20;  <mark style="color:$danger;">"symbol": "BTCUSDT",</mark>\
&#x20;  <mark style="color:$danger;">"linkGroup": "AX",</mark>\
&#x20;  <mark style="color:$danger;">"type": "SetLinkSymbol"</mark>\ <mark style="color:$danger;">},</mark>\
&#x20;  <mark style="color:$danger;">"response": {</mark>\
&#x20;  <mark style="color:$danger;">"type": "error",</mark>\
&#x20;  <mark style="color:$danger;">"error": { "message": "linkedGroup not found", "code": 400 },</mark>\
&#x20;  <mark style="color:$danger;">"timestamp": "2025-09-01T13:30:20.101782+03:00"</mark>\ <mark style="color:$danger;">}</mark>\ <mark style="color:$danger;">}</mark>

</details>

### Ping/Pong

Поддерживаются два варианта пинга.

<details>

<summary>Текстовый</summary>

<mark style="color:blue;">socket.send('ping');</mark>

<mark style="color:$success;">ответ: 'pong'</mark>

</details>

<details>

<summary>JSON</summary>

<mark style="color:blue;">socket.send('{"type":"ping","title":"some title","message":"some message"}');</mark>

<mark style="color:$success;">{</mark>\
&#x20;  <mark style="color:$success;">"title": "Pong",</mark>\
&#x20;  <mark style="color:$success;">"message": "Response 'pong' to 'ping'.",</mark>\
&#x20;  <mark style="color:$success;">"request": { "title": "some title", "message": "some message", "type": "Ping" },</mark>\
&#x20;  <mark style="color:$success;">"response": { "type": "successfully", "timestamp": "2025-09-    01T13:35:34.0389026+03:00" }</mark>\ <mark style="color:$success;">}</mark>

</details>

## Справочник по значениям

### Биржи (e)

Список поддерживаемых бирж и коннекторов:

* BINANCE
* BINANCE-FUT
* BYBIT
* OKX
* MEXC
* BITMEX
* Bitfinex
* Gate.io
* Bitget
* TigerX

Передаваемое значение регистронезависимо. ￼

### Тип рынка (m)

SPOT или FUTURES (регистр не важен; в ответе нормализуется до Spot/Futures). ￼

### Группы линковки (linkGroup)

Передаётся строка. Допустимые группы — буквенные A–Z и цифровые 0–11. Цветовые соответствия и полный справочник доступны в проектной заметке№

<details>

<summary>Буквенные группы</summary>

A: #FFF9C4

B: #93FF9D

C: #1DEAC5

D: #D380FF

E: #FFA5A9

F: #EFE95F

G: #30F74C

H: #01AC8D

I: #9CA6FF

J: #C2595B

K: #CFC937

L: #05D759

M: #0DB9D7

N: #7455F2

O: #A95A7D

P: #EBA14C

Q: #08DA8E

R: #2586E0

S: #1A46DF

T: #905BA0

U: #F56334&#x20;

V: #05A964

W: #00879A

X: #4D23F5

Y: #6C26EE

Z: #3C3C3C

</details>

<details>

<summary>Цифровые группы</summary>

0: #FFAA00

1: #FF4E00

2: #CB3400

3: #87EA09

4: #31DA06

5: #178905

6: #00E0FF

7: #0A7AE0

8: #0A42D2

9: #9655F2

10: #A700FF

11: #6509D5

</details>

## Поведение соединения и коды ошибок

* Синтаксическая ошибка JSON (невозможность распарсить, либо некорректная команда type) → ошибка с code 400 и закрытие соединения с WebSocket-кодом 1007.
* Ошибки валидации содержимого (пустые поля, несуществующий символ, неверная группа) → ошибка с code 400, соединение остаётся открытым.

  Сообщения и примеры в этом разделе см. выше.&#x20;

## Примеры push сообщений

```
socket.send('{"type": "setLinkSymbol", "e": "TigerX Binance", "m": "SPOT", "symbol": "BTCUSDT", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "TigerX OKX", "m": "FUTURES", "symbol": "BTCUSDT", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "Bitget", "m": "FUTURES", "symbol": "PARTIUSDT", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "MOEX", "m": "FUTURES", "symbol": "CR", "linkGroup": "A"}');
//socket.send('{"type": "setLinkSymbol", "e": "MOEX", "m": "FUTURES", "symbol": "CRZ5", "linkGroup": "A"}');
```

## Рекомендации клиенту

* На синтаксические ошибки JSON (закрытие 1007) — переподключение с экспоненциальной задержкой и предварительной локальной валидацией JSON перед отправкой.
* На ошибки валидации содержимого — исправление полей и повторная отправка без переподключения.
* Поддерживать keep-alive через периодический ping (текстовый или JSON).&#x20;
