Разработка системы OTC-торговли
OTC (Over-The-Counter) торговля — это сделки между двумя сторонами вне публичного биржевого стакана. Институциональные инвесторы, крупные трейдеры, фонды покупают и продают большие объёмы через OTC именно потому, что биржевой стакан не может переварить $10M+ ордер без значительного price impact. OTC desk решает эту проблему.
Зачем нужен OTC
При крупной покупке через обычный биржевой ордер:
- Маркет ордер на $10M BTC сдвинет цену на 2-5% вверх (market impact)
- Трейдер сам себе поднимает цену покупки
- Сделка видна в order flow — информация утекает к HFT
OTC позволяет согласовать фиксированную цену на весь объём, исполнить атомарно и конфиденциально.
Архитектура OTC системы
Request for Quote (RFQ) flow
Клиент запрашивает котировку
│ (сумма, пара, направление)
▼
OTC Desk получает RFQ
│
▼
OTC Trader агрегирует ликвидность
├── Внутренний matching (встречные ордера других OTC клиентов)
├── CEX deep liquidity (Binance OTC, Cumberland)
└── Собственный инвентарь
│
▼
Котировка с lock period (30-60 секунд)
│
▼
Клиент принимает / отклоняет
│
▼
Settlement (атомарный, часто T+0 или T+1)
OTC Quote система
from dataclasses import dataclass
from decimal import Decimal
from datetime import datetime, timedelta
import uuid
@dataclass
class OTCQuote:
quote_id: str
client_id: str
symbol: str
side: str # 'buy' | 'sell'
quantity: Decimal
price: Decimal
total_value: Decimal
spread_bps: int # спред от mid-market
expires_at: datetime
status: str = 'pending' # pending / accepted / rejected / expired
class OTCDeskService:
def __init__(self, pricing_engine, risk_manager):
self.pricing = pricing_engine
self.risk = risk_manager
async def request_quote(
self,
client_id: str,
symbol: str,
side: str,
quantity: Decimal
) -> OTCQuote:
# Проверяем лимиты клиента
client = await self.db.get_client(client_id)
notional = await self.pricing.estimate_notional(symbol, quantity)
if notional > client.otc_limit:
raise LimitExceeded(f"Exceeds client OTC limit: {client.otc_limit}")
# Получаем mid-market price
mid_price = await self.pricing.get_mid_price(symbol)
# Рассчитываем спред на основе размера и ликвидности
spread_bps = self.calculate_spread(symbol, quantity, notional, client.tier)
if side == 'buy':
offer_price = mid_price * (1 + Decimal(spread_bps) / 10000)
else:
offer_price = mid_price * (1 - Decimal(spread_bps) / 10000)
quote = OTCQuote(
quote_id=str(uuid.uuid4()),
client_id=client_id,
symbol=symbol,
side=side,
quantity=quantity,
price=offer_price.quantize(Decimal('0.01')),
total_value=(offer_price * quantity).quantize(Decimal('0.01')),
spread_bps=spread_bps,
expires_at=datetime.utcnow() + timedelta(seconds=45)
)
await self.db.save_quote(quote)
return quote
def calculate_spread(
self,
symbol: str,
quantity: Decimal,
notional_usd: Decimal,
client_tier: str
) -> int:
base_spread = {
'BTC': 10, # 10bps базовый для BTC
'ETH': 15,
'SOL': 25,
}.get(symbol.replace('USDT', ''), 50)
# Размер влияет на спред: больше → шире
size_premium = max(0, int((notional_usd / 1_000_000 - 1) * 3))
# Клиентский тир снижает спред
tier_discount = {'vip': 5, 'premium': 3, 'standard': 0}.get(client_tier, 0)
return base_spread + size_premium - tier_discount
Settlement
OTC settlement может быть:
Same-day (T+0): платёж и доставка актива в один день. Возможно при предварительно внесённом залоге или через DvP (Delivery vs Payment) механизм.
Next-day (T+1): стандарт для институционального OTC. Подтверждение сделки сегодня, расчёт завтра. Даёт время обеим сторонам организовать средства.
Atomic swap: для крипто-крипто OTC — смарт-контракт атомарного обмена. Обе стороны депонируют активы, контракт исполняет одновременно или не исполняет вообще.
Compliance для OTC
OTC сделки выше $10,000 (или эквивалент в крипте) требуют обязательной KYC/AML процедуры во большинстве юрисдикций. Институциональные клиенты проходят расширенный due diligence:
- Corporate KYC: учредительные документы, структура ownership, UBO (Ultimate Beneficial Owner)
- Source of funds: происхождение средств
- AML screening: контрагенты, адреса блокчейна
- Risk rating: ежегодное обновление
OTC desk с правильным compliance стеком может работать с банками, фондами и institutional crypto players — это premium сегмент с высокими margins.







