Browse Source

修复仓位bug

skyffire 9 months ago
parent
commit
1539715f20
3 changed files with 20 additions and 16 deletions
  1. 8 8
      strategy/src/core.rs
  2. 8 4
      strategy/src/predictor.rs
  3. 4 4
      strategy/src/strategy.rs

+ 8 - 8
strategy/src/core.rs

@@ -387,8 +387,6 @@ impl Core {
                                 self.local_cash -= filled * filled_price;
                                 self.local_coin = filled - fee;
 
-                                self.predictor.on_order(side, filled).await
-
                             // sell 平多
                             } else if side == "pd" {
                                 self.local_sell_amount += filled;
@@ -404,8 +402,6 @@ impl Core {
                                 self.local_cash += filled * filled_price - fee;
                                 self.local_coin -= filled;
 
-                                self.predictor.on_order(side, filled).await
-
                             // buy 平空
                             } else if side == "pk" {
                                 self.local_buy_amount += filled - fee;
@@ -421,8 +417,6 @@ impl Core {
                                 self.local_cash -= filled * filled_price;
                                 self.local_coin += filled - fee;
 
-                                self.predictor.on_order(side, filled).await
-
                             // sell 开空
                             } else if side == "kk" {
                                 self.local_sell_amount += filled;
@@ -438,8 +432,6 @@ impl Core {
                                 }
                                 self.local_cash += filled * filled_price - fee;
                                 self.local_coin -= filled;
-
-                                self.predictor.on_order(side, filled).await
                             } else {
                                 info!("错误的仓位方向{}", side);
                             }
@@ -460,6 +452,8 @@ impl Core {
                                     self.local_position_by_orders.long_pos = self.local_position_by_orders.long_pos + filled;
                                 }
 
+                                self.predictor.on_order(side, filled).await
+
                             // sell 开空
                             } else if side == "kk" {
                                 self.local_sell_amount += filled;
@@ -473,6 +467,8 @@ impl Core {
                                     self.local_position_by_orders.short_pos = self.local_position_by_orders.short_pos + filled;
                                 }
 
+                                self.predictor.on_order(side, filled).await
+
                             // sell 平多
                             } else if side == "pd" {
                                 self.local_sell_amount += filled;
@@ -482,6 +478,8 @@ impl Core {
                                     self.local_position_by_orders.long_avg = Decimal::ZERO;
                                 }
 
+                                self.predictor.on_order(side, filled).await
+
                             // buy 平空
                             } else if side == "pk" {
                                 self.local_buy_amount += filled;
@@ -490,6 +488,8 @@ impl Core {
                                 if self.local_position_by_orders.short_pos == Decimal::ZERO {
                                     self.local_position_by_orders.short_avg = Decimal::ZERO;
                                 }
+
+                                self.predictor.on_order(side, filled).await
                             } else {
                                 error!("错误的仓位方向{}", side);
                             }

+ 8 - 4
strategy/src/predictor.rs

@@ -80,6 +80,7 @@ pub struct Predictor {
     pub trade_time_vec: VecDeque<Decimal>,                                      // 交易时间队列
     pub trade_side_map: HashMap<Decimal, String>,                               // 交易时间,对应的是kk,kd两个方向
     pub trade_amount_map: HashMap<Decimal, Decimal>,                            // 交易数量
+    pub trade_amount: Decimal,
 }
 
 impl Predictor {
@@ -199,6 +200,7 @@ impl Predictor {
             trade_time_vec: VecDeque::new(),
             trade_side_map: HashMap::new(),
             trade_amount_map: HashMap::new(),
+            trade_amount: Default::default(),
         };
 
         predictor
@@ -275,6 +277,8 @@ impl Predictor {
             self.trade_side_map.remove(&pop_time);
             self.trade_amount_map.remove(&pop_time);
         }
+
+        info!(?self.trade_time_vec, ?self.trade_side_map, ?self.trade_amount_map)
     }
 
     pub async fn update_level(&mut self) {
@@ -419,16 +423,16 @@ impl Predictor {
             let first = self.trade_time_vec.front().unwrap();
             let now = Decimal::from(Utc::now().timestamp_millis());
 
-            if now - self.params.holding_time * Decimal::ONE_THOUSAND > *first {
+            if now - *first > self.params.holding_time * Decimal::ONE_THOUSAND {
                 let side = self.trade_side_map.get(first).unwrap();
-                let _ = self.trade_amount_map.get(first).unwrap();
+                self.trade_amount = self.trade_amount_map.get(first).unwrap().clone();
 
                 match side.as_str() {
                     "kd" => {
-                        self.ask_delta = Decimal::ZERO;
+                        self.ask_delta = self.params.close;
                     }
                     "kk" => {
-                        self.bid_delta = Decimal::ZERO;
+                        self.bid_delta = self.params.close;
                     }
                     &_ => {
                         panic!("什么方向放进来了?side={}", side);

+ 4 - 4
strategy/src/strategy.rs

@@ -807,7 +807,7 @@ impl Strategy {
         // }
         // // debug!(?command);
 
-        if predictor.inventory > Decimal::ZERO && predictor.ask_delta != dec!(-2) {
+        if predictor.inventory > Decimal::ZERO && predictor.ask_delta != dec!(-2) && predictor.ask_delta != Decimal::ZERO {
             if pd_order_num == 0 {
                 let mut price = (short_lower + short_upper) * dec!(0.5);
                 // 不限制大小
@@ -816,7 +816,7 @@ impl Strategy {
 
                 let order_client_id = utils::generate_client_id(Some(self.broker_id.clone()));
                 let order = vec![
-                    predictor.pos_amount.abs().to_string(),
+                    predictor.trade_amount.to_string(),
                     "pd".to_string(),
                     price.to_string(),
                     order_client_id.clone()
@@ -827,7 +827,7 @@ impl Strategy {
                 // debug!(?command);
             }
         }
-        if predictor.inventory < Decimal::ZERO && predictor.bid_delta != dec!(-2) {
+        if predictor.inventory < Decimal::ZERO && predictor.bid_delta != dec!(-2) && predictor.bid_delta != Decimal::ZERO {
             if pk_order_num == 0 {
                 let mut price = (long_upper + long_lower) * dec!(0.5);
                 // 不限制大小
@@ -836,7 +836,7 @@ impl Strategy {
 
                 let order_client_id = utils::generate_client_id(Some(self.broker_id.clone()));
                 let order = vec![
-                    predictor.pos_amount.abs().to_string(),
+                    predictor.trade_amount.to_string(),
                     "pk".to_string(),
                     price.to_string(),
                     order_client_id.clone()