Browse Source

优化挂单速度。

skyffire 1 year ago
parent
commit
dcfc99073f
3 changed files with 18 additions and 20 deletions
  1. 0 1
      standard/src/bybit_swap.rs
  2. 0 1
      standard/src/gate_swap.rs
  3. 18 18
      strategy/src/core.rs

+ 0 - 1
standard/src/bybit_swap.rs

@@ -529,7 +529,6 @@ impl Platform for BybitSwap {
     async fn command_order(&mut self, order_command: &mut OrderCommand, trace_stack: &TraceStack) {
         // 下单指令
         let mut handles = vec![];
-        order_command.limits_open.extend(order_command.limits_close.clone());
         for item in order_command.limits_open.keys() {
             let mut self_clone = self.clone();
 

+ 0 - 1
standard/src/gate_swap.rs

@@ -515,7 +515,6 @@ impl Platform for GateSwap {
         let mut handles = vec![];
 
         // 下单指令
-        order_command.limits_open.extend(order_command.limits_close.clone());
         for item in order_command.limits_open.keys() {
             let mut ts = trace_stack.clone();
 

+ 18 - 18
strategy/src/core.rs

@@ -506,7 +506,7 @@ impl Core {
                         // 记录指令触发信息
                         if order.is_not_empty() {
                             // info!("触发onOrder");
-                            self._update_local_orders(&order);
+                            self._update_local_orders(&mut order);
                             //交易所处理订单信号
                             let mut platform_rest_fb = self.platform_rest.clone_box();
                             let mut ts = trace_stack.clone();
@@ -662,9 +662,11 @@ impl Core {
                 if orders.is_not_empty() {
                     let mut platform_rest_fb = self.platform_rest.clone_box();
                     // 先更新本地记录再发单。
-                    self._update_local_orders(&orders);
+                    self._update_local_orders(&mut orders);
                     // info!("订单指令:{:?}", orders);
-                    platform_rest_fb.command_order(&mut orders, trace_stack).await;
+                    spawn(async move {
+                        platform_rest_fb.command_order(&mut orders, trace_stack).await;
+                    });
 
                     // 更新中控账户相关信息
                     {
@@ -777,19 +779,17 @@ impl Core {
 
     // 本地记录所有报单信息
     // #[instrument(skip(self, orders), level="TRACE")]
-    pub fn _update_local_orders(&mut self, orders: &OrderCommand) {
-        let mut limits = HashMap::new();
-        limits.extend(orders.clone().limits_open);
-        limits.extend(orders.clone().limits_close);
+    pub fn _update_local_orders(&mut self, orders: &mut OrderCommand) {
+        orders.limits_open.extend(orders.limits_close.clone());
 
-        if !limits.is_empty() {
-            for j in limits.keys() {
+        if !orders.limits_open.is_empty() {
+            for j in orders.limits_open.keys() {
                 let order_info = OrderInfo {
                     symbol: self.symbol.clone(),
-                    amount: Decimal::from_str(limits.get(j).unwrap()[0].as_str()).unwrap(),
-                    side: limits.get(j).unwrap()[1].clone(),
-                    price: Decimal::from_str(limits.get(j).unwrap()[2].as_str()).unwrap(),
-                    client_id: limits.get(j).unwrap()[3].clone(),
+                    amount: Decimal::from_str(orders.limits_open.get(j).unwrap()[0].as_str()).unwrap(),
+                    side: orders.limits_open.get(j).unwrap()[1].clone(),
+                    price: Decimal::from_str(orders.limits_open.get(j).unwrap()[2].as_str()).unwrap(),
+                    client_id: orders.limits_open.get(j).unwrap()[3].clone(),
                     filled_price: Default::default(),
                     filled: Decimal::ZERO,
                     order_id: "".to_string(),
@@ -800,11 +800,11 @@ impl Core {
                     trace_stack: TraceStack::new(0, Instant::now()),
                 };
                 // 本地挂单表
-                self.local_orders.insert(limits.get(j).unwrap()[3].clone(), order_info.clone());
+                self.local_orders.insert(orders.limits_open.get(j).unwrap()[3].clone(), order_info.clone());
                 // 本地缓存表
-                self.local_orders_backup.insert(limits.get(j).unwrap()[3].clone(), order_info);
+                self.local_orders_backup.insert(orders.limits_open.get(j).unwrap()[3].clone(), order_info);
                 // 本地缓存cid表
-                self.local_orders_backup_cid.push(limits.get(j).unwrap()[3].clone());
+                self.local_orders_backup_cid.push(orders.limits_open.get(j).unwrap()[3].clone());
             }
         }
         if !orders.cancel.is_empty() {
@@ -1620,7 +1620,7 @@ pub fn run_strategy(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
                             if orders.is_not_empty() {
                                 info!("触发onExit");
                                 info!(?orders);
-                                core._update_local_orders(&orders);
+                                core._update_local_orders(&mut orders);
                                 spawn(async move {
                                     let mut ts = TraceStack::new(0, Instant::now());
                                     platform_rest_fb.command_order(&mut orders, &mut ts).await;
@@ -1647,7 +1647,7 @@ pub fn run_strategy(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
                             if orders.is_not_empty() {
                                 info!("触发onSleep");
                                 info!(?orders);
-                                core._update_local_orders(&orders);
+                                core._update_local_orders(&mut orders);
                                 spawn(async move {
                                     let mut ts = TraceStack::new(0, Instant::now());
                                     platform_rest_fb.command_order(&mut orders, &mut ts).await;