GaiaExGaiaEx
GaiaEx API ile İşlem: Kimlik Doğrulama, Emirler ve Piyasa Verisi
GeliştiriciProgramlama12 min read

GaiaEx API ile İşlem: Kimlik Doğrulama, Emirler ve Piyasa Verisi

GaiaEx'e programatik olarak bağlan ve ilk otomatik işlemini yap

Paylaş

GaiaEx API Genel Bakış: Hyperliquid L1 Üzerinde REST + WebSocket

GaiaEx, Hyperliquid L1 üzerine inşa edilmiş merkeziyetsiz bir borsadır ve API'si, platformun sunduğu her şeye programatik erişim sağlar — piyasa verisi, emir yönetimi, pozisyon takibi ve gerçek zamanlı akış (streaming). Bir işlem botu, bir portföy panosu veya özel bir uyarı sistemi geliştiriyor olsan da, API senin giriş noktandır.

API, birbirini tamamlayan iki protokole ayrılır:

  • REST API — Emir vermek, bakiye sorgulamak, geçmiş işlemleri getirmek ve API anahtarlarını yönetmek için istek-yanıt uç noktaları. Belirli bir şeyi yapman veya belirli bir şey istemen gerektiğinde REST kullan.
  • WebSocket API — Gerçek zamanlı piyasa verisi (işlemler, emir defteri güncellemeleri, ticker'lar) ve özel hesap olayları (emir gerçekleşmeleri, pozisyon değişiklikleri) için kalıcı akış bağlantıları. Bir şey gerçekleştiği anda ona tepki vermen gerektiğinde WebSocket kullan.

Perde arkasında, GaiaEx Hyperliquid L1'in zincir üstü emir defterine bağlanır. Emirlerin belirleyici (deterministic) yürütmeyle zincir üstünde eşleştirilir ve fonların MPC (Çok Taraflı Hesaplama) cüzdanları tarafından güvence altına alınır — bu, hiçbir tek tarafın (GaiaEx dahil) senin tam özel anahtarını tutmadığı anlamına gelir. API, blok zinciri karmaşıklığını basitleştirir: bir emir vermek için bir JSON isteği gönderirsin ve platform, imzalamayı, gönderimi ve L1'de onaylamayı halleder.

REST API'nin taban URL'si standart kurallara uyar: https://api.gaiaex.com/v1/. WebSocket bağlantıları wss://api.gaiaex.com/ws/v1/ adresinde kurulur. Tüm uç noktalar JSON döndürür, tüm zaman damgaları epoch'tan itibaren milisaniyedir (UTC) ve kayan nokta hassasiyet sorunlarını önlemek için tüm parasal değerler string olarak gönderilir.

REST vs WebSocket: hangisi ne zaman kullanılır REST (istek / yanıt) Emir ver / iptal et Bakiyeler, geçmiş, REST tick Eylemler ve anlık görüntüler için en iyisi WebSocket (akış) İşlemler, defter, hesap olayları Anlık güncellemeler, daha düşük gecikme Canlı stratejiler için en iyisi Botlar genellikle ikisini birleştirir: sinyal için WS, yürütme ve mutabakat için REST.
Sürekli piyasa durumu için akışı kullan; ayrık bir komut veya anlık görüntüye gerek duyduğunda REST kullan.

API Anahtarı Yönetimi ve HMAC Kimlik Doğrulaması

Özel uç noktalara erişmek için (emir vermek, bakiyeni sorgulamak), bir API anahtar çiftine ihtiyacın var. Bunu GaiaEx panosundan Ayarlar → API Anahtarları altından oluşturabilirsin. İki değer alacaksın:

  • API Key (Anahtar) — Her istekle gönderilen genel bir tanımlayıcı. Kullanıcı adın gibi düşün.
  • API Secret (Gizli Anahtar) — İstekleri imzalamak için kullanılan özel bir anahtar. Bunu asla paylaşma, versiyon kontrolüne asla göndermeyin (commit), bir istek başlığında asla göndermeyin.

GaiaEx, özel istekleri doğrulamak için HMAC-SHA256 imzalama kullanır. İşlem şöyledir: zaman damgasını, HTTP yöntemini, istek yolunu ve gövdeyi tek bir string'te birleştir, sonra gizli anahtarını kullanarak bir HMAC imzası hesapla. Sunucu aynı hesaplamayı yapar ve imzaları karşılaştırır.

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 gizli anahtarını ortam değişkenlerinde veya bir gizli anahtar yöneticisinde sakla — asla koda sabit olarak yazma. Kullanımı sunucunun IP adresiyle sınırlamak için panoda API anahtarına IP beyaz listelemesi ayarla. Anahtarın ele geçirilirse, hemen panodan geçersiz kıl ve yeni bir anahtar oluştur.

Zaman damgası bileşeni tekrar oynatma (replay) saldırılarını önler: sunucu, zaman damgası sunucunun saatinden 30 saniyeden fazla uzak olan her isteği reddeder. Makinenin saatinin NTP üzerinden senkronize olduğundan emin ol.

HMAC istek imzalama (kavramsal) İstemci sign(ts + method + path + body) API secret ile HMAC-SHA256 GaiaEx doğrular Gizli anahtar hattan asla geçmez — sadece imza + anahtar id + zaman damgası. Saat kayması penceresi bayat tekrar oynatmaları engeller
Sunucu özeti (digest) yeniden hesaplar; eşleşmezlik, gizli anahtarını açığa çıkarmadan çağrıyı reddeder.

Piyasa Verisi Getirme: Emir Defteri, İşlemler ve Ticker

Piyasa verisi uç noktaları herkese açıktır — kimlik doğrulaması gerektirmez. İşlem kararları vermen için gereken ham bilgiyi sağlarlar.

Emir defteri — Belirli bir sembol için o anki alış ve satış emirlerini döndürür. depth parametresi kaç fiyat seviyesinin döndürüleceğini kontrol eder (varsayılan 20, maksimum 100).

# BTC-USD emir defterini getir (üst 10 seviye)
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}")

