Appearance
Public API v1
Public API позволяет внешней программе отправлять торговые команды в TradingMonitor.Pro, получать подтверждённый терминалом статус исполнения, отменять конкретный API-ордер и читать события NinjaTrader через SSE.
Базовый адрес production API:
text
https://tradingmonitor.proВсе даты в JSON передаются в UTC в формате ISO 8601. Поле ts торгового сигнала является Unix timestamp в миллисекундах.
Сначала demo
Ответ 202 Accepted подтверждает приём запроса backend, но сам по себе не подтверждает выставление или исполнение ордера. Перед live-торговлей проверьте полный цикл на Sim101, Playback или другом demo-счёте.
Два вида авторизации
| Назначение | Credential | Заголовок |
|---|---|---|
| Вход и управление API-ключами | пользовательский JWT | Authorization: Bearer <user-jwt> |
| Торговые вызовы Public API v1 | Public API key | Authorization: Bearer tmpro_api_<secret> |
sessionToken, пользовательский JWT и Public API key — разные credentials. Нельзя использовать session token вместо API-ключа.
Scopes
| Scope | Разрешение |
|---|---|
signals:write | Отправка сигналов через POST /api/v1/signals |
signals:read | Чтение routing, execution, fill и cancel status |
orders:cancel | Точная отмена одного API-tracked entry order |
events:read | Список источников и SSE-события NinjaTrader |
Создавайте ключ только с необходимыми разрешениями. Для полного тестового клиента можно выбрать все четыре scope.
Полный список документированных вызовов
| Метод и путь | Авторизация | Scope | Назначение |
|---|---|---|---|
POST /api/auth/login | email + password | — | Получить пользовательский JWT |
GET /api/api-keys | JWT | — | Получить список неотозванных API-ключей |
POST /api/api-keys | JWT | — | Создать Public API key |
DELETE /api/api-keys/{id} | JWT | — | Отозвать Public API key |
POST /api/v1/signals | API key | signals:write | Отправить сигнал |
GET /api/v1/signals/{requestId} | API key | signals:read | Получить routing и execution status |
POST /api/v1/orders/{orderRef}/cancel | API key | orders:cancel | Запросить точную отмену ордера |
GET /api/v1/terminal-events/sources | API key | events:read | Получить активные NinjaTrader sources |
GET /api/v1/terminal-events/stream | API key | events:read | Открыть SSE-поток событий |
Рекомендуемый рабочий процесс
- Установите обновлённый индикатор в NinjaTrader и задайте
AccountName. - Задайте уникальный
InstanceId, если у пользователя подключено несколько компьютеров или терминалов. - Создайте API-ключ с нужными scopes.
- Сформируйте уникальные
signalIdиIdempotency-Key. - Отправьте сигнал.
- Сохраните полученный
requestId. - Опрашивайте status endpoint до терминального результата execution.
- Для pending entry order сохраните
orderRef. - Если требуется отмена, отправьте cancel-запрос с новым
Idempotency-Key. - Продолжайте читать status исходного сигнала: именно там появляется итог отмены.
Минимальный быстрый старт
Ниже показан market order для NinjaTrader. Значение ts должно быть вычислено непосредственно перед отправкой.
bash
export TMPRO_API_KEY='tmpro_api_REPLACE_ME'
TS=$(date +%s%3N)
IDEMPOTENCY_KEY=$(uuidgen)
curl --request POST 'https://tradingmonitor.pro/api/v1/signals' \
--header "Authorization: Bearer $TMPRO_API_KEY" \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--data "{
\"v\": 1,
\"signalId\": \"demo-$IDEMPOTENCY_KEY\",
\"ts\": $TS,
\"ttlMs\": 15000,
\"platform\": \"ninjatrader\",
\"type\": \"order\",
\"cmd\": \"submit\",
\"payload\": {
\"instrument\": \"ES 09-26\",
\"side\": \"buy\",
\"executionType\": \"market\",
\"quantity\": 1
}
}"csharp
using System.Net.Http.Headers;
using System.Net.Http.Json;
using var http = new HttpClient
{
BaseAddress = new Uri("https://tradingmonitor.pro")
};
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "tmpro_api_REPLACE_ME");
var idempotencyKey = Guid.NewGuid().ToString();
var signal = new
{
v = 1,
signalId = $"demo-{Guid.NewGuid():N}",
ts = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
ttlMs = 15_000,
platform = "ninjatrader",
type = "order",
cmd = "submit",
payload = new
{
instrument = "ES 09-26",
side = "buy",
executionType = "market",
quantity = 1
}
};
using var request = new HttpRequestMessage(HttpMethod.Post, "/api/v1/signals")
{
Content = JsonContent.Create(signal)
};
request.Headers.Add("Idempotency-Key", idempotencyKey);
using var response = await http.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");python
import time
import uuid
import requests
api_key = "tmpro_api_REPLACE_ME"
idempotency_key = str(uuid.uuid4())
signal = {
"v": 1,
"signalId": f"demo-{uuid.uuid4().hex}",
"ts": int(time.time() * 1000),
"ttlMs": 15_000,
"platform": "ninjatrader",
"type": "order",
"cmd": "submit",
"payload": {
"instrument": "ES 09-26",
"side": "buy",
"executionType": "market",
"quantity": 1,
},
}
response = requests.post(
"https://tradingmonitor.pro/api/v1/signals",
headers={
"Authorization": f"Bearer {api_key}",
"Idempotency-Key": idempotency_key,
},
json=signal,
timeout=30,
)
print(response.status_code, response.text)Успешный ответ:
json
{
"requestId": "8d69cb7cfec4421d8e6a1277198d38fb",
"signalId": "demo-f0b4ad6f443a4dfeb3b019d44b36f7d4",
"status": "accepted",
"acceptedAt": "2026-07-16T12:00:00Z"
}Следующие разделы подробно описывают каждый endpoint, все поля, ответы, retries и ошибки.