|
|
@@ -254,23 +254,21 @@ impl Predictor {
|
|
|
pub async fn on_trade(&mut self, trade: &Trade, _index: usize) {
|
|
|
self.trade_long_vec.push_back(trade.clone());
|
|
|
self.trade_short_vec.push_back(trade.clone());
|
|
|
- if !self.inventory.is_zero() {
|
|
|
- self.trade_fixed_vec.push(trade.clone());
|
|
|
-
|
|
|
- if self.trade_fixed_vec.len() > 100 {
|
|
|
- let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_fixed_vec.iter()
|
|
|
- .fold((Decimal::ZERO, Decimal::ZERO), |(buy_sum, sell_sum), item| {
|
|
|
- if item.size > Decimal::ZERO {
|
|
|
- (buy_sum + item.value.abs(), sell_sum)
|
|
|
- } else if item.size < Decimal::ZERO {
|
|
|
- (buy_sum, sell_sum + item.value.abs())
|
|
|
- } else {
|
|
|
- (buy_sum, sell_sum)
|
|
|
- }
|
|
|
- });
|
|
|
- self.money_flow = (bought_sum - sold_sum) / (bought_sum + sold_sum);
|
|
|
- self.money_flow.rescale(4);
|
|
|
- }
|
|
|
+ self.trade_fixed_vec.push(trade.clone());
|
|
|
+
|
|
|
+ if self.trade_long_vec.len() > 100 {
|
|
|
+ let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_long_vec.deque.iter()
|
|
|
+ .fold((Decimal::ZERO, Decimal::ZERO), |(buy_sum, sell_sum), item| {
|
|
|
+ if item.size > Decimal::ZERO {
|
|
|
+ (buy_sum + item.value.abs(), sell_sum)
|
|
|
+ } else if item.size < Decimal::ZERO {
|
|
|
+ (buy_sum, sell_sum + item.value.abs())
|
|
|
+ } else {
|
|
|
+ (buy_sum, sell_sum)
|
|
|
+ }
|
|
|
+ });
|
|
|
+ self.money_flow = (bought_sum - sold_sum) / (bought_sum + sold_sum);
|
|
|
+ self.money_flow.rescale(4);
|
|
|
}
|
|
|
|
|
|
self.last_price = trade.price;
|
|
|
@@ -431,8 +429,8 @@ impl Predictor {
|
|
|
// is_cross = is_cross && mid_rate.abs() > self.params.open_activate;
|
|
|
// is_cross = is_cross && ((mid_start - fair_start) / mid_start).abs() < dec!(0.0005);
|
|
|
|
|
|
- // 最近80%的波动都发生在最近短周期的时间里
|
|
|
- let is_high_speed = mid_rate.abs() > mid_long_rate.abs() * dec!(0.8) && mid_rate * mid_long_rate > Decimal::ZERO;
|
|
|
+ // 小于40%的波动发生在最后一段时间
|
|
|
+ let is_high_speed = mid_rate.abs() < mid_long_rate.abs() * dec!(0.4) && mid_rate * mid_long_rate > Decimal::ZERO;
|
|
|
|
|
|
if is_high_speed && mid_rate.abs() > self.params.open_activate {
|
|
|
// 向上涨,并且fair下穿mid,视为观测阶段开始
|
|
|
@@ -723,9 +721,13 @@ impl Predictor {
|
|
|
let last_price = self.last_price;
|
|
|
let fair_price = Self::DONT_VIEW;
|
|
|
|
|
|
- let spread = self.spread;
|
|
|
- let spread_max = self.spread_ema;
|
|
|
- let spread_min = self.spread_diff;
|
|
|
+ let (spread, spread_max, spread_min) = if self.mid_price_trend_time_vec.len() > 1 {
|
|
|
+ let (_, max, min) = Self::get_real_rate(&self.mid_price_trend_time_vec);
|
|
|
+
|
|
|
+ (self.mid_price, max, min)
|
|
|
+ } else {
|
|
|
+ (self.mid_price, Self::DONT_VIEW, Self::DONT_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;
|
|
|
@@ -735,14 +737,16 @@ impl Predictor {
|
|
|
|
|
|
let inventory = self.inventory;
|
|
|
|
|
|
- let (sigma_square, _, _) = if self.mid_price_long_time_vec.len() > 1 {
|
|
|
- Self::get_real_rate(&self.mid_price_long_time_vec)
|
|
|
- } else {
|
|
|
- (Decimal::ZERO, Decimal::ZERO, Decimal::ZERO)
|
|
|
- };
|
|
|
+ let sigma_square = self.money_flow;
|
|
|
// let sigma_square = self.error_rate;
|
|
|
|
|
|
- let gamma = self.mid_rate_focus_open;
|
|
|
+ let gamma = if self.mid_price_time_vec.len() > 1 {
|
|
|
+ let (mid_rate, _, _) = Self::get_real_rate(&self.mid_price_time_vec);
|
|
|
+
|
|
|
+ mid_rate
|
|
|
+ } else {
|
|
|
+ Decimal::ZERO
|
|
|
+ };
|
|
|
let kappa = self.mid_rate_focus_close;
|
|
|
|
|
|
let flow_ratio = Decimal::ZERO;
|