浏览代码

行情信息未收到时的软处理
1. 打印频率限制
2. 差价检查不在未准备好时进行
3. 行情延迟判断不在未准备好时进行

skyfffire 2 年之前
父节点
当前提交
fb71ef312a
共有 1 个文件被更改,包括 26 次插入10 次删除
  1. 26 10
      strategy/src/quant.rs

+ 26 - 10
strategy/src/quant.rs

@@ -102,6 +102,10 @@ pub struct Quant {
     pub is_update: HashMap<String, bool>,
     pub running: Arc<AtomicBool>,
     pub hold_coin: Decimal,
+
+    // 打印限频
+    pub prev_log_ready_timestamp: i64,
+    pub log_ready_log_interval: i64,
 }
 
 impl Quant {
@@ -212,6 +216,8 @@ impl Quant {
             local_depths: Default::default(),
             is_update: Default::default(),
             running,
+            prev_log_ready_timestamp: 0,
+            log_ready_log_interval: 10 * 1000,
         };
         for i in 0..=params.ref_exchange.len() - 1 {
             // 拼接不会消耗原字符串
@@ -528,35 +534,45 @@ impl Quant {
         // 检查 ticker 行情
         for i in &self.ref_name {
             if self.tickers.is_empty() || !self.tickers.contains_key(i) {
-                info!("529参考盘口ticker未准备好: {:?}", self.tickers);
+                self.log_ready_status(format!("529参考盘口ticker未准备好: {:?}", self.tickers));
                 return;
             } else {
                 if self.tickers.get(i).unwrap().buy == dec!(0) || self.tickers.get(i).unwrap().sell == dec!(0) {
-                    info!("533参考盘口ticker未准备好: {:?}", self.tickers);
+                    self.log_ready_status(format!("533参考盘口ticker未准备好: {:?}", self.tickers));
                     return;
                 }
             }
         }
         if self.tickers.contains_key(&self.trade_name) {
             if self.tickers.get(&self.trade_name).unwrap().buy == dec!(0) || self.tickers.get(&self.trade_name).unwrap().sell == dec!(0) {
-                info!("540交易盘口ticker未准备好: {:?}", self.tickers);
+                self.log_ready_status(format!("540交易盘口ticker未准备好: {:?}", self.tickers));
                 return;
             }
         } else {
-            info!("544交易盘口ticker未准备好: {:?}", self.tickers);
+            self.log_ready_status(format!("544交易盘口ticker未准备好: {:?}", self.tickers));
             return;
         }
         // 检查 market 行情
         let all_market: Vec<Decimal> = self.get_all_market_data();
         if all_market.len() != LENGTH * (1usize + self.ref_num as usize) {
-            info!("550聚合行情未准备好: market长度:{}, 检验数: {}", all_market.len(), LENGTH * (1usize + self.ref_num as usize));
+            self.log_ready_status(format!("550聚合行情未准备好: market长度:{}, 检验数: {}", all_market.len(), LENGTH * (1usize + self.ref_num as usize)));
             return;
         } else {
-            info!("553聚合行情准备就绪");
+            // 如果准备就绪,则可以开始交易
+            info!("----------------------------------聚合行情准备就绪,可以开始交易---------------------------------");
             self.trade_msg.market = all_market;
             self.predictor.market_info_handler(&self.trade_msg.market);
+            self.ready = 1;
+        }
+    }
+
+    pub fn log_ready_status(&mut self, msg: String) {
+        // 隔一会再打印未准备就绪的台词
+        let now_timestamp = Utc::now().timestamp_millis();
+        if now_timestamp - self.prev_log_ready_timestamp > self.log_ready_log_interval {
+            self.prev_log_ready_timestamp = now_timestamp;
+            info!("{}", msg);
         }
-        self.ready = 1
     }
 
     pub fn _update_depth(&mut self, depth: Vec<Decimal>, name: String, trace_stack: &mut TraceStack) {
@@ -887,7 +903,7 @@ impl Quant {
             self.stop().await;
         }
         // 报单延迟风控,平均延迟允许上限5000ms
-        if self.platform_rest.get_request_avg_delay() > dec!(5000) {
+        if self.ready == 1 && self.platform_rest.get_request_avg_delay() > dec!(5000) {
             let exit_msg = format!("{} 延迟爆表 触发风控 准备停机。", self.params.account_name);
             warn!(exit_msg);
             self.exit_msg = exit_msg;
@@ -939,7 +955,7 @@ impl Quant {
             let delay = now_time_millis - last_update_millis;
             let limit = global::public_params::MARKET_DELAY_LIMIT;
 
-            if delay > limit {
+            if self.ready == 1 && delay > limit {
                 let exit_msg = format!("{} ticker_name:{}, delay:{}ms,行情更新延迟过高,退出。",
                                        self.params.account_name, exchange_name, delay);
                 warn!(?now_time_millis, ?last_update_millis, ?limit);
@@ -994,7 +1010,7 @@ impl Quant {
         }
 
         // 定价异常风控
-        if (self.strategy.ref_price - self.strategy.mp).abs() / self.strategy.mp > dec!(0.03) {
+        if self.ready == 1 && (self.strategy.ref_price - self.strategy.mp).abs() / self.strategy.mp > dec!(0.03) {
             let exit_msg = format!("{} 定价偏离过大,怀疑定价异常,退出。", self.params.account_name);
             warn!(exit_msg);
             warn!(?self.strategy.ref_price, ?self.strategy.mp);