Клуб FTT · Портфель №1

Сделки портфеля приходят на твой сервер

Не чат и не уведомление — машиночитаемое сообщение с подписью, в ту же секунду, что и в автоследование.

вход, выход, стоп в безубытокподпись HMACid для дедупликации
POST https://твой-сервер/hook 200 OK
{ "id": "pf1:b7e1:entry:SPY", "type": "signal", "portfolio": "pf1", "kind": "entry", "ticker": "SPY", "price": 763.4, "share_pct": 5, "ts": "2026-09-07T13:30:02.118Z" }
X-FTT-Signature: sha256=9f81…c7d4доставлено за 1,2 с

Это для тех, кто торгует сам. Мы не касаемся твоего счёта и ничего на нём не ставим — только сообщаем о сделке Портфеля №1: что, когда и по какой цене. Размер, инструмент и способ исполнения выбираешь ты: хоть акции, хоть опционы, хоть своя стратегия поверх сигнала.

Как это работает

Запрос

POST на твой адрес, тело JSON, заголовки: X-FTT-Event (номер события), X-FTT-Timestamp (unix-секунды), X-FTT-Signature (v1=<hex>). Ответь любым кодом 200–299 в течение 6 секунд. Если ответа нет или код 5xx — повторим ещё два раза (через 1,5 и 4 секунды); на 4xx не повторяем. Один и тот же номер события может прийти повторно — сохраняй обработанные id.

{
  "id": "pf1:3f9c…:entry:SPY",   // номер события
  "type": "signal",              // "signal" или "test"
  "portfolio": "pf1",
  "kind": "entry",               // "entry" — вход, "exit" — выход, "bestop" — стоп в безубыток
  "ticker": "SPY",
  "price": 645.2,                // цена сделки, USD
  "share_pct": 5.0,              // доля капитала на вход (только entry)
  "result_pct": 3.1,             // результат выхода, если известен (только exit)
  "trigger": 645.85,             // только bestop: триггер стопа Портфеля №1; price здесь — ЕГО цена входа, свой стоп ставь по СВОЕМУ входу
  "ts": "2026-09-08T14:31:02.120Z",
  "ref": "a1b2c3d4e5f6"          // метка твоего потока
}

Проверка подписи

Подпись — HMAC-SHA256 твоим ключом от строки <timestamp>.<тело запроса как есть>. Сравнивай с X-FTT-Signature без префикса v1=. Отклоняй запросы старше 5 минут.

// Node.js
const crypto = require('crypto');
function verify(secret, tsHeader, rawBody, sigHeader){
  const mac = crypto.createHmac('sha256', secret).update(tsHeader + '.' + rawBody).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(sigHeader.replace('v1=','')));
}
# Python
import hmac, hashlib
def verify(secret, ts, raw_body, sig):
    mac = hmac.new(secret.encode(), f"{ts}.{raw_body}".encode(), hashlib.sha256).hexdigest()
    return hmac.compare_digest(mac, sig.replace("v1=", ""))

Что важно

Сигнал приходит в момент исполнения сделки Портфеля №1, одновременно с автоследованием. Цена в сигнале — цена нашей сделки, у тебя она будет отличаться. Сигнал — техническая информация о сделке, не рекомендация; решения и риск на твоей стороне.

«Сигналы по API» — техническая услуга доставки сообщений о сделках Портфеля №1 для личного использования. Условия.