skyfffire vor 1 Jahr
Ursprung
Commit
faea17e939
2 geänderte Dateien mit 37 neuen und 36 gelöschten Zeilen
  1. 36 35
      strategy/src/avellaneda_stoikov.rs
  2. 1 1
      strategy/src/strategy.rs

+ 36 - 35
strategy/src/avellaneda_stoikov.rs

@@ -172,37 +172,38 @@ impl AvellanedaStoikov {
     pub async fn on_trade(&mut self, trade: &Trade) {
         self.trade_vec.push_back(trade.clone());
 
-        if self.trade_vec.deque.len() > 0 {
-            // let prev_trade_iter = self.trade_vec.deque.iter().last().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 {
+        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 {
+            } 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;
-            }
         }
+        // else {
+        //     if trade.size > Decimal::ZERO {
+        //         self.flow_in_value += trade.value;
+        //     } else {
+        //         self.flow_out_value += trade.value;
+        //     }
+        // }
 
         // self.flow_in_value = Decimal::ZERO;
         // self.flow_out_value = Decimal::ZERO;
@@ -292,25 +293,25 @@ impl AvellanedaStoikov {
         if !self.flow_ratio.is_zero() {
             if self.flow_ratio_change_long < Decimal::ZERO {
                 if self.flow_ratio_change_short > Decimal::ZERO {
-                    self.ask_delta -= self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
-                    self.bid_delta += self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
+                    self.ask_delta -= self.base_delta;
+                    self.bid_delta += self.base_delta;
                 } else if self.flow_ratio_change_short < Decimal::ZERO && self.inventory < Decimal::ZERO {
-                    self.ask_delta += self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
-                    self.bid_delta -= self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
+                    self.ask_delta += self.base_delta;
+                    self.bid_delta -= self.base_delta;
                 } else {
-                    self.ask_delta += self.base_delta * dec!(3);
-                    self.bid_delta += self.base_delta * dec!(3);
+                    self.ask_delta += self.base_delta;
+                    self.bid_delta += self.base_delta;
                 }
             } else if self.flow_ratio_change_long > Decimal::ZERO {
                 if self.flow_ratio_change_short > Decimal::ZERO && self.inventory > Decimal::ZERO {
-                    self.ask_delta -= self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
-                    self.bid_delta += self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
+                    self.ask_delta -= self.base_delta;
+                    self.bid_delta += self.base_delta;
                 } else if self.flow_ratio_change_short < Decimal::ZERO {
-                    self.ask_delta += self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
-                    self.bid_delta -= self.base_delta * self.flow_ratio_change_short.abs() / dec!(0.03);
+                    self.ask_delta += self.base_delta;
+                    self.bid_delta -= self.base_delta;
                 } else {
-                    self.ask_delta += self.base_delta * dec!(3);
-                    self.bid_delta += self.base_delta * dec!(3);
+                    self.ask_delta += self.base_delta;
+                    self.bid_delta += self.base_delta;
                 }
             }
         } else {
@@ -338,7 +339,7 @@ impl AvellanedaStoikov {
     }
 
     pub fn update_flow_ratio(&mut self) {
-        if self.flow_out_value + self.flow_in_value > dec!(500_000) {
+        if self.flow_out_value + self.flow_in_value > dec!(100_000) {
             // 使用EMA來更新資金流,確保平滑性
             let a = Decimal::TWO / dec!(50);
             let now = (self.flow_in_value - self.flow_out_value) / (self.flow_out_value + self.flow_in_value);

+ 1 - 1
strategy/src/strategy.rs

@@ -1095,7 +1095,7 @@ impl Strategy {
         }
 
         self._cancel_open(&mut command, local_orders);              // 撤单命令处理
-        self._post_open(&mut command, local_orders, predictor);     // 限价单命令处理
+        // self._post_open(&mut command, local_orders, predictor);     // 限价单命令处理
         self._check_local_orders(&mut command, local_orders);       // 固定时间检查超时订单
         self._update_in_cancel(&mut command, local_orders);         // 更新撤单队列,是一个filter
         self._check_request_limit(&mut command);                    // 限制频率,移除不合规则之订单,是一个filter