GaiaEx AcademyGaiaEx Academy
Торгівля через API GaiaEx: автентифікація, ордери та ринкові дані
РозробникПрограмування12 min read

Торгівля через API GaiaEx: автентифікація, ордери та ринкові дані

Підключіться до GaiaEx програмно і розмістіть свою першу автоматизовану угоду

Поділитися

Огляд API GaiaEx: REST + WebSocket на Hyperliquid L1

GaiaEx — це децентралізована біржа, побудована на Hyperliquid L1, а її API надає програмний доступ до всього, що пропонує платформа — ринкові дані, керування ордерами, відстеження позицій та потокову передачу даних у реальному часі. Незалежно від того, чи будуєте ви торгового бота, дашборд портфеля, чи власну систему сповіщень, API — ваша точка входу.

API розділений на два взаємодоповнюючих протоколи:

  • REST API — ендпоінти запит-відповідь для розміщення ордерів, запиту балансів, отримання історії угод та керування API-ключами. Використовуйте REST, коли потрібно щось зробити чи запитати конкретну інформацію.
  • WebSocket API — постійні потокові з’єднання для ринкових даних у реальному часі (угоди, оновлення книги ордерів, тікери) та приватних подій рахунку (виконання ордерів, зміни позицій). Використовуйте WebSocket, коли потрібно реагувати на щось у момент, коли це відбувається.

Під капотом GaiaEx з’єднується з он-чейн книгою ордерів Hyperliquid L1. Ваші ордери зіставляються он-чейн з детерміністичним виконанням, а ваші кошти захищені MPC-гаманцями (багатостороннє обчислення) — тобто жодна окрема сторона (навіть GaiaEx) не тримає ваш повний приватний ключ. API абстрагує складність блокчейну: ви надсилаєте JSON-запит, щоб розмістити ордер, а платформа обробляє підпис, надсилання та підтвердження на L1.

Базовий URL для REST API відповідає стандартним конвенціям: https://api.gaiaex.com/v1/. З’єднання WebSocket встановлюються за адресою wss://api.gaiaex.com/ws/v1/. Усі ендпоінти повертають JSON, усі мітки часу — у мілісекундах з епохи (UTC), а всі грошові значення — рядки, щоб уникнути проблем з точністю чисел з рухомою комою.

REST проти WebSocket: коли що використовувати REST (запит / відповідь) Розміщення / скасування ордерів Баланси, історія, REST-опитування Найкраще для дій і знімків стану WebSocket (потік) Угоди, книга ордерів, події рахунку Push-оновлення, нижча латентність Найкраще для live-стратегій Боти зазвичай поєднують обидва: WS для сигналів, REST для виконання й вивірки.
Використовуйте потокову передачу для безперервного стану ринку; використовуйте REST, коли потрібна дискретна команда чи знімок стану.

Керування API-ключами та автентифікація HMAC

Для доступу до приватних ендпоінтів (розміщення ордерів, запит балансів) вам потрібна пара API-ключів. Створіть її на дашборді GaiaEx у розділі Settings → API Keys. Ви отримаєте два значення:

  • API Key — публічний ідентифікатор, що надсилається з кожним запитом. Уявіть його як ваше ім’я користувача.
  • API Secret — приватний ключ, що використовується для підпису запитів. Ніколи не діліться ним, ніколи не додавайте його в систему контролю версій, ніколи не надсилайте його в заголовку запиту.

GaiaEx використовує підпис HMAC-SHA256 для автентифікації приватних запитів. Процес: об’єднайте мітку часу, HTTP-метод, шлях запиту та тіло в один рядок, потім обчисліть HMAC-підпис, використовуючи ваш секрет. Сервер виконує таке саме обчислення та порівнює підписи.

import hmac, hashlib, time, requests, json

API_KEY = "your_api_key"
API_SECRET = "your_api_secret"
BASE_URL = "https://api.gaiaex.com/v1"

def signed_request(method, path, body=None):
    timestamp = str(int(time.time() * 1000))
    body_str = json.dumps(body) if body else ""
    message = timestamp + method.upper() + path + body_str
    signature = hmac.new(
        API_SECRET.encode(), message.encode(), hashlib.sha256
    ).hexdigest()

    headers = {
        "X-API-Key": API_KEY,
        "X-Timestamp": timestamp,
        "X-Signature": signature,
        "Content-Type": "application/json",
    }

    resp = requests.request(method, BASE_URL + path, headers=headers,
                            data=body_str if body else None)
    return resp.json()

Зберігайте ваш API-секрет у змінних середовища чи менеджері секретів — ніколи не вбудовуйте його в код напряму. Налаштуйте білий список IP-адрес для вашого API-ключа в дашборді, щоб обмежити використання лише IP-адресою вашого сервера. Якщо ваш ключ скомпрометовано, негайно відкличте його з дашборду та створіть новий.

