Pārlūkot izejas kodu

使用fair挂单

skyffire 9 mēneši atpakaļ
vecāks
revīzija
8ff35862c4
1 mainītis faili ar 16 papildinājumiem un 6 dzēšanām
  1. 16 6
      strategy/src/predictor.rs

+ 16 - 6
strategy/src/predictor.rs

@@ -22,6 +22,7 @@ pub struct Predictor {
     pub record_vec: VecDeque<Record>,                                           // 蜡烛队列
 
     pub mid_price: Decimal,                                                     // 中间价
+    pub fair_price: Decimal,
     pub ask_price: Decimal,                                                     // 卖一价
     pub bid_price: Decimal,                                                     // 买一价
     pub last_price: Decimal,                                                    // 最后成交价
@@ -125,6 +126,7 @@ impl Predictor {
             record_vec: VecDeque::new(),
 
             mid_price: Default::default(),
+            fair_price: Default::default(),
             ask_price: Default::default(),
             bid_price: Default::default(),
             last_price: Default::default(),
@@ -248,6 +250,14 @@ impl Predictor {
         self.fair_price_vec[index] = a1.price * b1.value / total + b1.price * a1.value / total;
         self.fair_price_vec[index].rescale(self.mid_price.scale());
 
+        let fair_price_sum: Decimal = self.fair_price_vec.iter().sum();
+        let fair_price_count = self.fair_price_vec.iter()
+            .filter(|&&value| value != Decimal::new(0, 0)) // 过滤掉0
+            .count();
+        if fair_price_count != 0 {
+            self.fair_price = fair_price_sum / Decimal::from(fair_price_count);
+        }
+
         // 求价格倍率
         self.price_avg_times_vec[index] = if self.price_avg_times_vec[index].is_zero() {
             self.fair_price_vec[index] / self.mid_price
@@ -300,33 +310,33 @@ impl Predictor {
             self.ask_delta = dec!(0);
             self.bid_delta = dec!(-2);
 
-            self.optimal_ask_price = self.mid_price + self.mid_price * self.params.close;
+            self.optimal_ask_price = self.fair_price + self.fair_price * self.params.close;
             self.optimal_bid_price = Self::DONT_VIEW;
         } else if is_close_short {
             self.bid_delta = dec!(0);
             self.ask_delta = dec!(-2);
 
-            self.optimal_bid_price = self.mid_price - self.mid_price * self.params.close;
+            self.optimal_bid_price = self.fair_price - self.fair_price * self.params.close;
             self.optimal_ask_price = Self::DONT_VIEW;
         } else {
             if self.signal > Decimal::ZERO {
                 self.bid_delta = dec!(0);
                 self.ask_delta = dec!(-2);
 
-                self.optimal_bid_price = self.mid_price - self.mid_price * self.params.open;
+                self.optimal_bid_price = self.fair_price - self.fair_price * self.params.open;
                 self.optimal_ask_price = Self::DONT_VIEW;
             } else if self.signal < Decimal::ZERO {
                 self.ask_delta = dec!(0);
                 self.bid_delta = dec!(-2);
 
-                self.optimal_ask_price = self.mid_price + self.mid_price * self.params.open;
+                self.optimal_ask_price = self.fair_price + self.fair_price * self.params.open;
                 self.optimal_bid_price = Self::DONT_VIEW;
             } else {
                 self.bid_delta = dec!(0);
                 self.ask_delta = dec!(0);
 
-                self.optimal_bid_price = self.mid_price - self.mid_price * self.params.open;
-                self.optimal_ask_price = self.mid_price + self.mid_price * self.params.open;
+                self.optimal_bid_price = self.fair_price - self.fair_price * self.params.open;
+                self.optimal_ask_price = self.fair_price + self.fair_price * self.params.open;
             }
         }