|
@@ -142,7 +142,7 @@ impl AvellanedaStoikov {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- pub async fn on_depth(&mut self, depth: &Depth) {
|
|
|
|
|
|
|
+ pub async fn on_depth(&mut self, depth: &Depth, _index: u32) {
|
|
|
self.depth_vec.push_back(depth.clone());
|
|
self.depth_vec.push_back(depth.clone());
|
|
|
|
|
|
|
|
self.ask_price = depth.asks[0].price;
|
|
self.ask_price = depth.asks[0].price;
|
|
@@ -185,11 +185,6 @@ impl AvellanedaStoikov {
|
|
|
if self.record_vec.len() > 4 {
|
|
if self.record_vec.len() > 4 {
|
|
|
self.record_vec.pop_front();
|
|
self.record_vec.pop_front();
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 如果蜡烛数量足够,则更新mfi
|
|
|
|
|
- if self.record_vec.len() >= 4 {
|
|
|
|
|
- self.update_mfi();
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
|
|
pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
|
|
@@ -265,25 +260,25 @@ impl AvellanedaStoikov {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- fn calc_flow_ratio(_prev_flow_ratio: &Decimal, min_volume: &Decimal, trades: &mut FixedTimeRangeDeque<Trade>) -> Decimal {
|
|
|
|
|
- let mut flow_in_value = Decimal::ZERO;
|
|
|
|
|
- let mut flow_out_value = Decimal::ZERO;
|
|
|
|
|
- for trade_iter in trades.deque.iter() {
|
|
|
|
|
- if trade_iter.size > Decimal::ZERO {
|
|
|
|
|
- flow_in_value += trade_iter.value;
|
|
|
|
|
- } else {
|
|
|
|
|
- flow_out_value += trade_iter.value;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 使用EMA來更新資金流,確保平滑性
|
|
|
|
|
- if flow_out_value + flow_in_value > *min_volume {
|
|
|
|
|
- let now = (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value);
|
|
|
|
|
- now
|
|
|
|
|
- } else {
|
|
|
|
|
- Decimal::ZERO
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // fn calc_flow_ratio(_prev_flow_ratio: &Decimal, min_volume: &Decimal, trades: &mut FixedTimeRangeDeque<Trade>) -> Decimal {
|
|
|
|
|
+ // let mut flow_in_value = Decimal::ZERO;
|
|
|
|
|
+ // let mut flow_out_value = Decimal::ZERO;
|
|
|
|
|
+ // for trade_iter in trades.deque.iter() {
|
|
|
|
|
+ // if trade_iter.size > Decimal::ZERO {
|
|
|
|
|
+ // flow_in_value += trade_iter.value;
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // flow_out_value += trade_iter.value;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+ //
|
|
|
|
|
+ // // 使用EMA來更新資金流,確保平滑性
|
|
|
|
|
+ // if flow_out_value + flow_in_value > *min_volume {
|
|
|
|
|
+ // let now = (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value);
|
|
|
|
|
+ // now
|
|
|
|
|
+ // } else {
|
|
|
|
|
+ // Decimal::ZERO
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
|
|
|
pub fn check_ready(&mut self) {
|
|
pub fn check_ready(&mut self) {
|
|
|
if self.is_ready {
|
|
if self.is_ready {
|
|
@@ -325,21 +320,12 @@ impl AvellanedaStoikov {
|
|
|
// #[instrument(skip(self), level="TRACE")]
|
|
// #[instrument(skip(self), level="TRACE")]
|
|
|
async fn processor(&mut self) {
|
|
async fn processor(&mut self) {
|
|
|
self.update_t_diff();
|
|
self.update_t_diff();
|
|
|
- // info!(?self.t_diff);
|
|
|
|
|
- self.update_flow_ratio();
|
|
|
|
|
- // info!(?self.flow_ratio_long);
|
|
|
|
|
self.update_sigma_square();
|
|
self.update_sigma_square();
|
|
|
- // info!(?self.sigma_square);
|
|
|
|
|
self.update_gamma();
|
|
self.update_gamma();
|
|
|
- // info!(?self.gamma);
|
|
|
|
|
self.update_kappa();
|
|
self.update_kappa();
|
|
|
- // info!(?self.kappa);
|
|
|
|
|
self.update_ref_price();
|
|
self.update_ref_price();
|
|
|
- // info!(?self.ref_price);
|
|
|
|
|
self.update_delta();
|
|
self.update_delta();
|
|
|
- // info!(?self.ask_delta, ?self.bid_delta);
|
|
|
|
|
self.update_optimal_ask_and_bid();
|
|
self.update_optimal_ask_and_bid();
|
|
|
- // info!("=============================================");
|
|
|
|
|
|
|
|
|
|
self.check_ready();
|
|
self.check_ready();
|
|
|
if !self.is_ready {
|
|
if !self.is_ready {
|