|
|
@@ -36,10 +36,11 @@ pub struct AvellanedaStoikov {
|
|
|
pub flow_in_value: Decimal,
|
|
|
pub flow_out_value: Decimal,
|
|
|
pub flow_ratio: Decimal, // 资金流比例
|
|
|
- pub flow_ratio_diff_log: Decimal, // 一阶导数
|
|
|
|
|
|
pub ask_delta: Decimal, // δa
|
|
|
pub bid_delta: Decimal, // δb
|
|
|
+ pub base_delta: Decimal, // 基础挂单距离
|
|
|
+ pub ratio_edge: Decimal, // 资金流修正的挂单距离
|
|
|
pub ref_price: Decimal, // 预定价格
|
|
|
|
|
|
pub cci_arc: Arc<Mutex<CentralControlInfo>>, // 中控信息
|
|
|
@@ -53,7 +54,7 @@ impl AvellanedaStoikov {
|
|
|
// 时间窗口大小(微秒)
|
|
|
const MAX_TIME_RANGE_MICROS: i64 = 5 * 60_000_000;
|
|
|
// const ONE_MILLION: Decimal = dec!(1_000_000);
|
|
|
- const TWENTY_THOUSAND: Decimal = dec!(20_000);
|
|
|
+ // const TWENTY_THOUSAND: Decimal = dec!(20_000);
|
|
|
const IRA: Decimal = dec!(1);
|
|
|
|
|
|
pub fn new(cci_arc: Arc<Mutex<CentralControlInfo>>) -> Self {
|
|
|
@@ -78,6 +79,8 @@ impl AvellanedaStoikov {
|
|
|
sigma_square: Default::default(),
|
|
|
ask_delta: Default::default(),
|
|
|
bid_delta: Default::default(),
|
|
|
+ base_delta: Default::default(),
|
|
|
+ ratio_edge: Default::default(),
|
|
|
kappa: Default::default(),
|
|
|
flow_in_value: Default::default(),
|
|
|
ref_price: Default::default(),
|
|
|
@@ -88,7 +91,6 @@ impl AvellanedaStoikov {
|
|
|
prev_trade_time: 0,
|
|
|
t_diff: Default::default(),
|
|
|
flow_ratio: Decimal::ONE,
|
|
|
- flow_ratio_diff_log: Default::default(),
|
|
|
flow_out_value: Default::default(),
|
|
|
level: Default::default(),
|
|
|
};
|
|
|
@@ -231,25 +233,25 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
pub fn update_delta(&mut self) {
|
|
|
if self.gamma != Decimal::ZERO {
|
|
|
- let base_delta = (Decimal::ONE / self.gamma) * (Decimal::ONE + self.gamma / self.kappa).ln();
|
|
|
- let ratio_edge = (self.flow_ratio * base_delta) * Decimal::TWO;
|
|
|
+ self.base_delta = (Decimal::ONE / self.gamma) * (Decimal::ONE + self.gamma / self.kappa).ln() * dec!(0.8);
|
|
|
+ self.ratio_edge = (self.flow_ratio * self.base_delta) * Decimal::TWO;
|
|
|
|
|
|
- self.bid_delta = base_delta;
|
|
|
- self.ask_delta = base_delta;
|
|
|
+ self.bid_delta = self.base_delta;
|
|
|
+ self.ask_delta = self.base_delta;
|
|
|
|
|
|
if self.inventory > Decimal::ZERO {
|
|
|
let pos_edge = ((Decimal::ONE + Decimal::TWO * self.inventory) / Decimal::TWO) * (self.gamma * self.sigma_square) * self.t_diff;
|
|
|
|
|
|
- self.bid_delta += pos_edge;
|
|
|
+ self.bid_delta += pos_edge * dec!(0.1);
|
|
|
} else if self.inventory < Decimal::ZERO {
|
|
|
let pos_edge = ((Decimal::ONE - Decimal::TWO * self.inventory) / Decimal::TWO) * (self.gamma * self.sigma_square) * self.t_diff;
|
|
|
|
|
|
- self.ask_delta += pos_edge;
|
|
|
+ self.ask_delta += pos_edge * dec!(0.1);
|
|
|
}
|
|
|
- if ratio_edge < Decimal::ZERO {
|
|
|
- self.bid_delta += ratio_edge.abs()
|
|
|
- } else if ratio_edge > Decimal::ZERO {
|
|
|
- self.ask_delta += ratio_edge.abs()
|
|
|
+ if self.ratio_edge < Decimal::ZERO {
|
|
|
+ self.bid_delta += self.ratio_edge.abs()
|
|
|
+ } else if self.ratio_edge > Decimal::ZERO {
|
|
|
+ self.ask_delta += self.ratio_edge.abs()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -267,14 +269,10 @@ impl AvellanedaStoikov {
|
|
|
}
|
|
|
|
|
|
pub fn update_flow_ratio(&mut self) {
|
|
|
- self.flow_ratio = if self.trade_vec.len() < 2 {
|
|
|
+ self.flow_ratio = if self.trade_vec.len() < 100 {
|
|
|
Decimal::ZERO
|
|
|
} else {
|
|
|
- if self.flow_out_value + self.flow_in_value <= Self::TWENTY_THOUSAND {
|
|
|
- Decimal::ZERO
|
|
|
- } else {
|
|
|
- (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value)
|
|
|
- }
|
|
|
+ (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value)
|
|
|
};
|
|
|
|
|
|
self.flow_ratio.rescale(6);
|
|
|
@@ -357,10 +355,10 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
inventory: self.inventory,
|
|
|
sigma_square: self.flow_ratio,
|
|
|
- gamma: self.gamma,
|
|
|
- kappa: self.kappa,
|
|
|
+ gamma: self.base_delta,
|
|
|
+ kappa: self.ratio_edge,
|
|
|
|
|
|
- flow_ratio: self.flow_ratio_diff_log,
|
|
|
+ flow_ratio: self.flow_ratio,
|
|
|
ref_price: self.ref_price,
|
|
|
});
|
|
|
}
|