|
|
@@ -48,6 +48,7 @@ pub struct AvellanedaStoikov {
|
|
|
|
|
|
pub is_ready: bool,
|
|
|
pub prev_trade_time: i64, // 上次交易时间,也就是t
|
|
|
+ pub close_price: Decimal, // 平仓价格
|
|
|
pub t_diff: Decimal, // (T-t)
|
|
|
}
|
|
|
|
|
|
@@ -100,6 +101,7 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
is_ready: false,
|
|
|
prev_trade_time: Utc::now().timestamp_micros(),
|
|
|
+ close_price: Default::default(),
|
|
|
t_diff: Default::default(),
|
|
|
level: Default::default(),
|
|
|
};
|
|
|
@@ -237,11 +239,13 @@ impl AvellanedaStoikov {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
|
|
|
+ pub async fn on_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
|
|
|
let prev_inventory = self.inventory;
|
|
|
self.inventory = (inventory / (min_amount_value / self.mid_price)).round();
|
|
|
- if prev_inventory != self.inventory {
|
|
|
+ // 发现开仓行为
|
|
|
+ if prev_inventory.is_zero() && prev_inventory != self.inventory {
|
|
|
self.prev_trade_time = Utc::now().timestamp_micros();
|
|
|
+ self.close_price = self.ref_price;
|
|
|
}
|
|
|
|
|
|
self.update_level().await;
|
|
|
@@ -293,23 +297,23 @@ impl AvellanedaStoikov {
|
|
|
self.ask_delta = self.base_delta;
|
|
|
|
|
|
if self.inventory > Decimal::ZERO {
|
|
|
- self.ask_delta = self.base_delta;
|
|
|
- // self.ask_delta = Decimal::NEGATIVE_ONE;
|
|
|
+ // self.ask_delta = self.base_delta;
|
|
|
+ self.ask_delta = Decimal::NEGATIVE_ONE;
|
|
|
} else if self.inventory < Decimal::ZERO {
|
|
|
- self.bid_delta = self.base_delta;
|
|
|
- // self.bid_delta = Decimal::NEGATIVE_ONE;
|
|
|
+ // self.bid_delta = self.base_delta;
|
|
|
+ self.bid_delta = Decimal::NEGATIVE_ONE;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
pub fn update_optimal_ask_and_bid(&mut self) {
|
|
|
self.optimal_ask_price = if self.ask_delta == Decimal::NEGATIVE_ONE {
|
|
|
- self.ref_price
|
|
|
+ self.close_price
|
|
|
} else {
|
|
|
max(self.ref_price + self.ask_delta, self.bid_price)
|
|
|
};
|
|
|
self.optimal_bid_price = if self.bid_delta == Decimal::NEGATIVE_ONE {
|
|
|
- self.ref_price
|
|
|
+ self.close_price
|
|
|
} else {
|
|
|
min(self.ref_price - self.bid_delta, self.ask_price)
|
|
|
};
|