Розробка системи керування позиціями на perpetual DEX

Ми розробляємо кастомні системи керування позиціями на perpetual DEX — від простого трекера до повноцінного ризик-менеджера з автоматичними стоп-лосами та керуванням маржею. Perpetual DEX (dYdX, GMX, Hyperliquid, Gains Network) дозволяють торгувати з плечем без дати експірації та без централізованог

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1003
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1269
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1009

Ми розробляємо кастомні системи керування позиціями на 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.

  1. Імпортувати контракти GMX через npm install @gmx-v2/contracts.
  2. Підключити провайдер Viem і отримати екземпляр ExchangeRouter.
  3. Створити та підписати CreateOrderParams.
  4. Відправити транзакцію з executionFee.
  5. Обробити 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 тижні.