ソースを参照

马丁重新加入。

skyfffire 1 年間 前
コミット
646d01e323
2 ファイル変更20 行追加15 行削除
  1. 2 2
      strategy/src/avellaneda_stoikov.rs
  2. 18 13
      strategy/src/strategy.rs

+ 2 - 2
strategy/src/avellaneda_stoikov.rs

@@ -177,8 +177,8 @@ impl AvellanedaStoikov {
     }
 
     pub async fn update_level(&mut self) {
-        // self.level = (Decimal::NEGATIVE_ONE + (Decimal::ONE + dec!(8) * self.inventory.abs()).sqrt().unwrap()) / Decimal::TWO;
-        // self.level = min(self.level, dec!(5));
+        self.level = (Decimal::NEGATIVE_ONE + (Decimal::ONE + dec!(8) * self.inventory.abs()).sqrt().unwrap()) / Decimal::TWO;
+        self.level = min(self.level, dec!(6));
     }
 
     pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {

+ 18 - 13
strategy/src/strategy.rs

@@ -953,12 +953,15 @@ impl Strategy {
             let mut target_buy_price = predictor.optimal_bid_price;
             // target_buy_price = utils::clip(target_buy_price, self.bp * dec!(0.97), self.ap * dec!(1.0005));
             target_buy_price = utils::fix_price(target_buy_price, self.tick_size);
-            let amount = utils::get_amount_by_min_amount_value(self.min_amount_value, target_buy_price, self.step_size);
-            // let amount = if predictor.inventory < Decimal::ZERO {
-            //     utils::fix_amount(self.step_size * predictor.inventory.abs(), self.step_size)
-            // } else {
-            //     utils::fix_amount(self.step_size * (predictor.level + Decimal::ONE), self.step_size)
-            // };
+            // let amount = utils::get_amount_by_min_amount_value(self.min_amount_value, target_buy_price, self.step_size);
+            let amount = if predictor.inventory < Decimal::ZERO {
+                // utils::fix_amount(self.step_size * predictor.inventory.abs(), self.step_size)
+                utils::get_amount_by_min_amount_value(self.min_amount_value * predictor.level, target_buy_price, self.step_size)
+            } else {
+                // utils::fix_amount(self.step_size * (predictor.level + Decimal::ONE), self.step_size)
+                utils::get_amount_by_min_amount_value(self.min_amount_value * (predictor.level + Decimal::ONE), target_buy_price, self.step_size)
+            };
+
 
             // 下单价值判定
             let amount_value = amount * target_buy_price;
@@ -977,18 +980,20 @@ impl Strategy {
                 info!("下单价值太小,要求:{},但是价格:{}, 数量:{}", self.min_amount_value, target_buy_price, amount);
             }
         }
-        // 挂空单, TODO 如果下单之后没有收到仓位,岂不是会连续下几单?
+        // 挂空单
         if self.post_side <= 0 && sell_value == Decimal::ZERO && predictor.optimal_ask_price > predictor.mid_price {
             let mut target_sell_price = predictor.optimal_ask_price;
             // target_sell_price = utils::clip(target_sell_price, self.bp * dec!(0.9995), self.ap * dec!(1.03));
             // 取消大小限制
             target_sell_price = utils::fix_price(target_sell_price, self.tick_size);
-            let amount = utils::get_amount_by_min_amount_value(self.min_amount_value, target_sell_price, self.step_size);
-            // let amount = if predictor.inventory > Decimal::ZERO {
-            //     utils::fix_amount(self.step_size * predictor.inventory.abs(), self.step_size)
-            // } else {
-            //     utils::fix_amount(self.step_size * (predictor.level + Decimal::ONE), self.step_size)
-            // };
+            // let amount = utils::get_amount_by_min_amount_value(self.min_amount_value, target_sell_price, self.step_size);
+            let amount = if predictor.inventory > Decimal::ZERO {
+                utils::get_amount_by_min_amount_value(self.min_amount_value * predictor.level, target_sell_price, self.step_size)
+                // utils::fix_amount(self.step_size * predictor.inventory.abs(), self.step_size)
+            } else {
+                utils::get_amount_by_min_amount_value(self.min_amount_value * (predictor.level + Decimal::ONE), target_sell_price, self.step_size)
+                // utils::fix_amount(self.step_size * (predictor.level + Decimal::ONE), self.step_size)
+            };
 
             // 下单价值不能太大,也不能太小
             let amount_value = amount * target_sell_price;