|
@@ -22,6 +22,7 @@ pub struct Predictor {
|
|
|
pub record_vec: VecDeque<Record>, // 蜡烛队列
|
|
pub record_vec: VecDeque<Record>, // 蜡烛队列
|
|
|
|
|
|
|
|
pub mid_price: Decimal, // 中间价
|
|
pub mid_price: Decimal, // 中间价
|
|
|
|
|
+ pub fair_price: Decimal,
|
|
|
pub ask_price: Decimal, // 卖一价
|
|
pub ask_price: Decimal, // 卖一价
|
|
|
pub bid_price: Decimal, // 买一价
|
|
pub bid_price: Decimal, // 买一价
|
|
|
pub last_price: Decimal, // 最后成交价
|
|
pub last_price: Decimal, // 最后成交价
|
|
@@ -125,6 +126,7 @@ impl Predictor {
|
|
|
record_vec: VecDeque::new(),
|
|
record_vec: VecDeque::new(),
|
|
|
|
|
|
|
|
mid_price: Default::default(),
|
|
mid_price: Default::default(),
|
|
|
|
|
+ fair_price: Default::default(),
|
|
|
ask_price: Default::default(),
|
|
ask_price: Default::default(),
|
|
|
bid_price: Default::default(),
|
|
bid_price: Default::default(),
|
|
|
last_price: Default::default(),
|
|
last_price: Default::default(),
|
|
@@ -248,6 +250,14 @@ impl Predictor {
|
|
|
self.fair_price_vec[index] = a1.price * b1.value / total + b1.price * a1.value / total;
|
|
self.fair_price_vec[index] = a1.price * b1.value / total + b1.price * a1.value / total;
|
|
|
self.fair_price_vec[index].rescale(self.mid_price.scale());
|
|
self.fair_price_vec[index].rescale(self.mid_price.scale());
|
|
|
|
|
|
|
|
|
|
+ let fair_price_sum: Decimal = self.fair_price_vec.iter().sum();
|
|
|
|
|
+ let fair_price_count = self.fair_price_vec.iter()
|
|
|
|
|
+ .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.price_avg_times_vec[index] = if self.price_avg_times_vec[index].is_zero() {
|
|
self.price_avg_times_vec[index] = if self.price_avg_times_vec[index].is_zero() {
|
|
|
self.fair_price_vec[index] / self.mid_price
|
|
self.fair_price_vec[index] / self.mid_price
|
|
@@ -300,33 +310,33 @@ impl Predictor {
|
|
|
self.ask_delta = dec!(0);
|
|
self.ask_delta = dec!(0);
|
|
|
self.bid_delta = dec!(-2);
|
|
self.bid_delta = dec!(-2);
|
|
|
|
|
|
|
|
- self.optimal_ask_price = self.mid_price + self.mid_price * self.params.close;
|
|
|
|
|
|
|
+ self.optimal_ask_price = self.fair_price + self.fair_price * self.params.close;
|
|
|
self.optimal_bid_price = Self::DONT_VIEW;
|
|
self.optimal_bid_price = Self::DONT_VIEW;
|
|
|
} else if is_close_short {
|
|
} else if is_close_short {
|
|
|
self.bid_delta = dec!(0);
|
|
self.bid_delta = dec!(0);
|
|
|
self.ask_delta = dec!(-2);
|
|
self.ask_delta = dec!(-2);
|
|
|
|
|
|
|
|
- self.optimal_bid_price = self.mid_price - self.mid_price * self.params.close;
|
|
|
|
|
|
|
+ self.optimal_bid_price = self.fair_price - self.fair_price * self.params.close;
|
|
|
self.optimal_ask_price = Self::DONT_VIEW;
|
|
self.optimal_ask_price = Self::DONT_VIEW;
|
|
|
} else {
|
|
} else {
|
|
|
if self.signal > Decimal::ZERO {
|
|
if self.signal > Decimal::ZERO {
|
|
|
self.bid_delta = dec!(0);
|
|
self.bid_delta = dec!(0);
|
|
|
self.ask_delta = dec!(-2);
|
|
self.ask_delta = dec!(-2);
|
|
|
|
|
|
|
|
- self.optimal_bid_price = self.mid_price - self.mid_price * self.params.open;
|
|
|
|
|
|
|
+ self.optimal_bid_price = self.fair_price - self.fair_price * self.params.open;
|
|
|
self.optimal_ask_price = Self::DONT_VIEW;
|
|
self.optimal_ask_price = Self::DONT_VIEW;
|
|
|
} else if self.signal < Decimal::ZERO {
|
|
} else if self.signal < Decimal::ZERO {
|
|
|
self.ask_delta = dec!(0);
|
|
self.ask_delta = dec!(0);
|
|
|
self.bid_delta = dec!(-2);
|
|
self.bid_delta = dec!(-2);
|
|
|
|
|
|
|
|
- self.optimal_ask_price = self.mid_price + self.mid_price * self.params.open;
|
|
|
|
|
|
|
+ self.optimal_ask_price = self.fair_price + self.fair_price * self.params.open;
|
|
|
self.optimal_bid_price = Self::DONT_VIEW;
|
|
self.optimal_bid_price = Self::DONT_VIEW;
|
|
|
} else {
|
|
} else {
|
|
|
self.bid_delta = dec!(0);
|
|
self.bid_delta = dec!(0);
|
|
|
self.ask_delta = dec!(0);
|
|
self.ask_delta = dec!(0);
|
|
|
|
|
|
|
|
- self.optimal_bid_price = self.mid_price - self.mid_price * self.params.open;
|
|
|
|
|
- self.optimal_ask_price = self.mid_price + self.mid_price * self.params.open;
|
|
|
|
|
|
|
+ self.optimal_bid_price = self.fair_price - self.fair_price * self.params.open;
|
|
|
|
|
+ self.optimal_ask_price = self.fair_price + self.fair_price * self.params.open;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|