Răsfoiți Sursa

预估利润点数的查看。

skyffire 1 an în urmă
părinte
comite
e637412456
1 a modificat fișierele cu 21 adăugiri și 1 ștergeri
  1. 21 1
      strategy/src/avellaneda_stoikov.rs

+ 21 - 1
strategy/src/avellaneda_stoikov.rs

@@ -43,6 +43,8 @@ pub struct AvellanedaStoikov {
     pub money_flow: Decimal,                                                    // 资金流
     pub money_flow_ema: Decimal,                                                // 资金流ema
     pub money_flow_diff: Decimal,                                               // 资金流差值
+    pub money_flow_prev_cross: Decimal,                                         // 资金量上次穿越0轴时的价格
+    pub total_cross_diff: Decimal,                                              // 总共的穿越和(理论利润)
 
     pub ask_delta: Decimal,                                                     // δa
     pub bid_delta: Decimal,                                                     // δb
@@ -101,6 +103,7 @@ impl AvellanedaStoikov {
             money_flow: Default::default(),
             money_flow_ema: Default::default(),
             money_flow_diff: Default::default(),
+            money_flow_prev_cross: Default::default(),
             open_interest: Default::default(),
             open_interest_ema: Default::default(),
             open_interest_diff: Default::default(),
@@ -109,6 +112,7 @@ impl AvellanedaStoikov {
             prev_trade_time: Utc::now().timestamp_micros(),
             t_diff: Default::default(),
             level: Default::default(),
+            total_cross_diff: Default::default(),
         };
 
         avellaneda_stoikov
@@ -329,7 +333,23 @@ impl AvellanedaStoikov {
             } else {
                 dec!(0.01) * self.money_flow + dec!(0.99) * self.money_flow_ema
             };
+
+            let prev_money_flow_diff = self.money_flow_diff;
             self.money_flow_diff = self.money_flow - self.money_flow_ema;
+
+            let _0 = Decimal::ZERO;
+            let is_cross = (prev_money_flow_diff > _0 && self.money_flow_diff < _0) || (prev_money_flow_diff < _0 && self.money_flow_diff > _0);
+            if is_cross {
+                if !self.money_flow_prev_cross.is_zero() {
+                    if prev_money_flow_diff > _0 {
+                        self.total_cross_diff += self.mid_price - self.money_flow_prev_cross;
+                    } else {
+                        self.total_cross_diff += self.money_flow_prev_cross - self.mid_price;
+                    }
+                }
+
+                self.money_flow_prev_cross = self.mid_price;
+            }
         }
     }
 
@@ -535,7 +555,7 @@ impl AvellanedaStoikov {
             inventory: self.inventory,
             sigma_square: self.sigma_square,
             gamma: self.money_flow_diff,
-            kappa: self.open_interest,
+            kappa: self.total_cross_diff,
 
             flow_ratio: self.money_flow,
             ref_price: self.ref_price,