|
|
@@ -20,6 +20,7 @@ pub struct Predictor {
|
|
|
pub volume_vec: Vec<Decimal>, // 交易量队列
|
|
|
pub trade_long_vec: FixedTimeRangeDeque<Trade>, // 交易队列
|
|
|
pub trade_short_vec: FixedTimeRangeDeque<Trade>, // 交易队列
|
|
|
+ pub trade_fixed_vec: Vec<Trade>, // 交易队列(观察持仓后的资金流)
|
|
|
pub spread_vec: Vec<Decimal>, // 价差队列
|
|
|
pub record_vec: VecDeque<Record>, // 蜡烛队列
|
|
|
|
|
|
@@ -144,6 +145,7 @@ impl Predictor {
|
|
|
spread_vec: vec![],
|
|
|
trade_long_vec: FixedTimeRangeDeque::new(Self::TRADE_LONG_RANGE_MICROS),
|
|
|
trade_short_vec: FixedTimeRangeDeque::new(Self::TRADE_SHORT_RANGE_MICROS),
|
|
|
+ trade_fixed_vec: vec![],
|
|
|
record_vec: VecDeque::new(),
|
|
|
|
|
|
mid_price: Default::default(),
|
|
|
@@ -194,7 +196,7 @@ impl Predictor {
|
|
|
|
|
|
params,
|
|
|
|
|
|
- debug_sender: tx
|
|
|
+ debug_sender: tx,
|
|
|
};
|
|
|
|
|
|
predictor
|
|
|
@@ -226,19 +228,22 @@ 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());
|
|
|
-
|
|
|
- let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_short_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.error_rate = (bought_sum - sold_sum) / (bought_sum + sold_sum);
|
|
|
- self.error_rate.rescale(4);
|
|
|
+ if !self.inventory.is_zero() {
|
|
|
+ self.trade_fixed_vec.push(trade.clone());
|
|
|
+
|
|
|
+ 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.error_rate = (bought_sum - sold_sum) / (bought_sum + sold_sum);
|
|
|
+ self.error_rate.rescale(4);
|
|
|
+ }
|
|
|
|
|
|
self.last_price = trade.price;
|
|
|
|
|
|
@@ -282,9 +287,11 @@ impl Predictor {
|
|
|
self.fair_price_time_vec.deque.clear();
|
|
|
}
|
|
|
|
|
|
- // if prev_inventory != self.inventory && self.inventory.is_zero() {
|
|
|
- // self.is_regressed = false;
|
|
|
- // }
|
|
|
+ // 重置资金流计算
|
|
|
+ if prev_inventory != self.inventory && self.inventory.is_zero() {
|
|
|
+ self.trade_fixed_vec.clear();
|
|
|
+ self.error_rate = Decimal::ZERO;
|
|
|
+ }
|
|
|
|
|
|
self.update_level().await;
|
|
|
self.processor().await;
|