|
|
@@ -287,90 +287,90 @@ 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 (index, trade_iter) in trades.deque.iter().enumerate() {
|
|
|
- // if index == 0 {
|
|
|
- // continue
|
|
|
- // }
|
|
|
- //
|
|
|
- // let prev_trade_iter = trades.deque.get(index - 1).unwrap();
|
|
|
- // let trade = trade_iter;
|
|
|
- // if trade.price > prev_trade_iter.price {
|
|
|
- // flow_in_value += trade.value * (prev_trade_iter.price - trade.price).abs();
|
|
|
- // // flow_in_value += Decimal::ONE;
|
|
|
- // } else if trade.price < prev_trade_iter.price {
|
|
|
- // flow_out_value += trade.value * (prev_trade_iter.price - trade.price).abs();
|
|
|
- // // flow_out_value += Decimal::ONE;
|
|
|
- // } else {
|
|
|
- // // if trade.size > Decimal::ZERO {
|
|
|
- // // flow_in_value += trade.value;
|
|
|
- // // } else {
|
|
|
- // // flow_out_value += trade.value;
|
|
|
- // // }
|
|
|
- // }
|
|
|
- //
|
|
|
- // // if trade_iter.size > Decimal::ZERO {
|
|
|
- // // flow_in_value += trade_iter.value;
|
|
|
- // // } else {
|
|
|
- // // flow_out_value += trade_iter.value;
|
|
|
- // // }
|
|
|
- // }
|
|
|
-
|
|
|
- // if self.trade_vec.deque.len() > 1 {
|
|
|
- // let prev_trade_iter = self.trade_vec.deque.get(self.trade_vec.deque.len() - 2).unwrap();
|
|
|
- // if trade.price > prev_trade_iter.price {
|
|
|
- // self.flow_in_value += trade.value;
|
|
|
- // } else if trade.price < prev_trade_iter.price {
|
|
|
- // self.flow_out_value += trade.value;
|
|
|
- // } else {
|
|
|
- // // if trade.size > Decimal::ZERO {
|
|
|
- // // self.flow_in_value += trade.value;
|
|
|
- // // } else {
|
|
|
- // // self.flow_out_value += trade.value;
|
|
|
- // // }
|
|
|
- // }
|
|
|
- //
|
|
|
- // // if trade.size > Decimal::ZERO {
|
|
|
- // // self.flow_in_value += trade.value;
|
|
|
- // // } else {
|
|
|
- // // self.flow_out_value += trade.value;
|
|
|
- // // }
|
|
|
- //
|
|
|
- // if self.flow_out_value + self.flow_in_value > dec!(2_000_000) {
|
|
|
- // self.flow_out_value = self.flow_out_value * dec!(0.618);
|
|
|
- // self.flow_in_value = self.flow_in_value * dec!(0.618);
|
|
|
- // }
|
|
|
- // }
|
|
|
- // else {
|
|
|
- // if trade.size > Decimal::ZERO {
|
|
|
- // self.flow_in_value += trade.value;
|
|
|
- // } else {
|
|
|
- // self.flow_out_value += trade.value;
|
|
|
- // }
|
|
|
- // }
|
|
|
-
|
|
|
- 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來更新資金流,確保平滑性
|
|
|
- // let a = Decimal::TWO / dec!(50);
|
|
|
- if flow_out_value + flow_in_value > *min_volume {
|
|
|
- // let now = (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value);
|
|
|
- // a * now + (Decimal::ONE - a) * prev_flow_ratio
|
|
|
- (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value)
|
|
|
- } 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 (index, trade_iter) in trades.deque.iter().enumerate() {
|
|
|
+ // // if index == 0 {
|
|
|
+ // // continue
|
|
|
+ // // }
|
|
|
+ // //
|
|
|
+ // // let prev_trade_iter = trades.deque.get(index - 1).unwrap();
|
|
|
+ // // let trade = trade_iter;
|
|
|
+ // // if trade.price > prev_trade_iter.price {
|
|
|
+ // // flow_in_value += trade.value * (prev_trade_iter.price - trade.price).abs();
|
|
|
+ // // // flow_in_value += Decimal::ONE;
|
|
|
+ // // } else if trade.price < prev_trade_iter.price {
|
|
|
+ // // flow_out_value += trade.value * (prev_trade_iter.price - trade.price).abs();
|
|
|
+ // // // flow_out_value += Decimal::ONE;
|
|
|
+ // // } else {
|
|
|
+ // // // if trade.size > Decimal::ZERO {
|
|
|
+ // // // flow_in_value += trade.value;
|
|
|
+ // // // } else {
|
|
|
+ // // // flow_out_value += trade.value;
|
|
|
+ // // // }
|
|
|
+ // // }
|
|
|
+ // //
|
|
|
+ // // // if trade_iter.size > Decimal::ZERO {
|
|
|
+ // // // flow_in_value += trade_iter.value;
|
|
|
+ // // // } else {
|
|
|
+ // // // flow_out_value += trade_iter.value;
|
|
|
+ // // // }
|
|
|
+ // // }
|
|
|
+ //
|
|
|
+ // // if self.trade_vec.deque.len() > 1 {
|
|
|
+ // // let prev_trade_iter = self.trade_vec.deque.get(self.trade_vec.deque.len() - 2).unwrap();
|
|
|
+ // // if trade.price > prev_trade_iter.price {
|
|
|
+ // // self.flow_in_value += trade.value;
|
|
|
+ // // } else if trade.price < prev_trade_iter.price {
|
|
|
+ // // self.flow_out_value += trade.value;
|
|
|
+ // // } else {
|
|
|
+ // // // if trade.size > Decimal::ZERO {
|
|
|
+ // // // self.flow_in_value += trade.value;
|
|
|
+ // // // } else {
|
|
|
+ // // // self.flow_out_value += trade.value;
|
|
|
+ // // // }
|
|
|
+ // // }
|
|
|
+ // //
|
|
|
+ // // // if trade.size > Decimal::ZERO {
|
|
|
+ // // // self.flow_in_value += trade.value;
|
|
|
+ // // // } else {
|
|
|
+ // // // self.flow_out_value += trade.value;
|
|
|
+ // // // }
|
|
|
+ // //
|
|
|
+ // // if self.flow_out_value + self.flow_in_value > dec!(2_000_000) {
|
|
|
+ // // self.flow_out_value = self.flow_out_value * dec!(0.618);
|
|
|
+ // // self.flow_in_value = self.flow_in_value * dec!(0.618);
|
|
|
+ // // }
|
|
|
+ // // }
|
|
|
+ // // else {
|
|
|
+ // // if trade.size > Decimal::ZERO {
|
|
|
+ // // self.flow_in_value += trade.value;
|
|
|
+ // // } else {
|
|
|
+ // // self.flow_out_value += trade.value;
|
|
|
+ // // }
|
|
|
+ // // }
|
|
|
+ //
|
|
|
+ // 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來更新資金流,確保平滑性
|
|
|
+ // // let a = Decimal::TWO / dec!(50);
|
|
|
+ // if flow_out_value + flow_in_value > *min_volume {
|
|
|
+ // // let now = (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value);
|
|
|
+ // // a * now + (Decimal::ONE - a) * prev_flow_ratio
|
|
|
+ // (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value)
|
|
|
+ // } else {
|
|
|
+ // Decimal::ZERO
|
|
|
+ // }
|
|
|
+ // }
|
|
|
|
|
|
fn calc_flow_ratio_2(_prev_flow_ratio: &Decimal, min_volume: &Decimal, trades: &mut FixedTimeRangeDeque<Trade>) -> Decimal {
|
|
|
let mut flow_in_value = Decimal::ZERO;
|