Przeglądaj źródła

1. 使用双端队列解决性能问题
2. 降低数据采样精度

skyffire 11 miesięcy temu
rodzic
commit
daaf16ffb5
2 zmienionych plików z 17 dodań i 79 usunięć
  1. 15 78
      strategy/src/avellaneda_stoikov.rs
  2. 2 1
      strategy/src/utils.rs

+ 15 - 78
strategy/src/avellaneda_stoikov.rs

@@ -1,14 +1,12 @@
 use std::cmp::{max, min};
 use std::collections::{BTreeMap, VecDeque};
 use std::sync::Arc;
-use std::time::Duration;
 use chrono::{Utc};
 use futures_channel::mpsc::UnboundedSender;
 use futures_util::StreamExt;
 use rust_decimal::prelude::*;
 use rust_decimal_macros::dec;
 use tokio::sync::{Mutex};
-use tokio::time::sleep;
 use tracing::{info};
 use global::cci::CentralControlInfo;
 use global::fixed_time_range_deque::FixedTimeRangeDeque;
@@ -94,36 +92,34 @@ impl AvellanedaStoikov {
 
         tokio::spawn(async move {
             let len = 16usize;
-            let mut prev_save_time = dec!(0);
-            let mut debugs: Vec<Vec<Decimal>> = vec![Vec::new(); len];
+            let mut prev_save_time = Decimal::from(Utc::now().timestamp_millis());
+            let mut debugs: Vec<VecDeque<Decimal>> = vec![VecDeque::new(); len];
 
             loop {
                 while let Some(value) = rx.next().await {
                     // 数据填充到对应位置
                     for i in 0..len {
-                        debugs[i].push(value[i]);
+                        debugs[i].push_back(value[i]);
                     }
 
                     // 长度限制
-                    if debugs[0].len() > 700_000 {
+                    if debugs[0].len() > 1_000_000 {
                         for i in 0..len {
-                            debugs[i].remove(0);
+                            debugs[i].pop_front(); // 从前面移除元素
                         }
                     }
-                }
-
-                let now = Decimal::from(Utc::now().timestamp_millis());
-                if now - prev_save_time < dec!(60000) {
-                    sleep(Duration::from_millis(1000)).await;
 
-                    continue;
-                }
+                    let now = Decimal::from(Utc::now().timestamp_millis());
+                    if now - prev_save_time < dec!(60000) {
+                        continue;
+                    }
 
-                let temp_html_str = utils::build_html_file(&debugs).await;
-                utils::write_to_file(&temp_html_str, "./db/db.html".to_string()).await;
+                    let temp_html_str = utils::build_html_file(&debugs).await;
+                    utils::write_to_file(&temp_html_str, "./db/db.html".to_string()).await;
 
-                prev_save_time = Decimal::from(Utc::now().timestamp_millis());
-                info!("存放完毕, {}", prev_save_time - now);
+                    prev_save_time = Decimal::from(Utc::now().timestamp_millis());
+                    info!("存放完毕, {}, {}", prev_save_time - now, debugs[0].len());
+                }
             }
         });
 
@@ -592,7 +588,7 @@ impl AvellanedaStoikov {
         let flow_ratio = Decimal::ZERO;
         let ref_price = self.ref_price;
 
-        let need_append = now - self.prev_insert_time > Decimal::TEN;
+        let need_append = now - self.prev_insert_time > dec!(50);
         if !need_append {
             return;
         }
@@ -615,65 +611,6 @@ impl AvellanedaStoikov {
             flow_ratio,
             ref_price
         ]).unwrap()
-
-        // self.prev_insert_time = now;
-        //
-        // // 将数据放入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);
-        // }
-        //
-        // // 将数据存入本地json文件,要求不能在行情烈度比较大的时候执行这个逻辑,防止卡交易逻辑
-        // if now - self.prev_save_time < dec!(60000) {
-        //     return;
-        // }
-        // // 存放逻辑
-        // info!("存放, {}, {}, {}", now, self.prev_save_time, now - self.prev_save_time);
-        //
-        // 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;
-        // });
-        //
-        // self.prev_save_time = Decimal::from(Utc::now().timestamp_millis());
-        // info!("存放完毕, {}", self.prev_save_time - now);
     }
 
     // #[instrument(skip(self, ref_ticker_map), level="TRACE")]

+ 2 - 1
strategy/src/utils.rs

@@ -1,3 +1,4 @@
+use std::collections::VecDeque;
 use std::ops::{Div, Mul};
 use std::path::Path;
 use chrono::Utc;
@@ -159,7 +160,7 @@ pub async fn write_to_file(json_data: &String, file_path: String) {
     }
 }
 
-pub async fn build_html_file(data_c: &Vec<Vec<Decimal>>) -> String {
+pub async fn build_html_file(data_c: &Vec<VecDeque<Decimal>>) -> String {
     let temp_json_str = serde_json::to_string(&data_c).unwrap();
 
     let str1 = r##"