|
|
@@ -47,6 +47,7 @@ pub struct Predictor {
|
|
|
|
|
|
pub mid_price_time_vec: FixedTimeRangeDeque<Decimal>, // 中间价格队列,100ms以内的所有中间价格
|
|
|
pub fair_price_time_vec: FixedTimeRangeDeque<Decimal>, // 公平价格队列,100ms以内的所有公平价格
|
|
|
+ pub spread_sma_1000_time_vec: FixedTimeRangeDeque<Decimal>, // spread队列,100ms以内的所有spread_sma_1000
|
|
|
pub fair_price_vec: Vec<Decimal>, // 公平价格列表,0表示做市所,1表示参考所
|
|
|
pub fair_price: Decimal, // 预定价格
|
|
|
pub fair_rate_focus: Decimal, // 变化幅度焦点
|
|
|
@@ -156,6 +157,7 @@ impl Predictor {
|
|
|
|
|
|
fair_price_time_vec: FixedTimeRangeDeque::new(100_000),
|
|
|
mid_price_time_vec: FixedTimeRangeDeque::new(100_000),
|
|
|
+ spread_sma_1000_time_vec: FixedTimeRangeDeque::new(500_000),
|
|
|
fair_price: Default::default(),
|
|
|
fair_rate_focus: Default::default(),
|
|
|
fair_price_when_ordering: Default::default(),
|
|
|
@@ -322,21 +324,21 @@ impl Predictor {
|
|
|
// }
|
|
|
|
|
|
// 更新程序关注的变化幅度焦点
|
|
|
- if self.fair_rate_focus.is_zero() {
|
|
|
- let last_fair_price = self.fair_price_time_vec.deque.iter().last().unwrap();
|
|
|
- let first_fair_price = self.fair_price_time_vec.deque[0];
|
|
|
- let mut rate = (last_fair_price - first_fair_price) / first_fair_price;
|
|
|
+ if self.fair_rate_focus.is_zero() && self.spread_sma_1000_time_vec.len() > 1 {
|
|
|
+ let last_spread_sma = self.spread_sma_1000_time_vec.deque.iter().last().unwrap();
|
|
|
+ let first_spread_sma = self.spread_sma_1000_time_vec.deque[0];
|
|
|
+ let mut rate = last_spread_sma - first_spread_sma;
|
|
|
rate.rescale(8);
|
|
|
|
|
|
// 只有有强度的rate才有资格被称为针
|
|
|
if rate.abs() > self.params.open {
|
|
|
// 向上涨,并且fair下穿mid,视为观测阶段开始
|
|
|
- if rate > Decimal::ZERO && self.mid_price > self.fair_price {
|
|
|
+ if rate > Decimal::ZERO {
|
|
|
self.fair_rate_focus = rate;
|
|
|
}
|
|
|
|
|
|
// 向下跌,并且fair上穿mid,视为观测阶段开始
|
|
|
- if rate < Decimal::ZERO && self.mid_price < self.fair_price {
|
|
|
+ if rate < Decimal::ZERO {
|
|
|
self.fair_rate_focus = rate;
|
|
|
}
|
|
|
}
|
|
|
@@ -379,6 +381,7 @@ impl Predictor {
|
|
|
} else {
|
|
|
self.spread_sma_1000 * dec!(0.999) + self.spread * dec!(0.001)
|
|
|
};
|
|
|
+ self.spread_sma_1000_time_vec.push_back(self.spread_sma_1000);
|
|
|
// self.spread_sma_1000.rescale(8);
|
|
|
|
|
|
while self.spread_vec.len() > 1_000 {
|
|
|
@@ -399,8 +402,8 @@ impl Predictor {
|
|
|
// let is_open_long = self.spread_sma_1000 - self.spread_sma > self.params.open && self.fair_price > self.mid_price;
|
|
|
// let is_open_short = self.spread_sma_1000 - self.spread_sma < self.params.open * Decimal::NEGATIVE_ONE && self.fair_price < self.mid_price;
|
|
|
// 可能是接针
|
|
|
- let is_open_long = self.fair_rate_focus < Decimal::ZERO;
|
|
|
- let is_open_short = self.fair_rate_focus > Decimal::ZERO;
|
|
|
+ let is_open_long = self.fair_rate_focus < Decimal::ZERO && self.fair_price > self.mid_price;
|
|
|
+ let is_open_short = self.fair_rate_focus > Decimal::ZERO && self.fair_price < self.mid_price;
|
|
|
let is_close_long = self.inventory > Decimal::ZERO;
|
|
|
let is_close_short = self.inventory < Decimal::ZERO;
|
|
|
|
|
|
@@ -408,31 +411,31 @@ impl Predictor {
|
|
|
self.ask_delta = dec!(-2);
|
|
|
|
|
|
if is_close_long {
|
|
|
- // if self.mid_price > self.pos_avg_price {
|
|
|
- // // let profit_rate = (self.mid_price - self.pos_avg_price) / self.pos_avg_price;
|
|
|
- // // let fill_rate = profit_rate / (self.params.open * dec!(50));
|
|
|
- // // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
|
|
|
- // //
|
|
|
- // // self.ask_delta = self.mid_price * close_rate * self.t_diff;
|
|
|
- // self.ask_delta = self.mid_price * self.params.close;
|
|
|
- // } else if self.mid_price > self.fair_price {
|
|
|
- // self.ask_delta = self.mid_price * self.params.close;
|
|
|
- // }
|
|
|
+ if self.mid_price > self.pos_avg_price {
|
|
|
+ // let profit_rate = (self.mid_price - self.pos_avg_price) / self.pos_avg_price;
|
|
|
+ // let fill_rate = profit_rate / (self.params.open * dec!(50));
|
|
|
+ // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
|
|
|
+ //
|
|
|
+ // self.ask_delta = self.mid_price * close_rate * self.t_diff;
|
|
|
+ self.ask_delta = self.mid_price * self.params.close;
|
|
|
+ } else if self.mid_price > self.fair_price {
|
|
|
+ self.ask_delta = self.mid_price * self.params.close;
|
|
|
+ }
|
|
|
|
|
|
- self.ask_delta = self.mid_price * self.params.close;
|
|
|
+ // self.ask_delta = self.mid_price * self.params.close;
|
|
|
} else if is_close_short {
|
|
|
- // if self.mid_price < self.pos_avg_price {
|
|
|
- // // let profit_rate = (self.pos_avg_price - self.mid_price) / self.pos_avg_price;
|
|
|
- // // let fill_rate = profit_rate / (self.params.open * dec!(50));
|
|
|
- // // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
|
|
|
- // //
|
|
|
- // // self.bid_delta = self.mid_price * close_rate * self.t_diff;
|
|
|
- // self.bid_delta = self.mid_price * self.params.close;
|
|
|
- // } else if self.mid_price < self.fair_price {
|
|
|
- // self.bid_delta = self.mid_price * self.params.close;
|
|
|
- // }
|
|
|
+ if self.mid_price < self.pos_avg_price {
|
|
|
+ // let profit_rate = (self.pos_avg_price - self.mid_price) / self.pos_avg_price;
|
|
|
+ // let fill_rate = profit_rate / (self.params.open * dec!(50));
|
|
|
+ // let close_rate = (Decimal::ONE - fill_rate) * self.params.open + self.params.close;
|
|
|
+ //
|
|
|
+ // self.bid_delta = self.mid_price * close_rate * self.t_diff;
|
|
|
+ self.bid_delta = self.mid_price * self.params.close;
|
|
|
+ } else if self.mid_price < self.fair_price {
|
|
|
+ self.bid_delta = self.mid_price * self.params.close;
|
|
|
+ }
|
|
|
|
|
|
- self.bid_delta = self.mid_price * self.params.close;
|
|
|
+ // self.bid_delta = self.mid_price * self.params.close;
|
|
|
} else if is_open_long {
|
|
|
let is_open_long_market = self.spread_sma_1000 - self.spread_sma > self.params.open_market;
|
|
|
self.bid_delta = if is_open_long_market {
|
|
|
@@ -535,9 +538,12 @@ impl Predictor {
|
|
|
let bid_price = self.bid_price;
|
|
|
let last_price = self.last_price;
|
|
|
|
|
|
- let spread = self.spread_sma;
|
|
|
- let spread_max = self.spread_sma_2000;
|
|
|
- let spread_min = self.spread_sma_1000;
|
|
|
+
|
|
|
+ let last_spread_sma = self.spread_sma_1000_time_vec.deque.iter().last().unwrap();
|
|
|
+ let first_spread_sma = self.spread_sma_1000_time_vec.deque[0];
|
|
|
+ let spread = self.spread_sma_1000;
|
|
|
+ let spread_max = last_spread_sma - first_spread_sma;
|
|
|
+ let spread_min = Self::UN_VIEW;
|
|
|
// let spread = self.price_times_avg;
|
|
|
// let spread_max = self.fair_price_vec[1] / self.fair_price_vec[0];
|
|
|
// let spread_min = self.fair_price / self.mid_price;
|