|
|
@@ -32,6 +32,7 @@ pub struct Predictor {
|
|
|
pub trades_volume_short_ema: Decimal, // 过去10秒的成交量总和的ema
|
|
|
pub spread: Decimal, // 当前价差
|
|
|
pub spread_ema_1000: Decimal, // 价差的ema,1000级别
|
|
|
+ pub spread_diff: Decimal, // 价差与价差ema的diff,可以衡量价差扩大行为
|
|
|
|
|
|
pub optimal_ask_price: Decimal, // 卖出挂单价
|
|
|
pub optimal_bid_price: Decimal, // 买入挂单价
|
|
|
@@ -157,6 +158,7 @@ impl Predictor {
|
|
|
trades_volume_short_ema: Default::default(),
|
|
|
spread: Default::default(),
|
|
|
spread_ema_1000: Default::default(),
|
|
|
+ spread_diff: Default::default(),
|
|
|
optimal_ask_price: Default::default(),
|
|
|
optimal_bid_price: Default::default(),
|
|
|
|
|
|
@@ -165,7 +167,7 @@ impl Predictor {
|
|
|
bid_delta: Default::default(),
|
|
|
|
|
|
fair_price_time_vec: FixedTimeRangeDeque::new((params.second_observation_time.to_f64().unwrap() * 1_000_000f64).to_i64().unwrap()),
|
|
|
- mid_price_time_vec: FixedTimeRangeDeque::new(100_000),
|
|
|
+ mid_price_time_vec: FixedTimeRangeDeque::new((params.second_observation_time.to_f64().unwrap() * 1_000_000f64).to_i64().unwrap()),
|
|
|
fair_price: Default::default(),
|
|
|
fair_price_ema_short: Default::default(),
|
|
|
fair_price_ema_long: Default::default(),
|
|
|
@@ -381,8 +383,10 @@ impl Predictor {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- let mut rate = Self::get_real_rate(&self.fair_price_time_vec);
|
|
|
- rate.rescale(8);
|
|
|
+ let mut fair_rate = Self::get_real_rate(&self.fair_price_time_vec);
|
|
|
+ fair_rate.rescale(8);
|
|
|
+ let mut mid_rate = Self::get_real_rate(&self.mid_price_time_vec);
|
|
|
+ mid_rate.rescale(8);
|
|
|
|
|
|
// 重置开仓焦点,条件1
|
|
|
if !self.fair_rate_focus_open.is_zero() {
|
|
|
@@ -413,16 +417,16 @@ impl Predictor {
|
|
|
// 更新程序关注的开仓焦点
|
|
|
if self.fair_rate_focus_open.is_zero() && self.inventory.is_zero() {
|
|
|
// 只有有强度的rate才有资格被称为针,并且差价够大,
|
|
|
- if rate.abs() > self.params.open_activate && self.spread.abs() > self.params.min_spread {
|
|
|
+ if fair_rate.abs() > self.params.open_activate && mid_rate.abs() > self.params.open_activate && self.spread_diff.abs() > self.params.min_spread {
|
|
|
// 向上涨,并且fair下穿mid,视为观测阶段开始
|
|
|
- if rate > Decimal::ZERO && self.spread < Decimal::ZERO {
|
|
|
- self.fair_rate_focus_open = rate;
|
|
|
+ if mid_rate > Decimal::ZERO && fair_rate > Decimal::ZERO && self.spread_diff < Decimal::ZERO {
|
|
|
+ self.fair_rate_focus_open = mid_rate;
|
|
|
self.mid_price_focus_open = self.mid_price;
|
|
|
}
|
|
|
|
|
|
// 向下跌,并且fair上穿mid,视为观测阶段开始
|
|
|
- if rate < Decimal::ZERO && self.spread > Decimal::ZERO {
|
|
|
- self.fair_rate_focus_open = rate;
|
|
|
+ if mid_rate < Decimal::ZERO && fair_rate > Decimal::ZERO && self.spread_diff > Decimal::ZERO {
|
|
|
+ self.fair_rate_focus_open = mid_rate;
|
|
|
self.mid_price_focus_open = self.mid_price;
|
|
|
}
|
|
|
}
|
|
|
@@ -432,7 +436,7 @@ impl Predictor {
|
|
|
// close_rate:
|
|
|
// 大于0:当前价格在均线之上
|
|
|
// 小于0:当前价格在均线之下
|
|
|
- let close_rate = rate.clone();
|
|
|
+ let close_rate = mid_rate.clone();
|
|
|
// 重置平仓焦点,条件1
|
|
|
if !self.fair_rate_focus_close.is_zero() && self.inventory.is_zero() {
|
|
|
self.fair_rate_focus_close = Decimal::ZERO;
|
|
|
@@ -529,6 +533,8 @@ impl Predictor {
|
|
|
// self.spread_sma_1000.rescale(8);
|
|
|
// self.spread_sma_1000_time_vec.push_back(self.spread_ema_1000);
|
|
|
|
|
|
+ self.spread_diff = self.spread - self.spread_ema_1000;
|
|
|
+
|
|
|
while self.spread_vec.len() > 1_000 {
|
|
|
self.spread_vec.remove(0);
|
|
|
}
|
|
|
@@ -681,7 +687,7 @@ impl Predictor {
|
|
|
|
|
|
let spread = self.spread;
|
|
|
let spread_max = self.spread_ema_1000;
|
|
|
- let spread_min = self.spread - self.spread_ema_1000;
|
|
|
+ let spread_min = self.spread_diff;
|
|
|
// 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;
|