> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Perps kod örnekleri

> Orderly Network'ün API'si aracılığıyla Raydium Perps'e programlı erişim: USDC yatırma, ticari hesabı kaydetme, emir verme / iptal etme / değiştirme, pozisyonları getirme, pazar WebSocket'ine abone olma ve geri çekme.

<Info>
  **Bu sayfayı yapay zekâ tarafından otomatik olarak çevrilmiştir. İngilizce sürüm esas alınır.**

  [İngilizce sürümü görüntüle →](/products/perps/code-demos)
</Info>

<Info>
  **Raydium Perps, Orderly Network üzerinde beyaz etiketli bir dağıtımdır.** Emir kitabı, eşleştirme motoru ve hesap durumunun tümü Orderly üzerinde yaşamaktadır. Raydium SDK v2 (`@raydium-io/raydium-sdk-v2`) perps'ı kapsamaz — programlı erişim için Orderly'nin REST + WebSocket API'sini doğrudan kullanın. Aşağıdaki kod parçacıkları en yaygın akışları gösterir; kanonik referans [orderly.network/docs](https://orderly.network/docs/build-on-omnichain/evm-api/introduction) adresindedir.
</Info>

<Info>
  **Sürüm başlığı.**

  * Arka uç: Orderly Network REST + WebSocket API
  * Kod parçacıkları 2026-04 itibarıyla Orderly'nin API'sine karşı doğrulanmıştır
  * Zincir üstü depozitolar için Solana kümesi: `mainnet-beta`
  * İmzalama: Orderly EIP-712 stilinde yükü üzerinde Solana ed25519 (Orderly EVM olmayan zincirler için bile EIP-712 şeması kullanır; en son alan listesi için Orderly dokümanlarına bakın)

  Orderly'nin API yüzeyi gelişmektedir; bu kod parçacıklarını üretime kopyalamadan önce [orderly.network/docs](https://orderly.network/docs/build-on-omnichain/evm-api/introduction) adresini kontrol edin.
</Info>

## Bu sayfada ne var?

Aşağıdaki akışlar entegrasyoncu ile ilgili yaşam döngüsünü kapsar:

1. Hesap kurulumu — USDC yatırma ve hesabı Orderly'ye kaydetme.
2. Kimliği doğrulanmış REST çağrıları — emir verme, iptal etme ve hesap sorguları için imza isteme.
3. Ticaret — pazar / limit emirleri verme, iptal etme, pozisyonları ve dolguları getirme.
4. Pazar verileri — emir kitabı ve ticari WebSocket'e abone olma.
5. Geri çekme — cüzdana geri çekme başlatma.

Bu kod parçacıkları `@solana/web3.js` ve Ed25519 imzalaması için `tweetnacl` ile Node.js + TypeScript'i hedefler. Bunlar **başlangıç noktasıdır** — Orderly'nin API yüzeyi geniş ve bu sayfadan daha hızlı değişir; üretim kodunu yayınlamadan önce her zaman Orderly'nin canlı dokümanlarını kontrol edin.

## Kurulum

```ts theme={null}
import { Connection, Keypair, PublicKey, clusterApiUrl } from "@solana/web3.js";
import nacl from "tweetnacl";
import bs58 from "bs58";
import fs from "node:fs";

// 1. Solana cüzdanı — USDC'ye sahip, depozito/geri çekme işlemlerini imzalar.
const connection = new Connection(process.env.RPC_URL ?? clusterApiUrl("mainnet-beta"));
const owner = Keypair.fromSecretKey(
  new Uint8Array(JSON.parse(fs.readFileSync(process.env.KEYPAIR!, "utf8"))),
);

// 2. Orderly ticari anahtarı — API isteklerini imzalamak için kullanılan ayrı Ed25519 keypair.
//    Solana cüzdanı DEĞİL. Bir kez oluşturun, gizli tutun, oturumlar arasında yeniden kullanın.
const orderlyKey = nacl.sign.keyPair();   // ed25519
const orderlyPubB58 = "ed25519:" + bs58.encode(orderlyKey.publicKey);

// 3. Orderly temel URL'si. Raydium, Orderly'nin mainnet hostunu kullanır.
const ORDERLY_BASE = "https://api.orderly.org";
const BROKER_ID    = "raydium";   // Orderly'de Raydium'un broker ad alanı
const CHAIN_ID     = "solana";    // çapraz zincir hesabı kaydı için
```

