瀏覽代碼

新版html格式,更省空间

skyfffire 11 月之前
父節點
當前提交
fdbcec842b
共有 3 個文件被更改,包括 67 次插入62 次删除
  1. 18 18
      src/server.rs
  2. 48 42
      strategy/src/avellaneda_stoikov.rs
  3. 1 2
      strategy/src/utils.rs

+ 18 - 18
src/server.rs

@@ -35,23 +35,23 @@ async fn get_account(arcs: web::Data<Arcs>) -> impl Responder {
 }
 
 // 句柄 GET 请求
-#[get("/predictor_state")]
-async fn get_predictor_state(arcs: web::Data<Arcs>) -> impl Responder {
-    // --------------------------------数据解锁处理--------------------------------
-    let cci = arcs.cci_cache_arc.lock().await;
-
-    // 实时请求只回报最后1w条
-    // 获取最后1w条数据
-    let last_10k = if cci.predictor_state_vec.len() >= 10_000 {
-        &cci.predictor_state_vec[cci.predictor_state_vec.len() - 10_000..] // 使用切片获取最后 10 万条
-    } else {
-        &cci.predictor_state_vec[..] // 如果长度不足 10 万条,则返回整个 Vec
-    };
-
-    // --------------------------------回报--------------------------------
-    let json_string = serde_json::to_string(&last_10k).unwrap();
-    HttpResponse::Ok().content_type("application/json").body(json_string)
-}
+// #[get("/predictor_state")]
+// async fn get_predictor_state(arcs: web::Data<Arcs>) -> impl Responder {
+//     // --------------------------------数据解锁处理--------------------------------
+//     let cci = arcs.cci_cache_arc.lock().await;
+//
+//     // 实时请求只回报最后1w条
+//     // 获取最后1w条数据
+//     let last_10k = if cci.predictor_state_vec.len() >= 10_000 {
+//         &cci.predictor_state_vec[cci.predictor_state_vec.len() - 10_000..] // 使用切片获取最后 10 万条
+//     } else {
+//         &cci.predictor_state_vec[..] // 如果长度不足 10 万条,则返回整个 Vec
+//     };
+//
+//     // --------------------------------回报--------------------------------
+//     let json_string = serde_json::to_string(&last_10k).unwrap();
+//     HttpResponse::Ok().content_type("application/json").body(json_string)
+// }
 
 // 句柄 POST 请求
 #[post("/exit")]
@@ -109,7 +109,7 @@ pub fn run_server(port: u32, running: Arc<AtomicBool>, cci_arc: Arc<Mutex<Centra
             .wrap(cors)
             .app_data(web::Data::new(arcs_clone))
             .service(get_account)
-            .service(get_predictor_state)
+            // .service(get_predictor_state)
             .service(on_change)
     })
     .bind(addr)

+ 48 - 42
strategy/src/avellaneda_stoikov.rs

@@ -9,7 +9,6 @@ use tracing::{info};
 use global::cci::CentralControlInfo;
 use global::fixed_time_range_deque::FixedTimeRangeDeque;
 use global::params::Params;
-use global::predictor_state::PredictorState;
 use standard::{Depth, Record, Ticker, Trade};
 use crate::utils;
 
