icrypex-com / apidoc

ICRYPEX API Documentation
GNU General Public License v3.0
9 stars 3 forks source link

C# Websocket Orderbook #5

Open akrepfatih opened 1 year ago

akrepfatih commented 1 year ago

C# string msg = "subscribe|{"c":"orderbook@btcusdt","s":true}";

Websocket ile kanalı dinliyorum ama değişimleri veriyor. Burada bir paket kaçırırsak hiç iyi olmaz. Sürekli listeyi veren bir kanal var mı ?

mhelvacikoylu commented 1 year ago

Merhaba,

Maalesef her seferinde tüm orderbook datasını gönderen bir kanal mümkün değil. Bu her iki taraf için de aşırı derecede network bandwith kullanımına neden olabilecek bir durum.

Size gelen orderbook difference verisinde bulunan cs değişkeninde change set numarası her pakette artan numara olarak gelir. Eğer son aldığınız paket ile bir önceki arasındaki fark 1 değil ise arada bir pakedi kaçırmışsınız anlamına gelir. Böyle durumlarda kanala yeniden subscribe olmanız gerekir.

akrepfatih commented 1 year ago

Haklısınız paket kaçırdığımı bu şekilde bulabilirim. Listenin ilk 50 sini değil de ilk 5 i gibi bir kanal olsa bu fazla bandwith kullanımını azaltır diye düşünüyorum. 50 Yerine 5 yollamak % 90 gibi bir tasarruf sağlar. Bunun da iki tarafı da üzmeyeceğini düşünüyorum.

akrepfatih commented 1 year ago

{"pairSymbol":"BTCUSDT","asks":[{"p":"30546","q":"0.91938"},{"p":"30547","q":"0.32488"},{"p":"30548","q":"0.17396"},{"p":"30551","q":"0.89272"},{"p":"30553","q":"1.18969"}],"bids":[{"p":"30542","q":"0.82213"},{"p":"30537","q":"0.47291"},{"p":"30536","q":"2.5907"},{"p":"30534","q":"0.32023"},{"p":"30533","q":"0.42497"}]}

Yukarıdaki örnek 321 bayt büyüklüğünde biz diyelim 500 bayt. 100ms de 1 güncellense 500 10 = 5000 bayt = Yaklaşık 5 KB 1 saniye banwith kullanır. 5 KB 200 işlem çifti = 1000 KB = 1 Megabayt 200 işlem çifti için gerekli 1 saniyede ki banwith kullanımı.

Yine de siz bilirsiniz.

Tam incelime yapmasam da Api , Websocket leriniz düzgün gözüküyor. Çalışmalarınız da başarılar diliyorum.

mhelvacikoylu commented 1 year ago

Merhaba,

Öneriniz için teşekkürler. Websocket'e orderbook-short adında parametreli bir kanal eklenmiştir. Websocket kısmına kullanım şekli de eklenmiştir.

https://github.com/icrypex-com/apidoc/blob/main/websockets.md

akrepfatih commented 2 weeks ago

orderbook|{"ps":"AVAXUSDT/P","cs":0,"a":[{"q":"381.02685","p":"35.9"},{"q":"208.15863","p":"35.98"},{"q":"427.12047","p":"36.02"},{"q":"158.36602","p":"36.11"},{"q":"62.28367","p":"36.18"}],"b":[{"q":"100.92101","p":"35.79"},{"q":"252.13423","p":"35.77"},{"q":"268.67918","p":"35.68"},{"q":"461.75226","p":"35.55"},{"q":"306.80464","p":"35.46"}]}

cs verisi sürekli 0 geliyor yollamanızın bir anlamı var mı ?

timestamp ı da yollasanız iyi olurdu.

  1. timestamp : kanalı dinleyenlere yollarken. ( Icrypex server ından bize gelen zamanı yaklaşık bulmak için. )
  2. timestamp : oluşturulma zamanı tabi başka bir yerde oluşturup oradan alıyorsanız. Yollarken verileri alıyorsanız buna gerek yok. var selectedFields = new { XTS = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(), OTS = ****.ToString(), PS = js.PS?.ToString() }; var serializedData = JsonConvert.SerializeObject(selectedFields); if (F_Db._hubContext != null && js.PS != null) { if (selectedFields.PS != null) { await F_Db._hubContext.Clients.Group(selectedFields.PS).SendAsync("Icrypex_TradeSingle", serializedData); } //---------------------------------------------------------------------// Başka bir siteden örnek { "e":"bookTicker", // event type "u":400900217, // order book updateId "E": 1568014460893, // event time "T": 1568014460891, // transaction time "s":"BNBUSDT", // symbol "b":"25.35190000", // best bid price "B":"31.21000000", // best bid qty "a":"25.36520000", // best ask price "A":"40.66000000" // best ask qty }
mhelvacikoylu commented 2 weeks ago

Konuyu bug olarak işaretledim. İnceleme ve geliştirme tamamladıktan sonda dönüş yapılacaktır.