|
|
@@ -26,7 +26,7 @@ pub struct Predictor {
|
|
|
pub trend_short_rate: Decimal,
|
|
|
pub fair_rate: Decimal,
|
|
|
|
|
|
- pub prices: Vec<Vec<VecDeque<Decimal>>>, // [[[做市所], [参考所0]], ...]
|
|
|
+ pub prices: Vec<Vec<FixedTimeRangeDeque<Decimal>>>, // [[[做市所], [参考所0]], ...]
|
|
|
pub ks: Vec<Decimal>,
|
|
|
pub bs: Vec<Decimal>,
|
|
|
|
|
|
@@ -152,7 +152,7 @@ impl Predictor {
|
|
|
price_avg_times_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
|
|
|
price_avg_times_long_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
|
|
|
|
|
|
- prices: vec![vec![VecDeque::new(); 2]; params.ref_exchange.len()],
|
|
|
+ prices: vec![vec![FixedTimeRangeDeque::new(600_000_000); 2]; params.ref_exchange.len()],
|
|
|
ks: vec![Decimal::ZERO; params.ref_exchange.len()],
|
|
|
bs: vec![Decimal::ZERO; params.ref_exchange.len()],
|
|
|
prev_fitting_time_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
|
|
|
@@ -263,12 +263,6 @@ impl Predictor {
|
|
|
self.prices[mid_index][0].push_back(self.mid_price);
|
|
|
self.prices[mid_index][1].push_back(mp.clone());
|
|
|
|
|
|
- // 长度限制
|
|
|
- if self.prices[mid_index][0].len() > 10000 {
|
|
|
- self.prices[mid_index][0].pop_front();
|
|
|
- self.prices[mid_index][1].pop_front();
|
|
|
- }
|
|
|
-
|
|
|
// 拟合,60s拟合一次
|
|
|
let before_fitting = Utc::now().timestamp_millis();
|
|
|
if Decimal::from(before_fitting) - self.prev_fitting_time_vec[mid_index] > dec!(60_000) || self.prices[mid_index][0].len() < 1000 {
|
|
|
@@ -395,7 +389,11 @@ impl Predictor {
|
|
|
.filter(|&&value| value != Decimal::new(0, 0)) // 过滤掉0
|
|
|
.count();
|
|
|
if fair_price_count != 0 {
|
|
|
- self.fair_price = fair_price_sum / Decimal::from(fair_price_count);
|
|
|
+ self.fair_price = if self.fair_price.is_zero() {
|
|
|
+ fair_price_sum / Decimal::from(fair_price_count)
|
|
|
+ } else {
|
|
|
+ dec!(0.99) + self.fair_price + dec!(0.01) * fair_price_sum / Decimal::from(fair_price_count)
|
|
|
+ };
|
|
|
|
|
|
self.fair_price_short_vec.push_back(self.fair_price);
|
|
|
|
|
|
@@ -453,14 +451,14 @@ impl Predictor {
|
|
|
let is_open_long = self.inventory.is_zero()
|
|
|
&& self.fair_price > self.mid_price * (Decimal::ONE + self.params.open)
|
|
|
&& self.trend_long_rate < dec!(-0.005)
|
|
|
- && self.trend_short_rate < dec!(-0.0005)
|
|
|
- && self.fair_rate > dec!(0.0005)
|
|
|
+ && self.trend_short_rate < Decimal::ZERO
|
|
|
+ && self.fair_rate > Decimal::ZERO
|
|
|
;
|
|
|
let is_open_short = self.inventory.is_zero()
|
|
|
&& self.fair_price < self.mid_price * (Decimal::ONE - self.params.open)
|
|
|
&& self.trend_long_rate > dec!(0.005)
|
|
|
- && self.trend_short_rate > dec!(0.0005)
|
|
|
- && self.fair_rate < dec!(-0.0005)
|
|
|
+ && self.trend_short_rate > Decimal::ZERO
|
|
|
+ && self.fair_rate < Decimal::ZERO
|
|
|
;
|
|
|
|
|
|
// 使信号有一定持续性
|
|
|
@@ -576,7 +574,7 @@ impl Predictor {
|
|
|
let mut sum_xy = Decimal::zero();
|
|
|
|
|
|
// 遍历VecDeque中的元素
|
|
|
- for (xi, yi) in x.iter().zip(y.iter()) {
|
|
|
+ for (xi, yi) in x.deque.iter().zip(y.deque.iter()) {
|
|
|
sum_x += xi;
|
|
|
sum_y += yi;
|
|
|
let xi_sq = xi * xi;
|