|
|
@@ -53,6 +53,7 @@ pub struct Predictor {
|
|
|
|
|
|
pub mid_price_time_vec: FixedTimeRangeDeque<Decimal>, // 中间价格队列,
|
|
|
pub fair_price_time_vec: FixedTimeRangeDeque<Decimal>, // 公平价格队列,
|
|
|
+ pub fair_price_long_time_vec: FixedTimeRangeDeque<Decimal>, // 公平价格队列,
|
|
|
pub fair_price_vec: Vec<Decimal>, // 公平价格列表,0表示做市所,1表示参考所
|
|
|
pub fair_price: Decimal, // 公平价格
|
|
|
pub fair_price_ema_short: Decimal, // 公平价格_ema
|
|
|
@@ -85,7 +86,7 @@ impl Predictor {
|
|
|
// 时间窗口大小(微秒)
|
|
|
// const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
|
|
|
const TIME_DIFF_RANGE_MICROS: i64 = 15 * 60_000_000;
|
|
|
- const TRADE_LONG_RANGE_MICROS: i64 = 60_000_000;
|
|
|
+ const TRADE_LONG_RANGE_MICROS: i64 = 5 * 60_000_000;
|
|
|
// const SPREAD_RANGE_MICROS: i64 = 15 * 60_000_000;
|
|
|
const TRADE_SHORT_RANGE_MICROS: i64 = 2 * 60_000_000;
|
|
|
// const ONE_MILLION: Decimal = dec!(1_000_000);
|
|
|
@@ -167,6 +168,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()),
|
|
|
+ fair_price_long_time_vec: FixedTimeRangeDeque::new(Self::TRADE_LONG_RANGE_MICROS),
|
|
|
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(),
|
|
|
@@ -385,16 +387,18 @@ impl Predictor {
|
|
|
|
|
|
let mut fair_rate = Self::get_real_rate(&self.fair_price_time_vec);
|
|
|
fair_rate.rescale(8);
|
|
|
+ let mut fair_long_rate = Self::get_real_rate(&self.fair_price_long_time_vec);
|
|
|
+ fair_long_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() {
|
|
|
- if self.fair_rate_focus_open > Decimal::ZERO && self.spread_ema_1000 < Decimal::ZERO {
|
|
|
+ if self.fair_rate_focus_open < Decimal::ZERO && self.spread_ema_1000 < Decimal::ZERO {
|
|
|
self.fair_rate_focus_open = Decimal::ZERO;
|
|
|
}
|
|
|
|
|
|
- if self.fair_rate_focus_open < Decimal::ZERO && self.spread_ema_1000 > Decimal::ZERO {
|
|
|
+ if self.fair_rate_focus_open > Decimal::ZERO && self.spread_ema_1000 > Decimal::ZERO {
|
|
|
self.fair_rate_focus_open = Decimal::ZERO;
|
|
|
}
|
|
|
}
|
|
|
@@ -406,11 +410,11 @@ impl Predictor {
|
|
|
if !self.mid_price_focus_open.is_zero() {
|
|
|
let focus_rate = (self.mid_price - self.mid_price_focus_open) / self.mid_price_focus_open;
|
|
|
|
|
|
- if self.fair_rate_focus_open > Decimal::ZERO && focus_rate < Decimal::NEGATIVE_ONE * self.params.open_activate / dec!(3) {
|
|
|
+ if self.fair_rate_focus_open < Decimal::ZERO && focus_rate < Decimal::NEGATIVE_ONE * self.params.open_activate / dec!(3) {
|
|
|
self.fair_rate_focus_open = Decimal::ZERO;
|
|
|
}
|
|
|
|
|
|
- if self.fair_rate_focus_open < Decimal::ZERO && focus_rate > self.params.open_activate / dec!(3) {
|
|
|
+ if self.fair_rate_focus_open > Decimal::ZERO && focus_rate > self.params.open_activate / dec!(3) {
|
|
|
self.fair_rate_focus_open = Decimal::ZERO;
|
|
|
}
|
|
|
}
|
|
|
@@ -704,7 +708,7 @@ impl Predictor {
|
|
|
};
|
|
|
// let sigma_square = self.error_rate;
|
|
|
|
|
|
- let gamma = self.fair_rate_focus_open;
|
|
|
+ let gamma = Self::get_real_rate(&self.fair_price_long_time_vec);
|
|
|
let kappa = self.fair_rate_focus_close;
|
|
|
|
|
|
let flow_ratio = Decimal::ZERO;
|