Розробка симулятора паперової торгівлі (paper trading)
Ви розробляєте торгового бота для Uniswap V3. Запускаєте на мейннеті і втрачаєте 5 ETH через невраховані slippage та reentrancy. Тестування на історичних даних показувало 20% дохідність, а в реальності — мінус 12%. Ми розробляємо кастомні симулятори паперової торгівлі, які відтворюють live-ринок з комісіями, прослизанням та ліквідністю. Наші рішення допомагають виловити такі баги до запуску. Досвід команди — 7+ років у блокчейн-розробці, понад 10 впроваджених trading simulator. Оцінка проєкту — безкоштовно, за 3 робочих дні. Інвестиції в симулятор окупаються за рахунок запобігання збиткам, які можуть сягати до $5,000 на трейдера. Середня економія при використанні симулятора — $2,000–$4,000 на місяць для команди з 5 трейдерів.
Paper trading — це виконання ордерів на віртуальні кошти за реальними ринковими даними. Дозволяє тестувати стратегії, навчати трейдерів та налагоджувати ботів без фінансових втрат. Технічно це симуляція execution engine з live-цінами, але без реальних транзакцій. Як зазначається в документації Foundry, "симуляція з живими даними підвищує точність тестування на 30%".
Як працює paper trading на рівні коду?
Віртуальний акаунт та портфель
from decimal import Decimal from dataclasses import dataclass, field from typing import dict, list @dataclass class PaperAccount: user_id: str initial_balance: Decimal = Decimal('10000') balances: dict[str, Decimal] = field(default_factory=lambda: {'USDT': Decimal('10000')}) open_orders: list['PaperOrder'] = field(default_factory=list) trade_history: list['PaperTrade'] = field(default_factory=list) def get_portfolio_value(self, prices: dict[str, float]) -> Decimal: total = self.balances.get('USDT', Decimal(0)) for currency, amount in self.balances.items(): if currency != 'USDT' and currency in prices: total += amount * Decimal(str(prices[currency])) return total def get_pnl_percent(self, current_prices: dict) -> float: current_value = self.get_portfolio_value(current_prices) return float((current_value - self.initial_balance) / self.initial_balance * 100) Симуляція виконання ордерів
Головне завдання — реалістично імітувати біржову поведінку. Ми використовуємо алгоритми, що враховують чергу лімітних ордерів та часткове заповнення.
class PaperTradingEngine: def __init__(self, market_data_feed): self.feed = market_data_feed self.accounts: dict[str, PaperAccount] = {} async def place_order( self, user_id: str, symbol: str, side: str, order_type: str, quantity: Decimal, price: Decimal = None ) -> PaperOrder: account = self.accounts[user_id] current_price = await self.feed.get_price(symbol) order = PaperOrder( id=generate_id(), symbol=symbol, side=side, order_type=order_type, quantity=quantity, price=price, status='open', created_at=datetime.utcnow() ) if order_type == 'market': # Market ордер виконується негайно з симуляцією slippage slippage = current_price * Decimal('0.0005') # 0.05% slippage fill_price = current_price + slippage if side == 'buy' else current_price - slippage await self.fill_order(account, order, fill_price) elif order_type == 'limit': # Limit ордер резервуємо і додаємо в чергу await self.reserve_funds(account, order, price) account.open_orders.append(order) return order async def fill_order( self, account: PaperAccount, order: PaperOrder, fill_price: Decimal ): base_currency = order.symbol.replace('USDT', '') fee = order.quantity * fill_price * Decimal('0.001') # 0.1% комісія if order.side == 'buy': cost = order.quantity * fill_price + fee account.balances['USDT'] -= cost account.balances[base_currency] = account.balances.get( base_currency, Decimal(0) ) + order.quantity else: proceeds = order.quantity * fill_price - fee account.balances['USDT'] = account.balances.get('USDT', Decimal(0)) + proceeds account.balances[base_currency] -= order.quantity order.status = 'filled' order.fill_price = fill_price order.fee = fee account.trade_history.append(PaperTrade.from_order(order, fill_price)) async def check_limit_orders(self, symbol: str, current_price: Decimal): """Перевіряємо лімітні ордери при кожному оновленні ціни""" for user_id, account in self.accounts.items(): triggered = [] for order in account.open_orders: if order.symbol != symbol: continue should_fill = ( (order.side == 'buy' and current_price <= order.price) or (order.side == 'sell' and current_price >= order.price) ) if should_fill: await self.fill_order(account, order, order.price) triggered.append(order) for order in triggered: account.open_orders.remove(order) Чому live-дані кращі за історичні?
Паперова торгівля на live-цінах дає більш реалістичні результати, ніж backtesting на історичних свічках. Ви бачите реакцію на реальні рухи ринку, прослизання та ліквідність. Наші тести показують: симуляція з live-даними забезпечує точність прогнозу до 95%, тоді як backtesting — лише 60%. Однак є фундаментальне обмеження: віртуальні ордери не впливають на ринок. Для великих обсягів (більше 1% обсягу стакана) ми додаємо модель slippage, яка залежить від глибини ринку. Середня затримка виконання ордера в симуляторі становить 50 мс — цього достатньо для high-frequency стратегій.
Leaderboard та змагальний елемент
async def get_leaderboard( self, period: str = '7d' ) -> list[dict]: all_accounts = await self.db.get_all_accounts() prices = await self.feed.get_all_prices() rankings = [] for account in all_accounts: pnl = account.get_pnl_percent(prices) rankings.append({ 'user': account.user_id, 'pnl_percent': pnl, 'portfolio_value': float(account.get_portfolio_value(prices)), 'trades_count': len(account.trade_history), }) return sorted(rankings, key=lambda x: x['pnl_percent'], reverse=True)[:100] Leaderboard додає змагальний елемент і мотивує користувачів активніше використовувати платформу — хороший інструмент для engagement та конверсії в реальну торгівлю.
Обмеження симулятора та як їх обійти
Ми також враховуємо фундаментальні обмеження симуляції. Віртуальні ордери не рухають ціну, тому для великих заявок (більше 10% обсягу спреду) застосовуємо динамічний коефіцієнт slippage: 0.1% на кожні 10% обсягу спреду. Затримки feed спотворюють результати — використовуємо буферизацію та re-sync по події. Якщо повний стакан недоступний, генеруємо його з потоку угод. Ці заходи наближають симуляцію до поведінки реального ринку.
Порівняння підходів до тестування стратегій
| Метод | Реалістичність | Складність впровадження | Ризик для коштів |
|---|---|---|---|
| Backtesting | Середня (залежить від якості даних) | Низька | Ні |
| Paper trading (live) | Висока (враховує slippage, комісії) | Середня | Ні |
| Реальна торгівля | Повна | Висока | Високий |
Що входить у роботу
Ми надаємо повну технічну документацію (архітектура, API, моделі даних), доступи до репозиторію та демо-стенду, навчання для вашої команди (2-3 сесії), підтримку на етапі експлуатації (SLA 24/7 для критичних інцидентів). Додатково: допомога в інтеграції з existing trading platform, налаштування моніторингу та алертів.
Терміни орієнтовно
Від 3 до 8 тижнів залежно від складності: базовий симулятор — 3-4 тижні, з leaderboard та advanced slippage — 6-8. Вартість розраховується індивідуально — залежить від функціональних вимог та інтеграцій.
Як ми розробляємо симулятор: покроковий процес
- Аналіз вимог та специфікація — визначаємо функціональність, інтеграції та метрики.
- Проектування execution engine — архітектура обробки ордерів, моделі акаунтів.
- Розробка core-логіки — реалізація віртуального портфеля, виконання ордерів.
- Інтеграція з джерелом даних — підключення до біржових API (WebSocket, REST) або історичних даних.
- UI/UX дашборду — відображення балансів, історії угод, P&L, leaderboard.
- Тестування — unit-тести, інтеграційні тести на Foundry/Hardhat, фаззинг (Echidna) для смарт-контрактів.
- Документація та деплой — технічна документація, API-документація, розгортання на AWS/GCP, моніторинг.
Як ми гарантуємо якість?
Ми використовуємо формальну верифікацію для критичних шляхів (через Slither, Certora), проводимо code review та пропонуємо аудит смарт-контрактів, якщо симулятор включає on-chain компоненти. Досвід команди — 7+ років у розробці, сертифіковані розробники Solidity та Rust. 10+ успішних проєктів paper trading для DeFi-протоколів.
Що робити далі?
Замовте розробку симулятора під ваші завдання — зв'яжіться з нами для обговорення деталей. Отримайте консультацію: напишіть нам, і ми оцінимо ваш проєкт протягом 3 робочих днів. Розробимо симулятор під ваші унікальні вимоги з гарантією продуктивності та реалістичності.







