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