|
|
@@ -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 {
|