소스 검색

真接针*第二版

skyfffire 10 달 전
부모
커밋
e3c7051368
1개의 변경된 파일39개의 추가작업 그리고 33개의 파일을 삭제
  1. 39 33
      strategy/src/predictor.rs

+ 39 - 33
strategy/src/predictor.rs

@@ -47,6 +47,7 @@ pub struct Predictor {
 
     pub mid_price_time_vec: FixedTimeRangeDeque<Decimal>,                       // 中间价格队列,100ms以内的所有中间价格
     pub fair_price_time_vec: FixedTimeRangeDeque<Decimal>,                      // 公平价格队列,100ms以内的所有公平价格
+    pub spread_sma_1000_time_vec: FixedTimeRangeDeque<Decimal>,                 // spread队列,100ms以内的所有spread_sma_1000
     pub fair_price_vec: Vec<Decimal>,                                           // 公平价格列表,0表示做市所,1表示参考所
     pub fair_price: Decimal,                                                    // 预定价格
     pub fair_rate_focus: Decimal,                                               // 变化幅度焦点
@@ -156,6 +157,7 @@ impl Predictor {
 
             fair_price_time_vec: FixedTimeRangeDeque::new(100_000),
             mid_price_time_vec: FixedTimeRangeDeque::new(100_000),
+            spread_sma_1000_time_vec: FixedTimeRangeDeque::new(500_000),
             fair_price: Default::default(),
             fair_rate_focus: Default::default(),
             fair_price_when_ordering: Default::default(),
@@ -322,21 +324,21 @@ impl Predictor {
             // }
 
             // 更新程序关注的变化幅度焦点
-            if self.fair_rate_focus.is_zero() {
-                let last_fair_price = self.fair_price_time_vec.deque.iter().last().unwrap();
-                let first_fair_price = self.fair_price_time_vec.deque[0];
-                let mut rate = (last_fair_price - first_fair_price) / first_fair_price;
+            if self.fair_rate_focus.is_zero() && self.spread_sma_1000_time_vec.len() > 1 {
+                let last_spread_sma = self.spread_sma_1000_time_vec.deque.iter().last().unwrap();
+                let first_spread_sma = self.spread_sma_1000_time_vec.deque[0];
+                let mut rate = last_spread_sma - first_spread_sma;
                 rate.rescale(8);
 
                 // 只有有强度的rate才有资格被称为针
                 if rate.abs() > self.params.open {
                     // 向上涨,并且fair下穿mid,视为观测阶段开始
-                    if rate > Decimal::ZERO && self.mid_price > self.fair_price {
+                    if rate > Decimal::ZERO {
                         self.fair_rate_focus = rate;
                     }
 
                     // 向下跌,并且fair上穿mid,视为观测阶段开始
-                    if rate < Decimal::ZERO && self.mid_price < self.fair_price {
+                    if rate < Decimal::ZERO {
                         self.fair_rate_focus = rate;
                     }
                 }
@@ -379,6 +381,7 @@ impl Predictor {
         } else {
             self.spread_sma_1000 * dec!(0.999) + self.spread * dec!(0.001)
         };
+        self.spread_sma_1000_time_vec.push_back(self.spread_sma_1000);
         // self.spread_sma_1000.rescale(8);
 
         while self.spread_vec.len() > 1_000 {
@@ -399,8 +402,8 @@ impl Predictor {
         // let is_open_long = self.spread_sma_1000 - self.spread_sma > self.params.open && self.fair_price > self.mid_price;
         // let is_open_short = self.spread_sma_1000 - self.spread_sma < self.params.open * Decimal::NEGATIVE_ONE && self.fair_price < self.mid_price;
         // 可能是接针
-        let is_open_long = self.fair_rate_focus < Decimal::ZERO;
-        let is_open_short = self.fair_rate_focus > Decimal::ZERO;
+        let is_open_long = self.fair_rate_focus < Decimal::ZERO && self.fair_price > self.mid_price;
+        let is_open_short = self.fair_rate_focus > Decimal::ZERO && self.fair_price < self.mid_price;
         let is_close_long = self.inventory > Decimal::ZERO;
         let is_close_short = self.inventory < Decimal::ZERO;
 
@@ -408,31 +411,31 @@ impl Predictor {
         self.ask_delta = dec!(-2);
 
         if is_close_long {
-            // if self.mid_price > self.pos_avg_price {
-            //     // let profit_rate = (self.mid_price - self.pos_avg_price) / self.pos_avg_price;
-            //     // let fill_rate = profit_rate / (self.params.open * dec!(50));
-            //     // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
-            //     //
-            //     // self.ask_delta = self.mid_price * close_rate * self.t_diff;
-            //     self.ask_delta = self.mid_price * self.params.close;
-            // } else if self.mid_price > self.fair_price {
-            //     self.ask_delta = self.mid_price * self.params.close;
-            // }
+            if self.mid_price > self.pos_avg_price {
+                // let profit_rate = (self.mid_price - self.pos_avg_price) / self.pos_avg_price;
+                // let fill_rate = profit_rate / (self.params.open * dec!(50));
+                // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
+                //
+                // self.ask_delta = self.mid_price * close_rate * self.t_diff;
+                self.ask_delta = self.mid_price * self.params.close;
+            } else if self.mid_price > self.fair_price {
+                self.ask_delta = self.mid_price * self.params.close;
+            }
 
-            self.ask_delta = self.mid_price * self.params.close;
+            // self.ask_delta = self.mid_price * self.params.close;
         } else if is_close_short {
-            // if self.mid_price < self.pos_avg_price {
-            //     // let profit_rate = (self.pos_avg_price - self.mid_price) / self.pos_avg_price;
-            //     // let fill_rate = profit_rate / (self.params.open * dec!(50));
-            //     // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
-            //     //
-            //     // self.bid_delta = self.mid_price * close_rate * self.t_diff;
-            //     self.bid_delta = self.mid_price * self.params.close;
-            // } else if self.mid_price < self.fair_price {
-            //     self.bid_delta = self.mid_price * self.params.close;
-            // }
+            if self.mid_price < self.pos_avg_price {
+                // let profit_rate = (self.pos_avg_price - self.mid_price) / self.pos_avg_price;
+                // let fill_rate = profit_rate / (self.params.open * dec!(50));
+                // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
+                //
+                // self.bid_delta = self.mid_price * close_rate * self.t_diff;
+                self.bid_delta = self.mid_price * self.params.close;
+            } else if self.mid_price < self.fair_price {
+                self.bid_delta = self.mid_price * self.params.close;
+            }
 
-            self.bid_delta = self.mid_price * self.params.close;
+            // self.bid_delta = self.mid_price * self.params.close;
         } else if is_open_long {
             let is_open_long_market = self.spread_sma_1000 - self.spread_sma > self.params.open_market;
             self.bid_delta = if is_open_long_market {
@@ -535,9 +538,12 @@ impl Predictor {
         let bid_price = self.bid_price;
         let last_price = self.last_price;
 
-        let spread = self.spread_sma;
-        let spread_max = self.spread_sma_2000;
-        let spread_min = self.spread_sma_1000;
+
+        let last_spread_sma = self.spread_sma_1000_time_vec.deque.iter().last().unwrap();
+        let first_spread_sma = self.spread_sma_1000_time_vec.deque[0];
+        let spread = self.spread_sma_1000;
+        let spread_max = last_spread_sma - first_spread_sma;
+        let spread_min = Self::UN_VIEW;
         // let spread = self.price_times_avg;
         // let spread_max = self.fair_price_vec[1] / self.fair_price_vec[0];
         // let spread_min = self.fair_price / self.mid_price;