Prechádzať zdrojové kódy

仓位过大时分阶段平仓。

skyffire 1 rok pred
rodič
commit
f50b1a4a63

+ 14 - 4
strategy/src/avellaneda_stoikov.rs

@@ -290,11 +290,21 @@ impl AvellanedaStoikov {
             }
 
             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);
+                if self.inventory.abs() >= dec!(3) {
+                    self.ask_delta -= self.ratio_edge.abs() * Decimal::TWO;
+                    self.bid_delta += self.sigma_square.abs() * dec!(5);
+                } 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 {
-                self.ask_delta += self.sigma_square.abs() * dec!(5);
-                self.bid_delta -= self.ratio_edge.abs() * (Decimal::TWO - self.t_diff);
+                if self.inventory.abs() <= dec!(-3) {
+                    self.ask_delta += self.sigma_square.abs() * dec!(5);
+                    self.bid_delta -= self.ratio_edge.abs() * Decimal::TWO;
+                } else {
+                    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 {
                 self.ask_delta += self.sigma_square.abs() * dec!(5);
                 self.bid_delta += self.sigma_square.abs() * dec!(5);

+ 2 - 2
strategy/src/strategy.rs

@@ -956,7 +956,7 @@ impl Strategy {
             // 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 = if predictor.inventory <= dec!(-3) {
-                utils::get_amount_by_min_amount_value(self.min_amount_value * predictor.inventory.abs(), target_buy_price, self.step_size)
+                utils::get_amount_by_min_amount_value(self.min_amount_value * (predictor.inventory.abs() - dec!(2)), target_buy_price, self.step_size)
             } else {
                 utils::get_amount_by_min_amount_value(self.min_amount_value, target_buy_price, self.step_size)
             };
@@ -997,7 +997,7 @@ impl Strategy {
             // 取消大小限制
             target_sell_price = utils::fix_price(target_sell_price, self.tick_size);
             let amount = if predictor.inventory >= dec!(3) {
-                utils::get_amount_by_min_amount_value(self.min_amount_value * predictor.inventory.abs(), target_sell_price, self.step_size)
+                utils::get_amount_by_min_amount_value(self.min_amount_value * (predictor.inventory.abs() - dec!(2)), target_sell_price, self.step_size)
             } else {
                 utils::get_amount_by_min_amount_value(self.min_amount_value, target_sell_price, self.step_size)
             };