|
|
@@ -18,14 +18,14 @@ use tokio::time::sleep;
|
|
|
use tracing::{error, info, warn};
|
|
|
use global::cci::CentralControlInfo;
|
|
|
use global::params::Params;
|
|
|
-use global::public_params::{ASK_PRICE_INDEX, BID_PRICE_INDEX, LENGTH};
|
|
|
+use global::public_params::{BID_PRICE_INDEX, LENGTH};
|
|
|
use global::trace_stack::TraceStack;
|
|
|
use global::trade::Trade;
|
|
|
use standard::{Account, Market, Order, OrderCommand, Platform, Position, PositionModeEnum, SpecialTicker, Ticker};
|
|
|
use standard::exchange::{Exchange};
|
|
|
use standard::exchange::ExchangeEnum::{BinanceSwap, BitgetSwap, BybitSwap, CoinexSwap, GateSwap, HtxSwap, KucoinSwap};
|
|
|
-use standard::handle_info::DepthParam;
|
|
|
use crate::fix_price::PricingEngine;
|
|
|
+use crate::incremental_json_writer::{FixPriceLog, IncrementalJsonWriter, OrderLog};
|
|
|
use crate::model::{LocalPosition, OrderInfo, TokenParam};
|
|
|
use crate::predictor::Predictor;
|
|
|
use crate::strategy::Strategy;
|
|
|
@@ -127,7 +127,12 @@ pub struct Core {
|
|
|
pub is_sigma_allow_open: bool, // 是否允许开单
|
|
|
|
|
|
pub trading_volume: Decimal, // 交易量统计
|
|
|
- pub last_ref_price: Decimal, // 最后一次进入挂单的参考价格
|
|
|
+ pub last_fix_price: Decimal, // 最后一次进入挂单的定价价格
|
|
|
+ pub fix_prices: HashMap<String, Decimal>, // 最新定价
|
|
|
+
|
|
|
+ pub order_json_writer: IncrementalJsonWriter<OrderLog>, // 下单信息记录
|
|
|
+ pub ref_fix_price_writer: IncrementalJsonWriter<FixPriceLog>, // 参考所定价记录
|
|
|
+ pub trans_fix_price_writer: IncrementalJsonWriter<FixPriceLog>, // 交易所定价记录
|
|
|
}
|
|
|
|
|
|
impl Core {
|
|
|
@@ -202,6 +207,7 @@ impl Core {
|
|
|
alpha: vec![],
|
|
|
gamma: Default::default(),
|
|
|
avg_spread_list: vec![],
|
|
|
+ ref_fix_price_list: vec![],
|
|
|
},
|
|
|
market: Market {
|
|
|
symbol: symbol.clone(),
|
|
|
@@ -271,7 +277,11 @@ impl Core {
|
|
|
is_sigma_abnormal: false,
|
|
|
is_sigma_allow_open: true,
|
|
|
trading_volume: Default::default(),
|
|
|
- last_ref_price: Default::default(),
|
|
|
+ last_fix_price: Default::default(),
|
|
|
+ fix_prices: Default::default(),
|
|
|
+ order_json_writer: IncrementalJsonWriter::new("test_data/order_log/order_json", 5, 100usize).unwrap(),
|
|
|
+ ref_fix_price_writer: IncrementalJsonWriter::new("test_data/ref_price_log/ref_fix_price", 5, 100usize).unwrap(),
|
|
|
+ trans_fix_price_writer: IncrementalJsonWriter::new("test_data/trans_price_log/trans_fix_price", 5, 100usize).unwrap(),
|
|
|
};
|
|
|
for i in 0..=params.ref_exchange.len() - 1 {
|
|
|
// 拼接不会消耗原字符串
|
|
|
@@ -333,6 +343,7 @@ impl Core {
|
|
|
info!("\n\n");
|
|
|
info!("接收到订单信息①:{:?}", data);
|
|
|
}
|
|
|
+ let now_time = Utc::now().timestamp_millis();
|
|
|
/*
|
|
|
更新订单
|
|
|
首先直接复写本地订单
|
|
|
@@ -349,7 +360,7 @@ impl Core {
|
|
|
为了防止下单失败依然有订单成交 本地需要做一个缓存
|
|
|
*/
|
|
|
// 触发订单更新
|
|
|
- self.trade_order_update_time = Utc::now().timestamp_millis();
|
|
|
+ self.trade_order_update_time = now_time;
|
|
|
|
|
|
// 更新跟踪
|
|
|
if self.local_orders.contains_key(&data.client_id) {
|
|
|
@@ -547,6 +558,16 @@ impl Core {
|
|
|
// trace_stack.on_after_strategy();
|
|
|
// 记录指令触发信息
|
|
|
if order.is_not_empty() {
|
|
|
+ if !order.limits_open.is_empty() || !order.limits_close.is_empty(){
|
|
|
+ let mut limit_open = order.limits_open.values().cloned().collect::<Vec<Vec<String>>>();
|
|
|
+ let limit_close = order.limits_close.values().cloned().collect::<Vec<Vec<String>>>();
|
|
|
+ limit_open.extend(limit_close);
|
|
|
+ let order_log = OrderLog{
|
|
|
+ order_info: limit_open,
|
|
|
+ record_timestamp: now_time,
|
|
|
+ };
|
|
|
+ self.order_json_writer.add_entry(order_log).unwrap();
|
|
|
+ }
|
|
|
// info!("触发onOrder");
|
|
|
self._update_local_orders(&mut order);
|
|
|
//交易所处理订单信号
|
|
|
@@ -662,14 +683,15 @@ impl Core {
|
|
|
return;
|
|
|
}
|
|
|
// 检查 market 行情
|
|
|
- self.agg_market = self.get_all_market_data();
|
|
|
- if self.agg_market.len() != LENGTH * (1usize + self.ref_num as usize) {
|
|
|
- self.log_ready_status(format!("550聚合行情未准备好: market长度:{}, 检验数: {}", self.agg_market.len(), LENGTH * (1usize + self.ref_num as usize)));
|
|
|
+ let (market_info, fix_price) = self.get_all_market_data();
|
|
|
+ self.agg_market = market_info;
|
|
|
+ if self.agg_market.len() != LENGTH * (1usize + self.ref_num as usize) || fix_price == Decimal::ZERO {
|
|
|
+ self.log_ready_status(format!("550聚合行情未准备好: market长度:{}, fix_price: {}, 检验数: {}", self.agg_market.len(), fix_price, LENGTH * (1usize + self.ref_num as usize)));
|
|
|
return;
|
|
|
} else {
|
|
|
// 如果准备就绪,则可以开始交易
|
|
|
info!("----------------------------------聚合行情准备就绪,可以开始交易---------------------------------");
|
|
|
- self.predictor.market_info_handler(&self.agg_market);
|
|
|
+ self.predictor.market_info_handler(&self.agg_market, fix_price);
|
|
|
self.ready = 1;
|
|
|
}
|
|
|
}
|
|
|
@@ -693,7 +715,7 @@ impl Core {
|
|
|
// 过滤条件 价格变化很大 时间间隔很长
|
|
|
let mut flag = 0;
|
|
|
|
|
|
- let price_rate = (ref_price - self.last_ref_price).abs() / ref_price;
|
|
|
+ let price_rate = (ref_price - self.last_fix_price).abs() / ref_price;
|
|
|
let rate = dec!(0.0002);
|
|
|
// 验证这次获取的预定价格要比上次的预定价格相差0.0002以上并且距离上次进入开单的时间间隔 > 50
|
|
|
if price_rate > rate || Utc::now().timestamp_millis() - self.on_tick_event_time > 50 {
|
|
|
@@ -701,16 +723,14 @@ impl Core {
|
|
|
flag = 1;
|
|
|
// 更新ontick触发时间记录
|
|
|
self.on_tick_event_time = Utc::now().timestamp_millis();
|
|
|
- // // 全局记录一下最后的预定价格
|
|
|
- self.last_ref_price = ref_price;
|
|
|
+ // 全局记录一下最后的预定价格
|
|
|
+ self.last_fix_price = ref_price;
|
|
|
}
|
|
|
|
|
|
// 允许交易
|
|
|
if self.mode_signal == 0 && self.ready == 1 && flag == 1 {
|
|
|
// 更新交易数据
|
|
|
self.update_trade_msg();
|
|
|
- // 更新预定价格
|
|
|
- self.ref_price = vec![vec![ref_price, ref_price]];
|
|
|
// 触发事件撤单逻辑
|
|
|
// 更新策略时间
|
|
|
self.strategy.local_time = Utc::now().timestamp_millis();
|
|
|
@@ -728,6 +748,16 @@ impl Core {
|
|
|
trace_stack.on_after_strategy();
|
|
|
|
|
|
if orders.is_not_empty() {
|
|
|
+ if !orders.limits_open.is_empty() || !orders.limits_close.is_empty(){
|
|
|
+ let mut limit_open = orders.limits_open.values().cloned().collect::<Vec<Vec<String>>>();
|
|
|
+ let limit_close = orders.limits_close.values().cloned().collect::<Vec<Vec<String>>>();
|
|
|
+ limit_open.extend(limit_close);
|
|
|
+ let order_log = OrderLog{
|
|
|
+ order_info: limit_open,
|
|
|
+ record_timestamp: now_time
|
|
|
+ };
|
|
|
+ self.order_json_writer.add_entry(order_log).unwrap();
|
|
|
+ }
|
|
|
let mut platform_rest_fb = self.platform_rest.clone_box();
|
|
|
// 先更新本地记录再发单。
|
|
|
self._update_local_orders(&mut orders);
|
|
|
@@ -747,6 +777,12 @@ impl Core {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ // 记录参考所定价
|
|
|
+ let ref_fix_price_log = FixPriceLog{
|
|
|
+ fix_price: ref_price,
|
|
|
+ record_timestamp: now_time
|
|
|
+ };
|
|
|
+ self.ref_fix_price_writer.add_entry(ref_fix_price_log).unwrap();
|
|
|
}
|
|
|
|
|
|
// #[instrument(skip(self, depth, name_ref, trace_stack), level="TRACE")]
|
|
|
@@ -987,13 +1023,15 @@ impl Core {
|
|
|
*/
|
|
|
// 更新聚合市场数据
|
|
|
// 更新聚合市场信息
|
|
|
- self.agg_market = self.get_all_market_data();
|
|
|
+ let (market_info, fix_price) = self.get_all_market_data();
|
|
|
+ self.agg_market = market_info;
|
|
|
// 更新预测器
|
|
|
- self.predictor.market_info_handler(&self.agg_market);
|
|
|
+ self.predictor.market_info_handler(&self.agg_market, fix_price);
|
|
|
}
|
|
|
|
|
|
// #[instrument(skip(self), level="TRACE")]
|
|
|
pub fn update_trade_msg(&mut self) {
|
|
|
+ let now_time = Utc::now().timestamp_millis();
|
|
|
// 更新保证金
|
|
|
self.local_cash = self.local_cash.round_dp(10);
|
|
|
self.local_coin = self.local_coin.round_dp(10);
|
|
|
@@ -1001,22 +1039,30 @@ impl Core {
|
|
|
// self.trade_msg.position = self.local_position_by_orders.clone();
|
|
|
// self.trade_msg.orders = self.local_orders.clone();
|
|
|
// 更新 ref
|
|
|
- // let mut ref_tickers: BTreeMap<String, Ticker> = BTreeMap::new();
|
|
|
- // for i in &self.ref_name {
|
|
|
- // let bp = self.tickers.get(i).unwrap().buy;
|
|
|
- // let ap = self.tickers.get(i).unwrap().sell;
|
|
|
- // ref_tickers.insert(i.clone(), Ticker {
|
|
|
- // time: 0,
|
|
|
- // high: Default::default(),
|
|
|
- // low: Default::default(),
|
|
|
- // sell: ap,
|
|
|
- // buy: bp,
|
|
|
- // last: Default::default(),
|
|
|
- // volume: Default::default(),
|
|
|
- // });
|
|
|
- // }
|
|
|
- // ref_price = [[bid_price, ask_price]]
|
|
|
- // self.ref_price = self.predictor.get_ref_price(&ref_tickers);
|
|
|
+ let mut ref_tickers: BTreeMap<String, Ticker> = BTreeMap::new();
|
|
|
+ for i in &self.ref_name {
|
|
|
+ let bp = self.tickers.get(i).unwrap().buy;
|
|
|
+ let ap = self.tickers.get(i).unwrap().sell;
|
|
|
+ ref_tickers.insert(i.clone(), Ticker {
|
|
|
+ time: 0,
|
|
|
+ high: Default::default(),
|
|
|
+ low: Default::default(),
|
|
|
+ sell: ap,
|
|
|
+ buy: bp,
|
|
|
+ last: Default::default(),
|
|
|
+ volume: Default::default(),
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // [bid, ask]
|
|
|
+ self.ref_price = self.predictor.get_ref_price(&ref_tickers);
|
|
|
+ let trans_fix_price = self.ref_price.last().unwrap().iter().sum::<Decimal>()/Decimal::TWO;
|
|
|
+ let trans_fix_price_log = FixPriceLog {
|
|
|
+ fix_price: trans_fix_price,
|
|
|
+ record_timestamp: now_time,
|
|
|
+ };
|
|
|
+ // let single_signal_start_time = std::time::Instant::now();
|
|
|
+ self.trans_fix_price_writer.add_entry(trans_fix_price_log).unwrap();
|
|
|
+ // info!("单次交易交易所定价写入完毕,耗时: {:?}", single_signal_start_time.elapsed())
|
|
|
}
|
|
|
|
|
|
// 本地记录所有报单信息
|
|
|
@@ -1080,9 +1126,10 @@ impl Core {
|
|
|
|
|
|
// 获取深度信息
|
|
|
// #[instrument(skip(self), level="TRACE")]
|
|
|
- pub fn get_all_market_data(&mut self) -> Vec<Decimal> {
|
|
|
+ pub fn get_all_market_data(&mut self) -> (Vec<Decimal>, Decimal) {
|
|
|
// 只能定时触发 组合市场信息=交易盘口+参考盘口
|
|
|
let mut market: Vec<Decimal> = Vec::new();
|
|
|
+ let mut fix_price = Decimal::ZERO;
|
|
|
// 获取交易盘口市场信息
|
|
|
let mut data: Vec<Decimal> = self.local_depths.get(&self.trade_name).unwrap().clone();
|
|
|
self.is_update.insert(self.symbol.clone(), true);
|
|
|
@@ -1097,8 +1144,12 @@ impl Core {
|
|
|
max_min_price = self.max_buy_min_sell_cache.get(i).unwrap().clone();
|
|
|
data.append(&mut max_min_price);
|
|
|
market.append(&mut data);
|
|
|
+ // 获取定价,暂只考虑一个参考所的情况
|
|
|
+ fix_price = self.fix_prices.get(i).unwrap().clone();
|
|
|
}
|
|
|
- return market;
|
|
|
+
|
|
|
+
|
|
|
+ return (market, fix_price);
|
|
|
}
|
|
|
|
|
|
// #[instrument(skip(self), level="TRACE")]
|
|
|
@@ -1696,6 +1747,10 @@ impl Core {
|
|
|
|
|
|
self.clear_position_and_orders(Decimal::ZERO).await;
|
|
|
|
|
|
+ info!("-------------------------写入未满的记录----------------------------");
|
|
|
+ self.trans_fix_price_writer.flush().unwrap();
|
|
|
+ self.order_json_writer.flush().unwrap();
|
|
|
+ self.ref_fix_price_writer.flush().unwrap();
|
|
|
info!("订单、仓位清除完毕,为避免api失效导致遗漏仓位,建议人工复查。");
|
|
|
info!("停机原因:{}。", self.exit_msg);
|
|
|
}
|