Sfoglia il codice sorgente

以开仓时的预定价格进行平仓。时间限制暂未做。

skyfffire 1 anno fa
parent
commit
6476a1e9a4
2 ha cambiato i file con 13 aggiunte e 9 eliminazioni
  1. 12 8
      strategy/src/avellaneda_stoikov.rs
  2. 1 1
      strategy/src/core.rs

+ 12 - 8
strategy/src/avellaneda_stoikov.rs

@@ -48,6 +48,7 @@ pub struct AvellanedaStoikov {
 
     pub is_ready: bool,
     pub prev_trade_time: i64,                                                   // 上次交易时间,也就是t
+    pub close_price: Decimal,                                                   // 平仓价格
     pub t_diff: Decimal,                                                        // (T-t)
 }
 
@@ -100,6 +101,7 @@ impl AvellanedaStoikov {
 
             is_ready: false,
             prev_trade_time: Utc::now().timestamp_micros(),
+            close_price: Default::default(),
             t_diff: Default::default(),
             level: Default::default(),
         };
@@ -237,11 +239,13 @@ impl AvellanedaStoikov {
         }
     }
 
-    pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
+    pub async fn on_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
         let prev_inventory = self.inventory;
         self.inventory = (inventory / (min_amount_value / self.mid_price)).round();
-        if prev_inventory != self.inventory {
+        // 发现开仓行为
+        if prev_inventory.is_zero() && prev_inventory != self.inventory {
             self.prev_trade_time = Utc::now().timestamp_micros();
+            self.close_price = self.ref_price;
         }
 
         self.update_level().await;
@@ -293,23 +297,23 @@ impl AvellanedaStoikov {
             self.ask_delta = self.base_delta;
 
             if self.inventory > Decimal::ZERO {
-                self.ask_delta = self.base_delta;
-                // self.ask_delta = Decimal::NEGATIVE_ONE;
+                // self.ask_delta = self.base_delta;
+                self.ask_delta = Decimal::NEGATIVE_ONE;
             } else if self.inventory < Decimal::ZERO {
-                self.bid_delta = self.base_delta;
-                // self.bid_delta = Decimal::NEGATIVE_ONE;
+                // self.bid_delta = self.base_delta;
+                self.bid_delta = Decimal::NEGATIVE_ONE;
             }
         }
     }
 
     pub fn update_optimal_ask_and_bid(&mut self) {
         self.optimal_ask_price = if self.ask_delta == Decimal::NEGATIVE_ONE {
-            self.ref_price
+            self.close_price
         } else {
             max(self.ref_price + self.ask_delta, self.bid_price)
         };
         self.optimal_bid_price = if self.bid_delta == Decimal::NEGATIVE_ONE {
-            self.ref_price
+            self.close_price
         } else {
             min(self.ref_price - self.bid_delta, self.ask_price)
         };

+ 1 - 1
strategy/src/core.rs

@@ -711,7 +711,7 @@ impl Core {
             pos = self.local_position.long_pos - self.local_position.short_pos;
         }
         pos.rescale(8);
-        self.avellaneda_stoikov.update_inventory(&pos, &self.strategy.min_amount_value).await;
+        self.avellaneda_stoikov.on_inventory(&pos, &self.strategy.min_amount_value).await;
 
         let mut entry_price;
         if pos.gt(&Decimal::ZERO) {