Răsfoiți Sursa

观察持仓后的资金流情况,定义有利

skyffire 10 luni în urmă
părinte
comite
a7bbb9870b
1 a modificat fișierele cu 24 adăugiri și 17 ștergeri
  1. 24 17
      strategy/src/predictor.rs

+ 24 - 17
strategy/src/predictor.rs

@@ -20,6 +20,7 @@ pub struct Predictor {
     pub volume_vec: Vec<Decimal>,                                               // 交易量队列
     pub trade_long_vec: FixedTimeRangeDeque<Trade>,                             // 交易队列
     pub trade_short_vec: FixedTimeRangeDeque<Trade>,                            // 交易队列
+    pub trade_fixed_vec: Vec<Trade>,                                            // 交易队列(观察持仓后的资金流)
     pub spread_vec: Vec<Decimal>,                                               // 价差队列
     pub record_vec: VecDeque<Record>,                                           // 蜡烛队列
 
@@ -144,6 +145,7 @@ impl Predictor {
             spread_vec: vec![],
             trade_long_vec: FixedTimeRangeDeque::new(Self::TRADE_LONG_RANGE_MICROS),
             trade_short_vec: FixedTimeRangeDeque::new(Self::TRADE_SHORT_RANGE_MICROS),
+            trade_fixed_vec: vec![],
             record_vec: VecDeque::new(),
 
             mid_price: Default::default(),
@@ -194,7 +196,7 @@ impl Predictor {
 
             params,
 
-            debug_sender: tx
+            debug_sender: tx,
         };
 
         predictor
@@ -226,19 +228,22 @@ impl Predictor {
     pub async fn on_trade(&mut self, trade: &Trade, _index: usize) {
         self.trade_long_vec.push_back(trade.clone());
         self.trade_short_vec.push_back(trade.clone());
-
-        let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_short_vec.deque.iter()
-            .fold((Decimal::ZERO, Decimal::ZERO), |(buy_sum, sell_sum), item| {
-                if item.size > Decimal::ZERO {
-                    (buy_sum + item.value.abs(), sell_sum)
-                } else if item.size < Decimal::ZERO {
-                    (buy_sum, sell_sum + item.value.abs())
-                } else {
-                    (buy_sum, sell_sum)
-                }
-            });
-        self.error_rate = (bought_sum - sold_sum) / (bought_sum + sold_sum);
-        self.error_rate.rescale(4);
+        if !self.inventory.is_zero() {
+            self.trade_fixed_vec.push(trade.clone());
+
+            let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_fixed_vec.iter()
+                .fold((Decimal::ZERO, Decimal::ZERO), |(buy_sum, sell_sum), item| {
+                    if item.size > Decimal::ZERO {
+                        (buy_sum + item.value.abs(), sell_sum)
+                    } else if item.size < Decimal::ZERO {
+                        (buy_sum, sell_sum + item.value.abs())
+                    } else {
+                        (buy_sum, sell_sum)
+                    }
+                });
+            self.error_rate = (bought_sum - sold_sum) / (bought_sum + sold_sum);
+            self.error_rate.rescale(4);
+        }
 
         self.last_price = trade.price;
 
@@ -282,9 +287,11 @@ impl Predictor {
             self.fair_price_time_vec.deque.clear();
         }
 
-        // if prev_inventory != self.inventory && self.inventory.is_zero() {
-        //     self.is_regressed = false;
-        // }
+        // 重置资金流计算
+        if prev_inventory != self.inventory && self.inventory.is_zero() {
+            self.trade_fixed_vec.clear();
+            self.error_rate = Decimal::ZERO;
+        }
 
         self.update_level().await;
         self.processor().await;