Browse Source

價格與量一起觀察。

skyfffire 1 year ago
parent
commit
16accb019d
1 changed files with 86 additions and 1 deletions
  1. 86 1
      strategy/src/avellaneda_stoikov.rs

+ 86 - 1
strategy/src/avellaneda_stoikov.rs

@@ -347,9 +347,94 @@ impl AvellanedaStoikov {
         }
         }
     }
     }
 
 
+    fn calc_flow_ratio_2(_prev_flow_ratio: &Decimal, min_volume: &Decimal, trades: &mut FixedTimeRangeDeque<Trade>) -> Decimal {
+        let mut flow_in_value = Decimal::ZERO;
+        let mut flow_out_value = Decimal::ZERO;
+        for (index, trade_iter) in trades.deque.iter().enumerate() {
+            if index == 0 {
+                continue
+            }
+
+            let prev_trade_iter = trades.deque.get(index - 1).unwrap();
+            let trade = trade_iter;
+            if trade.price > prev_trade_iter.price {
+                flow_in_value += trade.value * (prev_trade_iter.price - trade.price).abs();
+                // flow_in_value += Decimal::ONE;
+            } else if trade.price < prev_trade_iter.price {
+                flow_out_value += trade.value * (prev_trade_iter.price - trade.price).abs();
+                // flow_out_value += Decimal::ONE;
+            } else {
+                // if trade.size > Decimal::ZERO {
+                //     flow_in_value += trade.value;
+                // } else {
+                //     flow_out_value += trade.value;
+                // }
+            }
+
+            // if trade_iter.size > Decimal::ZERO {
+            //     flow_in_value += trade_iter.value;
+            // } else {
+            //     flow_out_value += trade_iter.value;
+            // }
+        }
+
+        // if self.trade_vec.deque.len() > 1 {
+        //     let prev_trade_iter = self.trade_vec.deque.get(self.trade_vec.deque.len() - 2).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 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!(2_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;
+        //     }
+        // }
+
+        // let mut flow_in_value = Decimal::ZERO;
+        // let mut flow_out_value = Decimal::ZERO;
+        // for trade_iter in trades.deque.iter() {
+        //     if trade_iter.size > Decimal::ZERO {
+        //         flow_in_value += trade_iter.value;
+        //     } else {
+        //         flow_out_value += trade_iter.value;
+        //     }
+        // }
+
+        // 使用EMA來更新資金流,確保平滑性
+        // let a = Decimal::TWO / dec!(50);
+        if flow_out_value + flow_in_value > *min_volume {
+            // let now = (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value);
+            // a * now + (Decimal::ONE - a) * prev_flow_ratio
+            (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value)
+        } else {
+            Decimal::ZERO
+        }
+    }
+
     pub fn update_flow_ratio(&mut self) {
     pub fn update_flow_ratio(&mut self) {
         self.flow_ratio_long = Self::calc_flow_ratio(&self.flow_ratio_long, &dec!(0), &mut self.trade_long_vec);
         self.flow_ratio_long = Self::calc_flow_ratio(&self.flow_ratio_long, &dec!(0), &mut self.trade_long_vec);
-        self.flow_ratio_short = Self::calc_flow_ratio(&self.flow_ratio_short, &dec!(0), &mut self.trade_short_vec);
+        self.flow_ratio_short = Self::calc_flow_ratio_2(&self.flow_ratio_short, &dec!(0), &mut self.trade_long_vec);
     }
     }
 
 
     pub fn check_ready(&mut self) {
     pub fn check_ready(&mut self) {