Розробка системи автоматичного обміну
Автоматичний крипто-обмінник — це сервіс миттєвого обміну без реєстрації або з мінімальною реєстрацією. Користувач вказує, що він хоче відправити, що отримати, адресу призначення — і система сама знаходить курс, проводить трансакцію та зараховує кошти. Технічно це orchestration engine поверх кількох ліквідних джерел.
Архітектура системи обміну
Основний потік
Користувач вказує пару (BTC → USDT, $500)
│
▼
Rate Aggregator (Binance, OKX, Changenow, Simpleswap)
│
▼
Вибір найкращого курсу + розрахунок комісії
│
▼
Створення замовлення (зафіксований курс на 15 хвилин)
│
▼
Виявлення депозиту (чекаємо BTC від користувача)
│
▼
Виконання (купуємо/продаємо через обраний источник ліквідності)
│
▼
Виплата (відправляємо USDT на адресу користувача)
Агрегація курсів
Агрегація курсів від кількох джерел:
import asyncio
from decimal import Decimal
class RateAggregator:
def __init__(self, providers: list):
self.providers = providers
async def get_best_rate(
self,
from_currency: str,
to_currency: str,
amount: Decimal
) -> BestRate:
# Запитуємо всі джерела паралельно
tasks = [
provider.get_rate(from_currency, to_currency, amount)
for provider in self.providers
]
results = await asyncio.gather(*tasks, return_exceptions=True)
valid_rates = [
r for r in results
if not isinstance(r, Exception) and r is not None
]
if not valid_rates:
raise NoLiquidityError("No rates available")
# Найкращий курс = максимальний to_amount
best = max(valid_rates, key=lambda r: r.to_amount)
return BestRate(
provider=best.provider_name,
from_amount=amount,
to_amount=best.to_amount,
rate=best.to_amount / amount,
expires_at=best.rate_expires_at,
fee=best.fee
)
Механізм фіксації курсу
Користувач бачить курс → отримує саме цей курс, навіть якщо ринок рухнеться. Стандартний період блокування: 10-20 хвилин. Обмінник бере на себе ризик зміни курсу у цей період.
Захист від надмірного ризику:
def should_lock_rate(self, rate: BestRate, spread_buffer: float = 0.005) -> bool:
"""
Блокуємо курс тільки якщо наш буфер покриває можливе рухання.
spread_buffer = 0.5% — наскільки курс може піти проти нас за 15 хвилин.
"""
our_fee = rate.from_amount * Decimal(str(self.our_markup))
min_profitable_rate = rate.to_amount * Decimal(str(1 - spread_buffer))
# Якщо навіть при рухові на spread_buffer ми в плюсі — блокуємо
return our_fee > (rate.to_amount - min_profitable_rate)
Управління ліквідністю
Моделі виконання
Pass-through модель: всі замовлення негайно виконуються на зовнішніх провайдерах. Немає inventory risk, немає необхідності тримати капітал в різних валютах. Маржа = різниця між агрегованим курсом і ціною провайдера.
B-Book модель: обмінник сам виступає контрагентом. Якщо A міняє BTC→USDT, а B міняє USDT→BTC одночасно — внутрішній матч без зовнішнього виконання. Вища маржа, але inventory risk.
Гібридна: внутрішній матчинг де можливо, зовнішнє виконання для решти.
Мультивалютний пул ліквідності
class LiquidityPool:
def __init__(self, min_balances: dict):
# Мінімальні баланси для забезпечення обмінів
self.min_balances = min_balances # {'BTC': 0.5, 'USDT': 10000, ...}
async def ensure_liquidity(self, currency: str, required_amount: Decimal):
current = await self.get_balance(currency)
minimum = Decimal(str(self.min_balances.get(currency, 0)))
if current - required_amount < minimum:
# Докупуємо через API біржі
deficit = minimum - (current - required_amount)
await self.rebalance(currency, deficit)
async def rebalance(self, currency: str, amount: Decimal):
"""Поновлюємо баланс валюти покупкою за USDT"""
logger.warning(f"Rebalancing {currency}: buying {amount}")
await self.exchange.buy_market(f"{currency}/USDT", amount)
Моніторинг трансакцій
Blockchain підтвердження
Різні мережі вимагають різного числа підтверджень перед зарахуванням:
CONFIRMATION_REQUIREMENTS = {
'BTC': {'confirmations': 2, 'timeout_minutes': 60},
'ETH': {'confirmations': 12, 'timeout_minutes': 15},
'USDT_TRC20': {'confirmations': 20, 'timeout_minutes': 10},
'BNB': {'confirmations': 15, 'timeout_minutes': 5},
'SOL': {'confirmations': 32, 'timeout_minutes': 5},
'LTC': {'confirmations': 6, 'timeout_minutes': 30},
}
async def wait_for_deposit(self, order: Order) -> DepositResult:
requirements = CONFIRMATION_REQUIREMENTS[order.from_currency]
deadline = order.created_at + timedelta(minutes=requirements['timeout_minutes'])
while datetime.utcnow() < deadline:
tx = await self.blockchain.find_transaction(
address=order.deposit_address,
expected_amount=order.from_amount
)
if tx and tx.confirmations >= requirements['confirmations']:
return DepositResult(success=True, tx_hash=tx.hash, amount=tx.amount)
await asyncio.sleep(30) # перевіряємо кожні 30 секунд
return DepositResult(success=False, reason='timeout')
Обробка часткових депозитів
Користувач відправив менше, ніж очікувалось (неправильний розрахунок комісії мережі):
- Якщо сума > мінімуму для обміну → виконуємо з пересчетом
- Якщо сума < мінімуму → повертаємо (мінус газ комісія)
- Якщо сума з невеликим відхиленням (±2%) → приймаємо, пересчитуємо курс
Compliance та AML
Обмінники — високоризиковий сегмент з погляду регуляторів. FATF рекомендації вимагають KYC для трансакцій вище порогів.
Мінімальний compliance стек:
class ExchangeCompliance:
def screen_transaction(self, tx: PendingExchange) -> ComplianceResult:
# Скринінг адрес
from_risk = self.chainalysis.check(tx.from_address)
to_risk = self.chainalysis.check(tx.to_address)
if from_risk.is_sanctioned or to_risk.is_sanctioned:
return ComplianceResult(action='block', reason='sanctions')
if from_risk.risk_score > 80 or to_risk.risk_score > 80:
return ComplianceResult(action='kyc_required')
# Перевірка суми
if tx.amount_usd > self.kyc_threshold:
return ComplianceResult(action='kyc_required')
return ComplianceResult(action='allow')
Пороги KYC залежать від юрисдикції: ЄС вимагає KYC при €1000+, деякі офшори не вимагають взагалі.
Ціноутворення та маржа
Типова структура маржі обмінника:
| Компонент | Значення |
|---|---|
| Спред провайдера | 0.1–0.5% |
| Наша наценка | 0.3–1.5% |
| Blockchain комісія | ~$1-5 залежно від мережі |
| Мінімальна маржа на угоду | $2-5 |
Маржа варіюється залежно від популярності пари (BTC/USDT—конкурентна → низька маржа, рідкі пари → вища), розміру трансакції (об'ємні знижки) та каналу привлечення (affiliate програма).
Система автоматичного обміну при правильній архітектурі обробляє тисячі трансакцій на день повністю в автоматичному режимі. Головні операційні ризики: затримки blockchain, волатильність курсів під час lock period, та compliance вимоги.







