瀏覽代碼

趋势模式v1

skyffire 9 月之前
父節點
當前提交
0b6178e28b
共有 3 個文件被更改,包括 35 次插入26 次删除
  1. 4 4
      strategy/src/core.rs
  2. 29 20
      strategy/src/predictor.rs
  3. 2 2
      strategy/src/strategy.rs

+ 4 - 4
strategy/src/core.rs

@@ -452,7 +452,7 @@ impl Core {
                                     self.local_position_by_orders.long_pos = self.local_position_by_orders.long_pos + filled;
                                 }
 
-                                self.predictor.on_order(side, filled).await
+                                self.predictor.on_order(side, filled, filled_price).await
 
                             // sell 开空
                             } else if side == "kk" {
@@ -467,7 +467,7 @@ impl Core {
                                     self.local_position_by_orders.short_pos = self.local_position_by_orders.short_pos + filled;
                                 }
 
-                                self.predictor.on_order(side, filled).await
+                                self.predictor.on_order(side, filled, filled_price).await
 
                             // sell 平多
                             } else if side == "pd" {
@@ -478,7 +478,7 @@ impl Core {
                                     self.local_position_by_orders.long_avg = Decimal::ZERO;
                                 }
 
-                                self.predictor.on_order(side, filled).await
+                                self.predictor.on_order(side, filled, filled_price).await
 
                             // buy 平空
                             } else if side == "pk" {
@@ -489,7 +489,7 @@ impl Core {
                                     self.local_position_by_orders.short_avg = Decimal::ZERO;
                                 }
 
-                                self.predictor.on_order(side, filled).await
+                                self.predictor.on_order(side, filled, filled_price).await
                             } else {
                                 error!("错误的仓位方向{}", side);
                             }

+ 29 - 20
strategy/src/predictor.rs

@@ -82,6 +82,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_price_map: HashMap<Decimal, Decimal>,                             // 交易价格
     pub trade_amount: Decimal,
 
     pub prev_flush_state_time: Decimal,
