Разработка системы автоматического обмена
Автоматический обменник криптовалюты — это сервис мгновенного обмена без регистрации или с минимальной регистрацией. Пользователь указывает что хочет отдать, что получить, адрес назначения — и система сама находит курс, проводит транзакцию и зачисляет средства. Технически это orchestration engine поверх нескольких ликвидных источников.
Архитектура системы обмена
Основной flow
Пользователь задаёт пару (BTC → USDT, $500)
│
▼
Rate Aggregator (Binance, OKX, Changenow, Simpleswap)
│
▼
Best Rate Selection + Fee Calculation
│
▼
Order Creation (locked rate на 15 минут)
│
▼
Deposit Detection (ждём BTC от пользователя)
│
▼
Execution (покупаем/продаём через выбранный liquidity source)
│
▼
Payout (отправляем USDT на адрес пользователя)
Rate Aggregation
Агрегация курсов от нескольких источников:
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
)
Locked rate механизм
Пользователь видит курс → должен получить именно его, даже если рынок сдвинулся. Стандартный lock period: 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.
Hybrid: internal matching где возможно, external execution для остатка.
Multi-currency liquidity pool
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)
Transaction мониторинг
Blockchain confirmations
Разные сети требуют разного числа подтверждений перед зачислением:
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')
Обработка частичных депозитов
Пользователь отправил меньше чем ожидалось (неверный расчёт комиссии сети):
- Если сумма > минимума для обмена → исполняем по факту с пересчётом
- Если сумма < минимума → возврат (minus gas fee)
- Если сумма с небольшим отклонением (±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+, ряд оффшоров не требует вовсе.
Ценообразование и маржа
Типичная структура маржи обменника:
| Компонент | Значение |
|---|---|
| Spread от провайдера | 0.1–0.5% |
| Наша наценка | 0.3–1.5% |
| Blockchain fee | ~$1-5 в зависимости от сети |
| Минимальная маржа на сделку | $2-5 |
Маржа варьируется в зависимости от популярности пары (BTC/USDT — конкурентная → низкая маржа, редкие пары → выше), размера транзакции (объёмные скидки), и канала привлечения (affiliate программа).
Система автоматического обмена при правильной архитектуре обрабатывает тысячи транзакций в день полностью в автоматическом режиме. Главные операционные риски: задержки блокчейна, волатильность курсов во время lock period, и compliance требования.







