KriptoCollector Consumer API · md.v1
Canlı · sürüm 1.0 · 2026-10-07

Sürüm 1.0 · kaynak proto/md/v1/md.proto, SPEC §14.1 · 2026-10-07

Tüketici API

Aynı sunucudaki trade projeleriniz — HFT, scalp, MFT, intraday ya da araştırma — piyasa verisini bu API'den alır. Strateji türü uç noktayı değiştirmez; değişen, hangi yoldan bağlandığınız ve hangi kanala abone olduğunuzdur.

Durum
Canlı. gRPC kriptocollector:7070 ve Unix soketi dinliyor. Her deploy'dan sonra ayrı bir konteynerden bağlanan örnek tüketici (mdprobe) bütün yolu sınar.
Nasıl bağlanırım
Bot konteynerinizi kc-consumers Docker ağına ekleyin, kriptocollector:7070 adresine gRPC ile bağlanın. Daha düşük gecikme için Unix soketi.
Protokol
protobuf md.v1. JSON, Kafka, NATS, Redis yok.
Uç noktalar
Health, ListInstruments, Subscribe, GetBars, GetTrades, GetHistory, GetBookSnapshot, GetIntegrity, ListArchive.
Geçmiş
Toplanan her şeyin tamamı: son günler sorguyla, uzun geçmiş Parquet dosyası olarak (işlem ve bar 2 yıl, diğer her şey süresiz).
Kimlik
Auth, kota ve TLS yok. Güven sınırı Docker ağıdır; port internete açık değildir.
Kaç proje
İstediğiniz kadar. Her bağlantının kendi kuyruğu var; biri yavaşlarsa diğeri etkilenmez.
Dil
Hazır kütüphane: Go (pkg/mdclient). Python, Rust ve diğerleri md.proto'dan kod üretir.

Kolektör emir göndermez, sinyal üretmez. Verdiği şey ham olay, kalite işareti ve trade'lerden üretilmiş, her gece yeniden üretilerek doğrulanan bar'dır.

Hızlı başlangıç

  1. Ağ: bot projenizin Dokploy compose'una kc-consumers ağını ekleyin (örnek).
  2. İstemci: Go ise kriptocollector/pkg/mdclient; başka dil ise proto/md/v1/md.proto'dan kod üretin (Python örneği).
  3. Açılış: Health → ListInstruments → geçmişi ısıtın (GetBars zaman aralığıyla, son 90 dk için GetHistory).
  4. Araştırma / backtest: ListArchive ile istediğiniz tablonun istediğiniz günlerini dosya olarak alın; DuckDB ya da pyarrow ile okuyun (nasıl).
  5. Canlı: Subscribe ile istediğiniz kanallara abone olun. Varsayılan yalnız temiz (OK) veriyi gönderir.
  6. Kopukluk: conn_seq boşluğu, Integrity ya da kayıp heartbeat görürseniz o sembolün durumunu sıfırlayıp yeniden hizalayın (nasıl).

Çalışan, uçtan uca bir örnek: cmd/mdprobe/main.go. Her deploy'dan sonra kriptocollector-consumer-smoke konteyneri olarak çalışır ve bitince tek satır yazar: mdprobe OK … ya da mdprobe FAIL ….

Kim bağlanır

Tüketici, aynı makinede (OVH) çalışan sizin projelerinizdir. Proje kolektörün içine gömülmez, ham dosyaları kendisi okumaz.

TüketiciTipik yolTipik kanal
Scalp / kısa vadeUnix soketi, yedek gRPCtrade, bbo, l2 (canary), bar 1s
MFT / intradaygRPCbar 1m–1h, bbo, mark, liq, oi
Opsiyon / oynaklıkgRPCopt_trade, opt_mark, opt_surface, index
Akıllı para / akışgRPChl_trade, hl_position, alt
AraştırmagRPC sorguGetBars, GetTrades zaman aralığıyla

Hepsi aynı sekiz metodu kullanır. Ayrı bir "HFT API" yoktur. Gecikme hakkında: borsadan bize ortalama ~50 ms, kötü %1'de ~200 ms; bu API mikro-saniye HFT için değil, saniye ve üstü stratejiler içindir.

Düzlemler ve adresler

