skyfffire 1 жил өмнө
parent
commit
cd5fd1503d

+ 20 - 22
strategy/src/avellaneda_stoikov.rs

@@ -36,10 +36,11 @@ pub struct AvellanedaStoikov {
     pub flow_in_value: Decimal,
     pub flow_out_value: Decimal,
     pub flow_ratio: Decimal,                                                    // 资金流比例
-    pub flow_ratio_diff_log: Decimal,                                           // 一阶导数
 
     pub ask_delta: Decimal,                                                     // δa
     pub bid_delta: Decimal,                                                     // δb
+    pub base_delta: Decimal,                                                    // 基础挂单距离
+    pub ratio_edge: Decimal,                                                    // 资金流修正的挂单距离
     pub ref_price: Decimal,                                                     // 预定价格
 
     pub cci_arc: Arc<Mutex<CentralControlInfo>>,                                // 中控信息
@@ -53,7 +54,7 @@ impl AvellanedaStoikov {
     // 时间窗口大小(微秒)
     const MAX_TIME_RANGE_MICROS: i64 = 5 * 60_000_000;
     // const ONE_MILLION: Decimal = dec!(1_000_000);
-    const TWENTY_THOUSAND: Decimal = dec!(20_000);
+    // const TWENTY_THOUSAND: Decimal = dec!(20_000);
     const IRA: Decimal = dec!(1);
 
     pub fn new(cci_arc: Arc<Mutex<CentralControlInfo>>) -> Self {
@@ -78,6 +79,8 @@ impl AvellanedaStoikov {
             sigma_square: Default::default(),
             ask_delta: Default::default(),
             bid_delta: Default::default(),
+            base_delta: Default::default(),
+            ratio_edge: Default::default(),
             kappa: Default::default(),
             flow_in_value: Default::default(),
             ref_price: Default::default(),
@@ -88,7 +91,6 @@ impl AvellanedaStoikov {
             prev_trade_time: 0,
             t_diff: Default::default(),
             flow_ratio: Decimal::ONE,
-            flow_ratio_diff_log: Default::default(),
             flow_out_value: Default::default(),
             level: Default::default(),
         };
@@ -231,25 +233,25 @@ impl AvellanedaStoikov {
 
     pub fn update_delta(&mut self) {
         if self.gamma != Decimal::ZERO {
-            let base_delta = (Decimal::ONE / self.gamma) * (Decimal::ONE + self.gamma / self.kappa).ln();
-            let ratio_edge = (self.flow_ratio * base_delta) * Decimal::TWO;
+            self.base_delta = (Decimal::ONE / self.gamma) * (Decimal::ONE + self.gamma / self.kappa).ln() * dec!(0.8);
+            self.ratio_edge = (self.flow_ratio * self.base_delta) * Decimal::TWO;
 
-            self.bid_delta = base_delta;
-            self.ask_delta = base_delta;
+            self.bid_delta = self.base_delta;
+            self.ask_delta = self.base_delta;
 
             if self.inventory > Decimal::ZERO {
                 let pos_edge = ((Decimal::ONE + Decimal::TWO * self.inventory) / Decimal::TWO) * (self.gamma * self.sigma_square) * self.t_diff;
 
-                self.bid_delta += pos_edge;
+                self.bid_delta += pos_edge * dec!(0.1);
             } else if self.inventory < Decimal::ZERO {
                 let pos_edge = ((Decimal::ONE - Decimal::TWO * self.inventory) / Decimal::TWO) * (self.gamma * self.sigma_square) * self.t_diff;
 
-                self.ask_delta += pos_edge;
+                self.ask_delta += pos_edge * dec!(0.1);
             }
-            if ratio_edge < Decimal::ZERO {
-                self.bid_delta += ratio_edge.abs()
-            } else if ratio_edge > Decimal::ZERO {
-                self.ask_delta += ratio_edge.abs()
+            if self.ratio_edge < Decimal::ZERO {
+                self.bid_delta += self.ratio_edge.abs()
+            } else if self.ratio_edge > Decimal::ZERO {
+                self.ask_delta += self.ratio_edge.abs()
             }
         }
     }
@@ -267,14 +269,10 @@ impl AvellanedaStoikov {
     }
 
     pub fn update_flow_ratio(&mut self) {
-        self.flow_ratio = if self.trade_vec.len() < 2 {
+        self.flow_ratio = if self.trade_vec.len() < 100 {
             Decimal::ZERO
         } else {
-            if self.flow_out_value + self.flow_in_value <= Self::TWENTY_THOUSAND {
-                Decimal::ZERO
-            } else {
-                (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value)
-            }
+            (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value)
         };
 
         self.flow_ratio.rescale(6);
@@ -357,10 +355,10 @@ impl AvellanedaStoikov {
 
             inventory: self.inventory,
             sigma_square: self.flow_ratio,
-            gamma: self.gamma,
-            kappa: self.kappa,
+            gamma: self.base_delta,
+            kappa: self.ratio_edge,
 
-            flow_ratio: self.flow_ratio_diff_log,
+            flow_ratio: self.flow_ratio,
             ref_price: self.ref_price,
         });
     }

+ 1 - 1
strategy/src/strategy.rs

@@ -160,7 +160,7 @@ impl Strategy {
             total_amount: Default::default(),
             is_ready: false,
             _is_print: is_print,
-            _min_amount_value: dec!(1.0),
+            _min_amount_value: dec!(0.01),
             _max_amount_value: dec!(10000.0),
             mp_ema: Default::default(),
             mp: Default::default(),