Skip to content

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-ключамипользовательский JWTAuthorization: Bearer <user-jwt>
Торговые вызовы Public API v1Public API keyAuthorization: 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/loginemail + passwordПолучить пользовательский JWT
GET /api/api-keysJWTПолучить список неотозванных API-ключей
POST /api/api-keysJWTСоздать Public API key
DELETE /api/api-keys/{id}JWTОтозвать Public API key
POST /api/v1/signalsAPI keysignals:writeОтправить сигнал
GET /api/v1/signals/{requestId}API keysignals:readПолучить routing и execution status
POST /api/v1/orders/{orderRef}/cancelAPI keyorders:cancelЗапросить точную отмену ордера
GET /api/v1/terminal-events/sourcesAPI keyevents:readПолучить активные NinjaTrader sources
GET /api/v1/terminal-events/streamAPI keyevents:readОткрыть SSE-поток событий

Рекомендуемый рабочий процесс

  1. Установите обновлённый индикатор в NinjaTrader и задайте AccountName.
  2. Задайте уникальный InstanceId, если у пользователя подключено несколько компьютеров или терминалов.
  3. Создайте API-ключ с нужными scopes.
  4. Сформируйте уникальные signalId и Idempotency-Key.
  5. Отправьте сигнал.
  6. Сохраните полученный requestId.
  7. Опрашивайте status endpoint до терминального результата execution.
  8. Для pending entry order сохраните orderRef.
  9. Если требуется отмена, отправьте cancel-запрос с новым Idempotency-Key.
  10. Продолжайте читать 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 и ошибки.

TradingMonitor.Pro documentation.