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

Data API'den günlük DEX OHLC fiyatlarını ve VWAP değerini sorgulayın, TypeScript ve Python'da kesin rasyonel kesirleri işleyin ve geçmiş verileri verimli şekilde geriye dönük doldurun.

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 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ı).

İ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:

ParametreKonumTürZorunluAçıklama
chainyoldizeEvetZincir tanımlayıcısı, örn. robinhood_mainnet
tokensorgudizeEvet20 baytlık temel token adresi, 0x isteğe bağlı, büyük/küçük harf fark etmez
quotesorgudizeHayırTek bir temel/karşıt çiftle sınırlamak için isteğe bağlı 20 baytlık karşıt token adresi
fromsorgutarih dizesiEvetUTC başlangıç tarihi, dahil, YYYY-MM-DD
tosorgutarih dizesiEvetUTC 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 -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"

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:

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.

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:

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 / call
  • 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 zincir üstünde bakiye yükleyin. Güncel tarifeler ve birim dönüşümleri için Fiyatlandırma sayfasına bakın.

Sonraki adımlar

Son güncelleme:

Bu sayfada