Browse Source

改为时间窗口。

skyffire 1 year ago
parent
commit
b53e04291c
1 changed files with 31 additions and 25 deletions
  1. 31 25
      strategy/src/predictor.rs

+ 31 - 25
strategy/src/predictor.rs

@@ -1,31 +1,37 @@
 use std::collections::{BTreeMap, VecDeque};
+use chrono::Utc;
 use rust_decimal::prelude::*;
 use tracing::info;
 use standard::{Depth, Ticker, Trade};
 
-const MAX_DATA_LENGTH: usize = 1000;
-
 // 定制的队列,可以统一指定长度
 #[derive(Debug)]
 pub struct FixedLengthDeque<T> {
     pub deque: VecDeque<T>,
-    max_len: usize,
+    pub deque_t: VecDeque<i64>
 }
 
 impl<T> FixedLengthDeque<T> {
-    fn new(max_len: usize) -> Self {
+    // 时间窗口大小(微秒)
+    const MAX_TIME_RANGE_MICROS: i64 = 10_000_000_000;
+
+    fn new() -> Self {
         FixedLengthDeque {
             deque: VecDeque::new(),
-            max_len,
+            deque_t: VecDeque::new()
         }
     }
 
     pub fn push_back(&mut self, value: T) {
+        let now = Utc::now().timestamp_micros();
+
         self.deque.push_back(value);
-        // =================== 之后如果要以时间作为限制,在这里改就行了 ==================
-        // 检查长度,如果超过最大长度,则移除前端元素
-        if self.deque.len() > self.max_len {
+        self.deque_t.push_back(now);
+
+        // =================== 检查长度,如果超过时间窗口,则移除前端元素 ==================
+        while self.deque_t.len() > 0 && now - self.deque_t.get(0).unwrap() > Self::MAX_TIME_RANGE_MICROS {
             self.deque.pop_front();
+            self.deque_t.pop_front();
         }
     }
 
@@ -83,18 +89,18 @@ pub struct AvellanedaStoikov {
 impl AvellanedaStoikov {
     pub fn new() -> Self {
         let avellaneda_stoikov = Self {
-            // 分别给与MAX_DATA_LENGTH的长度
-            depth_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            trade_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
+            // 分别给与的长度
+            depth_vec: FixedLengthDeque::new(),
+            trade_vec: FixedLengthDeque::new(),
             
-            mid_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            ask_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            bid_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            spread_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            spread_max_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            spread_min_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            optimal_ask_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            optimal_bid_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
+            mid_price_vec: FixedLengthDeque::new(),
+            ask_price_vec: FixedLengthDeque::new(),
+            bid_price_vec: FixedLengthDeque::new(),
+            spread_vec: FixedLengthDeque::new(),
+            spread_max_vec: FixedLengthDeque::new(),
+            spread_min_vec: FixedLengthDeque::new(),
+            optimal_ask_price_vec: FixedLengthDeque::new(),
+            optimal_bid_price_vec: FixedLengthDeque::new(),
             
             mid_price: Default::default(),
             ask_price: Default::default(),
@@ -105,12 +111,12 @@ impl AvellanedaStoikov {
             optimal_ask_price: Default::default(),
             optimal_bid_price: Default::default(),
 
-            inventory_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            gamma_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            sigma_square_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            delta_plus_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            kappa_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
-            ref_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
+            inventory_vec: FixedLengthDeque::new(),
+            gamma_vec: FixedLengthDeque::new(),
+            sigma_square_vec: FixedLengthDeque::new(),
+            delta_plus_vec: FixedLengthDeque::new(),
+            kappa_vec: FixedLengthDeque::new(),
+            ref_price_vec: FixedLengthDeque::new(),
 
             inventory: Default::default(),
             gamma: Default::default(),