YolAdresNe zaman
gRPC (Docker ağı)kriptocollector:7070, ağ kc-consumersVarsayılan. Abonelik ve tüm sorgular.
gRPC (host)127.0.0.1:7070Konteyner değil, doğrudan sunucuda çalışan bir süreç için.
Unix soketihost /var/lib/kriptocollector/run/md.sockEn düşük gecikme. Yalnız canlı akış (Subscribe); sorgular gRPC'den.
  • gRPC düz TCP'dir, TLS yoktur. Port yalnız host loopback'ine ve kc-consumers ağına açıktır; internetten erişilemez.
  • Unix soketi ağ üzerinden çalışmaz. Bot konteyneri host'taki /var/lib/kriptocollector/run dizinini kendi içine bağlar (mount) ve soket dosyasına o yoldan bağlanır. Soket root'a aittir (izin 660); bot konteyneri root ile ya da aynı grupla çalışmalıdır.
  • Unix soketi protokolü: istemci önce bir SubscribeRequest gönderir, sonra Envelope'lar alır. Her mesajın önünde 4 baytlık büyük-endian uzunluk vardır. Go kütüphanesi bunu hazır yapar (mdclient.DialUDS).
  • Geliştirme makinesi (laptop) canlı veri almaz; bu API'ye yalnız sunucudaki konteynerler bağlanır.

Bot projesinin compose'u

Dokploy'da botunuzun projesi ayrı bir compose'tur. Kolektöre ulaşmak için tek yapmanız gereken ortak ağa katılmaktır:

services:
  bot:
    build: .
    environment:
      - KC_GRPC=kriptocollector:7070
      # isteğe bağlı, düşük gecikmeli canlı akış:
      - KC_UDS=/run/kc/md.sock
    volumes:
      # yalnız Unix soketi kullanılacaksa
      - /var/lib/kriptocollector/run:/run/kc:rw
      # geçmişin tamamı, Parquet dosyaları (salt-okunur)
      - /data/parquet/kriptocollector:/kc/archive:ro
    networks:
      - kc-consumers
    restart: unless-stopped
    # aynı sunucu: kolektör önce gelir (sert piyasa hareketinde
    # kolektörün işlemci ihtiyacı birden artar, tam da botun en çok
    # çalıştığı an)
    cpus: 2
    mem_limit: 4g

networks:
  kc-consumers:
    external: true

kc-consumers ağı kolektörün compose'unda tanımlıdır ve kolektör çalıştıkça vardır. Bot, kolektörden önce başlarsa Health cevap verene kadar beklemelidir (örnek: mdprobe, 3 dk dener).

Protokol ve proto dosyası

Tek doğruluk kaynağı repodaki proto/md/v1/md.proto dosyasıdır (paket md.v1, servis MarketData). Alan numaraları donmuştur: mevcut alanlar değişmez, yeni alanlar yalnız eklenir.

service MarketData
rpc Subscribe(SubscribeRequest) returns (stream Envelope);
rpc GetBookSnapshot(BookRequest) returns (BookSnapshot);
rpc GetBars(BarsRequest) returns (BarsResponse);
rpc GetTrades(TradesRequest) returns (TradesResponse);
rpc GetHistory(HistoryRequest) returns (stream Envelope);
rpc GetIntegrity(IntegrityRequest) returns (IntegrityResponse);
rpc ListInstruments(InstrumentsRequest) returns (InstrumentsResponse);
rpc Health(HealthRequest) returns (HealthResponse);
rpc ListArchive(ArchiveRequest) returns (ArchiveResponse);

Akıştaki her mesaj bir Envelope'dır: conn_seq (bu bağlantıya özel artan sayı) ve tam olarak bir olay (trade, bbo, book_delta, book_snapshot, bar, mark, open_interest, liquidation, integrity, heartbeat, option_trade, option_mark, index_tick, option_surface, hl_trade, hl_position, alt_data).

Kimlik doğrulama

Token, kullanıcı, rol, kota ve TLS yoktur. kc-consumers ağındaki her konteyner bütün metotları çağırabilir. Bu sınır kendi projeleriniz içindir; dış müşteri bu kapıdan girmez. Abonelikte client alanına botunuzun adını yazın; kolektör logları ve sayaçları bu adla tutar.

min_quality'yi OK dışına çekmek (kirli veriyi de istemek) kolektör loguna yazılır.

Ortak başlık (Header)

AlanTipAnlam
exchangestringbinance, bybit; opsiyonlarda deribit, okx; ayrıca hyperliquid ve alt.
symbolstringBorsa sembolü (BTCUSDT), opsiyon adı ya da endeks adı.
channelstringKanal adı (aşağıdaki katalog).
exchange_tsint64Borsa zamanı, Unix nanosaniye. Bar'da açılış zamanı.
recv_tsint64Kolektörün aldığı an, Unix nanosaniye.
stream_sequint64borsa|sembol|kanal başına artan sayı.
qualityenumOK, DEGRADED, RESYNCING, STALE. Kalite makinesi ve kill-switch sonrası nihai şerit.
generationuint32Enstrüman kuşağı. Artarsa o sembolün eski durumunu silin.

