Quellcode durchsuchen

還是得扛單。

skyfffire vor 1 Jahr
Ursprung
Commit
a77bc213d0
1 geänderte Dateien mit 10 neuen und 17 gelöschten Zeilen
  1. 10 17
      strategy/src/avellaneda_stoikov.rs

+ 10 - 17
strategy/src/avellaneda_stoikov.rs

@@ -47,7 +47,7 @@ pub struct AvellanedaStoikov {
     pub cci_arc: Arc<Mutex<CentralControlInfo>>,                                // 中控信息
 
     pub is_ready: bool,
-    pub prev_reversal_time: i64,                                                // 上次穿越时间,也就是t
+    pub prev_trade_time: i64,                                                   // 上次交易时间,也就是t
     pub t_diff: Decimal,                                                        // (T-t)
 }
 
@@ -91,7 +91,7 @@ impl AvellanedaStoikov {
             cci_arc,
 
             is_ready: false,
-            prev_reversal_time: Utc::now().timestamp_micros(),
+            prev_trade_time: Utc::now().timestamp_micros(),
             t_diff: Default::default(),
             flow_ratio: Decimal::ONE,
             flow_out_value: Default::default(),
@@ -182,6 +182,7 @@ impl AvellanedaStoikov {
     }
 
     pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
+        self.prev_trade_time = Utc::now().timestamp_micros();
         self.inventory = (inventory / (min_amount_value / self.mid_price)).round();
 
         self.update_level().await;
@@ -229,7 +230,7 @@ impl AvellanedaStoikov {
 
     pub fn update_delta(&mut self) {
         if self.gamma != Decimal::ZERO {
-            let pos_edge = self.gamma * self.sigma_square * self.inventory.abs().powd(dec!(2)) * self.t_diff / Decimal::TWO;
+            let pos_edge = self.gamma * self.sigma_square * self.inventory.abs().powd(dec!(3.14)) * self.t_diff / Decimal::TWO;
 
             self.base_delta = self.sigma_square * self.t_diff;
             self.ratio_edge = dec!(3.14) * self.flow_ratio * self.sigma_square;
@@ -244,11 +245,11 @@ impl AvellanedaStoikov {
             }
 
             if self.ratio_edge > Decimal::ZERO {
-                self.ask_delta = self.ask_delta + (Decimal::ONE - self.ratio_edge.abs()) * self.t_diff;
-                self.bid_delta = self.bid_delta + self.ratio_edge.abs() * (dec!(1.618) - self.t_diff);
+                self.ask_delta = self.ask_delta - self.ratio_edge.abs() * (Decimal::ONE - self.t_diff);
+                self.bid_delta = self.bid_delta + self.ratio_edge.abs() * (dec!(0.5) + dec!(0.5) * self.t_diff);
             } else if self.ratio_edge < Decimal::ZERO {
-                self.ask_delta = self.ask_delta + self.ratio_edge.abs() * (dec!(1.618) - self.t_diff);
-                self.bid_delta = self.bid_delta + (Decimal::ONE - self.ratio_edge.abs()) * self.t_diff;
+                self.ask_delta = self.ask_delta + self.ratio_edge.abs() * (dec!(0.5) + dec!(0.5) * self.t_diff);
+                self.bid_delta = self.bid_delta - self.ratio_edge.abs() * (Decimal::ONE - self.t_diff);
             }
 
             if self.init_delta_plus.is_zero() {
@@ -263,8 +264,8 @@ impl AvellanedaStoikov {
     }
 
     pub fn update_t_diff(&mut self) {
-        if self.prev_reversal_time > 0 {
-            let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_reversal_time).unwrap();
+        if self.prev_trade_time > 0 {
+            let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
             self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::MAX_TIME_RANGE_MICROS).unwrap(), Decimal::ZERO);
         } else {
             self.t_diff = Decimal::ONE;
@@ -273,15 +274,7 @@ impl AvellanedaStoikov {
 
     pub fn update_flow_ratio(&mut self) {
         if self.trade_vec.len() > 100 {
-            let prev_flow_ratio = self.flow_ratio;
             self.flow_ratio = (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value);
-
-            // 上穿或下穿0軸
-            if prev_flow_ratio > Decimal::ZERO && self.flow_ratio < Decimal::ZERO {
-                self.prev_reversal_time = Utc::now().timestamp_micros();
-            } else if prev_flow_ratio < Decimal::ZERO && self.flow_ratio > Decimal::ZERO {
-                self.prev_reversal_time = Utc::now().timestamp_micros();
-            }
         } else {
             self.flow_ratio = Decimal::ZERO;
         }