@@ -220,6 +221,7 @@ impl Predictor {
             trade_time_vec: VecDeque::new(),
             trade_side_map: HashMap::new(),
             trade_amount_map: HashMap::new(),
+            trade_price_map: HashMap::new(),
             trade_amount: Default::default(),
 
             prev_flush_state_time: Default::default(),
@@ -356,7 +358,7 @@ impl Predictor {
     }
 
     // side, pk,pd从HashMap移除,kd,kk添加到HashMap
-    pub async fn on_order(&mut self, side: String, amount: Decimal) {
+    pub async fn on_order(&mut self, side: String, amount: Decimal, price: Decimal) {
         let prev_inventory = self.inventory;
         self.inventory = match side.as_str() {
             "kk" => {
@@ -392,6 +394,7 @@ impl Predictor {
             self.trade_time_vec.push_back(now);
             self.trade_side_map.insert(now, side);
             self.trade_amount_map.insert(now, amount);
+            self.trade_price_map.insert(now, price);
 
             self.prev_trade_time = Decimal::from(Utc::now().timestamp_millis());
             self.prev_trade_price = self.mid_price;
@@ -402,6 +405,7 @@ impl Predictor {
 
             self.trade_side_map.remove(&pop_time);
             self.trade_amount_map.remove(&pop_time);
+            self.trade_price_map.remove(&pop_time);
         }
 
         info!(?self.trade_time_vec);
@@ -548,11 +552,23 @@ impl Predictor {
         // 平仓优先级高一些
         if self.trade_time_vec.len() > 0 {
             let first = self.trade_time_vec.front().unwrap();
+            let side = self.trade_side_map.get(first).unwrap();
+            let entry_price = self.trade_price_map.get(first).unwrap();
+            self.trade_amount = self.trade_amount_map.get(first).unwrap().clone();
 
-            if now - *first > self.params.holding_time * Decimal::ONE_THOUSAND {
-                let side = self.trade_side_map.get(first).unwrap();
-                self.trade_amount = self.trade_amount_map.get(first).unwrap().clone();
+            let profit = match side.as_str() {
+                "kd" => {
+                    (self.mid_price - entry_price) / entry_price
+                }
+                "kk" => {
+                    (entry_price - self.mid_price) / entry_price
+                }
+                &_ => {
+                    panic!("什么方向放进来了?profit, side={}", side);
+                }
+            };
 
+            if now - *first > self.params.holding_time * Decimal::ONE_THOUSAND || profit.abs() > dec!(0.01) {
                 match side.as_str() {
                     "kd" => {
                         self.ask_delta = self.mid_price * self.params.close;
@@ -567,17 +583,11 @@ impl Predictor {
             }
         }
 
-        let is_open_long = self.force_order_value < -self.params.open
-            && (self.mid_price < self.prev_trade_price * dec!(0.999) || self.prev_trade_price.is_zero())
-            && self.inventory < self.params.grid
-            && self.volume_decay > dec!(0.2)
-            && false
+        let is_open_long = self.force_order_value > self.params.open
+            && self.inventory >= Decimal::ZERO && self.inventory < self.params.grid
             && self.bid_delta == dec!(-2);
-        let is_open_short = self.force_order_value > self.params.open
-            && (self.mid_price > self.prev_trade_price * dec!(1.001) || self.prev_trade_price.is_zero())
-            && self.inventory > -self.params.grid
-            && self.volume_decay > dec!(0.2)
-            && false
+        let is_open_short = self.force_order_value < -self.params.open
+            && self.inventory > -self.params.grid && self.inventory <= Decimal::ZERO
             && self.ask_delta == dec!(-2);
 
         if is_open_long {
@@ -669,9 +679,9 @@ impl Predictor {
         let last_price = self.last_price;
         let fair_price = self.mid_price_ema;
 
-        let spread = self.spread_ema;
-        let spread_max = self.orderbook_imbalance_ema;
-        let spread_min = self.volume_decay;
+        let spread = self.state_matrix[0][0] + self.state_matrix[1][0] + self.state_matrix[2][0];
+        let spread_max = self.state_matrix[0][1] + self.state_matrix[1][1] + self.state_matrix[2][1];
+        let spread_min = self.state_matrix[0][2] + self.state_matrix[1][2] + self.state_matrix[2][2];
 
         let optimal_ask_price = self.optimal_ask_price;
         let optimal_bid_price = self.optimal_bid_price;
@@ -681,7 +691,6 @@ impl Predictor {
         let sigma_square = Decimal::from(self.state);
 
         let gamma = self.force_order_value;
-        self.force_order_value = Decimal::ZERO;
         let kappa = self.balance;
 
         let flow_ratio = Decimal::ZERO;
@@ -741,7 +750,7 @@ impl Predictor {
 
             info!("state_matrix={}", parsed.to_string());
 
-            self.state_matrix = parsed["state_matrix"]
+            self.state_matrix = parsed["num_matrix"]
                 .as_array()
                 .unwrap()
                 .iter()
@@ -755,7 +764,7 @@ impl Predictor {
                 .collect();
 
             self.state = parsed["state"].as_i64().unwrap() as usize;
-            self.params.holding_time = Decimal::from(parsed["min_index"].as_i64().unwrap());
+            // self.params.holding_time = Decimal::from(parsed["min_index"].as_i64().unwrap());
         } else {
             error!("状态转移链挂了:{}", response.status());
         }

+ 2 - 2
strategy/src/strategy.rs

@@ -986,7 +986,7 @@ impl Strategy {
 
         // 挂多单
         if self.post_side >= 0 && buy_value.is_zero() && predictor.inventory < predictor.params.grid && predictor.bid_delta.is_zero() {
-            let mut target_buy_price = predictor.optimal_bid_price;
+            let mut target_buy_price = predictor.optimal_bid_price * dec!(1.001);
             // target_buy_price = utils::clip(target_buy_price, self.bp * dec!(0.97), self.ap * dec!(1.0005));
             target_buy_price = utils::fix_price(target_buy_price, self.tick_size);
 
@@ -1015,7 +1015,7 @@ impl Strategy {
         }
         // 挂空单
         if self.post_side <= 0 && sell_value.is_zero() && predictor.inventory > -predictor.params.grid && predictor.ask_delta.is_zero() {
-            let mut target_sell_price = predictor.optimal_ask_price;
+            let mut target_sell_price = predictor.optimal_ask_price * dec!(0.999);
             // target_sell_price = utils::clip(target_sell_price, self.bp * dec!(0.9995), self.ap * dec!(1.03));
             // 取消大小限制
             target_sell_price = utils::fix_price(target_sell_price, self.tick_size);