# Bir token için günlük DEX OHLC ve VWAP, kesin kesirlerle

> Source: https://docs.blockvectra.com/tr/guides/dex-daily-prices/

## DEX günlük fiyatlar veri kümesi nedir

BlockVectra'nın DEX veri kümesi, merkeziyetsiz borsa alım-satım aktivitesini indeksler ve toplanmış günlük fiyatlandırma metriklerini hesaplar. DEX günlük fiyatlar uç noktası (`getDexPrices`), belirli bir tarih aralığında belirtilen bir token için günlük hacim ağırlıklı ortalama fiyatı (VWAP), fiyat göstergelerini (`first_price`, `last_price`, `min_price` ve `max_price` alanları) ve hacim metriklerini sağlar.

Bu veri kümesinin kullanılabilirliği ağlar arasında farklılık gösterir; bu veri kümesini sağlayan zincirler [Desteklenen Zincirler](https://docs.blockvectra.com/en/chains/) sayfasına tabidir.

Bu uç nokta sayfalandırılmaz: istenen tarih aralığındaki eşleşen tüm günlük satırlar doğrudan `data` içinde döndürülür ve `next_cursor` asla bulunmaz. Uygulamanız günlük toplamlar yerine ayrıntılı swap işlemlerine ihtiyaç duyuyorsa, `GET /{chain}/dex/swaps` kullanın (bkz. [Data API Referansı](https://docs.blockvectra.com/en/api/data/)).

## İstek parametreleri ve limitler

Uç nokta rotası `GET https://api.blockvectra.com/v1/data/{chain}/dex/prices` şeklindedir. Tüm istekler, `x-api-key` başlığında API key'inizi sağlayarak kimlik doğrulaması gerektirir.

Uç nokta aşağıdaki sorgu parametrelerini kabul eder:

| Parametre | Konum | Tür          | Zorunlu | Açıklama                                                                                |
| --------- | ----- | ------------ | ------- | --------------------------------------------------------------------------------------- |
| `chain`   | yol   | dize         | Evet    | Zincir tanımlayıcısı, örn. `robinhood_mainnet`                                          |
| `token`   | sorgu | dize         | Evet    | 20 baytlık temel token adresi, `0x` isteğe bağlı, büyük/küçük harf fark etmez           |
| `quote`   | sorgu | dize         | Hayır   | Tek bir temel/karşıt çiftle sınırlamak için isteğe bağlı 20 baytlık karşıt token adresi |
| `from`    | sorgu | tarih dizesi | Evet    | UTC başlangıç tarihi, dahil, `YYYY-MM-DD`                                               |
| `to`      | sorgu | tarih dizesi | Evet    | UTC bitiş tarihi, dahil, `YYYY-MM-DD`. `to - from` `<= 90` gün olmalıdır                |

### Kısıtlamalar ve hata kodları

Bir istek kısıtlamaları ihlal ettiğinde API yapılandırılmış bir hata gövdesi döndürür `{"error":{"code","message"}}`:

* **HTTP 400 (`bad_request`)**: Zorunlu sorgu parametreleri eksik (`token`, `from` veya `to`), geçersiz `token`/`quote` adres sözdizimi, geçersiz `YYYY-MM-DD` takvim tarihleri veya `from` değeri `to` değerinden sonra.
* **HTTP 409 (`span_exceeded`)**: `to - from` 90 günden fazla.
* **HTTP 404 (`unknown_chain`)**: `{chain}`, `GET /chains` tarafından listelenen bir zincir değil.
* **HTTP 422 (`no_coverage`)**: Zincir `dex_prices` veri kümesi yeteneğini desteklemiyor.
* **HTTP 503 (`unavailable`)**: Hizmet geçici olarak kullanılamıyor; `Retry-After` başlığına göre yeniden deneyin.

## İstek örnekleri

Aşağıdaki örnekler, Eylül 2026 boyunca bir temel token için günlük DEX fiyatlarını sorgular:

**cURL**

```bash
curl -s "https://api.blockvectra.com/v1/data/robinhood_mainnet/dex/prices?token=0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D&from=2026-09-01&to=2026-09-30" \
  -H "x-api-key: $BLOCKVECTRA_API_KEY"
```


  **TypeScript**

```ts
const url = new URL("https://api.blockvectra.com/v1/data/robinhood_mainnet/dex/prices");
url.searchParams.set("token", "0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D");
url.searchParams.set("from", "2026-09-01");
url.searchParams.set("to", "2026-09-30");

const res = await fetch(url, {
  headers: {
    "x-api-key": process.env.BLOCKVECTRA_API_KEY!,
  },
});

if (!res.ok) {
  throw new Error(`Request failed with status ${res.status}`);
}

const body = await res.json();
console.log(body);
```


  **Python**

```python
import os
import requests

res = requests.get(
    "https://api.blockvectra.com/v1/data/robinhood_mainnet/dex/prices",
    params={
        "token": "0x1Cdad396DB64BDa184d5182A97Dd9B3C62100b7D",
        "from": "2026-09-01",
        "to": "2026-09-30",
    },
    headers={
        "x-api-key": os.environ["BLOCKVECTRA_API_KEY"],
    },
)
res.raise_for_status()
print(res.json())
```


## Ayrıntılı alan referansı

`data` içindeki her giriş, o UTC tarihindeki token çifti için toplanmış günlük DEX metriklerini temsil eder:

### Token ve karşıt varlıklar

* `day` (dize): `YYYY-MM-DD` biçiminde UTC tarihi.
* `token` (dize): Küçük harfli `0x` önekli onaltılık biçimde 20 baytlık temel token adresi.
* `token_symbol` (dize veya `null`): Temel token sembolü.
* `token_name` (dize veya `null`): Temel token görünen adı.
* `quote_token` (dize): Karşıt varlık adresi. Tamamen sıfırlardan oluşan adres (`0x0000000000000000000000000000000000000000`), karşıt varlık olarak yerel ETH'yi temsil eder.
* `quote_symbol` (dize veya `null`): Karşıt varlık sembolü (`quote_token` tamamen sıfırlardan oluşan adres olduğunda `"ETH"`).
* `quote_name` (dize veya `null`): Karşıt varlık görünen adı (`quote_token` tamamen sıfırlardan oluşan adres olduğunda `"Ether"`).
* `base_decimals` (tamsayı veya `null`): Temel token ondalık basamakları (0–255).
* `quote_decimals` (tamsayı veya `null`): Karşıt varlık ondalık basamakları (`quote_token` tamamen sıfırlardan oluşan adres olduğunda `18`).

### Hacim ve işlem sayıları

* `swap_count` (tamsayı): Bu satır için swap sayısı.
* `base_volume_raw` (dize): İşaretsiz tamsayı ondalık dizesi (`UInt256String`) olarak atomik temel hacim.
* `quote_volume_raw` (dize): İşaretsiz tamsayı ondalık dizesi (`UInt256String`) olarak atomik karşıt hacim.
* `base_volume` (dize veya `null`): `DecimalString` olarak `base_decimals` ile ölçeklendirilmiş insan tarafından okunabilir temel token hacmi; `base_decimals` bilinmediğinde `null`.
* `quote_volume` (dize veya `null`): `DecimalString` olarak karşıt ondalık basamaklarla ölçeklendirilmiş karşıt hacim veya `null`.

### Fiyat göstergeleri ve VWAP

* `vwap` (dize veya `null`): `DecimalString` olarak hacim ağırlıklı ortalama fiyat veya `null`.
* `first_price` (dize veya `null`): `DecimalString` olarak ilk fiyat göstergesi veya `null`.
* `last_price` (dize veya `null`): `DecimalString` olarak son fiyat göstergesi veya `null`.
* `min_price` (dize veya `null`): `DecimalString` olarak minimum fiyat göstergesi veya `null`.
* `max_price` (dize veya `null`): `DecimalString` olarak maksimum fiyat göstergesi veya `null`.

### Kesin kesir alanları

* `first_price_numerator` / `first_price_denominator` (dize): `first_price` için kesin tamsayı pay ve payda (`UInt256String`).
* `last_price_numerator` / `last_price_denominator` (dize): `last_price` için kesin tamsayı pay ve payda (`UInt256String`).
* `min_price_numerator` / `min_price_denominator` (dize): `min_price` için kesin tamsayı pay ve payda (`UInt256String`).
* `max_price_numerator` / `max_price_denominator` (dize): `max_price` için kesin tamsayı pay ve payda (`UInt256String`).
* `refreshed_at` (dize): Bu satır için yenilenme zaman damgası (ISO-8601 UTC zaman damgası).

### Zarf meta verileri (`meta`)

* `chain`: Zincir tanımlayıcısı.
* `chain_slug`: Kurallı büyük harfli zincir slug'ı.
* `chain_external_id`: CAIP-2 biçimli zincir tanımlayıcısı.
* `as_of_block`: Zincirin tamamen yazılmış en yeni bloğu (bu veri kümesi tarafından bildirilir, istek parametrelerine göre kontrol edilmez).
* `coverage`: Kapsam sınıflandırması (bu uç nokta için `"full"` bildirir).
* `refreshed_at`: Meta veri yenilenme zaman damgası. `null` olabilir: `null`, bu verinin güncelleme zamanının bilinmediği ve bayat olarak değerlendirilmesi gerektiği anlamına gelir; blok tabanlı uç noktalar her zaman bir değer döndürür.

## Fiyatlar neden kesin pay ve paydalar kullanır

Standart JSON sayıları, hassasiyet sınırlamaları getiren IEEE-754 çift duyarlıklı kayan noktalı sayılara dayanır:

1. **Kayan nokta kesilmesi ve kayması**: Float64 değerleri yalnızca 53 bitlik hassasiyet sağlar ve token miktarlarını bölmek, hesaplamalar boyunca biriken yuvarlama kaymasına yol açar.
2. **Aktarım güvenliği**: Değerleri ondalık dizeler (`UInt256String`) olarak biçimlendirmek, sayıların JSON ayrıştırıcılarında hassasiyet kaybetmeden HTTP üzerinden taşınmasını sağlar.

BlockVectra, fiyat göstergeleri için kesin tamsayı pay ve paydayı sağlayarak, kayan nokta dönüşümü olmadan kesin matematiksel hesaplamalara olanak tanır.

### TypeScript'te kesin kesirleri işleme (BigInt)

TypeScript'te, kayan nokta dönüşümü olmadan çapraz çarpım karşılaştırmaları ve sabit noktalı dönüşümler için yerel `BigInt` kullanabilirsiniz:

```ts
interface DexDailyPrice {
  first_price_numerator: string;
  first_price_denominator: string;
  last_price_numerator: string;
  last_price_denominator: string;
}

// 1. Ratio comparison without floating-point conversion: check if close price is higher than open price
// a / b > c / d  is equivalent to  a * d > c * b
export function isPriceUp(row: DexDailyPrice): boolean {
  const openNum = BigInt(row.first_price_numerator);
  const openDen = BigInt(row.first_price_denominator);
  const closeNum = BigInt(row.last_price_numerator);
  const closeDen = BigInt(row.last_price_denominator);

  return closeNum * openDen > openNum * closeDen;
}

// 2. Convert fraction to a fixed-point decimal string with arbitrary scale (without floating-point loss)
export function fractionToFixedString(
  numeratorStr: string,
  denominatorStr: string,
  decimals = 18
): string {
  const num = BigInt(numeratorStr);
  const den = BigInt(denominatorStr);
  if (decimals === 0) {
    return (num / den).toString();
  }
  const scaleFactor = 10n ** BigInt(decimals);

  const scaled = (num * scaleFactor) / den;
  const intPart = scaled / scaleFactor;
  const remainder = scaled % scaleFactor;
  const fracPart = remainder.toString().padStart(decimals, "0");

  return `${intPart}.${fracPart}`;
}
```

### Python'da kesin kesirleri işleme

Python, rasyonel ve ondalık hesaplamalar için özel olarak tasarlanmış standart kütüphane modülleri sağlar: `fractions.Fraction` ve `decimal.Decimal`.

```python
from decimal import Decimal, getcontext
from fractions import Fraction

# 1. Exact rational calculations with fractions.Fraction
open_price = Fraction(
    int(row["first_price_numerator"]),
    int(row["first_price_denominator"])
)
close_price = Fraction(
    int(row["last_price_numerator"]),
    int(row["last_price_denominator"])
)

# Exact price delta without floating-point rounding error
price_delta = close_price - open_price
print(f"Price delta (fraction): {price_delta}")

if open_price != 0:
    percentage_change = (price_delta / open_price) * 100
    print(f"Percentage change: {float(percentage_change):.4f}%")

# 2. Arbitrary-precision decimal arithmetic with decimal.Decimal
getcontext().prec = 50

if int(row["first_price_denominator"]) != 0:
    open_decimal = Decimal(row["first_price_numerator"]) / Decimal(row["first_price_denominator"])
    print(f"High-precision open: {open_decimal}")
```

## Bir yıllık günlük fiyatları geriye dönük doldurma

90 günlük aralık sınırı dahilinde bir yıllık veriyi (365 gün) geriye dönük doldurmak için, tam tarih aralığını en fazla 90 günlük ardışık pencerelere bölün ve parçalı istekler gönderin:

```ts
interface DateSpan {
  from: string;
  to: string;
}

/**
 * Split a large date range into consecutive spans of at most maxDays (default: 90)
 */
export function splitDateRange(startDateStr: string, endDateStr: string, maxDays = 90): DateSpan[] {
  const spans: DateSpan[] = [];
  let currentStart = new Date(startDateStr);
  const end = new Date(endDateStr);

  while (currentStart <= end) {
    const chunkEnd = new Date(currentStart);
    chunkEnd.setUTCDate(chunkEnd.getUTCDate() + (maxDays - 1));
    const effectiveEnd = chunkEnd < end ? chunkEnd : end;

    spans.push({
      from: currentStart.toISOString().slice(0, 10),
      to: effectiveEnd.toISOString().slice(0, 10),
    });

    const nextStart = new Date(effectiveEnd);
    nextStart.setUTCDate(nextStart.getUTCDate() + 1);
    currentStart = nextStart;
  }

  return spans;
}

/**
 * Backfill token daily prices across multiple 90-day chunks
 */
export async function backfillTokenDailyPrices(
  chain: string,
  token: string,
  startDate: string,
  endDate: string,
  apiKey: string
) {
  const chunks = splitDateRange(startDate, endDate, 90);
  const allDailyPrices = [];

  for (const chunk of chunks) {
    const url = new URL(`https://api.blockvectra.com/v1/data/${chain}/dex/prices`);
    url.searchParams.set("token", token);
    url.searchParams.set("from", chunk.from);
    url.searchParams.set("to", chunk.to);

    const res = await fetch(url, {
      headers: { "x-api-key": apiKey },
    });

    if (!res.ok) {
      throw new Error(`Failed to fetch span ${chunk.from}..${chunk.to}: HTTP ${res.status}`);
    }

    const json = await res.json();
    allDailyPrices.push(...json.data);
  }

  return allDailyPrices;
}
```

## Kapasite ve CU kullanım hesaplamaları

Her Data API uç noktası, tüketimi Compute Units (CU) cinsinden ölçer. `data.dex_prices` için çağrı başına CU ağırlığı ve token geriye dönük doldurmaları için tahmini tüketim aşağıda hesaplanmıştır:

- **Metot ağırlığı:** `data.dex_prices` = 15 CU / çağrı.
- **200 token için 1 yıllık günlük fiyatların geçmişe dönük doldurulması:** istek başına maksimum 90 günlük aralıkla, 365 günü kapsamak token başına 5 parça gerektirir ve toplam 1,000 çağrı yapar. Toplam tüketim 15,000 CU (ücretsiz plan döngü kotasının yaklaşık <0.1%'i), liste fiyatıyla yaklaşık <$0.01.
- **Günlük bakım (200 token'ı günde bir kez yenileme):** günde 200 çağrı (günde 3,000 CU), 30 günlük döngü başına yaklaşık toplam 6,000 çağrı (90,000 CU, ücretsiz kotanın yaklaşık 0.3%'i), liste fiyatıyla yaklaşık <$0.01/ay.

Geriye dönük doldurma hacminizi ölçeklendirirken veya daha yüksek istek eşzamanlılığı gerektiğinde, ücretli bir hesaba yükseltmek için konsol [Faturalandırma sayfasında](https://console.blockvectra.com/billing/) zincir üstünde bakiye yükleyin. Güncel tarifeler ve birim dönüşümleri için [Fiyatlandırma sayfasına](https://blockvectra.com/tr/pricing/) bakın.

## Sonraki adımlar

* BlockVectra'nın indekslediği her veri kümesini görmek için [veri kümeleri dizinine göz atın](https://blockvectra.com/tr/data/).
* Hesabınızın neleri içerdiğini kontrol etmek için [ücretsiz planı ve fiyatlandırmayı inceleyin](https://blockvectra.com/tr/pricing/#free).
* Bir API key oluşturmak için [konsolda oturum açın](https://console.blockvectra.com/login/?next=%2Fkeys%2F).
