소스 검색

feat: allow higher level depth streams for heatmap chart

Berke 1 년 전
부모
커밋
88a8f1070c
3개의 변경된 파일20개의 추가작업 그리고 39개의 파일을 삭제
  1. 13 31
      src/charts/heatmap.rs
  2. 6 7
      src/data_providers/binance/market_data.rs
  3. 1 1
      src/data_providers/bybit/market_data.rs

+ 13 - 31
src/charts/heatmap.rs

@@ -84,33 +84,25 @@ impl HeatmapChart {
         let mut min_bid_price = f32::MAX;
 
         for (_, (depth, _)) in self.data_points.range(earliest..=latest) {
+            let mid_price = (self.price_to_float(
+                *depth.asks.keys().next().unwrap_or(&0)
+            ) + self.price_to_float(
+                *depth.bids.keys().last().unwrap_or(&0)
+            )) / 2.0;
+
             if self.chart.autoscale {
                 max_ask_price = max_ask_price.max(
-                    self.price_to_float(
-                        *depth.asks.keys().last().unwrap_or(&0)
-                    )
+                    mid_price + (100.0 * self.tick_size)
                 );
                 min_bid_price = min_bid_price.min(
-                    self.price_to_float(
-                        *depth.bids.keys().next().unwrap_or(&0)
-                    )
+                    mid_price - (100.0 * self.tick_size)
                 );
             } else {
                 max_ask_price = max_ask_price.max(
-                    self.price_to_float(
-                        *depth.asks.keys().nth(self.y_scaling.try_into().unwrap_or(20))
-                            .unwrap_or(depth.asks.keys().last()
-                                .unwrap_or(&0)
-                            )
-                    )
+                    mid_price + (self.y_scaling as f32 * self.tick_size)
                 );
                 min_bid_price = min_bid_price.min(
-                    self.price_to_float(
-                        *depth.bids.keys().nth_back(self.y_scaling.try_into().unwrap_or(20))
-                            .unwrap_or(depth.bids.keys().next()
-                                .unwrap_or(&0)
-                            )
-                    )
+                    mid_price - (self.y_scaling as f32 * self.tick_size)
                 );
             }
         }
@@ -171,7 +163,7 @@ impl HeatmapChart {
     pub fn render_start(&mut self) {  
         let (latest, earliest, highest, lowest) = self.calculate_range();
 
-        if latest == 0 || highest == 0.0 {
+        if latest == 0 || highest == 0.0 || lowest == 0.0 {
             return;
         }
 
@@ -251,19 +243,9 @@ impl HeatmapChart {
                     self.chart.autoscale = false;
                 }
 
-                let last_depth_bids_len = self.data_points.last_key_value().map(|(_, (depth, _))| depth.bids.len()).unwrap_or(0);
-                let last_depth_asks_len = self.data_points.last_key_value().map(|(_, (depth, _))| depth.asks.len()).unwrap_or(0);
-
-                let max_len_depth: i32 = last_depth_bids_len.max(last_depth_asks_len).try_into().unwrap_or(0);
-
-                if last_depth_bids_len == 0 || last_depth_asks_len == 0 || max_len_depth == 0 {
-                    log::error!("No depth data available to y scaling");
-                    return
-                };
-
                 if *delta < 1.0 {
-                    if self.y_scaling < max_len_depth {
-                        self.y_scaling = (self.y_scaling + (delta * 10.0) as i32).min(max_len_depth);
+                    if self.y_scaling < 500 {
+                        self.y_scaling = (self.y_scaling + (delta * 10.0) as i32).min(500);
                     }
                 } else {
                     if self.y_scaling > 10 {

+ 6 - 7
src/data_providers/binance/market_data.rs

@@ -1,6 +1,6 @@
 use iced::{futures, stream};  
-use futures::stream::{Stream, StreamExt};
-use serde::{Deserializer};
+use futures::stream::Stream;
+use serde::Deserializer;
 use futures::sink::SinkExt;
 
 use serde_json::Value;
@@ -8,9 +8,8 @@ use crate::{Ticker, Timeframe};
 
 use bytes::Bytes;
 
-use sonic_rs::{JsonValueTrait};
-use sonic_rs::{Deserialize, Serialize}; 
-use sonic_rs::{to_object_iter_unchecked};
+use sonic_rs::{Deserialize, Serialize, JsonValueTrait}; 
+use sonic_rs::to_object_iter_unchecked;
 
 use anyhow::{Context, Result};
 
@@ -151,7 +150,7 @@ impl StreamName {
         if let Some(after_at) = stream_type.split('@').nth(1) {
             match after_at {
                 _ if after_at.starts_with("dep") => StreamName::Depth,
-                _ if after_at.starts_with("tra") => StreamName::Trade,
+                _ if after_at.starts_with("agg") => StreamName::Trade,
                 _ if after_at.starts_with("kli") => StreamName::Kline,
                 _ => StreamName::Unknown,
             }
@@ -314,7 +313,7 @@ pub fn connect_market_stream(ticker: Ticker) -> impl Stream<Item = Event> {
                 Ticker::LTCUSDT => "ltcusdt",
             };
 
-            let stream_1 = format!("{symbol_str}@trade");
+            let stream_1 = format!("{symbol_str}@aggTrade");
             let stream_2 = format!("{symbol_str}@depth@100ms");
 
             let mut orderbook: LocalDepthCache = LocalDepthCache::new();

+ 1 - 1
src/data_providers/bybit/market_data.rs

@@ -323,7 +323,7 @@ pub fn connect_market_stream(ticker: Ticker) -> impl Stream<Item = Event> {
             };
 
             let stream_1 = format!("publicTrade.{symbol_str}");
-            let stream_2 = format!("orderbook.200.{symbol_str}");
+            let stream_2 = format!("orderbook.500.{symbol_str}");
 
             let mut orderbook: LocalDepthCache = LocalDepthCache::new();