|
|
@@ -9,7 +9,6 @@ use tracing::{info};
|
|
|
use global::cci::CentralControlInfo;
|
|
|
use global::fixed_time_range_deque::FixedTimeRangeDeque;
|
|
|
use global::params::Params;
|
|
|
-use global::predictor_state::PredictorState;
|
|
|
use standard::{Depth, Record, Ticker, Trade};
|
|
|
use crate::utils;
|
|
|
|
|
|
@@ -56,6 +55,7 @@ pub struct AvellanedaStoikov {
|
|
|
pub order_ref_price: Decimal, // 下单时的预定价格
|
|
|
|
|
|
pub cci_arc: Arc<Mutex<CentralControlInfo>>, // 中控信息
|
|
|
+ pub debugs: Vec<Vec<Decimal>>, // debug数据等
|
|
|
|
|
|
pub is_ready: bool,
|
|
|
pub prev_trade_time: i64, // 上次交易时间,也就是t
|
|
|
@@ -118,6 +118,7 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
cci_arc,
|
|
|
|
|
|
+ debugs: vec![],
|
|
|
is_ready: false,
|
|
|
prev_trade_time: Utc::now().timestamp_micros(),
|
|
|
close_price: Default::default(),
|
|
|
@@ -262,6 +263,7 @@ impl AvellanedaStoikov {
|
|
|
} else {
|
|
|
self.fair_price_vec[index] * dec!(0.9) + fair_price * dec!(0.1)
|
|
|
};
|
|
|
+ self.fair_price_vec[index].rescale(self.mid_price.scale());
|
|
|
self.volume_vec[index] = a1.size + b1.size;
|
|
|
}
|
|
|
|
|
|
@@ -418,6 +420,9 @@ impl AvellanedaStoikov {
|
|
|
} else {
|
|
|
min(self.ref_price - self.bid_delta, self.ask_price)
|
|
|
};
|
|
|
+
|
|
|
+ self.optimal_ask_price.rescale(self.mid_price.scale());
|
|
|
+ self.optimal_bid_price.rescale(self.mid_price.scale());
|
|
|
}
|
|
|
|
|
|
pub fn update_t_diff(&mut self) {
|
|
|
@@ -519,7 +524,7 @@ impl AvellanedaStoikov {
|
|
|
// }
|
|
|
|
|
|
|
|
|
- let cci_arc = self.cci_arc.clone();
|
|
|
+ // let cci_arc = self.cci_arc.clone();
|
|
|
let now = Decimal::from_i64(Utc::now().timestamp_millis()).unwrap();
|
|
|
let mid_price = self.mid_price;
|
|
|
let ask_price = self.ask_price;
|
|
|
@@ -547,42 +552,47 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
self.prev_insert_time = now;
|
|
|
|
|
|
- // 将数据放入cci里面,方便读取
|
|
|
- let cci_arc_clone = cci_arc.clone();
|
|
|
- tokio::spawn(async move {
|
|
|
- let mut cci = cci_arc_clone.lock().await;
|
|
|
-
|
|
|
- // let kappa = Decimal::from(cci.predictor_state_vec.len());
|
|
|
-
|
|
|
- cci.predictor_state_vec.push(PredictorState {
|
|
|
- update_time: now,
|
|
|
-
|
|
|
- mid_price,
|
|
|
- ask_price,
|
|
|
- bid_price,
|
|
|
- last_price,
|
|
|
-
|
|
|
- spread,
|
|
|
- spread_max,
|
|
|
- spread_min,
|
|
|
- optimal_ask_price,
|
|
|
- optimal_bid_price,
|
|
|
-
|
|
|
- inventory,
|
|
|
- sigma_square,
|
|
|
- gamma,
|
|
|
- kappa,
|
|
|
-
|
|
|
- flow_ratio,
|
|
|
- ref_price,
|
|
|
- });
|
|
|
+ // 将数据放入debugs里面
|
|
|
+ if self.debugs.is_empty() {
|
|
|
+ self.debugs = vec![Vec::new(); 16];
|
|
|
+ }
|
|
|
+ self.debugs[0].push(now);
|
|
|
+ self.debugs[1].push(mid_price);
|
|
|
+ self.debugs[2].push(ask_price);
|
|
|
+ self.debugs[3].push(bid_price);
|
|
|
+ self.debugs[4].push(last_price);
|
|
|
+ self.debugs[5].push(spread);
|
|
|
+ self.debugs[6].push(spread_max);
|
|
|
+ self.debugs[7].push(spread_min);
|
|
|
+ self.debugs[8].push(optimal_ask_price);
|
|
|
+ self.debugs[9].push(optimal_bid_price);
|
|
|
+ self.debugs[10].push(inventory);
|
|
|
+ self.debugs[11].push(sigma_square);
|
|
|
+ self.debugs[12].push(gamma);
|
|
|
+ self.debugs[13].push(kappa);
|
|
|
+ self.debugs[14].push(flow_ratio);
|
|
|
+ self.debugs[15].push(ref_price);
|
|
|
+
|
|
|
+ // 长度限定
|
|
|
+ if self.debugs[0].len() > 700_000 {
|
|
|
+ self.debugs[0].remove(0);
|
|
|
+ self.debugs[1].remove(0);
|
|
|
+ self.debugs[2].remove(0);
|
|
|
+ self.debugs[3].remove(0);
|
|
|
+ self.debugs[4].remove(0);
|
|
|
+ self.debugs[5].remove(0);
|
|
|
+ self.debugs[6].remove(0);
|
|
|
+ self.debugs[7].remove(0);
|
|
|
+ self.debugs[8].remove(0);
|
|
|
+ self.debugs[9].remove(0);
|
|
|
+ self.debugs[10].remove(0);
|
|
|
+ self.debugs[11].remove(0);
|
|
|
+ self.debugs[12].remove(0);
|
|
|
+ self.debugs[13].remove(0);
|
|
|
+ self.debugs[14].remove(0);
|
|
|
+ self.debugs[15].remove(0);
|
|
|
+ }
|
|
|
|
|
|
- // 长度限定,最大100w条
|
|
|
- if cci.predictor_state_vec.len() > 700_000 {
|
|
|
- cci.predictor_state_vec.remove(0);
|
|
|
- }
|
|
|
- });
|
|
|
- //
|
|
|
let error_rate = self.error_rate;
|
|
|
// 将数据存入本地json文件,要求不能在行情烈度比较大的时候执行这个逻辑,防止卡交易逻辑
|
|
|
if now - self.prev_save_time < dec!(60000) || error_rate > dec!(0.15) {
|
|
|
@@ -591,11 +601,7 @@ impl AvellanedaStoikov {
|
|
|
// 存放逻辑
|
|
|
info!("存放, {}, {}, {}", now, self.prev_save_time, now - self.prev_save_time);
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- let cci = cci_arc.lock().await;
|
|
|
- let data_c = cci.predictor_state_vec.clone();
|
|
|
-
|
|
|
+ let data_c = self.debugs.clone();
|
|
|
tokio::spawn(async move {
|
|
|
let temp_html_str = utils::build_html_file(&data_c).await;
|
|
|
utils::write_to_file(&temp_html_str, "./db/db.html".to_string()).await;
|