Bladeren bron

平仓建立时间关联性。

skyfffire 11 maanden geleden
bovenliggende
commit
b1917cd823
1 gewijzigde bestanden met toevoegingen van 20 en 4 verwijderingen
  1. 20 4
      strategy/src/predictor.rs

+ 20 - 4
strategy/src/predictor.rs

@@ -446,16 +446,32 @@ impl Predictor {
 
         let is_open_long = (self.fair_price - self.mid_price) / self.mid_price > self.params.open;
         let is_open_short = (self.mid_price - self.fair_price) / self.mid_price > self.params.open;
-        let is_close_long = self.inventory > Decimal::ZERO && (self.fair_price < self.mid_price || self.pos_avg_price < self.mid_price);
-        let is_close_short = self.inventory < Decimal::ZERO && (self.fair_price > self.mid_price || self.pos_avg_price > self.mid_price);
+        let is_close_long = self.inventory > Decimal::ZERO;
+        let is_close_short = self.inventory < Decimal::ZERO;
 
         self.bid_delta = dec!(-2);
         self.ask_delta = dec!(-2);
 
         if is_close_long {
-            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 / dec!(0.01);
+                let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
+
+                self.ask_delta = self.mid_price * close_rate * self.t_diff;
+            } else if self.mid_price > self.fair_price {
+                self.ask_delta = self.mid_price * self.params.close;
+            }
         } else if is_close_short {
-            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 / dec!(0.01);
+                let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
+
+                self.bid_delta = self.mid_price * close_rate * self.t_diff;
+            } else if self.mid_price < self.fair_price {
+                self.bid_delta = self.mid_price * self.params.close;
+            }
         } else if is_open_long {
             let is_open_long_market = (self.fair_price - self.mid_price) / self.mid_price > self.params.open_market;
             self.bid_delta = if is_open_long_market {