skyfffire 11 місяців тому
батько
коміт
34b6fafd3a
3 змінених файлів з 32 додано та 13 видалено
  1. 3 4
      global/src/cci.rs
  2. 1 1
      src/server.rs
  3. 28 8
      strategy/src/avellaneda_stoikov.rs

+ 3 - 4
global/src/cci.rs

@@ -1,6 +1,5 @@
 use rust_decimal::Decimal;
 use serde_derive::Serialize;
-use crate::fixed_time_range_deque::FixedTimeRangeDeque;
 use crate::predictor_state::PredictorState;
 
 #[derive(Serialize, Clone, Debug)]
@@ -11,12 +10,12 @@ pub struct CentralControlInfo {
     pub entry_price: Decimal,                                       // 开仓价格
     pub now_price: Decimal,                                         // 当前价格
 
-    pub predictor_state_vec: FixedTimeRangeDeque<PredictorState>,   // 模型状态
+    pub predictor_state_vec: Vec<PredictorState>,                   // 模型状态
 }
 
 impl CentralControlInfo {
     // 时间窗口大小(微秒)
-    const MAX_TIME_RANGE_MICROS: i64 = 2 * 60 * 60_000_000;
+    // const MAX_TIME_RANGE_MICROS: i64 = 2 * 60 * 60_000_000;
 
     pub fn new() -> Self {
         Self {
@@ -25,7 +24,7 @@ impl CentralControlInfo {
             pos: Default::default(),
             entry_price: Default::default(),
             now_price: Default::default(),
-            predictor_state_vec: FixedTimeRangeDeque::new(Self::MAX_TIME_RANGE_MICROS),
+            predictor_state_vec: vec![],
         }
     }
 }

+ 1 - 1
src/server.rs

@@ -41,7 +41,7 @@ async fn get_predictor_state(arcs: web::Data<Arcs>) -> impl Responder {
     let cci = arcs.cci_cache_arc.lock().await;
 
     // --------------------------------回报--------------------------------
-    let json_string = serde_json::to_string(&cci.predictor_state_vec.deque).unwrap();
+    let json_string = serde_json::to_string(&cci.predictor_state_vec).unwrap();
     HttpResponse::Ok().content_type("application/json").body(json_string)
 }
 

+ 28 - 8
strategy/src/avellaneda_stoikov.rs

@@ -60,7 +60,9 @@ pub struct AvellanedaStoikov {
     pub t_diff: Decimal,                                                        // (T-t)
     pub last_update_time: Decimal,
     pub last_index: Decimal,
+
     pub prev_insert_time: Decimal,
+    pub prev_save_time: Decimal,
 }
 
 impl AvellanedaStoikov {
@@ -124,8 +126,10 @@ impl AvellanedaStoikov {
             short_trade_len_dec: Default::default(),
             last_update_time: Default::default(),
             last_index: Default::default(),
-            prev_insert_time: Default::default(),
             pos_avg_price: Default::default(),
+
+            prev_insert_time: Default::default(),
+            prev_save_time: Decimal::from(Utc::now().timestamp_millis()),
         };
 
         avellaneda_stoikov
@@ -216,7 +220,7 @@ impl AvellanedaStoikov {
         self.error_rate.rescale(4);
 
         self.last_price = trade.price;
-        self.processor().await;
+        // self.processor().await;
     }
 
     pub async fn update_fair_price(&mut self, depth: &Depth, index: usize) {
@@ -503,19 +507,20 @@ impl AvellanedaStoikov {
         let flow_ratio = Decimal::ZERO;
         let ref_price = self.ref_price;
 
-        let need_append = now - self.prev_insert_time > Decimal::TEN;
-        if !need_append {
-            return;
-        }
+        // let need_append = now - self.prev_insert_time > Decimal::TEN;
+        // if !need_append {
+        //     return;
+        // }
 
         self.prev_insert_time = now;
-        // 数据量太多导致的,减少一些吧
+
+        // 将数据放入cci里面,方便读取
         tokio::spawn(async move {
             let mut cci = cci_arc.lock().await;
 
             let kappa = Decimal::from(cci.predictor_state_vec.len());
 
-            cci.predictor_state_vec.push_back(PredictorState {
+            cci.predictor_state_vec.push(PredictorState {
                 update_time: now,
 
                 mid_price,
@@ -537,7 +542,22 @@ impl AvellanedaStoikov {
                 flow_ratio,
                 ref_price,
             });
+
+            // 长度限定,最大100w条
+            if cci.predictor_state_vec.len() > 1_000_000 {
+                cci.predictor_state_vec.remove(0);
+            }
         });
+
+        let prev_save_time = self.prev_save_time;
+        let error_rate = self.error_rate;
+        // 将数据存入本地json文件,要求不能在行情烈度比较大的时候执行这个逻辑,防止卡交易逻辑
+        if now - prev_save_time < dec!(60000) && error_rate > dec!(0.15) {
+            return;
+        }
+
+        self.prev_save_time = Decimal::from(Utc::now().timestamp_millis());
+        // 存放逻辑
     }
 
     // #[instrument(skip(self, ref_ticker_map), level="TRACE")]