Компонент мітки часу запобігає атакам повторного відтворення (replay attacks): сервер відхиляє будь-який запит, у якого мітка часу відрізняється від годинника сервера більш ніж на 30 секунд. Переконайтесь, що годинник вашої машини синхронізований через NTP.

Підпис HMAC-запиту (концептуально) Клієнт sign(ts + method + path + body) HMAC-SHA256 з API-секретом GaiaEx перевіряє Секрет ніколи не передається каналом — лише підпис + ID ключа + мітка часу. Вікно розбіжності годинника блокує застарілі повторні відтворення
Сервер повторно обчислює дайджест; невідповідність відхиляє викликаний запит, не розкриваючи ваш секрет.

Отримання ринкових даних: книга ордерів, угоди та тікер

Ендпоінти ринкових даних публічні — автентифікація не потрібна. Вони надають необроблену інформацію, потрібну вам для прийняття торгових рішень.

Книга ордерів (order book) — повертає поточні заявки на купівлю (bids) та продаж (asks) для заданого символу. Параметр depth контролює, скільки цінових рівнів повертається (за замовчуванням 20, максимум 100).

# Fetch the BTC-USD order book (top 10 levels)
resp = requests.get(f"{BASE_URL}/orderbook/BTC-USD?depth=10")
book = resp.json()

best_bid = book["bids"][0]  # [price, quantity]
best_ask = book["asks"][0]
spread = float(best_ask[0]) - float(best_bid[0])
print(f"Spread: ${spread:.2f}")

Останні угоди — повертає останні N виконаних угод для символу. Кожна угода включає ціну, кількість, сторону (чи тейкер купував, чи продавав) та мітку часу.

# Fetch the last 50 ETH-USD trades
resp = requests.get(f"{BASE_URL}/trades/ETH-USD?limit=50")
trades = resp.json()["trades"]
avg_price = sum(float(t["price"]) for t in trades) / len(trades)
print(f"Average of last 50 trades: ${avg_price:.2f}")

Тікер — підсумок поточного стану ринку: остання ціна, максимум/мінімум за 24 години, обсяг за 24 години, найкращі bid/ask та відсоткова зміна. Ідеально для побудови списків спостереження чи пошуку волатильності.

# Fetch all tickers
resp = requests.get(f"{BASE_URL}/tickers")
for ticker in resp.json():
    if float(ticker["change24h"]) > 5.0:
        print(f"{ticker['symbol']}: +{ticker['change24h']}%")

Для даних у реальному часі використовуйте WebSocket-потоки замість опитування (polling) цих ендпоінтів. REST-ендпоінти мають обмеження швидкості запитів і вносять латентність; WebSocket доставляє оновлення в ту саму мить, коли вони відбуваються на Hyperliquid L1.

Розміщення ордерів: ринковий, лімітний та стоп

Розміщення ордера — основна дія в будь-якій торговій системі. GaiaEx підтримує три типи ордерів через ендпоінт POST /orders:

Ринковий ордер — виконується негайно за найкращою доступною ціною. Використовуйте, коли швидкість виконання важливіша за точність ціни.

# Buy 0.1 BTC at market price
order = signed_request("POST", "/orders", {
    "symbol": "BTC-USD",
    "side": "buy",
    "type": "market",
    "quantity": "0.1",
})
print(f"Filled at {order['avgPrice']}")

Лімітний ордер — виконується лише за вказаною вами ціною чи кращою. Лежить у книзі ордерів, доки не виконається, не скасується, чи не закінчиться термін дії.

# Sell 2 ETH at $3,500 or higher
order = signed_request("POST", "/orders", {
    "symbol": "ETH-USD",
    "side": "sell",
    "type": "limit",
    "price": "3500.00",
    "quantity": "2.0",
    "timeInForce": "GTC",  # Good Till Cancelled
})

Стоп-ордер — умовний ордер, що активується, коли ринок досягає тригерної ціни. Використовується для стоп-лоссів та входів на пробій.

# Stop-loss: sell 0.5 BTC if price drops to $58,000
order = signed_request("POST", "/orders", {
    "symbol": "BTC-USD",
    "side": "sell",
    "type": "stop_market",
    "stopPrice": "58000.00",
    "quantity": "0.5",
})

Щоб керувати наявними ордерами: запитайте відкриті ордери через GET /orders?status=open, скасуйте конкретний ордер через DELETE /orders/{orderId}, чи скасуйте всі відкриті ордери для символу через DELETE /orders?symbol=BTC-USD. Для керування позиціями GET /positions повертає всі відкриті позиції з ціною входу, кількістю, нереалізованим P&L та ціною ліквідації.

Потокова передача даних у реальному часі через WebSocket

API WebSocket GaiaEx використовує модель підписки/відписки (subscribe/unsubscribe). Після підключення ви надсилаєте повідомлення підписки, вказуючи, які канали ви хочете отримувати. Публічні (ринкові дані) та приватні (події рахунку) канали доступні в одному з’єднанні.

