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.
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.kc-consumers Docker ağına ekleyin, kriptocollector:7070 adresine gRPC ile bağlanın. Daha düşük gecikme için Unix soketi.md.v1. JSON, Kafka, NATS, Redis yok.Health, ListInstruments, Subscribe, GetBars, GetTrades, GetHistory, GetBookSnapshot, GetIntegrity, ListArchive.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ıç
- Ağ: bot projenizin Dokploy compose'una
kc-consumersağını ekleyin (örnek). - İstemci: Go ise
kriptocollector/pkg/mdclient; başka dil iseproto/md/v1/md.proto'dan kod üretin (Python örneği). - Açılış:
Health→ListInstruments→ geçmişi ısıtın (GetBarszaman aralığıyla, son 90 dk içinGetHistory). - Araştırma / backtest:
ListArchiveile istediğiniz tablonun istediğiniz günlerini dosya olarak alın; DuckDB ya da pyarrow ile okuyun (nasıl). - Canlı:
Subscribeile istediğiniz kanallara abone olun. Varsayılan yalnız temiz (OK) veriyi gönderir. - Kopukluk:
conn_seqboşluğu,Integrityya 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üketici | Tipik yol | Tipik kanal |
|---|---|---|
| Scalp / kısa vade | Unix soketi, yedek gRPC | trade, bbo, l2 (canary), bar 1s |
| MFT / intraday | gRPC | bar 1m–1h, bbo, mark, liq, oi |
| Opsiyon / oynaklık | gRPC | opt_trade, opt_mark, opt_surface, index |
| Akıllı para / akış | gRPC | hl_trade, hl_position, alt |
| Araştırma | gRPC sorgu | GetBars, 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
| Yol | Adres | Ne zaman |
|---|---|---|
| gRPC (Docker ağı) | kriptocollector:7070, ağ kc-consumers | Varsayılan. Abonelik ve tüm sorgular. |
| gRPC (host) | 127.0.0.1:7070 | Konteyner değil, doğrudan sunucuda çalışan bir süreç için. |
| Unix soketi | host /var/lib/kriptocollector/run/md.sock | En 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-consumersağına açıktır; internetten erişilemez. - Unix soketi ağ üzerinden çalışmaz. Bot konteyneri host'taki
/var/lib/kriptocollector/rundizinini kendi içine bağlar (mount) ve soket dosyasına o yoldan bağlanır. Soketroot'a aittir (izin 660); bot konteyneri root ile ya da aynı grupla çalışmalıdır. - Unix soketi protokolü: istemci önce bir
SubscribeRequestgönderir, sonraEnvelope'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)
| Alan | Tip | Anlam |
|---|---|---|
exchange | string | binance, bybit; opsiyonlarda deribit, okx; ayrıca hyperliquid ve alt. |
symbol | string | Borsa sembolü (BTCUSDT), opsiyon adı ya da endeks adı. |
channel | string | Kanal adı (aşağıdaki katalog). |
exchange_ts | int64 | Borsa zamanı, Unix nanosaniye. Bar'da açılış zamanı. |
recv_ts | int64 | Kolektörün aldığı an, Unix nanosaniye. |
stream_seq | uint64 | borsa|sembol|kanal başına artan sayı. |
quality | enum | OK, DEGRADED, RESYNCING, STALE. Kalite makinesi ve kill-switch sonrası nihai şerit. |
generation | uint32 | Enstrü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)
| Alan | Anlam |
|---|---|
exchanges | binance, bybit, deribit, okx, hyperliquid, alt. Boş = hepsi. |
symbols | Tam ad ya da *'lı glob (BTC*). Boş = hepsi; çoğu bot kendi listesini verir. |
channels | trade, bbo, l2, bar, mark, oi, liq, opt_trade, opt_mark, opt_surface, index, hl_trade, hl_position, alt. Boş = hepsi (önerilmez: hacim yüksek). |
timeframes | Bar için 1s, 1m, 5m, 15m, 30m, 1h. 1s yalnız aktif sette üretilir. |
min_quality | Varsayılan OK (yalnız temiz veri). DEGRADED verirseniz şüpheli ve tek kaynaklı olaylar da gelir. |
active_set_only | true: yalnız günün aktif seti (BTC, ETH, SOL, DOGE, XRP + hacim/oynaklık seçilenler, ~15 sembol). |
policy | Kuyruk dolarsa: DROP_OLDEST (varsayılan) ya da DISCONNECT. Kolektör botu asla beklemez. |
queue | Bağlantı kuyruğu, olay sayısı. 0 = 65 536. |
client | Botun 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 veconn_seq'te boşluk olarak görünür. - Akış sessizken 5 saniyede bir
Heartbeatgelir. 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ı
Health
Kolektör ayakta mı. Yanıt: status (ok), server_ts, subscribers. Açılışta ve kopukluktan sonra çağrılır.
ListInstruments
Kesişim evreni. Açılışta ve generation değişince çağrılır.
| Alan | Anlam |
|---|---|
base | Dayanak, örn. BTC |
binance_symbol, bybit_symbol | İki borsadaki adı |
generation | Evren kuşağı |
active | Günün aktif setinde mi |
Subscribe
Canlı akış. Filtreler yukarıda. Akış, istemci bağlantıyı kapatana kadar sürer.
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.
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(…).
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.
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.
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.
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[].path | Arşiv bağlama noktasının altındaki yol, örn. parquet/bars/2026-10-06/13-…parquet |
files[].day, hour, rows, bytes, blake3 | Dosyanın günü, saati, satır sayısı, boyutu, özeti |
files[].local | Şu an okunabilir mi |
fetched, pending | Bu ç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.
| Kanal | Tip | Kapsam |
|---|---|---|
trade | Trade | Tüm evren, iki borsa |
bbo | Bbo | Tüm evren |
l2 | BookDelta | Temiz şeritte yalnız canary (çift tanıklı); diğerleri tek kaynaklı, DEGRADED |
bar | Bar | Tüm evren 1m–1h; 1s yalnız aktif set |
mark | Mark | Mark/endeks fiyatı ve fonlama |
oi | OpenInterest | Açık pozisyon ve oranlar (REST, seyrek) |
liq | Liquidation | Tasfiyeler |
opt_trade | OptionTrade | Deribit ve OKX, BTC/ETH opsiyonları |
opt_mark | OptionMark | Deribit, tüm opsiyonların mark + IV'si |
index | IndexTick | Deribit DVOL ve spot endeks |
opt_surface | OptionSurface | OKX oynaklık yüzeyi, dakikada bir, BTC/ETH tüm opsiyonlar |
hl_trade | HLTrade | Hyperliquid tüm perp işlemleri, alıcı ve satıcı adresiyle |
hl_position | HLPosition | Hyperliquid cüzdan × coin pozisyonları, dakikada bir (o dakika değişenler) |
alt | AltData | CFTC COT, CoinGecko türevleri, DefiLlama, Fear & Greed, Polymarket |
Trade
trade_id | Borsa kimliği (Binance aggTrade no, Bybit UUID) |
price, qty | Decimal |
side | Taker yönü: BUY, SELL |
single_feed | İkinci bağlantı tanıklık etmedi (temiz şeritte gelmez) |
diverged | İki bağlantı farklı söyledi |
off_tick | Fiyat tick ızgarasının dışında (gerçek veri, temiz değil) |
block_trade, rpi | Bybit 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_ts | Kova ve açılış zamanı (UTC, ns) |
open, high, low, close | Decimal |
volume, buy_volume, sell_volume, vwap | Decimal |
notional | Σ fiyat×miktar, kesin ondalık metin |
trades, buys, sells, degraded | İşlem sayıları; degraded = temiz olmayan işlem sayısı |
clean | Bar'daki her işlem temiz |
complete | false taslak, true kapanmış |
revision | Geç gelen işlemle düzeltilen bar'ın sürümü |
block_volume, block_trades, rpi_volume | Hacmin 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ı. |
DEGRADED | Tek kaynaklı, çelişkili ya da boşluk sonrası. Temiz şeritte gelmez; açıkça istenirse gelir. |
RESYNCING | Hizalanma bitene kadar yeni giriş yok. |
STALE | Kanal 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>.json | status: 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>.json | Gece testi: canlı barların ham kayıttan birebir yeniden üretimi ve ham ↔ Parquet işlem karşılaştırması |
/kc/archive/manifest/<gün>.json | Gü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_seqboşluğu (Go'daonGapçağrılır)Integrityolayıgenerationartışı 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ı:
Healthcevap verene kadar artan aralıklarla yeniden bağlanır, sonra boşluğuGetTrades/GetBars(aralıklı) veGetHistoryile doldurur. Binance işlemlerinde iki bağlantının da kaçırdığı kısım birkaç dakika içinde REST'ten geri doldurulur (arşivdeDEGRADED).
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.
| Veri | Nerede |
|---|---|
| İş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, bakiyesi | Trade 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 sonucu | Trade 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:
| Veri | Canlı kanal | Son günler (sorgu) | Tüm geçmiş (dosya) |
|---|---|---|---|
| İşlemler (Binance, Bybit) | trade | GetTrades, 14 gün | trades, 2 yıl |
| Bar'lar (1s–1h) | bar | GetBars, 90 gün | bars, 2 yıl |
| En iyi fiyat | bbo | GetHistory, 90 dk (aktif set) | bbo, 2 yıl |
| Emir defteri | l2 | GetBookSnapshot (canary) | l2, 2 yıl |
| Mark, fonlama | mark | GetHistory, 90 dk | mark, süresiz |
| Tasfiyeler | liq | GetHistory, 90 dk | liq, süresiz |
| Açık pozisyon, oranlar | oi | GetHistory, 90 dk | sparse, süresiz |
| Opsiyon işlemleri, mark, DVOL | opt_trade, opt_mark, index | GetHistory, 90 dk | opt_trades, opt_marks, deribit_index, süresiz |
| OKX oynaklık yüzeyi | opt_surface | GetHistory, 90 dk | opt_surface, süresiz |
| Hyperliquid işlemleri | hl_trade | GetHistory, 90 dk | hl_trades, süresiz |
| Hyperliquid pozisyonları | hl_position | GetHistory, 90 dk | hl_positions, süresiz |
| COT, CoinGecko, DefiLlama, F&G, Polymarket | alt | GetHistory, 90 dk | alt_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.