Skip to content

Точная отмена ордера

POST /api/v1/orders/{orderRef}/cancel

Запрашивает отмену одного конкретного ордера, ранее созданного через tracked Public API signal. Требует scope orders:cancel.

Endpoint:

  • отменяет только ордер, связанный с переданным orderRef;
  • не выполняет cancel-all;
  • не закрывает уже открытую позицию;
  • не принимает NinjaTrader OrderId вместо orderRef;
  • возвращает 202 Accepted до получения окончательного подтверждения от terminal/broker.

Как получить orderRef

  1. Отправьте order.submit через POST /api/v1/signals.
  2. Получите requestId из ответа.
  3. Вызовите GET /api/v1/signals/{requestId}.
  4. Возьмите executions[].orderRef нужного execution.

orderRef создаётся только для type=order, cmd=submit. Это opaque backend identifier: не разбирайте его формат и не конструируйте самостоятельно.

Когда ордер можно отменить

Backend принимает exact cancel, только если одновременно выполняются условия:

  • execution принадлежит тому же пользователю;
  • orderRef существует;
  • execution имеет status broker_submitted или partially_filled;
  • terminal ранее сообщил свой внутренний TerminalOrderId;
  • тот же terminal instance активен и поддерживает capability точной отмены;
  • для ордера ещё нет незавершённого cancel request.

Terminal считается доступным, пока его heartbeat не старше 120 секунд. Значение является текущей настройкой backend и может быть изменено оператором.

Filled order

Если entry order уже полностью исполнен, используйте position-команду для закрытия или уменьшения позиции. Exact cancel не является командой закрытия позиции.

Заголовки

http
Authorization: Bearer tmpro_api_<secret>
Idempotency-Key: <unique-value>

Idempotency-Key обязателен, должен иметь длину 1–128 символов и не содержать управляющих символов. Для одного логического запроса отмены сохраняйте один key при всех network retries.

Тело запроса отсутствует.

Примеры

bash
export TMPRO_API_KEY='tmpro_api_REPLACE_ME'
ORDER_REF='ord_c05a69ac94f948c0997c661d83d2a2b1'
IDEMPOTENCY_KEY=$(uuidgen)

curl --request POST \
  "https://tradingmonitor.pro/api/v1/orders/${ORDER_REF}/cancel" \
  --header "Authorization: Bearer $TMPRO_API_KEY" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY"
csharp
using System.Net.Http.Headers;

var orderRef = "ord_c05a69ac94f948c0997c661d83d2a2b1";
using var http = new HttpClient
{
    BaseAddress = new Uri("https://tradingmonitor.pro")
};
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "tmpro_api_REPLACE_ME");

var encodedOrderRef = Uri.EscapeDataString(orderRef);
using var request = new HttpRequestMessage(
    HttpMethod.Post,
    $"/api/v1/orders/{encodedOrderRef}/cancel");
request.Headers.Add("Idempotency-Key", Guid.NewGuid().ToString());

using var response = await http.SendAsync(request);
var body = await response.Content.ReadAsStringAsync();

Console.WriteLine($"{(int)response.StatusCode} {body}");
Console.WriteLine($"Location: {response.Headers.Location}");
Console.WriteLine(
    $"Replayed: {response.Headers.TryGetValues("Idempotency-Replayed", out var values) && values.Single() == "true"}");
python
import uuid
from urllib.parse import quote

import requests

api_key = "tmpro_api_REPLACE_ME"
order_ref = "ord_c05a69ac94f948c0997c661d83d2a2b1"
url = (
    "https://tradingmonitor.pro/api/v1/orders/"
    f"{quote(order_ref, safe='')}/cancel"
)