Orderly ticari anahtarı cüzdan keypair'iniz **değildir**. İlk kullanımda cüzdanınıza karşı kaydettiğiniz bir istek imzalama anahtarıdır; fonları dokunmadan döndürebilirsiniz. Bunu bir oturum kimlik bilgisi olarak ele alın.

## Hesap kaydı

Herhangi bir emir vermeden önce cüzdanı Orderly'ye kaydedin:

```ts theme={null}
import { encodeUserSettlement } from "./eip712-helpers"; // tam yükü için Orderly dokümanlarına bakın

// 1. Orderly'den bir kayıt nonce'u isteyin.
const nonceResp = await fetch(`${ORDERLY_BASE}/v1/registration_nonce`).then(r => r.json());
const registrationNonce = nonceResp.data.registration_nonce;

// 2. Solana cüzdanı ile bir kayıt yükünü imzalayın (Solana'da EIP-712 stilinde
//    yapılandırılmış bir ileti olarak uygulanır; Orderly'nin SDK kodlayıcıyı sağlar).
const payload = encodeUserSettlement({
  brokerId: BROKER_ID,
  chainId: CHAIN_ID,
  registrationNonce,
  timestamp: Date.now(),
});
const walletSig = nacl.sign.detached(Buffer.from(payload), owner.secretKey);

// 3. Orderly Ed25519 ticari anahtarını dahil ederek kaydolun.
const reg = await fetch(`${ORDERLY_BASE}/v1/register_account`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    message: payload,
    signature: bs58.encode(walletSig),
    userAddress: owner.publicKey.toBase58(),
    orderlyKey: orderlyPubB58,
  }),
}).then(r => r.json());

console.log("Account ID:", reg.data.account_id);
```

Hesap ID'leri her `(broker_id, wallet_address)` çifti için belirleyicidir — kayıt idempotent'dir. Bir cüzdan zaten Raydium'un broker'ı ile kaydolmuşsa, çağrı yeni bir tane oluşturmadan aynı hesap ID'sini döndürür.

## USDC Yatırma

Depozitolar USDC'yi cüzdan ATA'sından Orderly'nin kapanma kasasına taşır. Bunlar zincir üstü Solana işlemleridir:

```ts theme={null}
// Orderly'nin Solana programını kullanarak depozito ix'ini oluşturun (vault program ID'si
// dokümanlarında yayımlanır; sabit kodlamak yerine dinamik olarak çekin).
const vaultProgramId = new PublicKey("<orderly_solana_vault_program_id>");

const depositIx = await buildOrderlyDepositIx({
  vaultProgramId,
  user: owner.publicKey,
  brokerId: BROKER_ID,
  amountUsdc: BigInt(100_000_000),    // 100 USDC (6 ondalık)
});

const tx = new Transaction().add(depositIx);
const sig = await connection.sendTransaction(tx, [owner]);
await connection.confirmTransaction(sig, "confirmed");
console.log("Deposit tx:", sig);
```

Yaklaşık 30 saniye sonra, Orderly'nin relayer depozitosunu indeksler ve bakiye hesabın serbest marjı altında görüntülenir. Onaylamak için `/v1/client/holding` sorgusu yapın:

```ts theme={null}
const holdingResp = await orderlyAuthGet("/v1/client/holding");
console.log("Balances:", holdingResp.data.holding);
```

(`orderlyAuthGet` aşağıda tanımlanmıştır — her kimliği doğrulanmış çağrı onun üzerinden geçer.)

## İstek imzalama yardımcısı

Orderly'ye yapılan her kimliği doğrulanmış REST çağrısı `(timestamp + method + path + body)` üzerinden Ed25519 imzasını taşır:

```ts theme={null}
async function orderlyAuthRequest(
  method: "GET" | "POST" | "PUT" | "DELETE",
  path: string,
  body?: unknown,
): Promise<any> {
  const ts   = Date.now().toString();
  const json = body ? JSON.stringify(body) : "";
  const msg  = `${ts}${method}${path}${json}`;
  const sig  = nacl.sign.detached(Buffer.from(msg), orderlyKey.secretKey);

  const resp = await fetch(ORDERLY_BASE + path, {
    method,
    headers: {
      "Content-Type": "application/json",
      "orderly-account-id":  /* kayıtlı account_id */ "",
      "orderly-key":         orderlyPubB58,
      "orderly-signature":   bs58.encode(sig),
      "orderly-timestamp":   ts,
    },
    body: json || undefined,
  });
  return resp.json();
}

const orderlyAuthGet  = (p: string)            => orderlyAuthRequest("GET",  p);
const orderlyAuthPost = (p: string, b: object) => orderlyAuthRequest("POST", p, b);
const orderlyAuthDel  = (p: string)            => orderlyAuthRequest("DELETE", p);
```

