|
|
@@ -81,6 +81,10 @@ pub struct Predictor {
|
|
|
pub trade_side_map: HashMap<Decimal, String>, // 交易时间,对应的是kk,kd两个方向
|
|
|
pub trade_amount_map: HashMap<Decimal, Decimal>, // 交易数量
|
|
|
pub trade_amount: Decimal,
|
|
|
+
|
|
|
+ pub prev_flush_state_time: Decimal,
|
|
|
+ pub state: usize,
|
|
|
+ pub state_matrix: Vec<Vec<Decimal>>,
|
|
|
}
|
|
|
|
|
|
impl Predictor {
|
|
|
@@ -205,6 +209,14 @@ impl Predictor {
|
|
|
trade_side_map: HashMap::new(),
|
|
|
trade_amount_map: HashMap::new(),
|
|
|
trade_amount: Default::default(),
|
|
|
+
|
|
|
+ prev_flush_state_time: Default::default(),
|
|
|
+ state: 1,
|
|
|
+ state_matrix: vec![
|
|
|
+ vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ ],
|
|
|
};
|
|
|
|
|
|
predictor
|
|
|
@@ -423,10 +435,36 @@ impl Predictor {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- self.bid_delta = dec!(-2);
|
|
|
- self.ask_delta = dec!(-2);
|
|
|
|
|
|
+ // 根据马尔科夫链调整挂单策略
|
|
|
let now = Decimal::from(Utc::now().timestamp_millis());
|
|
|
+ if now - self.prev_flush_state_time > dec!(60_000) {
|
|
|
+ self.state_matrix = vec![
|
|
|
+ vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ ];
|
|
|
+
|
|
|
+ self.state = 0usize;
|
|
|
+ let profit_list = vec![dec!(0.33), dec!(0.33), dec!(0.33)];
|
|
|
+
|
|
|
+ let mut profit_min = dec!(1);
|
|
|
+ let mut profit_min_index = 0usize;
|
|
|
+
|
|
|
+ for (i, p) in profit_list.iter().enumerate() {
|
|
|
+ if *p < profit_min {
|
|
|
+ profit_min = *p;
|
|
|
+ profit_min_index = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 这个是后面加了动态平仓时间再使用的
|
|
|
+ // self.params.holding_time = Decimal::from(profit_min_index);
|
|
|
+ let _ = Decimal::from(profit_min_index);
|
|
|
+ }
|
|
|
+
|
|
|
+ self.bid_delta = dec!(-2);
|
|
|
+ self.ask_delta = dec!(-2);
|
|
|
|
|
|
// 平仓优先级高一些
|
|
|
if self.trade_time_vec.len() > 0 {
|
|
|
@@ -548,9 +586,9 @@ impl Predictor {
|
|
|
let last_price = self.last_price;
|
|
|
let fair_price = Self::DONT_VIEW;
|
|
|
|
|
|
- let spread = self.balance;
|
|
|
- let spread_max = Self::DONT_VIEW;
|
|
|
- let spread_min = Self::DONT_VIEW;
|
|
|
+ let spread = self.state_matrix[0][0];
|
|
|
+ let spread_max = self.state_matrix[1][1];
|
|
|
+ let spread_min = self.state_matrix[2][2];
|
|
|
|
|
|
let optimal_ask_price = self.optimal_ask_price;
|
|
|
let optimal_bid_price = self.optimal_bid_price;
|
|
|
@@ -561,7 +599,7 @@ impl Predictor {
|
|
|
// let sigma_square = self.error_rate;
|
|
|
|
|
|
let gamma = self.pos_amount;
|
|
|
- let kappa = self.inventory;
|
|
|
+ let kappa = self.balance;
|
|
|
|
|
|
let flow_ratio = Decimal::ZERO;
|
|
|
|