|
@@ -63,7 +63,7 @@ pub struct Predictor {
|
|
|
|
|
|
|
|
pub prev_trade_force_order_value: Decimal, // 上次下单时的爆仓价值ln
|
|
pub prev_trade_force_order_value: Decimal, // 上次下单时的爆仓价值ln
|
|
|
pub prev_trade_price: Decimal, // 上次加仓的价格
|
|
pub prev_trade_price: Decimal, // 上次加仓的价格
|
|
|
- pub prev_trade_time: i64, // 上次交易时间,也就是t
|
|
|
|
|
|
|
+ pub prev_trade_time: Decimal, // 上次交易时间,也就是t
|
|
|
pub t_diff: Decimal, // (T-t)
|
|
pub t_diff: Decimal, // (T-t)
|
|
|
|
|
|
|
|
pub last_update_time: Decimal, // 最后更新时间(depth)
|
|
pub last_update_time: Decimal, // 最后更新时间(depth)
|
|
@@ -86,7 +86,7 @@ pub struct Predictor {
|
|
|
impl Predictor {
|
|
impl Predictor {
|
|
|
// 时间窗口大小(微秒)
|
|
// 时间窗口大小(微秒)
|
|
|
// const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
|
|
// const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
|
|
|
- const TIME_DIFF_RANGE_MICROS: i64 = 15 * 60_000_000;
|
|
|
|
|
|
|
+ // const TIME_DIFF_RANGE_MICROS: i64 = 15 * 60_000_000;
|
|
|
// const TRADE_LONG_RANGE_MICROS: i64 = 5 * 60_000_000;
|
|
// const TRADE_LONG_RANGE_MICROS: i64 = 5 * 60_000_000;
|
|
|
// const SPREAD_RANGE_MICROS: i64 = 15 * 60_000_000;
|
|
// const SPREAD_RANGE_MICROS: i64 = 15 * 60_000_000;
|
|
|
// const TRADE_SHORT_RANGE_MICROS: i64 = 2 * 60_000_000;
|
|
// const TRADE_SHORT_RANGE_MICROS: i64 = 2 * 60_000_000;
|
|
@@ -178,7 +178,7 @@ impl Predictor {
|
|
|
one_grid_order_value: Default::default(),
|
|
one_grid_order_value: Default::default(),
|
|
|
prev_trade_force_order_value: Default::default(),
|
|
prev_trade_force_order_value: Default::default(),
|
|
|
prev_trade_price: Default::default(),
|
|
prev_trade_price: Default::default(),
|
|
|
- prev_trade_time: Utc::now().timestamp_micros(),
|
|
|
|
|
|
|
+ prev_trade_time: Default::default(),
|
|
|
t_diff: Default::default(),
|
|
t_diff: Default::default(),
|
|
|
level: Default::default(),
|
|
level: Default::default(),
|
|
|
pos_amount: Default::default(),
|
|
pos_amount: Default::default(),
|
|
@@ -317,7 +317,7 @@ impl Predictor {
|
|
|
|
|
|
|
|
// 用于计算加仓
|
|
// 用于计算加仓
|
|
|
if self.inventory.abs() > prev_inventory.abs() {
|
|
if self.inventory.abs() > prev_inventory.abs() {
|
|
|
- self.prev_trade_time = Utc::now().timestamp_micros();
|
|
|
|
|
|
|
+ self.prev_trade_time = Decimal::from(Utc::now().timestamp_millis());
|
|
|
self.prev_trade_price = self.mid_price;
|
|
self.prev_trade_price = self.mid_price;
|
|
|
self.prev_trade_force_order_value = self.force_order_value;
|
|
self.prev_trade_force_order_value = self.force_order_value;
|
|
|
self.force_order_value = Decimal::ZERO;
|
|
self.force_order_value = Decimal::ZERO;
|
|
@@ -411,17 +411,14 @@ impl Predictor {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 可能是接针
|
|
|
|
|
- let is_open_long = self.force_order_value < -self.params.open && self.inventory < self.params.grid;
|
|
|
|
|
- let is_open_short = self.force_order_value > self.params.open && self.inventory > -self.params.grid;
|
|
|
|
|
-
|
|
|
|
|
self.bid_delta = dec!(-2);
|
|
self.bid_delta = dec!(-2);
|
|
|
self.ask_delta = dec!(-2);
|
|
self.ask_delta = dec!(-2);
|
|
|
|
|
|
|
|
|
|
+ let now = Decimal::from(Utc::now().timestamp_millis());
|
|
|
|
|
+
|
|
|
// 平仓优先级高一些
|
|
// 平仓优先级高一些
|
|
|
if self.trade_time_vec.len() > 0 {
|
|
if self.trade_time_vec.len() > 0 {
|
|
|
let first = self.trade_time_vec.front().unwrap();
|
|
let first = self.trade_time_vec.front().unwrap();
|
|
|
- let now = Decimal::from(Utc::now().timestamp_millis());
|
|
|
|
|
|
|
|
|
|
if now - *first > self.params.holding_time * Decimal::ONE_THOUSAND {
|
|
if now - *first > self.params.holding_time * Decimal::ONE_THOUSAND {
|
|
|
let side = self.trade_side_map.get(first).unwrap();
|
|
let side = self.trade_side_map.get(first).unwrap();
|
|
@@ -441,6 +438,16 @@ impl Predictor {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 可能是接针
|
|
|
|
|
+ let is_open_long = self.force_order_value < -self.params.open
|
|
|
|
|
+ && now - self.prev_trade_time > dec!(60000)
|
|
|
|
|
+ && self.inventory < self.params.grid
|
|
|
|
|
+ && self.bid_delta == dec!(-2);
|
|
|
|
|
+ let is_open_short = self.force_order_value > self.params.open
|
|
|
|
|
+ && now - self.prev_trade_time > dec!(60000)
|
|
|
|
|
+ && self.inventory > -self.params.grid
|
|
|
|
|
+ && self.ask_delta == dec!(-2);
|
|
|
|
|
+
|
|
|
if is_open_long {
|
|
if is_open_long {
|
|
|
self.bid_delta = Decimal::ZERO;
|
|
self.bid_delta = Decimal::ZERO;
|
|
|
} else if is_open_short {
|
|
} else if is_open_short {
|
|
@@ -470,12 +477,12 @@ impl Predictor {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pub fn update_t_diff(&mut self) {
|
|
pub fn update_t_diff(&mut self) {
|
|
|
- if self.prev_trade_time > 0 {
|
|
|
|
|
- let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
|
|
|
|
|
- self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::TIME_DIFF_RANGE_MICROS).unwrap(), Decimal::ZERO);
|
|
|
|
|
- } else {
|
|
|
|
|
- self.t_diff = Decimal::ONE;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // if self.prev_trade_time > 0 {
|
|
|
|
|
+ // let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
|
|
|
|
|
+ // self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::TIME_DIFF_RANGE_MICROS).unwrap(), Decimal::ZERO);
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // self.t_diff = Decimal::ONE;
|
|
|
|
|
+ // }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pub fn check_ready(&mut self) {
|
|
pub fn check_ready(&mut self) {
|