Son işlemler — Bir sembol için son N gerçekleşen işlemi döndürür. Her işlem fiyatı, miktarı, tarafı (taker'ın alış mı satış mı yaptığı) ve zaman damgasını içerir.

# Son 50 ETH-USD işlemini getir
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"Son 50 işlemin ortalaması: ${avg_price:.2f}")

Ticker — O anki piyasa durumunun özeti: son fiyat, 24 saatlik en yüksek/en düşük, 24 saatlik hacim, en iyi alış/satış ve yüzdesel değişim. İzleme listeleri oluşturmak veya oynaklığı taramak için idealdir.

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

Gerçek zamanlı veri için, bu uç noktaları yoklamak (polling) yerine WebSocket akışlarını kullan. REST uç noktaları hız sınırlıdır (rate-limited) ve gecikme (latency) yaratır; WebSocket, Hyperliquid L1'de gerçekleştiği anda güncellemeleri iletir.

Emir Verme: Piyasa, Limit ve Stop

Emir verme, herhangi bir işlem sisteminde temel eylemdir. GaiaEx, POST /orders uç noktası üzerinden üç emir türünü destekler:

Piyasa emri — Mevcut en iyi fiyatta anında gerçekleşir. Yürütme hızının fiyat kesinliğinden daha önemli olduğu durumlarda kullanılır.

# Piyasa fiyatından 0,1 BTC satın al
order = signed_request("POST", "/orders", {
    "symbol": "BTC-USD",
    "side": "buy",
    "type": "market",
    "quantity": "0.1",
})
print(f"Gerçekleşme fiyatı: {order['avgPrice']}")

Limit emri — Sadece belirttiğin fiyatta veya daha iyisinde gerçekleşir. Gerçekleşene, iptal edilene veya süresi dolana kadar emir defterinde bekler.

# 2 ETH'yi $3.500 veya daha yükseğe sat
order = signed_request("POST", "/orders", {
    "symbol": "ETH-USD",
    "side": "sell",
    "type": "limit",
    "price": "3500.00",
    "quantity": "2.0",
    "timeInForce": "GTC",  # İptal Edilene Kadar Geçerli
})

Stop emri — Piyasa tetikleme fiyatına ulaştığında etkinleşen koşullu bir emir. Zarar durdurma (stop-loss) ve kırılım (breakout) girişleri için kullanılır.

# Zarar durdur: fiyat $58.000'e düşerse 0,5 BTC sat
order = signed_request("POST", "/orders", {
    "symbol": "BTC-USD",
    "side": "sell",
    "type": "stop_market",
    "stopPrice": "58000.00",
    "quantity": "0.5",
})

