Appearance
Точная отмена ордера
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
- Отправьте
order.submitчерезPOST /api/v1/signals. - Получите
requestIdиз ответа. - Вызовите
GET /api/v1/signals/{requestId}. - Возьмите
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Поля:
| Поле | Значение |
|---|---|
cancelRequestId | correlation конкретного запроса отмены |
requestId | исходный signal request |
executionId | execution, содержащий отменяемый ордер |
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 потерялся: это может создать конкурирующие логические попытки после завершения предыдущей.
Ошибки
| HTTP | Code | Причина и действие |
|---|---|---|
400 | invalid_idempotency_key | header отсутствует, повторён или не соответствует ограничениям |
401 | invalid_api_key | ключ отсутствует, отозван, истёк или неверен |
403 | insufficient_scope | нет scope orders:cancel |
404 | order_not_found | orderRef неверен, не принадлежит пользователю или имеет недопустимый формат |
409 | order_not_cancellable | execution не в broker_submitted/partially_filled или terminal order correlation отсутствует |
409 | terminal_unavailable | точный terminal недоступен или не поддерживает exact cancel |
409 | cancel_already_in_progress | для order уже выполняется отмена |
409 | idempotency_conflict | key уже использован для другой отмены |
429 | api_rate_limited | превышен REST rate limit; учитывайте Retry-After |
Все REST-ошибки /api/v1/* используют единый envelope, описанный в разделе Ошибки, retries и лимиты.