response = requests.post(
    url,
    headers={
        "Authorization": f"Bearer {api_key}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    timeout=30,
)

print(response.status_code, response.text)
print("Location:", response.headers.get("Location"))
print("Replayed:", response.headers.get("Idempotency-Replayed"))

Ответ 202 Accepted

json
{
  "cancelRequestId": "can_d40ad508dfc343f681506cdbe750be99",
  "requestId": "3b080d01b59448d59c3e1d9b93725378",
  "executionId": "exec_3ef5c67ee80d4638b5139b83b331d5a3",
  "orderRef": "ord_c05a69ac94f948c0997c661d83d2a2b1",
  "status": "accepted",
  "acceptedAt": "2026-07-16T12:00:00Z"
}

Заголовки:

http
Location: /api/v1/signals/3b080d01b59448d59c3e1d9b93725378
Idempotency-Replayed: false

Поля:

ПолеЗначение
cancelRequestIdcorrelation конкретного запроса отмены
requestIdисходный signal request
executionIdexecution, содержащий отменяемый ордер
orderRefточный backend reference ордера
statusпри принятии всегда accepted
acceptedAtвремя создания cancel request на backend

202 подтверждает создание и отправку cancel-команды, но не подтверждает, что broker уже отменил ордер.

Как получить окончательный результат

Выполняйте GET по адресу из заголовка Location и проверяйте executions[].cancel у execution с соответствующим executionId.

Пример:

json
{
  "executions": [
    {
      "executionId": "exec_3ef5c67ee80d4638b5139b83b331d5a3",
      "orderRef": "ord_c05a69ac94f948c0997c661d83d2a2b1",
      "status": "cancelled",
      "cancel": {
        "cancelRequestId": "can_d40ad508dfc343f681506cdbe750be99",
        "status": "cancelled",
        "reasonCode": null,
        "createdAt": "2026-07-16T12:00:00Z",
        "completedAt": "2026-07-16T12:00:00.420Z"
      }
    }
  ]
}

Возможные значения cancel.status:

StatusФинальныйЗначение
acceptedнетbackend создал cancel request
cancel_requestedнетterminal отправил отмену в NinjaTrader/broker adapter
cancelledдаордер подтверждённо отменён
already_filledдак моменту отмены ордер уже был исполнен; execution переводится в filled
cancel_rejectedдаотмена отклонена terminal или broker
not_cancellableдатекущее состояние ордера не допускает отмену
order_not_foundдаterminal больше не может сопоставить tracked order
not_confirmedдаподтверждение не получено до timeout

Текущий backend ожидает terminal confirmation до 30 секунд. Не считайте отсутствие быстрого ответа доказательством отмены: дождитесь финального cancel.status либо проверьте broker state вручную.

Идемпотентность и retry

  • тот же Idempotency-Key и тот же orderRef: повторный 202, тот же cancelRequestId, Idempotency-Replayed: true;
  • тот же key для другого orderRef: 409 idempotency_conflict;
  • другой key, пока предыдущая отмена находится в accepted или cancel_requested: 409 cancel_already_in_progress;
  • после network timeout повторяйте исходный запрос с тем же key.

Не создавайте новый key только потому, что первый HTTP response потерялся: это может создать конкурирующие логические попытки после завершения предыдущей.

Ошибки

HTTPCodeПричина и действие
400invalid_idempotency_keyheader отсутствует, повторён или не соответствует ограничениям
401invalid_api_keyключ отсутствует, отозван, истёк или неверен
403insufficient_scopeнет scope orders:cancel
404order_not_foundorderRef неверен, не принадлежит пользователю или имеет недопустимый формат
409order_not_cancellableexecution не в broker_submitted/partially_filled или terminal order correlation отсутствует
409terminal_unavailableточный terminal недоступен или не поддерживает exact cancel
409cancel_already_in_progressдля order уже выполняется отмена
409idempotency_conflictkey уже использован для другой отмены
429api_rate_limitedпревышен REST rate limit; учитывайте Retry-After

Все REST-ошибки /api/v1/* используют единый envelope, описанный в разделе Ошибки, retries и лимиты.

TradingMonitor.Pro documentation.