Bladeren bron

强制只有3根k线。

skyffire 1 jaar geleden
bovenliggende
commit
3dedde135b
1 gewijzigde bestanden met toevoegingen van 9 en 6 verwijderingen
  1. 9 6
      strategy/src/avellaneda_stoikov.rs

+ 9 - 6
strategy/src/avellaneda_stoikov.rs

@@ -1,5 +1,5 @@
 use std::cmp::{max, min};
-use std::collections::{BTreeMap};
+use std::collections::{BTreeMap, VecDeque};
 use std::sync::Arc;
 use chrono::Utc;
 use rust_decimal::prelude::*;
@@ -17,7 +17,7 @@ pub struct AvellanedaStoikov {
     pub trade_long_vec: FixedTimeRangeDeque<Trade>,                             // 交易队列
     pub trade_short_vec: FixedTimeRangeDeque<Trade>,                            // 交易队列
     pub spread_vec: FixedTimeRangeDeque<Decimal>,
-    pub record_vec: FixedTimeRangeDeque<Record>,                                // 蜡烛队列
+    pub record_vec: VecDeque<Record>,                                           // 蜡烛队列
 
     pub mid_price: Decimal,                                                     // 中间价
     pub ask_price: Decimal,                                                     // 卖一价
@@ -55,7 +55,6 @@ pub struct AvellanedaStoikov {
 impl AvellanedaStoikov {
     // 时间窗口大小(微秒)
     const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
-    const RECORD_RANGE_MICROS: i64 = 4 * 60_000_000;
     const TRADE_LONG_RANGE_MICROS: i64 = 3 * 60_000_000;
     const TRADE_SHORT_RANGE_MICROS: i64 = 20_000_000;
     // const ONE_MILLION: Decimal = dec!(1_000_000);
@@ -69,7 +68,7 @@ impl AvellanedaStoikov {
             spread_vec: FixedTimeRangeDeque::new(Self::MAX_TIME_RANGE_MICROS),
             trade_long_vec: FixedTimeRangeDeque::new(Self::TRADE_LONG_RANGE_MICROS),
             trade_short_vec: FixedTimeRangeDeque::new(Self::TRADE_SHORT_RANGE_MICROS),
-            record_vec: FixedTimeRangeDeque::new(Self::RECORD_RANGE_MICROS),
+            record_vec: VecDeque::new(),
 
             mid_price: Default::default(),
             ask_price: Default::default(),
@@ -181,7 +180,7 @@ impl AvellanedaStoikov {
         if self.record_vec.len() == 0 {
             self.record_vec.push_back(record.clone());
         } else {
-            let last_record = self.record_vec.deque.back_mut().unwrap();
+            let last_record = self.record_vec.back_mut().unwrap();
 
             if last_record.time == record.time {
                 *last_record = record.clone();
@@ -190,6 +189,10 @@ impl AvellanedaStoikov {
             }
         }
 
+        if self.record_vec.len() > 3 {
+            self.record_vec.pop_front();
+        }
+
         // 如果蜡烛数量足够,则更新mfi
         if self.record_vec.len() >= 3 {
             self.update_mfi();
@@ -201,7 +204,7 @@ impl AvellanedaStoikov {
         let mut money_flow_out = Decimal::ZERO;
         let _3 = dec!(3);
 
-        for record in self.record_vec.deque.iter() {
+        for record in self.record_vec.iter() {
             let typical_price = (record.high + record.low + record.close) / _3;
             let money_flow = typical_price * record.volume;
             if record.close > record.open {