Prechádzať zdrojové kódy

两个交易所有差价时,价格修复。

skyfffire 1 rok pred
rodič
commit
ae054fdeb9
1 zmenil súbory, kde vykonal 17 pridanie a 2 odobranie
  1. 17 2
      strategy/src/avellaneda_stoikov.rs

+ 17 - 2
strategy/src/avellaneda_stoikov.rs

@@ -14,7 +14,8 @@ use standard::{Depth, Record, Ticker, Trade};
 #[derive(Debug)]
 pub struct AvellanedaStoikov {
     pub depth_vec: Vec<Depth>,                                                  // 深度队列
-    pub fair_price_vec: Vec<Decimal>,                                           // 深度队列
+    pub fair_price_vec: Vec<Decimal>,                                           // 预定价格队列
+    pub volume_vec: Vec<Decimal>,                                               // 深度队列
     pub trade_long_vec: FixedTimeRangeDeque<Trade>,                             // 交易队列
     pub trade_short_vec: FixedTimeRangeDeque<Trade>,                            // 交易队列
     pub spread_vec: Vec<Decimal>,                                               // 市场冲击队列
@@ -65,6 +66,7 @@ impl AvellanedaStoikov {
             // 接针版本
             depth_vec: vec![Depth::new(); 10],
             fair_price_vec: vec![Decimal::ZERO; 10],
+            volume_vec: vec![Decimal::ZERO; 10],
 
             // 老的队列
             spread_vec: vec![],
@@ -196,6 +198,7 @@ impl AvellanedaStoikov {
         let fair_price = mid + (a1.price - b1.price) * i_upper / Decimal::TWO;
 
         self.fair_price_vec[index] = fair_price;
+        self.volume_vec[index] = a1.size + b1.size;
     }
 
     pub async fn update_level(&mut self) {
@@ -254,7 +257,19 @@ impl AvellanedaStoikov {
 
     pub fn update_ref_price(&mut self) {
         if !self.fair_price_vec[0].is_zero() && !self.fair_price_vec[1].is_zero() {
-            self.ref_price = (self.fair_price_vec[0] + self.fair_price_vec[1]) / Decimal::TWO;
+            let v0_rate = self.volume_vec[0] / (self.volume_vec[0] + self.volume_vec[1]);
+            let v1_rate = self.volume_vec[1] / (self.volume_vec[0] + self.volume_vec[1]);
+
+
+            let sma = self.depth_vec[1].asks[0].price;
+            let smb = self.depth_vec[1].bids[0].price;
+
+            let mp0 = self.mid_price;
+            let mp1 = (sma + smb) / Decimal::TWO;
+
+            let price_diff = mp0 - mp1;
+
+            self.ref_price = self.fair_price_vec[0] * v0_rate + self.fair_price_vec[1] * v1_rate + price_diff / Decimal::TWO;
         }
     }