Evren: kripto USDT perpetual, Binance ∩ Bybit kesişimi (~460 sembol). Spot, USDC, forex, TradFi yok.

Fixed-point

Fiyat ve miktar float değildir: Decimal { int64 raw; int32 scale }.

değer = raw / 10^scale        örnek: raw=8370015, scale=2 → 83700.15

Karşılaştırma ve toplamları tamsayıyla ya da kesin ondalık türüyle yapın. float64'e çevirip karar vermek sözleşmeyi bozar. Bar'daki notional (Σ fiyat×miktar) taşmasın diye metin olarak gelir.

Abonelik filtreleri (SubscribeRequest)

AlanAnlam
exchangesbinance, bybit, deribit, okx, hyperliquid, alt. Boş = hepsi.
symbolsTam ad ya da *'lı glob (BTC*). Boş = hepsi; çoğu bot kendi listesini verir.
channelstrade, bbo, l2, bar, mark, oi, liq, opt_trade, opt_mark, opt_surface, index, hl_trade, hl_position, alt. Boş = hepsi (önerilmez: hacim yüksek).
timeframesBar için 1s, 1m, 5m, 15m, 30m, 1h. 1s yalnız aktif sette üretilir.
min_qualityVarsayılan OK (yalnız temiz veri). DEGRADED verirseniz şüpheli ve tek kaynaklı olaylar da gelir.
active_set_onlytrue: yalnız günün aktif seti (BTC, ETH, SOL, DOGE, XRP + hacim/oynaklık seçilenler, ~15 sembol).
policyKuyruk dolarsa: DROP_OLDEST (varsayılan) ya da DISCONNECT. Kolektör botu asla beklemez.
queueBağlantı kuyruğu, olay sayısı. 0 = 65 536.
clientBotun adı (log ve sayaç için).

Teslimat

  • Canlı akış en fazla bir kez (at-most-once) teslim eder. Kaçırılan olayın kaynağı sorgulardır.
  • Her bağlantının kendi sınırlı kuyruğu vardır. Dolarsa politika uygulanır; düşen olaylar Integrity{DROPPED} ile bildirilir ve conn_seq'te boşluk olarak görünür.
  • Akış sessizken 5 saniyede bir Heartbeat gelir. 15 saniye hiçbir şey gelmezse bağlantıyı ölü sayın.
  • Kapanmış bar'ın doğruluk kaynağı canlı akış değil, GetBars'tır. Akış tetikleyicidir.

RPC uçları

unary

Health

Kolektör ayakta mı. Yanıt: status (ok), server_ts, subscribers. Açılışta ve kopukluktan sonra çağrılır.

unary

ListInstruments

Kesişim evreni. Açılışta ve generation değişince çağrılır.

AlanAnlam
baseDayanak, örn. BTC
binance_symbol, bybit_symbolİki borsadaki adı
generationEvren kuşağı
activeGünün aktif setinde mi
stream

Subscribe

Canlı akış. Filtreler yukarıda. Akış, istemci bağlantıyı kapatana kadar sürer.

unary

GetBars

Aralıksız (from_ts = to_ts = 0): bellekteki son kapanmış bar'lar (limit kadar, en çok 60).

Aralıklı: [from_ts, to_ts) açılış zamanı aralığındaki kapanmış bar'lar, eskiden yeniye. Mühürlenmiş saatler arşivden, son ~90 dakika sıcak halkadan gelir; arada boşluk kalmaz. Her bar'ın son revizyonu döner. Bir çağrı en çok 20 000 bar döner; devamı için from_ts'yi son bar'ın açılışından sonraya alın. Go: client.BarsRange(ctx, "binance", "BTCUSDT", "1m", from, to) sayfalamayı kendisi yapar.

clean=false bar, içinde şüpheli işlem olan bar'dır. Pozisyon kararı yalnız complete=true ve clean=true bar'la verilmelidir.

unary

GetTrades

Aralıksız: bellekteki son işlemler (en çok 200). Aralıklı: [from_ts, to_ts) borsa zamanı aralığındaki işlemler; arşiv + sıcak halka, 20 000'lik sayfalar. Her işlemin şeridi (quality) kaydedildiği gibidir. Go: client.TradesRange(…).

stream

GetHistory

Sıcak halka: tek sembolün son ~90 dakikadaki olayları, eskiden yeniye. Yeniden başlayan bir bot göstergelerini bununla ısıtır, sonra Subscribe'a geçer. Kolektör yeniden başlasa da kaybolmaz.

İstek: exchange, symbol, channels (trade varsayılan; bbo yalnız aktif set; bar + timeframe; mark, liq, oi, opt_trade, opt_mark, opt_surface, index, hl_trade, hl_position, alt), from_ts/to_ts, limit (en çok 500 000). Emir defteri değişiklikleri tutulmaz; defter için GetBookSnapshot.

