Ver Fonte

尝试修复持有仓位时无法平另一个方向仓位的bug

skyffire há 9 meses atrás
pai
commit
7f5c63577a
2 ficheiros alterados com 23 adições e 18 exclusões
  1. 22 15
      strategy/src/predictor.rs
  2. 1 3
      strategy/src/strategy.rs

+ 22 - 15
strategy/src/predictor.rs

@@ -63,7 +63,7 @@ pub struct Predictor {
 
     pub prev_trade_force_order_value: Decimal,                                  // 上次下单时的爆仓价值ln
     pub prev_trade_price: Decimal,                                              // 上次加仓的价格
-    pub prev_trade_time: i64,                                                   // 上次交易时间,也就是t
+    pub prev_trade_time: Decimal,                                               // 上次交易时间,也就是t
     pub t_diff: Decimal,                                                        // (T-t)
 
     pub last_update_time: Decimal,                                              // 最后更新时间(depth)
@@ -86,7 +86,7 @@ pub struct Predictor {
 impl Predictor {
     // 时间窗口大小(微秒)
     // const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
-    const TIME_DIFF_RANGE_MICROS: i64 = 15 * 60_000_000;
+    // const TIME_DIFF_RANGE_MICROS: i64 = 15 * 60_000_000;
     // const TRADE_LONG_RANGE_MICROS: i64 = 5 * 60_000_000;
     // const SPREAD_RANGE_MICROS: i64 = 15 * 60_000_000;
     // const TRADE_SHORT_RANGE_MICROS: i64 = 2 * 60_000_000;
@@ -178,7 +178,7 @@ impl Predictor {
             one_grid_order_value: Default::default(),
             prev_trade_force_order_value: Default::default(),
             prev_trade_price: Default::default(),
-            prev_trade_time: Utc::now().timestamp_micros(),
+            prev_trade_time: Default::default(),
             t_diff: Default::default(),
             level: Default::default(),
             pos_amount: Default::default(),
@@ -317,7 +317,7 @@ impl Predictor {
 
         // 用于计算加仓
         if self.inventory.abs() > prev_inventory.abs() {
-            self.prev_trade_time = Utc::now().timestamp_micros();
+            self.prev_trade_time = Decimal::from(Utc::now().timestamp_millis());
             self.prev_trade_price = self.mid_price;
             self.prev_trade_force_order_value = self.force_order_value;
             self.force_order_value = Decimal::ZERO;
@@ -411,17 +411,14 @@ impl Predictor {
             return;
         }
 
-        // 可能是接针
-        let is_open_long = self.force_order_value < -self.params.open && self.inventory < self.params.grid;
-        let is_open_short = self.force_order_value > self.params.open && self.inventory > -self.params.grid;
-
         self.bid_delta = dec!(-2);
         self.ask_delta = dec!(-2);
 
+        let now = Decimal::from(Utc::now().timestamp_millis());
+
         // 平仓优先级高一些
         if self.trade_time_vec.len() > 0 {
             let first = self.trade_time_vec.front().unwrap();
-            let now = Decimal::from(Utc::now().timestamp_millis());
 
             if now - *first > self.params.holding_time * Decimal::ONE_THOUSAND {
                 let side = self.trade_side_map.get(first).unwrap();
@@ -441,6 +438,16 @@ impl Predictor {
             }
         }
 
+        // 可能是接针
+        let is_open_long = self.force_order_value < -self.params.open
+            && now - self.prev_trade_time > dec!(60000)
+            && self.inventory < self.params.grid
+            && self.bid_delta == dec!(-2);
+        let is_open_short = self.force_order_value > self.params.open
+            && now - self.prev_trade_time > dec!(60000)
+            && self.inventory > -self.params.grid
+            && self.ask_delta == dec!(-2);
+
         if is_open_long {
             self.bid_delta = Decimal::ZERO;
         } else if is_open_short {
@@ -470,12 +477,12 @@ impl Predictor {
     }
 
     pub fn update_t_diff(&mut self) {
-        if self.prev_trade_time > 0 {
-            let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
-            self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::TIME_DIFF_RANGE_MICROS).unwrap(), Decimal::ZERO);
-        } else {
-            self.t_diff = Decimal::ONE;
-        }
+        // if self.prev_trade_time > 0 {
+        //     let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
+        //     self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::TIME_DIFF_RANGE_MICROS).unwrap(), Decimal::ZERO);
+        // } else {
+        //     self.t_diff = Decimal::ONE;
+        // }
     }
 
     pub fn check_ready(&mut self) {

+ 1 - 3
strategy/src/strategy.rs

@@ -893,9 +893,7 @@ impl Strategy {
 
     // 超时触发查单信号
     // #[instrument(skip(self, command), level="TRACE")]
-    pub fn _check_local_orders(&mut self,
-                               command: &mut OrderCommand,
-                               local_orders: &HashMap<String, OrderInfo>) {
+    pub fn _check_local_orders(&mut self, command: &mut OrderCommand, local_orders: &HashMap<String, OrderInfo>) {
         // debug!(?command);
         // 超时检测
         if self.local_time - self._check_local_orders_time < self._check_local_orders_interval {