|
|
@@ -47,7 +47,7 @@ pub struct AvellanedaStoikov {
|
|
|
pub cci_arc: Arc<Mutex<CentralControlInfo>>, // 中控信息
|
|
|
|
|
|
pub is_ready: bool,
|
|
|
- pub prev_trade_time: i64, // 上次交易时间,也就是t
|
|
|
+ pub prev_reversal_time: i64, // 上次穿越时间,也就是t
|
|
|
pub t_diff: Decimal, // (T-t)
|
|
|
}
|
|
|
|
|
|
@@ -91,7 +91,7 @@ impl AvellanedaStoikov {
|
|
|
cci_arc,
|
|
|
|
|
|
is_ready: false,
|
|
|
- prev_trade_time: Utc::now().timestamp_micros(),
|
|
|
+ prev_reversal_time: Utc::now().timestamp_micros(),
|
|
|
t_diff: Default::default(),
|
|
|
flow_ratio: Decimal::ONE,
|
|
|
flow_out_value: Default::default(),
|
|
|
@@ -182,7 +182,6 @@ impl AvellanedaStoikov {
|
|
|
}
|
|
|
|
|
|
pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
|
|
|
- self.prev_trade_time = Utc::now().timestamp_micros();
|
|
|
self.inventory = (inventory / (min_amount_value / self.mid_price)).round();
|
|
|
|
|
|
self.update_level().await;
|
|
|
@@ -230,7 +229,7 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
pub fn update_delta(&mut self) {
|
|
|
if self.gamma != Decimal::ZERO {
|
|
|
- let pos_edge = self.gamma * self.sigma_square * self.inventory.abs().powd(dec!(3.14)) * self.t_diff / Decimal::TWO;
|
|
|
+ let pos_edge = self.gamma * self.sigma_square * self.inventory.abs().powd(dec!(2)) * self.t_diff / Decimal::TWO;
|
|
|
|
|
|
self.base_delta = self.sigma_square * self.t_diff;
|
|
|
self.ratio_edge = dec!(3.14) * self.flow_ratio * self.sigma_square;
|
|
|
@@ -245,11 +244,11 @@ impl AvellanedaStoikov {
|
|
|
}
|
|
|
|
|
|
if self.ratio_edge > Decimal::ZERO {
|
|
|
- self.ask_delta = self.ask_delta - self.ratio_edge.abs() * (Decimal::ONE - self.t_diff);
|
|
|
- self.bid_delta = self.bid_delta + self.ratio_edge.abs() * (dec!(0.5) + dec!(0.5) * self.t_diff);
|
|
|
+ self.ask_delta = self.ask_delta + (Decimal::ONE - self.ratio_edge.abs()) * self.t_diff;
|
|
|
+ self.bid_delta = self.bid_delta + self.ratio_edge.abs() * (dec!(1.618) - self.t_diff);
|
|
|
} else if self.ratio_edge < Decimal::ZERO {
|
|
|
- self.ask_delta = self.ask_delta + self.ratio_edge.abs() * (dec!(0.5) + dec!(0.5) * self.t_diff);
|
|
|
- self.bid_delta = self.bid_delta - self.ratio_edge.abs() * (Decimal::ONE - self.t_diff);
|
|
|
+ self.ask_delta = self.ask_delta + self.ratio_edge.abs() * (dec!(1.618) - self.t_diff);
|
|
|
+ self.bid_delta = self.bid_delta + (Decimal::ONE - self.ratio_edge.abs()) * self.t_diff;
|
|
|
}
|
|
|
|
|
|
if self.init_delta_plus.is_zero() {
|
|
|
@@ -264,8 +263,8 @@ impl AvellanedaStoikov {
|
|
|
}
|
|
|
|
|
|
pub fn update_t_diff(&mut self) {
|
|
|
- if self.prev_trade_time > 0 {
|
|
|
- let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
|
|
|
+ if self.prev_reversal_time > 0 {
|
|
|
+ let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_reversal_time).unwrap();
|
|
|
self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::MAX_TIME_RANGE_MICROS).unwrap(), Decimal::ZERO);
|
|
|
} else {
|
|
|
self.t_diff = Decimal::ONE;
|
|
|
@@ -274,7 +273,15 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
pub fn update_flow_ratio(&mut self) {
|
|
|
if self.trade_vec.len() > 100 {
|
|
|
+ let prev_flow_ratio = self.flow_ratio;
|
|
|
self.flow_ratio = (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value);
|
|
|
+
|
|
|
+ // 上穿或下穿0軸
|
|
|
+ if prev_flow_ratio > Decimal::ZERO && self.flow_ratio < Decimal::ZERO {
|
|
|
+ self.prev_reversal_time = Utc::now().timestamp_micros();
|
|
|
+ } else if prev_flow_ratio < Decimal::ZERO && self.flow_ratio > Decimal::ZERO {
|
|
|
+ self.prev_reversal_time = Utc::now().timestamp_micros();
|
|
|
+ }
|
|
|
} else {
|
|
|
self.flow_ratio = Decimal::ZERO;
|
|
|
}
|