import asyncio, json, hmac, hashlib, time
import websockets

async def connect_gaiaex():
    uri = "wss://api.gaiaex.com/ws/v1"
    async with websockets.connect(uri) as ws:
        # Authenticate for private channels
        ts = str(int(time.time() * 1000))
        sig = hmac.new(API_SECRET.encode(),
                       (ts + "websocket_auth").encode(),
                       hashlib.sha256).hexdigest()
        await ws.send(json.dumps({
            "method": "auth",
            "apiKey": API_KEY,
            "timestamp": ts,
            "signature": sig,
        }))

        # Subscribe to public + private channels
        await ws.send(json.dumps({
            "method": "subscribe",
            "channels": [
                "trades.BTC-USD",
                "orderbook.BTC-USD",
                "account.orders",
                "account.positions",
            ]
        }))

        async for msg in ws:
            data = json.loads(msg)
            ch = data.get("channel", "")
            if ch == "account.orders":
                print(f"Order update: {data['status']} {data['orderId']}")
            elif ch == "trades.BTC-USD":
                print(f"Trade: {data['price']} x {data['quantity']}")

asyncio.run(connect_gaiaex())

Канал account.orders надсилає оновлення щоразу, коли один з ваших ордерів виконано, частково виконано чи скасовано — усуваючи потребу опитувати REST-ендпоінт. Канал account.positions транслює оновлення P&L та маржі у реальному часі. У поєднанні з публічними каналами ринкових даних одне WebSocket-з’єднання надає все, що потрібно торговому боту для роботи.

Завжди реалізуйте механізм heartbeat: GaiaEx надсилає періодичні ping-кадри, і ваш клієнт повинен відповідати pong-кадрами. Якщо pong не отримано протягом 30 секунд, сервер закриває з’єднання. З вашого боку, якщо дані не надходять протягом 30 секунд, вважайте з’єднання мертвим і перепідключіться.

Побудова простого торгового бота: моніторинг, виконання, керування

Об’єднаймо все у мінімального, але функціонального торгового бота. Бот стежить за ціною BTC-USD через WebSocket, і коли ціна опускається нижче цільового рівня, він розміщує лімітний ордер на купівлю. Коли позиція відкрита і ціна піднімається вище рівня тейк-профіту, він закриває позицію.

import asyncio, json
import websockets

TARGET_BUY = 60000.0
TAKE_PROFIT = 63000.0
QUANTITY = "0.05"
position_open = False

async def trading_bot():
    global position_open
    uri = "wss://api.gaiaex.com/ws/v1"

    async with websockets.connect(uri) as ws:
        # Auth + subscribe (omitted for brevity)
        await ws.send(json.dumps({
            "method": "subscribe",
            "channels": ["trades.BTC-USD"]
        }))

        async for msg in ws:
            data = json.loads(msg)
            if data.get("channel") != "trades.BTC-USD":
                continue

            price = float(data["price"])

            if not position_open and price <= TARGET_BUY:
                order = signed_request("POST", "/orders", {
                    "symbol": "BTC-USD", "side": "buy",
                    "type": "limit", "price": str(TARGET_BUY),
                    "quantity": QUANTITY,
                })
                print(f"BUY order placed: {order['orderId']}")
                position_open = True

            elif position_open and price >= TAKE_PROFIT:
                order = signed_request("POST", "/orders", {
                    "symbol": "BTC-USD", "side": "sell",
                    "type": "market", "quantity": QUANTITY,
                })
                print(f"SELL order placed: {order['orderId']}")
                position_open = False

asyncio.run(trading_bot())

Це навмисно просто. Продакшн-бот додасть: обробку помилок з try/except навколо кожного API-виклику та автоматичне перепідключення; логіку повторних спроб з експоненційною відстрочкою для тимчасових збоїв; відстеження позицій через WebSocket-канал account.positions замість булевого флагу; ризик-ліміти, що зупиняють торгівлю після максимального денного збитку; та логування, що фіксує кожне рішення та відповідь API для пост-трейд аналізу.

Архітектура MPC-гаманця GaiaEx означає, що ваш бот ніколи не обробляє необроблені приватні ключі — підпис обробляється розподіленою інфраструктурою ключів платформи. Це зменшує поверхню безпеки порівняно з ботами, що керують власними ключами гаманця, де одна компрометація може виснажити всі кошти. У поєднанні з білим списком IP-адрес API-ключа та рівнем автентифікації HMAC ви отримуєте глибокий захист для автоматизованої торгівлі.

Починайте з малого: розгортайте з мінімальним розміром позиції, моніторте протягом 48 годин, перевірте, що виконання відповідає очікуванням, потім масштабуйте поступово. Найкращі торгові боти будуються поступово, а не за один спринт кодування.