Yeniden oynatma koruması: sunucu saatinden 5 saniyeden fazla uzak olan `timestamp` içeren istekler reddedilir. Saatinizi (NTP) senkronize edin ve istekleri önceden imzalamaktan kaçının.

## Pazar emri verme

```ts theme={null}
const marketResp = await orderlyAuthPost("/v1/order", {
  symbol:        "PERP_SOL_USDC",
  order_type:    "MARKET",
  side:          "BUY",
  order_quantity: 1.0,        // 1 SOL pozisyon
  reduce_only:    false,
});

if (marketResp.success) {
  console.log("Order ID:", marketResp.data.order_id);
} else {
  console.error("Reject:", marketResp.message);
}
```

Pazar emirleri hemen yürütülür. Yanıt, elde edilen `order_id` ve durumunu döndürür. Dolgular WebSocket üzerinden gelir (aşağıya bakın); REST yanıtının kendisi tam olarak doldurulana kadar bloke olmaz.

## Sadece-Sonrası ile Limit Emri Verme

```ts theme={null}
const limitResp = await orderlyAuthPost("/v1/order", {
  symbol:         "PERP_SOL_USDC",
  order_type:     "LIMIT",
  side:           "SELL",
  order_quantity: 0.5,
  order_price:    140.50,
  // bayrak kombinasyonları:
  // post_only: true bunu yapıcı yalnızca bir emir yapar — kesişirse iptal eder.
  // reduce_only / time_in_force bağımsız olarak ayarlanabilir.
  post_only:      true,
});
console.log(limitResp);
```

`IOC` / `FOK` için `time_in_force: "IOC"` veya `"FOK"` ayarlayın. Her bayrağın semantiği için [`products/perps/order-types`](/tr/products/perps/order-types) bölümüne bakın.

## Emir İptal Etme

```ts theme={null}
// Emir ID'sine göre
await orderlyAuthDel(`/v1/order?order_id=${orderId}&symbol=PERP_SOL_USDC`);

// Bir sembol üzerindeki TÜM emirleri iptal et
await orderlyAuthDel(`/v1/orders?symbol=PERP_SOL_USDC`);
```

İptal senkron olarak onaylanır ancak gerçek iptal bir doldurma ile yarışabilir. Her zaman `/v1/orders` tarafından yoklayarak veya WebSocket'i izleyerek mutabakat sağlayın — iptal başarılı olduğunu onay olmadan varsaymak yinelenen veya istenmeyen pozisyonlara yol açabilir.

## Açık Pozisyonları Getirme

```ts theme={null}
const posResp = await orderlyAuthGet("/v1/positions");
for (const p of posResp.data.rows) {
  console.log(
    p.symbol,
    "size:",  p.position_qty,
    "entry:", p.average_open_price,
    "unrealized:", p.unsettled_pnl,
  );
}
```

Negatif `position_qty` kısa, pozitif uzun pozisyondur. `position_qty == 0` pozisyonun kapalı olduğu anlamına gelir ancak satır sonraki temizlemeye kadar görüntülenebilir.

## Dolgu Geçmişini Getirme

```ts theme={null}
const fills = await orderlyAuthGet(
  "/v1/trades?symbol=PERP_SOL_USDC&start_t=" + (Date.now() - 86_400_000)
);
for (const t of fills.data.rows) {
  console.log(t.executed_timestamp, t.side, t.executed_quantity, "@", t.executed_price);
}
```

Zaman argümanları milisaniye Unix zaman damgasıdır. Varsayılan sayfa boyutu 25 satırdır; sayfalamak için `page` ve `size` sorgu parametrelerini kullanın.

## WebSocket: Pazar Verileri

```ts theme={null}
import WebSocket from "ws";

const ws = new WebSocket(`wss://ws.orderly.org/ws/stream/${accountId}`);

ws.on("open", () => {
  // Halka açık pazar verileri: bir sembol için emir kitabı deltaları + işlemler
  ws.send(JSON.stringify({ id: "ob1", topic: "orderbook@PERP_SOL_USDC" }));
  ws.send(JSON.stringify({ id: "tr1", topic: "trade@PERP_SOL_USDC" }));
});

