Prechádzať zdrojové kódy

使用EMA來刻畫資金流狀態。低周期入場,高周期平倉。

skyfffire 1 rok pred
rodič
commit
0d48e5454e
1 zmenil súbory, kde vykonal 42 pridanie a 55 odobranie
  1. 42 55
      strategy/src/avellaneda_stoikov.rs

+ 42 - 55
strategy/src/avellaneda_stoikov.rs

@@ -166,55 +166,45 @@ impl AvellanedaStoikov {
     }
 
     pub async fn on_trade(&mut self, trade: &Trade) {
-        if self.trade_vec.deque.len() > 0 {
-            let prev_trade_iter = self.trade_vec.deque.iter().last().unwrap();
-
-            if trade.price > prev_trade_iter.price {
-                self.flow_in_value += trade.value;
-            } else if trade.price < prev_trade_iter.price {
-                self.flow_out_value += trade.value;
-            } else {
-                if trade.size > Decimal::ZERO {
-                    self.flow_in_value += trade.value;
-                } else {
-                    self.flow_out_value += trade.value;
-                }
-            }
-
-            if self.flow_out_value + self.flow_in_value > dec!(1_000_000) {
-                self.flow_out_value = self.flow_out_value * dec!(0.618);
-                self.flow_in_value = self.flow_in_value * dec!(0.618);
-            }
-        } else {
-            if trade.size > Decimal::ZERO {
-                self.flow_in_value += trade.value;
-            } else {
-                self.flow_out_value += trade.value;
-            }
-        }
         self.trade_vec.push_back(trade.clone());
 
-        // self.flow_in_value = Decimal::ZERO;
-        // self.flow_out_value = Decimal::ZERO;
-        // for (index, trade_iter) in self.trade_vec.deque.iter().enumerate() {
-        //     if index == 0 {
-        //         continue
-        //     }
-        //     let prev_trade_iter = self.trade_vec.get(index - 1).unwrap();
+        // if self.trade_vec.deque.len() > 0 {
+        //     let prev_trade_iter = self.trade_vec.deque.iter().last().unwrap();
         //
-        //     if trade_iter.price > prev_trade_iter.price {
-        //         self.flow_in_value += trade_iter.value;
-        //     } else if trade_iter.price < prev_trade_iter.price {
-        //         self.flow_out_value += trade_iter.value;
+        //     if trade.price > prev_trade_iter.price {
+        //         self.flow_in_value += trade.value;
+        //     } else if trade.price < prev_trade_iter.price {
+        //         self.flow_out_value += trade.value;
         //     } else {
-        //         if trade_iter.size > Decimal::ZERO {
-        //             self.flow_in_value += trade_iter.value;
+        //         if trade.size > Decimal::ZERO {
+        //             self.flow_in_value += trade.value;
         //         } else {
-        //             self.flow_out_value += trade_iter.value;
+        //             self.flow_out_value += trade.value;
         //         }
         //     }
+        //
+        //     if self.flow_out_value + self.flow_in_value > dec!(1_000_000) {
+        //         self.flow_out_value = self.flow_out_value * dec!(0.618);
+        //         self.flow_in_value = self.flow_in_value * dec!(0.618);
+        //     }
+        // } else {
+        //     if trade.size > Decimal::ZERO {
+        //         self.flow_in_value += trade.value;
+        //     } else {
+        //         self.flow_out_value += trade.value;
+        //     }
         // }
 
+        self.flow_in_value = Decimal::ZERO;
+        self.flow_out_value = Decimal::ZERO;
+        for trade_iter in self.trade_vec.deque.iter() {
+            if trade_iter.size > Decimal::ZERO {
+                self.flow_in_value += trade_iter.value;
+            } else {
+                self.flow_out_value += trade_iter.value;
+            }
+        }
+
         self.last_price = trade.price;
         self.update_spread();
         self.processor().await;
@@ -291,19 +281,13 @@ impl AvellanedaStoikov {
                 self.ask_delta += pos_edge;
             }
 
-            if self.flow_ratio_change > Decimal::ZERO {
-                self.bid_delta -= self.base_delta;
-
-                // if self.inventory <= Decimal::ZERO {
-                //     self.ask_delta += self.base_delta;
-                // }
-            } else if self.flow_ratio_change < Decimal::ZERO {
-                self.ask_delta -= self.base_delta;
-
-                // if self.inventory >= Decimal::ZERO {
-                //     self.bid_delta += self.base_delta;
-                // }
-            }
+            // if self.flow_ratio_change > Decimal::ZERO {
+            //     self.bid_delta -= self.base_delta * dec!(0.5);
+            //     self.ask_delta += self.base_delta * dec!(0.5);
+            // } else if self.flow_ratio_change < Decimal::ZERO {
+            //     self.bid_delta += self.base_delta * dec!(0.5);
+            //     self.ask_delta -= self.base_delta * dec!(0.5);
+            // }
 
             if self.init_delta_plus.is_zero() {
                 self.init_delta_plus = (self.bid_delta + self.ask_delta) / Decimal::TWO
@@ -326,8 +310,11 @@ impl AvellanedaStoikov {
     }
 
     pub fn update_flow_ratio(&mut self) {
-        if self.trade_vec.len() > 100 {
-            self.flow_ratio = (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value);
+        if self.flow_out_value + self.flow_in_value > dec!(100_000) {
+            // 使用EMA來更新資金流,確保平滑性
+            let a = Decimal::TWO / Decimal::TEN;
+            let now = (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value);
+            self.flow_ratio = a * now + (Decimal::ONE - a) * self.flow_ratio;
             self.flow_ratio_vec.push_back(self.flow_ratio);
 
             // 更新最後的變化