unary

GetBookSnapshot

Bir sembolün anlık, doğrulanmış emir defteri (depth = seviye sayısı, 0 = tamamı). Yalnız canary sembollerde var: BTC, ETH, SOL, DOGE, XRP, iki borsada. Diğer semboller NotFound döner.

unary

GetIntegrity

Şu anki kalite durumu: her borsa|sembol|kanal için şerit seviyesi (level) ve kill-switch ile durdurulmuş mu (paused). Bot, bir sembolde işlem açmadan önce buna bakabilir. Günlük kalite belgeleri (Calibration Certificate) arşiv dizininde certificate/GÜN.json olarak durur.

unary

ListArchive

Bir tablonun mühürlenmiş Parquet dosyaları, eskiden yeniye. İstek: table, from_day, to_day (UTC YYYY-AA-GG, ikisi de dahil; boş = açık uç), fetch.

Son 30 günün dosyaları sunucudadır ve hemen okunur (local=true). Daha eskileri S3'tedir: fetch=true verirseniz kolektör onları geri indirir, kayıttaki özetle (blake3) doğrular ve path'i doldurur. Bir çağrı en çok 48 dosya indirir ve indirme bitene kadar bekler; pending sıfırdan büyükse aynı isteği tekrarlayın. Geri indirilen dosya, son istekten 7 gün sonra yeniden silinir.

Yanıt alanıAnlam
files[].pathArşiv bağlama noktasının altındaki yol, örn. parquet/bars/2026-10-06/13-…parquet
files[].day, hour, rows, bytes, blake3Dosyanın günü, saati, satır sayısı, boyutu, özeti
files[].localŞu an okunabilir mi
fetched, pendingBu çağrıda indirilen / hâlâ S3'te bekleyen

Tablolar: trades, bbo, l2, bars, mark, liq, sparse (OI, oranlar, fonlama geçmişi), opt_trades, opt_marks, opt_surface, deribit_index, hl_trades, hl_positions, alt_raw.

Ham kayıttan sonradan üretilen tablolar: reprocess/mark (7 Ekim 2026 öncesi Bybit mark, fonlama ve açık pozisyonu) ve reprocess/liq (aynı dönemin tasfiyeleri, düzeltilmiş yönle). 7 Ekim'den önceki günler için bunları kullanın.

Event kataloğu

Kanal adı abonelikte, tip adı Envelope'ta kullanılır. Her olayda ortak başlık vardır.

KanalTipKapsam
tradeTradeTüm evren, iki borsa
bboBboTüm evren
l2BookDeltaTemiz şeritte yalnız canary (çift tanıklı); diğerleri tek kaynaklı, DEGRADED
barBarTüm evren 1m–1h; 1s yalnız aktif set
markMarkMark/endeks fiyatı ve fonlama
oiOpenInterestAçık pozisyon ve oranlar (REST, seyrek)
liqLiquidationTasfiyeler
opt_tradeOptionTradeDeribit ve OKX, BTC/ETH opsiyonları
opt_markOptionMarkDeribit, tüm opsiyonların mark + IV'si
indexIndexTickDeribit DVOL ve spot endeks
opt_surfaceOptionSurfaceOKX oynaklık yüzeyi, dakikada bir, BTC/ETH tüm opsiyonlar
hl_tradeHLTradeHyperliquid tüm perp işlemleri, alıcı ve satıcı adresiyle
hl_positionHLPositionHyperliquid cüzdan × coin pozisyonları, dakikada bir (o dakika değişenler)
altAltDataCFTC COT, CoinGecko türevleri, DefiLlama, Fear & Greed, Polymarket

Trade

trade_idBorsa kimliği (Binance aggTrade no, Bybit UUID)
price, qtyDecimal
sideTaker yönü: BUY, SELL
single_feedİkinci bağlantı tanıklık etmedi (temiz şeritte gelmez)
divergedİki bağlantı farklı söyledi
off_tickFiyat tick ızgarasının dışında (gerçek veri, temiz değil)
block_trade, rpiBybit blok işlem / RPI emri

Bbo

bid_price, bid_qty, ask_price, ask_qty (Decimal), single_feed, diverged, off_tick.

BookDelta / BookSnapshot

BookDelta: bids/asks seviye listesi (miktar 0 = seviyeyi sil), first_update, final_update, prev_update, snapshot (tam yenileme), depth_mode, synced. BookSnapshot (GetBookSnapshot yanıtı): last_update, en iyiden başlayan bids/asks, synced. Go kütüphanesindeki mdclient.Book yardımcısı deltaları uygular ve boşlukta snapshot'tan yeniden kurar.

