|
|
@@ -35,8 +35,8 @@ pub struct AvellanedaStoikov {
|
|
|
pub gamma: Decimal, // γ,库存风险厌恶参数
|
|
|
pub kappa: Decimal, // κ 订单簿 流动性 参数
|
|
|
|
|
|
- pub flow_ratio: Decimal, // 资金流比例
|
|
|
- pub flow_ratio_short: Decimal, // 资金流比例
|
|
|
+ pub flow_ratio_mfi: Decimal, // 资金流比例(专供MFI)
|
|
|
+ pub flow_ratio_trades: Decimal, // 资金流比例(trades生成)
|
|
|
pub money_flow_index: Decimal, // MFI
|
|
|
|
|
|
pub ask_delta: Decimal, // δa
|
|
|
@@ -97,8 +97,8 @@ impl AvellanedaStoikov {
|
|
|
prev_trade_time: Utc::now().timestamp_micros(),
|
|
|
t_diff: Default::default(),
|
|
|
level: Default::default(),
|
|
|
- flow_ratio: Default::default(),
|
|
|
- flow_ratio_short: Default::default(),
|
|
|
+ flow_ratio_mfi: Default::default(),
|
|
|
+ flow_ratio_trades: Default::default(),
|
|
|
money_flow_index: Default::default(),
|
|
|
};
|
|
|
|
|
|
@@ -278,7 +278,7 @@ impl AvellanedaStoikov {
|
|
|
let pos_edge = self.gamma * self.sigma_square * self.inventory.abs().powd(dec!(2)) * self.t_diff;
|
|
|
|
|
|
self.base_delta = self.gamma * self.sigma_square * self.t_diff / Decimal::TWO + (Decimal::ONE / self.gamma) * (Decimal::ONE + self.gamma / self.kappa).ln();
|
|
|
- self.ratio_edge = self.flow_ratio * self.sigma_square;
|
|
|
+ self.ratio_edge = self.flow_ratio_mfi * self.sigma_square;
|
|
|
|
|
|
self.bid_delta = self.base_delta;
|
|
|
self.ask_delta = self.base_delta;
|
|
|
@@ -289,15 +289,35 @@ impl AvellanedaStoikov {
|
|
|
self.ask_delta += pos_edge;
|
|
|
}
|
|
|
|
|
|
- if self.ratio_edge > Decimal::ZERO {
|
|
|
- self.ask_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
|
|
|
- self.bid_delta += self.sigma_square.abs() * dec!(5);
|
|
|
- } else if self.ratio_edge < Decimal::ZERO {
|
|
|
- self.ask_delta += self.sigma_square.abs() * dec!(5);
|
|
|
- self.bid_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
|
|
|
- } else if self.ratio_edge == Decimal::ZERO {
|
|
|
+ if self.ratio_edge == Decimal::ZERO {
|
|
|
self.ask_delta += self.sigma_square.abs() * dec!(5);
|
|
|
self.bid_delta += self.sigma_square.abs() * dec!(5);
|
|
|
+ } else if self.ratio_edge > Decimal::ZERO {
|
|
|
+ if self.flow_ratio_trades.abs() > dec!(0.3) {
|
|
|
+ if self.inventory > Decimal::ZERO {
|
|
|
+ self.ask_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
|
|
|
+ self.bid_delta += self.sigma_square.abs() * dec!(10);
|
|
|
+ } else {
|
|
|
+ self.ask_delta += self.sigma_square.abs() * dec!(10);
|
|
|
+ self.bid_delta += self.sigma_square.abs() * dec!(10);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ self.ask_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
|
|
|
+ self.bid_delta += self.sigma_square.abs() * dec!(5);
|
|
|
+ }
|
|
|
+ } else if self.ratio_edge < Decimal::ZERO {
|
|
|
+ if self.flow_ratio_trades.abs() > dec!(0.3) {
|
|
|
+ if self.inventory < Decimal::ZERO {
|
|
|
+ self.ask_delta += self.sigma_square.abs() * dec!(10);
|
|
|
+ self.bid_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
|
|
|
+ } else {
|
|
|
+ self.ask_delta += self.sigma_square.abs() * dec!(10);
|
|
|
+ self.bid_delta += self.sigma_square.abs() * dec!(10);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ self.ask_delta += self.sigma_square.abs() * dec!(5);
|
|
|
+ self.bid_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -439,14 +459,14 @@ impl AvellanedaStoikov {
|
|
|
// }
|
|
|
|
|
|
pub fn update_flow_ratio(&mut self) {
|
|
|
- self.flow_ratio = if self.money_flow_index > dec!(80) {
|
|
|
+ self.flow_ratio_mfi = if self.money_flow_index > dec!(80) {
|
|
|
(self.money_flow_index - dec!(80)) / dec!(20)
|
|
|
} else if self.money_flow_index < dec!(20) {
|
|
|
Decimal::NEGATIVE_ONE * (dec!(20) - self.money_flow_index) / dec!(20)
|
|
|
} else {
|
|
|
Decimal::ZERO
|
|
|
};
|
|
|
- self.flow_ratio_short = Self::calc_flow_ratio(&self.flow_ratio_short, &dec!(0), &mut self.trade_long_vec);
|
|
|
+ self.flow_ratio_trades = Self::calc_flow_ratio(&self.flow_ratio_trades, &dec!(0), &mut self.trade_long_vec);
|
|
|
}
|
|
|
|
|
|
pub fn check_ready(&mut self) {
|
|
|
@@ -526,10 +546,10 @@ impl AvellanedaStoikov {
|
|
|
|
|
|
inventory: self.inventory,
|
|
|
sigma_square: self.money_flow_index,
|
|
|
- gamma: self.flow_ratio_short,
|
|
|
+ gamma: self.flow_ratio_trades,
|
|
|
kappa: self.t_diff,
|
|
|
|
|
|
- flow_ratio: self.flow_ratio,
|
|
|
+ flow_ratio: self.flow_ratio_mfi,
|
|
|
ref_price: self.ref_price,
|
|
|
});
|
|
|
}
|