|
|
@@ -14,7 +14,8 @@ use standard::{Depth, Record, Ticker, Trade};
|
|
|
#[derive(Debug)]
|
|
|
pub struct AvellanedaStoikov {
|
|
|
pub depth_vec: Vec<Depth>, // 深度队列
|
|
|
- pub fair_price_vec: Vec<Decimal>, // 深度队列
|
|
|
+ pub fair_price_vec: Vec<Decimal>, // 预定价格队列
|
|
|
+ pub volume_vec: Vec<Decimal>, // 深度队列
|
|
|
pub trade_long_vec: FixedTimeRangeDeque<Trade>, // 交易队列
|
|
|
pub trade_short_vec: FixedTimeRangeDeque<Trade>, // 交易队列
|
|
|
pub spread_vec: Vec<Decimal>, // 市场冲击队列
|
|
|
@@ -65,6 +66,7 @@ impl AvellanedaStoikov {
|
|
|
// 接针版本
|
|
|
depth_vec: vec![Depth::new(); 10],
|
|
|
fair_price_vec: vec![Decimal::ZERO; 10],
|
|
|
+ volume_vec: vec![Decimal::ZERO; 10],
|
|
|
|
|
|
// 老的队列
|
|
|
spread_vec: vec![],
|
|
|
@@ -196,6 +198,7 @@ impl AvellanedaStoikov {
|
|
|
let fair_price = mid + (a1.price - b1.price) * i_upper / Decimal::TWO;
|
|
|
|
|
|
self.fair_price_vec[index] = fair_price;
|
|
|
+ self.volume_vec[index] = a1.size + b1.size;
|
|
|
}
|
|
|
|
|
|
pub async fn update_level(&mut self) {
|
|
|
@@ -254,7 +257,19 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
pub fn update_ref_price(&mut self) {
|
|
|
if !self.fair_price_vec[0].is_zero() && !self.fair_price_vec[1].is_zero() {
|
|
|
- self.ref_price = (self.fair_price_vec[0] + self.fair_price_vec[1]) / Decimal::TWO;
|
|
|
+ let v0_rate = self.volume_vec[0] / (self.volume_vec[0] + self.volume_vec[1]);
|
|
|
+ let v1_rate = self.volume_vec[1] / (self.volume_vec[0] + self.volume_vec[1]);
|
|
|
+
|
|
|
+
|
|
|
+ let sma = self.depth_vec[1].asks[0].price;
|
|
|
+ let smb = self.depth_vec[1].bids[0].price;
|
|
|
+
|
|
|
+ let mp0 = self.mid_price;
|
|
|
+ let mp1 = (sma + smb) / Decimal::TWO;
|
|
|
+
|
|
|
+ let price_diff = mp0 - mp1;
|
|
|
+
|
|
|
+ self.ref_price = self.fair_price_vec[0] * v0_rate + self.fair_price_vec[1] * v1_rate + price_diff / Decimal::TWO;
|
|
|
}
|
|
|
}
|
|
|
|