|
|
@@ -1,31 +1,37 @@
|
|
|
use std::collections::{BTreeMap, VecDeque};
|
|
|
+use chrono::Utc;
|
|
|
use rust_decimal::prelude::*;
|
|
|
use tracing::info;
|
|
|
use standard::{Depth, Ticker, Trade};
|
|
|
|
|
|
-const MAX_DATA_LENGTH: usize = 1000;
|
|
|
-
|
|
|
// 定制的队列,可以统一指定长度
|
|
|
#[derive(Debug)]
|
|
|
pub struct FixedLengthDeque<T> {
|
|
|
pub deque: VecDeque<T>,
|
|
|
- max_len: usize,
|
|
|
+ pub deque_t: VecDeque<i64>
|
|
|
}
|
|
|
|
|
|
impl<T> FixedLengthDeque<T> {
|
|
|
- fn new(max_len: usize) -> Self {
|
|
|
+ // 时间窗口大小(微秒)
|
|
|
+ const MAX_TIME_RANGE_MICROS: i64 = 10_000_000_000;
|
|
|
+
|
|
|
+ fn new() -> Self {
|
|
|
FixedLengthDeque {
|
|
|
deque: VecDeque::new(),
|
|
|
- max_len,
|
|
|
+ deque_t: VecDeque::new()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
pub fn push_back(&mut self, value: T) {
|
|
|
+ let now = Utc::now().timestamp_micros();
|
|
|
+
|
|
|
self.deque.push_back(value);
|
|
|
- // =================== 之后如果要以时间作为限制,在这里改就行了 ==================
|
|
|
- // 检查长度,如果超过最大长度,则移除前端元素
|
|
|
- if self.deque.len() > self.max_len {
|
|
|
+ self.deque_t.push_back(now);
|
|
|
+
|
|
|
+ // =================== 检查长度,如果超过时间窗口,则移除前端元素 ==================
|
|
|
+ while self.deque_t.len() > 0 && now - self.deque_t.get(0).unwrap() > Self::MAX_TIME_RANGE_MICROS {
|
|
|
self.deque.pop_front();
|
|
|
+ self.deque_t.pop_front();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -83,18 +89,18 @@ pub struct AvellanedaStoikov {
|
|
|
impl AvellanedaStoikov {
|
|
|
pub fn new() -> Self {
|
|
|
let avellaneda_stoikov = Self {
|
|
|
- // 分别给与MAX_DATA_LENGTH的长度
|
|
|
- depth_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- trade_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
+ // 分别给与的长度
|
|
|
+ depth_vec: FixedLengthDeque::new(),
|
|
|
+ trade_vec: FixedLengthDeque::new(),
|
|
|
|
|
|
- mid_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- ask_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- bid_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- spread_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- spread_max_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- spread_min_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- optimal_ask_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- optimal_bid_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
+ mid_price_vec: FixedLengthDeque::new(),
|
|
|
+ ask_price_vec: FixedLengthDeque::new(),
|
|
|
+ bid_price_vec: FixedLengthDeque::new(),
|
|
|
+ spread_vec: FixedLengthDeque::new(),
|
|
|
+ spread_max_vec: FixedLengthDeque::new(),
|
|
|
+ spread_min_vec: FixedLengthDeque::new(),
|
|
|
+ optimal_ask_price_vec: FixedLengthDeque::new(),
|
|
|
+ optimal_bid_price_vec: FixedLengthDeque::new(),
|
|
|
|
|
|
mid_price: Default::default(),
|
|
|
ask_price: Default::default(),
|
|
|
@@ -105,12 +111,12 @@ impl AvellanedaStoikov {
|
|
|
optimal_ask_price: Default::default(),
|
|
|
optimal_bid_price: Default::default(),
|
|
|
|
|
|
- inventory_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- gamma_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- sigma_square_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- delta_plus_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- kappa_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
- ref_price_vec: FixedLengthDeque::new(MAX_DATA_LENGTH),
|
|
|
+ inventory_vec: FixedLengthDeque::new(),
|
|
|
+ gamma_vec: FixedLengthDeque::new(),
|
|
|
+ sigma_square_vec: FixedLengthDeque::new(),
|
|
|
+ delta_plus_vec: FixedLengthDeque::new(),
|
|
|
+ kappa_vec: FixedLengthDeque::new(),
|
|
|
+ ref_price_vec: FixedLengthDeque::new(),
|
|
|
|
|
|
inventory: Default::default(),
|
|
|
gamma: Default::default(),
|