Mevcut emirleri yönetmek için: açık emirleri GET /orders?status=open ile sorgula, belirli bir emri DELETE /orders/{orderId} ile iptal et, veya bir sembole ait tüm açık emirleri DELETE /orders?symbol=BTC-USD ile iptal et. Pozisyon yönetimi için, GET /positions giriş fiyatı, miktar, gerçekleşmemiş kâr/zarar ve tasfiye fiyatıyla tüm açık pozisyonları döndürür.

WebSocket Üzerinden Gerçek Zamanlı Veri Akışı

GaiaEx WebSocket API'si abone ol / abonelikten çık modeli kullanır. Bağlandıktan sonra, hangi kanallardan veri almak istediğini belirten abonelik mesajları gönderirsin. Aynı bağlantı üzerinde hem genel (piyasa verisi) hem de özel (hesap olayları) kanallar mevcuttur.

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:
        # Özel kanallar için kimlik doğrula
        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,
        }))

        # Genel + özel kanallara abone ol
        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"Emir güncellemesi: {data['status']} {data['orderId']}")
            elif ch == "trades.BTC-USD":
                print(f"İşlem: {data['price']} x {data['quantity']}")

asyncio.run(connect_gaiaex())

account.orders kanalı, emirlerinden biri gerçekleştiğinde, kısmen gerçekleştiğinde veya iptal edildiğinde güncelleme gönderir — bu da REST uç noktasını yoklama (polling) ihtiyacını ortadan kaldırır. account.positions kanalı gerçek zamanlı kâr/zarar ve marj güncellemelerini akıtır. Genel piyasa verisi kanallarıyla birleştiğinde, tek bir WebSocket bağlantısı bir işlem botunun çalışması için gereken her şeyi sağlar.

Her zaman bir heartbeat mekanizması uygula: GaiaEx periyodik ping çerçeveleri gönderir ve istemcin bunlara pong çerçeveleriyle yanıt vermelidir. 30 saniye içinde bir pong alınmazsa, sunucu bağlantıyı kapatır. Kendi tarafında, 30 saniye içinde hiçbir veri gelmezse, bağlantının koptuğunu düşün ve yeniden bağlan.

Basit Bir İşlem Botu Oluşturma: İzle, Yürüt, Yönet

Her şeyi minimal ama işlevsel bir işlem botunda birleştirelim. Bot, WebSocket üzerinden BTC-USD fiyatını izler ve fiyat bir hedefin altına düştüğünde limit alım emri verir. Pozisyon açık olduğunda ve fiyat bir kâr al seviyesinin üzerine çıktığında, pozisyonu kapatır.

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:
        # Kimlik doğrulama + abonelik (kısalık için atlandı)
        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"ALIM emri verildi: {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"SATIM emri verildi: {order['orderId']}")
                position_open = False

asyncio.run(trading_bot())

Bu bilinçli olarak basittir. Üretim düzeyi bir bot şunları ekler: her API çağrısı etrafında try/except ile hata yönetimi ve otomatik yeniden bağlanma; geçici hatalar için üstel geri çekilme (exponential backoff) ile yeniden deneme mantığı; bir boolean bayrak yerine account.positions WebSocket kanalı üzerinden pozisyon takibi; maksimum günlük zarar sonrası işlemi durduran risk sınırları; ve işlem sonrası analiz için her kararı ve API yanıtını kaydeden günlükleme (logging).

GaiaEx'in MPC cüzdan mimarisi, botunun asla ham özel anahtarları işlemediği anlamına gelir — imzalama, platformun dağıtık anahtar altyapısı tarafından yönetilir. Bu, kendi cüzdan anahtarlarını yöneten botlara kıyasla güvenlik yüzeyini azaltır; o botlarda tek bir ele geçirme tüm fonları boşaltabilir. API anahtarı IP beyaz listelemesi ve HMAC kimlik doğrulama katmanıyla birleştiğinde, otomatik işlem için katmanlı savunma (defense in depth) elde edersin.

Küçük başla: minimum pozisyon büyüklüğüyle canlıya al, 48 saat izle, gerçekleşmelerin beklentilerle eşleştiğini doğrula, sonra kademeli olarak büyüt. En iyi işlem botları tek bir kodlama koşusunda değil, adım adım inşa edilir.