ws.on("message", (raw) => {
  const msg = JSON.parse(raw.toString());
  if (msg.topic?.startsWith("orderbook@")) {
    // depth diff: { bids: [[price, qty], ...], asks: [[price, qty], ...] }
    applyOrderbookDelta(msg.data);
  } else if (msg.topic?.startsWith("trade@")) {
    console.log("trade:", msg.data);
  }
});
```

**Özel** akış için (dolguların, pozisyon güncellemelerinin, bakiye değişikliklerinin), WebSocket'in kimliği doğrulanması gerekir. REST istekleriyle aynı şekilde imzalanan, hesap ID'nize kapsamlı bir `subscribe` yükü gönderin. Orderly'nin dokümanlarında tam yükün şekli vardır; ara sıra değişir, bu nedenle burada belirli bir şemayı sabit kodlamayın.

## USDC Geri Çekme

```ts theme={null}
// 1. Bir geri çekme isteyin.
const wRes = await orderlyAuthPost("/v1/withdraw_request", {
  token:  "USDC",
  chain_id: CHAIN_ID,
  amount: 50.0,                          // insan birimleri
  receiver: owner.publicKey.toBase58(),
});

console.log("Withdrawal request id:", wRes.data.withdraw_id);
```

Orderly, geri çekmeyi zincir üstü olarak alıcı adresine aktarır. Sabit bir **1 USDC** geri çekme ücreti vardır (bkz. [`products/perps/fees`](/tr/products/perps/fees)). Zincir üstü aktarım normal koşullar altında 1-2 dakika içinde gerçekleşir; tıkanıklık sırasında daha uzun beklemeyi unutmayın.

## Tuzaklar

* **Ticari anahtarı ortamlar arasında yeniden kullanmayın.** Cüzdanınıza karşı kayıtlı tek Orderly ticari anahtarı, bir Solana mainnet hesabı ile ilişkilendirilir. Ayrıca devnet veya staging'e ihtiyacınız varsa her biri için ayrı bir anahtar oluşturun.
* **Zaman senkronizasyonu.** Orderly'nin saat çarpıklık toleransı sıkıdır (±5s). Uzun süreli hizmetlerde NTP sapması sonunda imzalamayı bozacaktır. Periyodik olarak yeniden senkronize edin.
* **WebSocket yeniden bağlantıları.** Halka açık WS bazen Orderly yükseltmeleri sırasında bağlantıları düşürür. Üstel backoff uygulayın ve yeniden açıldığında yeniden abone olun.
* **Oran limitleri.** REST çağrıları hesap başına tier-rate-limited'dir. > 5 emir iptal etmesi varsa `cancel_all` aracılığıyla toplu iptal yapın, id'ye göre `cancel` döngüsü yerine.
* **Pozisyon yönü örtülüdür.** `PERP_SOL_USDC` üzerinde bir `BUY` emri uzun bir pozisyon açar veya uzatır; `SELL` kısa bir pozisyon açar veya uzatır — ancak zaten uzun pozisyondaysanız, `SELL` pozisyonu *azaltır* (ve çevirebilir) çünkü Raydium Perps tek yönlü moddur. Yön önemliyse bir emir vermeden önce her zaman mevcut pozisyonu kontrol edin.
* **Finansman ve tasfiyeler emir akışından ayrıdır.** Finansman ödemeleri ve tasfiyeler ayrı olay akışları olarak görüntülenir; bunlar "emirler" değildir. Bunları gözlemlemesi gerekiyorsa ilgili özel WS konularına abone olun.

## Sonraki Adım

* [`products/perps/trading-basics`](/tr/products/perps/trading-basics) — kalıcı mekanikler hakkındaki kavramsal primer.
* [`products/perps/order-types`](/tr/products/perps/order-types) — her emir türü ve bayrağın semantiği.
* [`products/perps/collateral`](/tr/products/perps/collateral) — desteklenen teminat varlıkları ve zincir başına limitler.
* [`products/perps/fees`](/tr/products/perps/fees) — yapıcı/alıcı programları ve geri çekme ücreti.

Kaynaklar:

* [Orderly Network geliştirici belgeleri](https://orderly.network/docs/build-on-omnichain/evm-api/introduction) — yukarıda kullanılan API yüzeyi için kanonik referans. Raydium Perps bunu doğrudan tüketir.
* [Orderly TypeScript SDK](https://github.com/OrderlyNetwork/orderly-sdk-js) — aynı REST/WebSocket katmanını yazılı yardımcılarla sarar; imzalama katmanını kendiniz yazmayı atlamak isterseniz kullanışlıdır.