@@ -56,6 +55,7 @@ pub struct AvellanedaStoikov {
     pub order_ref_price: Decimal,                                               // 下单时的预定价格
 
     pub cci_arc: Arc<Mutex<CentralControlInfo>>,                                // 中控信息
+    pub debugs: Vec<Vec<Decimal>>,                                              // debug数据等
 
     pub is_ready: bool,
     pub prev_trade_time: i64,                                                   // 上次交易时间,也就是t
@@ -118,6 +118,7 @@ impl AvellanedaStoikov {
 
             cci_arc,
 
+            debugs: vec![],
             is_ready: false,
             prev_trade_time: Utc::now().timestamp_micros(),
             close_price: Default::default(),
@@ -262,6 +263,7 @@ impl AvellanedaStoikov {
         } else {
             self.fair_price_vec[index] * dec!(0.9) + fair_price * dec!(0.1)
         };
+        self.fair_price_vec[index].rescale(self.mid_price.scale());
         self.volume_vec[index] = a1.size + b1.size;
     }
 
@@ -418,6 +420,9 @@ impl AvellanedaStoikov {
         } else {
             min(self.ref_price - self.bid_delta, self.ask_price)
         };
+
+        self.optimal_ask_price.rescale(self.mid_price.scale());
+        self.optimal_bid_price.rescale(self.mid_price.scale());
     }
 
     pub fn update_t_diff(&mut self) {
@@ -519,7 +524,7 @@ impl AvellanedaStoikov {
         // }
 
 
-        let cci_arc = self.cci_arc.clone();
+        // let cci_arc = self.cci_arc.clone();
         let now = Decimal::from_i64(Utc::now().timestamp_millis()).unwrap();
         let mid_price = self.mid_price;
         let ask_price = self.ask_price;
@@ -547,42 +552,47 @@ impl AvellanedaStoikov {
 
         self.prev_insert_time = now;
 
-        // 将数据放入cci里面,方便读取
-        let cci_arc_clone = cci_arc.clone();
-        tokio::spawn(async move {
-            let mut cci = cci_arc_clone.lock().await;
-
-            // let kappa = Decimal::from(cci.predictor_state_vec.len());
-
-            cci.predictor_state_vec.push(PredictorState {
-                update_time: now,
-
-                mid_price,
-                ask_price,
-                bid_price,
-                last_price,
-
-                spread,
-                spread_max,
-                spread_min,
-                optimal_ask_price,
-                optimal_bid_price,
-
-                inventory,
-                sigma_square,
-                gamma,
-                kappa,
-
-                flow_ratio,
-                ref_price,
-            });
+        // 将数据放入debugs里面
+        if self.debugs.is_empty() {
+            self.debugs = vec![Vec::new(); 16];
+        }
+        self.debugs[0].push(now);
+        self.debugs[1].push(mid_price);
+        self.debugs[2].push(ask_price);
+        self.debugs[3].push(bid_price);
+        self.debugs[4].push(last_price);
+        self.debugs[5].push(spread);
+        self.debugs[6].push(spread_max);
+        self.debugs[7].push(spread_min);
+        self.debugs[8].push(optimal_ask_price);
+        self.debugs[9].push(optimal_bid_price);
+        self.debugs[10].push(inventory);
+        self.debugs[11].push(sigma_square);
+        self.debugs[12].push(gamma);
+        self.debugs[13].push(kappa);
+        self.debugs[14].push(flow_ratio);
+        self.debugs[15].push(ref_price);
+
+        // 长度限定
+        if self.debugs[0].len() > 700_000 {
+            self.debugs[0].remove(0);
+            self.debugs[1].remove(0);
+            self.debugs[2].remove(0);
+            self.debugs[3].remove(0);
+            self.debugs[4].remove(0);
+            self.debugs[5].remove(0);
+            self.debugs[6].remove(0);
+            self.debugs[7].remove(0);
+            self.debugs[8].remove(0);
+            self.debugs[9].remove(0);
+            self.debugs[10].remove(0);
+            self.debugs[11].remove(0);
+            self.debugs[12].remove(0);
+            self.debugs[13].remove(0);
+            self.debugs[14].remove(0);
+            self.debugs[15].remove(0);
+        }
 
-            // 长度限定,最大100w条
-            if cci.predictor_state_vec.len() > 700_000 {
-                cci.predictor_state_vec.remove(0);
-            }
-        });
-        //
         let error_rate = self.error_rate;
         // 将数据存入本地json文件,要求不能在行情烈度比较大的时候执行这个逻辑,防止卡交易逻辑
         if now - self.prev_save_time < dec!(60000) || error_rate > dec!(0.15) {
@@ -591,11 +601,7 @@ impl AvellanedaStoikov {
         // 存放逻辑
         info!("存放, {}, {}, {}", now, self.prev_save_time, now - self.prev_save_time);
 
-
-
-        let cci = cci_arc.lock().await;
-        let data_c = cci.predictor_state_vec.clone();
-
+        let data_c = self.debugs.clone();
         tokio::spawn(async move {
             let temp_html_str = utils::build_html_file(&data_c).await;
             utils::write_to_file(&temp_html_str, "./db/db.html".to_string()).await;

+ 1 - 2
strategy/src/utils.rs

@@ -7,7 +7,6 @@ use tokio::fs;
 use tokio::fs::File;
 use tokio::io::AsyncWriteExt;
 use tracing::{error};
-use global::predictor_state::PredictorState;
 use global::public_params;
 
 // 生成订单的id,可以根据交易所名字来
@@ -160,7 +159,7 @@ pub async fn write_to_file(json_data: &String, file_path: String) {
     }
 }
 
-pub async fn build_html_file(data_c: &Vec<PredictorState>) -> String {
+pub async fn build_html_file(data_c: &Vec<Vec<Decimal>>) -> String {
     let temp_json_str = serde_json::to_string(&data_c).unwrap();
 
     let str1 = r##"