|
|
@@ -39,12 +39,13 @@ pub struct AvellanedaStoikov {
|
|
|
pub flow_ratio_long: Decimal, // 资金流比例
|
|
|
pub flow_ratio_short: Decimal,
|
|
|
|
|
|
- pub last_open_interest: Decimal, // 最后持仓量
|
|
|
+ pub open_interest: Decimal, // 最后持仓量
|
|
|
+ pub open_interest_ema: Decimal, // 持仓量的ema
|
|
|
+ pub open_interest_diff: Decimal, // 持仓量与ema的diff
|
|
|
pub last_volume: Decimal, // 最后统计的交易量(过去1秒)
|
|
|
pub money_flow: Decimal, // 资金流
|
|
|
pub money_flow_ema: Decimal, // 资金流ema
|
|
|
pub money_flow_diff: Decimal, // 资金流差值
|
|
|
- pub open_interest_diff: Decimal, // 开仓的差值
|
|
|
|
|
|
pub ask_delta: Decimal, // δa
|
|
|
pub bid_delta: Decimal, // δb
|
|
|
@@ -109,8 +110,9 @@ impl AvellanedaStoikov {
|
|
|
money_flow: Default::default(),
|
|
|
money_flow_ema: Default::default(),
|
|
|
money_flow_diff: Default::default(),
|
|
|
+ open_interest: Default::default(),
|
|
|
+ open_interest_ema: Default::default(),
|
|
|
open_interest_diff: Default::default(),
|
|
|
- last_open_interest: Default::default(),
|
|
|
last_volume: Default::default(),
|
|
|
|
|
|
is_ready: false,
|
|
|
@@ -332,7 +334,11 @@ impl AvellanedaStoikov {
|
|
|
self.money_flow += money_flow_index;
|
|
|
self.money_flow_vec.push_back(self.money_flow);
|
|
|
if !money_flow_index.is_zero() {
|
|
|
- self.money_flow_ema = dec!(0.01) * self.money_flow + dec!(0.99) * self.money_flow_ema;
|
|
|
+ self.money_flow_ema = if self.money_flow_ema.is_zero() {
|
|
|
+ self.money_flow
|
|
|
+ } else {
|
|
|
+ dec!(0.01) * self.money_flow + dec!(0.99) * self.money_flow_ema
|
|
|
+ };
|
|
|
self.money_flow_diff = self.money_flow - self.money_flow_ema;
|
|
|
}
|
|
|
}
|
|
|
@@ -356,8 +362,17 @@ impl AvellanedaStoikov {
|
|
|
self.last_price = ticker.last;
|
|
|
self.ask_price = ticker.sell;
|
|
|
self.bid_price = ticker.buy;
|
|
|
- self.last_open_interest = ticker.open_interest;
|
|
|
self.mid_price = (self.ask_price + self.bid_price) / Decimal::TWO;
|
|
|
+ // 持仓量的处理
|
|
|
+ if self.open_interest != ticker.open_interest {
|
|
|
+ self.open_interest = ticker.open_interest;
|
|
|
+ self.open_interest_ema = if self.open_interest_ema.is_zero() {
|
|
|
+ self.open_interest
|
|
|
+ } else {
|
|
|
+ dec!(0.01) * self.open_interest + dec!(0.99) * self.open_interest_ema
|
|
|
+ };
|
|
|
+ self.open_interest_diff = self.open_interest - self.open_interest_ema;
|
|
|
+ }
|
|
|
|
|
|
self.update_money_flow();
|
|
|
self.processor().await;
|
|
|
@@ -538,7 +553,7 @@ impl AvellanedaStoikov {
|
|
|
optimal_bid_price: self.optimal_bid_price,
|
|
|
|
|
|
inventory: self.money_flow,
|
|
|
- sigma_square: self.last_open_interest,
|
|
|
+ sigma_square: self.open_interest,
|
|
|
gamma: self.open_interest_diff,
|
|
|
kappa: self.money_flow_diff,
|
|
|
|