Ver Fonte

trade的资金流绝对值大于0.3就不要开单,观察再说。

skyffire há 1 ano atrás
pai
commit
f56052a875
1 ficheiros alterados com 36 adições e 16 exclusões
  1. 36 16
      strategy/src/avellaneda_stoikov.rs

+ 36 - 16
strategy/src/avellaneda_stoikov.rs

@@ -35,8 +35,8 @@ pub struct AvellanedaStoikov {
     pub gamma: Decimal,                                                         // γ,库存风险厌恶参数
     pub kappa: Decimal,                                                         // κ 订单簿 流动性 参数
 
-    pub flow_ratio: Decimal,                                                    // 资金流比例
-    pub flow_ratio_short: Decimal,                                              // 资金流比例
+    pub flow_ratio_mfi: Decimal,                                                // 资金流比例(专供MFI)
+    pub flow_ratio_trades: Decimal,                                             // 资金流比例(trades生成)
     pub money_flow_index: Decimal,                                              // MFI
 
     pub ask_delta: Decimal,                                                     // δa
@@ -97,8 +97,8 @@ impl AvellanedaStoikov {
             prev_trade_time: Utc::now().timestamp_micros(),
             t_diff: Default::default(),
             level: Default::default(),
-            flow_ratio: Default::default(),
-            flow_ratio_short: Default::default(),
+            flow_ratio_mfi: Default::default(),
+            flow_ratio_trades: Default::default(),
             money_flow_index: Default::default(),
         };
 
@@ -278,7 +278,7 @@ impl AvellanedaStoikov {
             let pos_edge = self.gamma * self.sigma_square * self.inventory.abs().powd(dec!(2)) * self.t_diff;
 
             self.base_delta = self.gamma * self.sigma_square * self.t_diff / Decimal::TWO + (Decimal::ONE / self.gamma) * (Decimal::ONE + self.gamma / self.kappa).ln();
-            self.ratio_edge = self.flow_ratio * self.sigma_square;
+            self.ratio_edge = self.flow_ratio_mfi * self.sigma_square;
 
             self.bid_delta = self.base_delta;
             self.ask_delta = self.base_delta;
@@ -289,15 +289,35 @@ impl AvellanedaStoikov {
                 self.ask_delta += pos_edge;
             }
 
-            if self.ratio_edge > Decimal::ZERO {
-                self.ask_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
-                self.bid_delta += self.sigma_square.abs() * dec!(5);
-            } else if self.ratio_edge < Decimal::ZERO {
-                self.ask_delta += self.sigma_square.abs() * dec!(5);
-                self.bid_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
-            } else if self.ratio_edge == Decimal::ZERO {
+            if self.ratio_edge == Decimal::ZERO {
                 self.ask_delta += self.sigma_square.abs() * dec!(5);
                 self.bid_delta += self.sigma_square.abs() * dec!(5);
+            } else if self.ratio_edge > Decimal::ZERO {
+                if self.flow_ratio_trades.abs() > dec!(0.3) {
+                    if self.inventory > Decimal::ZERO {
+                        self.ask_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
+                        self.bid_delta += self.sigma_square.abs() * dec!(10);
+                    } else  {
+                        self.ask_delta += self.sigma_square.abs() * dec!(10);
+                        self.bid_delta += self.sigma_square.abs() * dec!(10);
+                    }
+                } else {
+                    self.ask_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
+                    self.bid_delta += self.sigma_square.abs() * dec!(5);
+                }
+            } else if self.ratio_edge < Decimal::ZERO {
+                if self.flow_ratio_trades.abs() > dec!(0.3) {
+                    if self.inventory < Decimal::ZERO {
+                        self.ask_delta += self.sigma_square.abs() * dec!(10);
+                        self.bid_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
+                    } else {
+                        self.ask_delta += self.sigma_square.abs() * dec!(10);
+                        self.bid_delta += self.sigma_square.abs() * dec!(10);
+                    }
+                } else {
+                    self.ask_delta += self.sigma_square.abs() * dec!(5);
+                    self.bid_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
+                }
             }
         }
     }
@@ -439,14 +459,14 @@ impl AvellanedaStoikov {
     // }
 
     pub fn update_flow_ratio(&mut self) {
-        self.flow_ratio = if self.money_flow_index > dec!(80) {
+        self.flow_ratio_mfi = if self.money_flow_index > dec!(80) {
             (self.money_flow_index - dec!(80)) / dec!(20)
         } else if self.money_flow_index < dec!(20) {
             Decimal::NEGATIVE_ONE * (dec!(20) - self.money_flow_index) / dec!(20)
         } else {
             Decimal::ZERO
         };
-        self.flow_ratio_short = Self::calc_flow_ratio(&self.flow_ratio_short, &dec!(0), &mut self.trade_long_vec);
+        self.flow_ratio_trades = Self::calc_flow_ratio(&self.flow_ratio_trades, &dec!(0), &mut self.trade_long_vec);
     }
 
     pub fn check_ready(&mut self) {
@@ -526,10 +546,10 @@ impl AvellanedaStoikov {
 
             inventory: self.inventory,
             sigma_square: self.money_flow_index,
-            gamma: self.flow_ratio_short,
+            gamma: self.flow_ratio_trades,
             kappa: self.t_diff,
 
-            flow_ratio: self.flow_ratio,
+            flow_ratio: self.flow_ratio_mfi,
             ref_price: self.ref_price,
         });
     }