|
|
@@ -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);
|