Ми розробляємо кастомні системи керування позиціями на perpetual DEX — від простого трекера до повноцінного ризик-менеджера з автоматичними стоп-лосами та керуванням маржею. Perpetual DEX (dYdX, GMX, Hyperliquid, Gains Network) дозволяють торгувати з плечем без дати експірації та без централізованого кастодіана. Але їхній стандартний UI не покриває завдання програмного керування: боти, vaults, протоколи автоматизації потребують власного рішення. Наша команда має 5+ років досвіду в розробці DeFi-рішень і гарантує прозору інтеграцію з будь-яким perpetual DEX. У цій статті розберемо архітектурні відмінності ключових perpetual DEX, покажемо реальну інтеграцію з GMX v2 і дамо готові шаблони для трекінгу та ризик-менеджменту.
Які архітектурні відмінності між orderbook та AMM perpetual DEX?
Orderbook-based (dYdX v4, Hyperliquid)
Класичний orderbook, але on-chain або в off-chain orderbook з on-chain settlement. dYdX v4 — окремий Cosmos appchain, Hyperliquid — власний L1. Взаємодія через REST API та WebSocket, аналогічно CEX.
Особливість dYdX v4: транзакції надсилаються не через Ethereum RPC, а через Cosmos SDK. Інший клієнт, інші формати. @dydxprotocol/v4-client-js — офіційний SDK.
Hyperliquid: власний HTTP API та WebSocket. Підписання через EIP-712 (EVM-сумісно). Найбільший throughput серед on-chain perps.
AMM-based (GMX v2, Gains Network)
Позиції відкриваються проти liquidity pool, а не counterparty. Price impact є, orderbook немає. GMX v2 використовує синтетичні активи через Chainlink price feeds.
GMX v2 контракти: ExchangeRouter для відкриття/закриття позицій, OrderVault для зберігання collateral до виконання. Усі операції через createOrder() з параметрами.
Як розраховується liquidation price на різних біржах?
Position tracker
Компонент, який безперервно відстежує стан відкритих позицій:
interface Position { id: string; exchange: "dydx" | "gmx" | "hyperliquid"; market: string; // "ETH-USD" side: "long" | "short"; size: bigint; // в USD entryPrice: number; currentPrice: number; unrealizedPnl: number; liquidationPrice: number; leverage: number; margin: bigint; fundingPaid: number; // накопичені funding payments } Джерела даних: WebSocket підписки на position updates (dYdX, Hyperliquid), polling через REST кожні 5-30 секунд (GMX через subgraph або прямі виклики контрактів).
Risk manager
Слідкує за наближенням до liquidation та виконанням stop-loss/take-profit:
const riskThresholds = { liquidationWarning: 0.15, // 15% до ліквідації → алерт autoReduceAt: 0.10, // 10% до ліквідації → зменшити позицію emergencyCloseAt: 0.05, // 5% до ліквідації → закрити повністю }; const distanceToLiquidation = (position: Position): number => { const current = position.currentPrice; const liq = position.liquidationPrice; if (position.side === "long") return (current - liq) / current; return (liq - current) / current; }; Add margin — перша лінія захисту. При наближенні до liquidation price — автоматично додати collateral замість закриття позиції. Дешевше по gas і зберігає позицію. Вимагає резервного балансу USDC на гаманці.
Partial close — при важкій ситуації зменшити розмір на 30-50%. Знижує розмір ризику без повного виходу.
Emergency close — повне закриття ринковим ордером. Високий slippage, але при реальній загрозі ліквідації — вигідніше втратити 1-2% на slippage, ніж 5-15% liquidation penalty.
Funding rate monitor
Funding payments на perpetuals — приховані витрати, які при поганому знаку з'їдають PnL. Відстежуємо:
// Для longs: positive funding rate → ви платите // Для shorts: positive funding rate → ви отримуєте const calculateFundingCost = ( position: Position, fundingRate8h: number, // наприклад 0.0001 = 0.01% periods: number ): number => { const sign = position.side === "long" ? -1 : 1; return position.size * fundingRate8h * periods * sign; }; Якщо накопичений funding cost перевищує expected profit по позиції — кандидат на закриття незалежно від PnL.
Інтеграція з GMX v2: покрокова інструкція
GMX v2 — найскладніший з популярних perpetual DEX для інтеграції, тому що всі операції асинхронні через order keeper.
- Імпортувати контракти GMX через
npm install @gmx-v2/contracts. - Підключити провайдер Viem і отримати екземпляр
ExchangeRouter. - Створити та підписати
CreateOrderParams. - Відправити транзакцію з
executionFee. - Обробити callback
afterOrderExecution().
// Відкриття long позиції на ETH IExchangeRouter.CreateOrderParams memory params = IExchangeRouter.CreateOrderParams({ addresses: IExchangeRouter.CreateOrderParamsAddresses({ receiver: address(this), callbackContract: address(this), // наш контракт отримає callback uiFeeReceiver: address(0), market: ETH_USD_MARKET, initialCollateralToken: USDC_ADDRESS, swapPath: new address[](0) }), numbers: IExchangeRouter.CreateOrderParamsNumbers({ sizeDeltaUsd: 10_000 * 1e30, // $10,000 позиція (30 decimals) initialCollateralDeltaAmount: 1_000 * 1e6, // $1,000 collateral (USDC 6 decimals) triggerPrice: 0, // market order acceptablePrice: minAcceptablePrice, executionFee: executionFee, callbackGasLimit: 700_000, minOutputAmount: 0 }), orderType: Order.OrderType.MarketIncrease, decreasePositionSwapType: Order.DecreasePositionSwapType.NoSwap, isLong: true, shouldUnwrapNativeToken: false, referralCode: bytes32(0) }); exchangeRouter.createOrder{value: executionFee}(params); Ордер виконується keeper-нодами GMX асинхронно. Callback afterOrderExecution() на вашому контракті сигналізує про виконання. Якщо keeper не виконав за певний час — ордер можна скасувати через cancelOrder().
Розрахунок liquidation price на GMX
| Параметр | Формула |
|---|---|
| Long | liq_price = entry_price * (1 - (margin - borrow_fee) / size) |
| Short | liq_price = entry_price * (1 + (margin - borrow_fee) / size) |
borrow_fee накопичується з часом — його потрібно враховувати при розрахунку поточного стану. GMX надає Reader контракт з getPositionInfo() який повертає актуальні дані включаючи fees.
Порівняльна таблиця бірж
| Параметр | dYdX v4 | Hyperliquid | GMX v2 |
|---|---|---|---|
| Архітектура | Cosmos appchain | Власний L1 | Arbitrum/AVAX |
| API | REST + WebSocket, Cosmos SDK | REST + WebSocket, EIP-712 | Контракти Ethereum, async order |
| Складність інтеграції | Середня | Низька | Висока (async order) |
| Швидкість | ~0.5 сек | ~0.1 сек | ~1-5 хв (keeper) |
Стек та інфраструктура
TypeScript + viem для GMX on-chain взаємодій. @dydxprotocol/v4-client-js для dYdX. Websocket клієнти для real-time даних. PostgreSQL + TimescaleDB для зберігання історії позицій та PnL. Redis для кешування поточного стану. Grafana дашборд з метриками по всіх відкритих позиціях.
Орієнтири за термінами
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика | 1-3 дні | Вимоги, вибір стеку |
| Проектування | 2-4 дні | Архітектура, схеми |
| Реалізація | 5-10 днів | Робочий прототип |
| Тестування | 2-3 дні | Unit + інтеграційні тести |
| Деплой | 1-2 дні | Продакшн-середовище |
Система трекінгу позицій для одного perpetual DEX з алертами — 3-5 днів. Повна система з ризик-менеджментом, auto-margin-add та stop-loss/take-profit для одного протоколу (GMX або dYdX) — 1-1.5 тижні. Мультипротокольна система (GMX + dYdX + Hyperliquid) — 2-3 тижні. Вартість розраховується після уточнення цільових бірж і вимог до автоматизації.
Отримайте консультацію по вашому проєкту — оцінимо складність і терміни. Реалізуємо під ключ за 2-3 тижні.







