|
|
@@ -30,7 +30,7 @@ use crate::utils;
|
|
|
use crate::utils::clip;
|
|
|
|
|
|
|
|
|
-pub struct Quant {
|
|
|
+pub struct Core {
|
|
|
pub params: Params,
|
|
|
// 启动时间
|
|
|
pub start_time: i64,
|
|
|
@@ -120,17 +120,17 @@ pub struct Quant {
|
|
|
pub cci_arc: Arc<Mutex<CentralControlInfo>>, // 中控信息汇集
|
|
|
}
|
|
|
|
|
|
-impl Quant {
|
|
|
+impl Core {
|
|
|
pub async fn new(exchange: String,
|
|
|
params: Params,
|
|
|
exchange_params: BTreeMap<String, String>,
|
|
|
order_sender: Sender<Order>,
|
|
|
error_sender: Sender<Error>,
|
|
|
running: Arc<AtomicBool>,
|
|
|
- cci_arc: Arc<Mutex<CentralControlInfo>>) -> Quant {
|
|
|
+ cci_arc: Arc<Mutex<CentralControlInfo>>) -> Core {
|
|
|
let symbol = params.pair.clone();
|
|
|
let pairs: Vec<&str> = params.pair.split('_').collect();
|
|
|
- let mut quant_obj = Quant {
|
|
|
+ let mut core_obj = Core {
|
|
|
params: params.clone(),
|
|
|
start_time: 0,
|
|
|
symbol: symbol.clone(),
|
|
|
@@ -259,25 +259,25 @@ impl Quant {
|
|
|
let market_update_interval_key = tickers_key.clone();
|
|
|
let max_buy_min_sell_cache_key = tickers_key.clone();
|
|
|
|
|
|
- quant_obj.tickers.insert(tickers_key, SpecialTicker::new());
|
|
|
- quant_obj.ref_name.push(ref_name_element);
|
|
|
- quant_obj.depths.insert(depths_key, Default::default());
|
|
|
- quant_obj.market_update_time.insert(market_update_time_key, Default::default());
|
|
|
- quant_obj.market_update_interval.insert(market_update_interval_key, Default::default());
|
|
|
- quant_obj.max_buy_min_sell_cache.insert(max_buy_min_sell_cache_key, vec![Decimal::ZERO, Decimal::ZERO]);
|
|
|
+ core_obj.tickers.insert(tickers_key, SpecialTicker::new());
|
|
|
+ core_obj.ref_name.push(ref_name_element);
|
|
|
+ core_obj.depths.insert(depths_key, Default::default());
|
|
|
+ core_obj.market_update_time.insert(market_update_time_key, Default::default());
|
|
|
+ core_obj.market_update_interval.insert(market_update_interval_key, Default::default());
|
|
|
+ core_obj.max_buy_min_sell_cache.insert(max_buy_min_sell_cache_key, vec![Decimal::ZERO, Decimal::ZERO]);
|
|
|
}
|
|
|
- let name = format!("{}{}{}", quant_obj.exchange.clone(), "@", quant_obj.symbol);
|
|
|
+ let name = format!("{}{}{}", core_obj.exchange.clone(), "@", core_obj.symbol);
|
|
|
let market_update_time_key = name.clone();
|
|
|
let market_update_interval_key = name.clone();
|
|
|
let tickers_key = name.clone();
|
|
|
let depths_key = name.clone();
|
|
|
let max_buy_min_sell_cache_key = name.clone();
|
|
|
- quant_obj.trade_name = name;
|
|
|
- quant_obj.market_update_time.insert(market_update_time_key, Default::default());
|
|
|
- quant_obj.market_update_interval.insert(market_update_interval_key, Default::default());
|
|
|
- quant_obj.tickers.insert(tickers_key, SpecialTicker::new());
|
|
|
- quant_obj.depths.insert(depths_key, Default::default());
|
|
|
- quant_obj.max_buy_min_sell_cache.insert(max_buy_min_sell_cache_key, vec![Decimal::ZERO, Decimal::ZERO]);
|
|
|
+ core_obj.trade_name = name;
|
|
|
+ core_obj.market_update_time.insert(market_update_time_key, Default::default());
|
|
|
+ core_obj.market_update_interval.insert(market_update_interval_key, Default::default());
|
|
|
+ core_obj.tickers.insert(tickers_key, SpecialTicker::new());
|
|
|
+ core_obj.depths.insert(depths_key, Default::default());
|
|
|
+ core_obj.max_buy_min_sell_cache.insert(max_buy_min_sell_cache_key, vec![Decimal::ZERO, Decimal::ZERO]);
|
|
|
// broker.newWs
|
|
|
let mut price_alpha: Vec<Decimal> = Vec::new();
|
|
|
for ref_pair_str in params.ref_pair {
|
|
|
@@ -290,11 +290,11 @@ impl Quant {
|
|
|
}
|
|
|
}
|
|
|
info!("价格系数:{:?}", price_alpha);
|
|
|
- quant_obj.predictor = Predictor::new(quant_obj.ref_name.len())
|
|
|
+ core_obj.predictor = Predictor::new(core_obj.ref_name.len())
|
|
|
.alpha(price_alpha)
|
|
|
.gamma(params.gamma);
|
|
|
|
|
|
- return quant_obj;
|
|
|
+ return core_obj;
|
|
|
}
|
|
|
|
|
|
#[instrument(skip(self, data, trace_stack), level="TRACE")]
|
|
|
@@ -662,7 +662,7 @@ impl Quant {
|
|
|
if self.mode_signal == 0 && self.ready == 1 && flag == 1 {
|
|
|
// 更新交易数据
|
|
|
self.update_trade_msg();
|
|
|
- trace_stack.on_after_quant();
|
|
|
+ trace_stack.on_after_core();
|
|
|
// 触发事件撤单逻辑
|
|
|
// 更新策略时间
|
|
|
self.strategy.local_time = Utc::now().timestamp_millis();
|
|
|
@@ -1607,8 +1607,8 @@ impl Quant {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#[instrument(skip(quant_arc), level="TRACE")]
|
|
|
-pub fn run_strategy(quant_arc: Arc<Mutex<Quant>>) -> JoinHandle<()> {
|
|
|
+#[instrument(skip(core_arc), level="TRACE")]
|
|
|
+pub fn run_strategy(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
|
|
|
return spawn(async move {
|
|
|
//定期触发策略
|
|
|
info!("定时触发器启动");
|
|
|
@@ -1618,41 +1618,41 @@ pub fn run_strategy(quant_arc: Arc<Mutex<Quant>>) -> JoinHandle<()> {
|
|
|
let start_time = Utc::now().timestamp_millis();
|
|
|
let mut delay = 1u64;
|
|
|
{
|
|
|
- let mut quant = quant_arc.lock().await;
|
|
|
- if quant.ready == 1 {
|
|
|
+ let mut core = core_arc.lock().await;
|
|
|
+ if core.ready == 1 {
|
|
|
// 更新交易信息集合
|
|
|
- quant.update_trade_msg();
|
|
|
- if quant.mode_signal != 0 {
|
|
|
- if quant.mode_signal > 1 {
|
|
|
- quant.mode_signal -= 1;
|
|
|
+ core.update_trade_msg();
|
|
|
+ if core.mode_signal != 0 {
|
|
|
+ if core.mode_signal > 1 {
|
|
|
+ core.mode_signal -= 1;
|
|
|
}
|
|
|
- if quant.mode_signal == 1 {
|
|
|
+ if core.mode_signal == 1 {
|
|
|
return;
|
|
|
}
|
|
|
// 触发策略 更新策略时间
|
|
|
- quant.strategy.local_time = Utc::now().timestamp_millis();
|
|
|
- let trade_msg = quant.trade_msg.clone();
|
|
|
- let mut platform_rest_fb = quant.platform_rest.clone_box();
|
|
|
+ core.strategy.local_time = Utc::now().timestamp_millis();
|
|
|
+ let trade_msg = core.trade_msg.clone();
|
|
|
+ let mut platform_rest_fb = core.platform_rest.clone_box();
|
|
|
// 获取信号
|
|
|
- if quant.mode_signal > 20 {
|
|
|
+ if core.mode_signal > 20 {
|
|
|
// 先执行onExit
|
|
|
- let orders = quant.strategy.on_exit(&trade_msg);
|
|
|
+ let orders = core.strategy.on_exit(&trade_msg);
|
|
|
if orders.is_not_empty() {
|
|
|
info!("触发onExit");
|
|
|
info!(?orders);
|
|
|
- quant._update_local_orders(&orders);
|
|
|
+ core._update_local_orders(&orders);
|
|
|
spawn(async move {
|
|
|
platform_rest_fb.command_order(orders, Default::default()).await;
|
|
|
});
|
|
|
}
|
|
|
} else {
|
|
|
// 再执行onSleep
|
|
|
- let orders = quant.strategy.on_sleep(&trade_msg);
|
|
|
+ let orders = core.strategy.on_sleep(&trade_msg);
|
|
|
// 记录指令触发信息
|
|
|
if orders.is_not_empty() {
|
|
|
info!("触发onSleep");
|
|
|
info!(?orders);
|
|
|
- quant._update_local_orders(&orders);
|
|
|
+ core._update_local_orders(&orders);
|
|
|
spawn(async move {
|
|
|
platform_rest_fb.command_order(orders, Default::default()).await;
|
|
|
});
|
|
|
@@ -1660,12 +1660,12 @@ pub fn run_strategy(quant_arc: Arc<Mutex<Quant>>) -> JoinHandle<()> {
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- quant.check_ready();
|
|
|
+ core.check_ready();
|
|
|
}
|
|
|
// 计算耗时并进行休眠
|
|
|
let pass_time = (Utc::now().timestamp_millis() - start_time).to_u64().unwrap();
|
|
|
- if pass_time < quant.interval {
|
|
|
- delay = quant.interval - pass_time;
|
|
|
+ if pass_time < core.interval {
|
|
|
+ delay = core.interval - pass_time;
|
|
|
}
|
|
|
}
|
|
|
sleep(Duration::from_millis(delay)).await;
|
|
|
@@ -1674,9 +1674,9 @@ pub fn run_strategy(quant_arc: Arc<Mutex<Quant>>) -> JoinHandle<()> {
|
|
|
}
|
|
|
|
|
|
// 定期触发的系统逻辑
|
|
|
-#[instrument(skip(quant_arc), level="TRACE")]
|
|
|
-pub fn on_timer(quant_arc: Arc<Mutex<Quant>>) -> JoinHandle<()> {
|
|
|
- let quant_arc_clone = quant_arc.clone();
|
|
|
+#[instrument(skip(core_arc), level="TRACE")]
|
|
|
+pub fn on_timer(core_arc: Arc<Mutex<Core>>) -> JoinHandle<()> {
|
|
|
+ let core_arc_clone = core_arc.clone();
|
|
|
|
|
|
return spawn(async move {
|
|
|
tokio::time::sleep(Duration::from_secs(20)).await;
|
|
|
@@ -1684,27 +1684,27 @@ pub fn on_timer(quant_arc: Arc<Mutex<Quant>>) -> JoinHandle<()> {
|
|
|
loop {
|
|
|
tokio::time::sleep(Duration::from_secs(10)).await;
|
|
|
|
|
|
- let mut quant = quant_arc_clone.lock().await;
|
|
|
+ let mut core = core_arc_clone.lock().await;
|
|
|
{
|
|
|
// 检查风控
|
|
|
- quant.check_risk().await;
|
|
|
+ core.check_risk().await;
|
|
|
|
|
|
// 线程停止信号
|
|
|
- if quant.mode_signal == 1 {
|
|
|
+ if core.mode_signal == 1 {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 计算预估成交额
|
|
|
- let total_trade_value = quant.local_buy_value + quant.local_sell_value;
|
|
|
- let time_diff = Decimal::from(Utc::now().timestamp_millis() - quant.start_time);
|
|
|
+ let total_trade_value = core.local_buy_value + core.local_sell_value;
|
|
|
+ let time_diff = Decimal::from(Utc::now().timestamp_millis() - core.start_time);
|
|
|
let trade_vol_24h = (total_trade_value / time_diff) * dec!(86400);
|
|
|
- quant.strategy.trade_vol_24h_w = trade_vol_24h / dec!(10000);
|
|
|
- quant.strategy.trade_vol_24h_w.rescale(2);
|
|
|
+ core.strategy.trade_vol_24h_w = trade_vol_24h / dec!(10000);
|
|
|
+ core.strategy.trade_vol_24h_w.rescale(2);
|
|
|
|
|
|
- // TODO quant没有rest
|
|
|
- // info!("Rest报单平均延迟{}ms", quant.rest.avg_delay);
|
|
|
- // info!("Rest报单最高延迟{}ms", quant.rest.max_delay);
|
|
|
- for (_name, _interval) in &quant.market_update_interval {
|
|
|
+ // TODO core没有rest
|
|
|
+ // info!("Rest报单平均延迟{}ms", core.rest.avg_delay);
|
|
|
+ // info!("Rest报单最高延迟{}ms", core.rest.max_delay);
|
|
|
+ for (_name, _interval) in &core.market_update_interval {
|
|
|
// debug!("WS盘口{}行情平均更新间隔{}ms。", name, interval);
|
|
|
}
|
|
|
}
|