Bar

timeframe, open_tsKova ve açılış zamanı (UTC, ns)
open, high, low, closeDecimal
volume, buy_volume, sell_volume, vwapDecimal
notionalΣ fiyat×miktar, kesin ondalık metin
trades, buys, sells, degradedİşlem sayıları; degraded = temiz olmayan işlem sayısı
cleanBar'daki her işlem temiz
completefalse taslak, true kapanmış
revisionGeç gelen işlemle düzeltilen bar'ın sürümü
block_volume, block_trades, rpi_volumeHacmin içindeki blok işlem (borsa dışı anlaşma) ve RPI alt kümeleri; akış ölçümünde hacimden çıkarın

Bar'lar borsanın kendi mumundan değil, işlemlerden üretilir. Her dakika borsanın mumuyla karşılaştırılır; her gece dünün tüm bar'ları baştan üretilip birebir doğrulanır.

Mark (fonlama)

mark, index, settle_estimate, funding_rate (Decimal), next_funding_ts (ns), open_interest, open_interest_value (yalnız Bybit; Binance'in açık pozisyonu oi kanalındadır). İki borsa için de saniyede en fazla bir güncelleme. Mark fiyatı defter fiyatı değildir.

OpenInterest

source (örn. binance|oi_hist) ve row_json: borsanın REST satırı, baytları değiştirilmeden. Açık pozisyon, uzun/kısa oranları ve fonlama geçmişini taşır; alanlar borsanın kendi alan adlarıdır.

Liquidation

price (iflas/emir fiyatı; gerçekleşme fiyatı değildir), avg_price, qty, side, position_side, coverage: FULL (Bybit, tümü) ya da SAMPLED (Binance, örneklenmiş — her tasfiye değil).

Yön: side her iki borsada da zorla verilen tasfiye emrinin yönüdür: SELL = uzun pozisyon tasfiye edildi, BUY = kısa pozisyon. position_side aynı bilgiyi açıkça verir (long | short). Not: 7 Ekim 2026 öncesi arşivde Bybit satırlarının side değeri pozisyon yönüdür (ters); o tarih öncesi için pos_side sütunu boştur.

Opsiyon olayları

OptionTrade (borsa deribit ya da okx, sembol = opsiyon adı): contract (dayanak, vade YYYY-MM-DD, kullanım fiyatı, C/P), price (dayanak cinsinden), amount (kontrat), side, iv (işlem anı oynaklığı, yüzde), index_price, mark_price. OptionMark (Deribit): mark_price, iv (oran: 0.3142 = %31.42). IndexTick: kind dvol ya da price, value; sembol btc_usd/eth_usd.

Opsiyon olayları tek kaynaklıdır (ikinci tanık yok) ve katı ayrıştırıldıkları için temiz şerittedir.

OptionSurface (OKX, sembol = opsiyon adı): contract, mark_vol, bid_vol, ask_vol (oran), fwd_price (vadenin forward fiyatı), delta_bs/gamma_bs/vega_bs/theta_bs (Black-Scholes, USD), delta/gamma/vega/theta (fiyat ayarlı, coin).

Hyperliquid

HLTrade (sembol = coin, örn. BTC): side (alıcı taraf BUY, satıcı taraf SELL), price, size, tid, hash, buyer, seller (cüzdan adresleri).

HLPosition: address, net_size (+ uzun, − kısa), avg_price (açık pozisyonun ortalama girişi), realized_pnl, fills, last_fill_ts. Sayılar taşmasın diye kesin ondalık metindir. Pozisyonlar toplama başlangıcından (2026-10-07) itibaren sayılır; bir cüzdanın o tarihten önceki bakiyesi bu akışta yoktur.

AltData

Sembol = kaynak adı (cftc_cot_crypto, coingecko_derivatives, defillama_stablecoins, defillama_dexs, fear_greed, polymarket_top, deribit_book_summary_btc, deribit_book_summary_eth — Deribit'te her opsiyonun açık pozisyonu, hacmi ve IV'si, 15 dakikada bir). Alanlar: source, status (HTTP), bytes, blake3, body_json (kaynağın yanıtı, değiştirilmeden). 1 MB'tan büyük yanıt (CoinGecko türevleri ~9 MB) akışta yalnız duyurulur, body_json boş gelir; gövdenin tamamı arşivin alt_raw tablosundadır (aynı blake3).

Integrity

Kalite olayı: DROPPED (bu bağlantı kuyruk dolduğu için olay kaybetti, count kadar), SERVE_PAUSED (kill-switch bir anahtarı durdurdu), RESYNC (bir defter yeniden kuruluyor). key etkilenen borsa|sembol|kanal'dır. İşlem sinyali değildir; o sembolde yeni giriş durmalıdır.

Heartbeat

server_ts, conn_seq. Veri değildir; sessiz kopukluğun tanığıdır.

Go örneği

Kütüphane kriptocollector/pkg/mdclient (ve üretilmiş tipler kriptocollector/pkg/md/v1). Modül adı bir URL olmadığı için go get ile çekilmez; botun go.mod'una repo yolunu verin:

require kriptocollector v0.0.0
replace kriptocollector => ../KriptoCollector   // repo'nun yerel kopyası

Tam örnek: cmd/mdprobe/main.go.

c, err := mdclient.DialGRPC(os.Getenv("KC_GRPC")) // "kriptocollector:7070"
if err != nil { return err }
defer c.Close()

// 1. ısınma: son 7 günün 1 saatlik bar'ları (arşiv + en yeniler)
now := time.Now()
bars, err := c.BarsRange(ctx, "binance", "BTCUSDT", "1h",
    now.Add(-7*24*time.Hour).UnixNano(), now.UnixNano())

// 2. canlı: temiz işlemler ve kapanan 1m bar'lar
st, err := c.Subscribe(ctx, &mdv1.SubscribeRequest{
    Exchanges: []string{"binance", "bybit"}, Symbols: []string{"BTCUSDT"},
    Channels: []string{"trade", "bar"}, Timeframes: []string{"1m"},
    Client: "benim-botum",
}, func(prev, got uint64) {
    // conn_seq boşluğu: o sembolün durumunu sıfırla, GetBars ile hizala
})
for {
    env, err := st.Recv()
    if err != nil { break } // yeniden bağlan
    switch {
    case env.GetTrade() != nil:
        // fiyat: env.GetTrade().GetPrice().GetRaw() / 10^Scale
    case env.GetBar() != nil && env.GetBar().GetComplete():
        // kapanmış bar
    }
}

Unix soketi ile canlı akış: mdclient.DialUDS(ctx, "/run/kc/md.sock", req, onGap) — aynı Recv() arayüzü.

Python örneği

Repodaki proto/md/v1/md.proto dosyasını projenize kopyalayıp kodu üretin:

pip install grpcio grpcio-tools
python -m grpc_tools.protoc -I proto --python_out=. --grpc_python_out=. proto/md/v1/md.proto
import os, time, grpc
from md.v1 import md_pb2 as md, md_pb2_grpc as rpc

ch = grpc.insecure_channel(os.environ.get("KC_GRPC", "kriptocollector:7070"))
api = rpc.MarketDataStub(ch)
print(api.Health(md.HealthRequest()).status)

def dec(d):                       # Decimal → int, ölçek ayrı tutulur
    return d.raw, d.scale

now = time.time_ns()
bars = api.GetBars(md.BarsRequest(exchange="binance", symbol="BTCUSDT",
        timeframe="1m", from_ts=now - 6*3600*10**9, to_ts=now)).bars

req = md.SubscribeRequest(exchanges=["binance"], symbols=["BTCUSDT"],
        channels=["trade"], client="python-bot")
for env in api.Subscribe(req):
    if env.HasField("trade"):
        t = env.trade
        print(t.header.symbol, dec(t.price), dec(t.qty), t.side)

20 000'den uzun aralıklarda from_ts'yi son bar'ın açılışından sonraya alarak tekrar çağırın. Fiyatı decimal.Decimal(raw).scaleb(-scale) ile kesin ondalığa çevirin, float kullanmayın.

Kalite

Varsayılan abonelik yalnız OK görür. Kirli veri temiz diye servis edilmez.

qualityİstemci ne yapar
OKİşlenebilir. İki bağlantı aynı şeyi söyledi ve kalite makinesi sağlıklı.
DEGRADEDTek kaynaklı, çelişkili ya da boşluk sonrası. Temiz şeritte gelmez; açıkça istenirse gelir.
RESYNCINGHizalanma bitene kadar yeni giriş yok.
STALEKanal sustu. Yeni giriş yok.

İki bağlantının da kaçırdığı Binance işlemleri sonradan borsanın REST'inden geri doldurulur; bunlar arşivde DEGRADED olarak durur, canlı akışa verilmez.

Sertifika ve güvenilir günler

Kolektör her UTC günü için bir kalite belgesi yazar. Belge saatlik güncellenir; günün kesin hali ertesi gün yaklaşık 03:40 UTC'de (gece mühür ve gece testi bittikten sonra) oluşur.

Dosya (arşiv bağlamasında)İçerik
/kc/archive/certificate/<gün>.jsonstatus: PASS / FAIL / INCOMPLETE; criteria: her kriterin değeri ve eşiği (kapsam, OK oranları, boşluk, A/B çelişki, ret, kâhinler, L0 bütünlüğü, saat, mühür, bar yeniden üretimi); worst_symbols
/kc/archive/golden/<gün>.jsonGece testi: canlı barların ham kayıttan birebir yeniden üretimi ve ham ↔ Parquet işlem karşılaştırması
/kc/archive/manifest/<gün>.jsonGünün mühür kökü (her segmentin blake3 zinciri)
import json, glob, os
pass_days = sorted(os.path.basename(p)[:10]
    for p in glob.glob("/kc/archive/certificate/*.json")
    if json.load(open(p)).get("status") == "PASS")

Kullanım: geriye dönük testte önce PASS günleri kullanın. FAIL bir gün çöp değildir: kirli dakikalar zaten DEGRADED işaretlidir, temiz şerit (quality='OK' AND fsm='OK') o gün de kullanılabilir. Belge yalnızca "bu gün bütünüyle kusursuz" kanıtıdır. Canlı işleme geçmeden önce birkaç PASS günü görülmesi önerilir.

Yeniden hizalama

Aşağıdakilerden biri olursa o sembol ve kanalın durumunu silin; kolektör yeniden OK olmadan pozisyon büyütmeyin:

  • conn_seq boşluğu (Go'da onGap çağrılır)
  • Integrity olayı
  • generation artışı ya da sembolün evrenden düşmesi
  • 15 saniye heartbeat gelmemesi
  • Kolektörün yeniden başlaması (güncelleme). Kesinti tipik olarak 4–6 saniyedir; boşluk günlük kalite belgesine işlenir. Bot bağlantının kopmasını hata saymamalı: Health cevap verene kadar artan aralıklarla yeniden bağlanır, sonra boşluğu GetTrades / GetBars (aralıklı) ve GetHistory ile doldurur. Binance işlemlerinde iki bağlantının da kaçırdığı kısım birkaç dakika içinde REST'ten geri doldurulur (arşivde DEGRADED).

Kolektör güncellemeleri az ve mümkünse piyasanın sakin saatlerinde yapılır. Sert piyasa hareketinde borsa bağlantıları kopabilir; kolektör yeniden bağlanmaları birkaç saniyeye yayar, etkilenen dakikalar DEGRADED işaretlenir.

Hizalama çağrıları: defter için GetBookSnapshot, bar için GetBars (aralıklı), son dakikalar için GetHistory, kalite için GetIntegrity.

Trade projesi ne tutar

Trade projesi piyasa verisi toplamaz ve kopyalamaz. Canlı veri, son dakikalar ve tüm geçmiş kolektörden gelir; arşiv dosyaları yerinde okunur. Aynı sunucuda terabaytlarca veriyi ikinci kez tutmanın anlamı yoktur.

VeriNerede
İşlem, BBO, defter, bar, mark/fonlama, OI, tasfiye, opsiyon, Hyperliquid, ek kaynaklar (canlı + geçmiş)Kolektör (bu API ve /kc/archive)
Kendi emirleri, dolumları, pozisyonu, bakiyesiTrade projesi: borsanın hesaba özel bağlantısından alır ve işlem günlüğü olarak saklar (kolektör bunları görmez)
Hesaplanan gösterge, sinyal, test sonucuTrade projesi (küçük, türetilmiş tablolar)
Borsa API anahtarlarıYalnız trade projesinin gizli ayarları; kolektörün deposuna ya da compose'una girmez

Stratejinin ihtiyaç duyduğu bir piyasa verisi kolektörde yoksa (ör. aktif set dışında bir sembolün tam defteri, yeni bir kaynak) o veri trade projesine değil kolektöre eklenir: tek yerde, tek doğrulama zinciriyle ve diğer botlar için de.

Hız profilleri

Aynı API, üç örnek abonelik:

Scalp / kısa vade

yol:         Unix soketi, yedek gRPC
channels:    trade, bbo, l2        // l2 temiz şeritte yalnız canary
timeframes:  1s
min_quality: OK
active_set_only: true
policy:      DROP_OLDEST

MFT / intraday

yol:         gRPC
açılış:      BarsRange(1h, son 30 gün) + GetHistory(son 90 dk)
channels:    bar, bbo, mark, liq, oi
timeframes:  1m, 5m, 15m, 1h
min_quality: OK
policy:      DISCONNECT
kapanış:     Bar.complete=true; şüphede GetBars ile birebir doğrula

Araştırma

yol:         gRPC sorgu
çağrılar:    GetBars / GetTrades (aralıklı), ListInstruments, GetIntegrity
canlı akış:  gerekmiyorsa yok

Arşivden okuma

Uzun geçmiş ve toplu araştırma sorgu bağlantısından değil, dosyadan okunur: bu hızlıdır ve kolektörü yormaz. Bot konteynerine arşivi salt-okunur bağlayın (compose örneği, /kc/archive), sonra:

import duckdb, grpc
from md.v1 import md_pb2 as md, md_pb2_grpc as rpc
api = rpc.MarketDataStub(grpc.insecure_channel("kriptocollector:7070"))

req = md.ArchiveRequest(table="trades", from_day="2026-09-01", to_day="2026-09-30", fetch=True)
r = api.ListArchive(req)
while r.pending:            # 30 günden eskiler S3'ten geri geliyor
    r = api.ListArchive(req)
paths = ["/kc/archive/" + f.path for f in r.files if f.local]

df = duckdb.sql(f"""
    SELECT exchange_ts, price_raw, price_scale, qty_raw, qty_scale, side
    FROM read_parquet({paths})
    WHERE exchange = 'binance' AND symbol = 'BTCUSDT' AND quality = 'OK' AND fsm = 'OK'
    ORDER BY exchange_ts""").df()

Parquet sütunları fixed-point'tir: x_raw / 10^x_scale. Temiz şerit = quality='OK' AND fsm='OK'. İşlemlerde origin='rest_backfill', iki bağlantının da kaçırıp borsanın REST'inden geri doldurulan işlemdir.

Kaynak politikası: büyük okumalar gece ya da hafta sonu yapılır, bot konteyneri en çok 2 çekirdekle sınırlanır. Kolektör her zaman önce gelir.

Veri kapsamı

Kolektörün topladığı her şey hem canlı hem geçmişiyle bu API'den alınır:

VeriCanlı kanalSon günler (sorgu)Tüm geçmiş (dosya)
İşlemler (Binance, Bybit)tradeGetTrades, 14 güntrades, 2 yıl
Bar'lar (1s–1h)barGetBars, 90 günbars, 2 yıl
En iyi fiyatbboGetHistory, 90 dk (aktif set)bbo, 2 yıl
Emir defteril2GetBookSnapshot (canary)l2, 2 yıl
Mark, fonlamamarkGetHistory, 90 dkmark, süresiz
TasfiyelerliqGetHistory, 90 dkliq, süresiz
Açık pozisyon, oranlaroiGetHistory, 90 dksparse, süresiz
Opsiyon işlemleri, mark, DVOLopt_trade, opt_mark, indexGetHistory, 90 dkopt_trades, opt_marks, deribit_index, süresiz
OKX oynaklık yüzeyiopt_surfaceGetHistory, 90 dkopt_surface, süresiz
Hyperliquid işlemlerihl_tradeGetHistory, 90 dkhl_trades, süresiz
Hyperliquid pozisyonlarıhl_positionGetHistory, 90 dkhl_positions, süresiz
COT, CoinGecko, DefiLlama, F&G, PolymarketaltGetHistory, 90 dkalt_raw, süresiz

Bu API'de olmayanlar: emir, pozisyon yönetimi, kaldıraç, kullanıcı verisi; OFI, VPIN, Sharpe gibi türetilmiş sinyaller (bunlar stratejinin işidir); spot, USDC, forex; kimlik doğrulama ve dışarıya açık port.

Sık sorulanlar

Hangi adrese bağlanacağım?

Konteynerden: kriptocollector:7070 (kc-consumers ağına katılmış olarak). Sunucunun kendisinden: 127.0.0.1:7070. Düşük gecikme: Unix soketi.

JSON alabilir miyim?

Hayır. Tel formatı md.v1 protobuf'tur; her dil için kod üretilebilir.

Birden fazla bot aynı anda bağlanır mı?

Evet. Her bağlantının ayrı kuyruğu var; kolektör hiçbirini beklemez.

Canlı bar'ı kaçırırsam?

GetBars aralıklı çağrı. Canlı akış en fazla bir kez teslim ettiği için kapanmış bar'ın kaynağı sorgudur.

Ne kadar geriye gidebilirim?

Sorgu ile bar'lar 90 gün, işlemler 14 gün. Bundan eskisi ve tüm tablolar ListArchive ile dosya olarak: işlem, bar, en iyi fiyat ve defter 2 yıl, diğer her şey süresiz (tablo).

Bağlanabildiğimi nasıl anlarım?

Kolektörün kendi örnek tüketicisi her deploy'dan sonra çalışır; logunda mdprobe OK görünüyorsa yol açıktır. Kendi botunuzda ilk çağrı Health olsun.

Bu sayfa proto/md/v1/md.proto ve SPEC §14.1 ile birlikte güncellenir. Bir alan ya da davranış değişirse önce SPEC, sonra proto, sonra bu sayfa.