predictor.rs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. use std::cmp::max;
  2. use std::collections::{BTreeMap, VecDeque};
  3. use std::sync::Arc;
  4. use chrono::{Utc};
  5. use futures_channel::mpsc::UnboundedSender;
  6. use futures_util::StreamExt;
  7. use reqwest::{Client};
  8. use rust_decimal::prelude::*;
  9. use rust_decimal_macros::dec;
  10. use serde_json::{json, Value};
  11. use tokio::sync::{Mutex};
  12. use tracing::{error, info};
  13. use global::cci::CentralControlInfo;
  14. use global::fixed_time_range_deque::FixedTimeRangeDeque;
  15. use global::params::Params;
  16. use standard::{Depth, Record, Ticker, Trade};
  17. use crate::utils;
  18. #[derive(Debug, Clone)]
  19. pub struct Predictor {
  20. pub depth_vec: Vec<Depth>, // 深度队列
  21. pub spread_vec: Vec<Decimal>, // 价差队列
  22. pub record_vec: VecDeque<Record>, // 蜡烛队列
  23. pub trade_price_long_vec: FixedTimeRangeDeque<Decimal>, // 交易队列
  24. pub mid_price: Decimal, // 中间价
  25. pub fair_price: Decimal,
  26. pub ask_price: Decimal, // 卖一价
  27. pub bid_price: Decimal, // 买一价
  28. pub last_price: Decimal, // 最后成交价
  29. pub optimal_ask_price: Decimal, // 卖出挂单价
  30. pub optimal_bid_price: Decimal, // 买入挂单价
  31. pub inventory: Decimal, // 库存,也就是q
  32. pub pos_amount: Decimal, // 原始持仓量
  33. pub pos_avg_price: Decimal, // 原始持仓价格
  34. pub balance: Decimal, // 初始余额
  35. pub prev_balance: Decimal,
  36. pub signal: Decimal, // 大于0代表此时是正向信号,小于0则相反
  37. pub ask_delta: Decimal, // δa
  38. pub bid_delta: Decimal, // δb
  39. pub fair_price_vec: Vec<Decimal>, // 公平价格列表
  40. pub fair_price_std_vec: Vec<Decimal>, // 公平价格列表,标准化之后的
  41. pub price_avg_times_vec: Vec<Decimal>, // 公平所与做市所的价格倍率的平均值
  42. pub price_avg_times_long_vec: Vec<Decimal>, // 公平所与做市所的价格倍率的平均值
  43. pub is_ready: bool, // 是否已准备好
  44. pub last_update_time: Decimal, // 最后更新时间(depth)
  45. pub last_index: Decimal, // 最后更新的index
  46. pub prev_insert_time: Decimal,
  47. pub prev_save_time: Decimal,
  48. pub init_time: Decimal,
  49. pub prev_update_open_params_time: Decimal,
  50. pub params: Params,
  51. pub debug_sender: UnboundedSender<Vec<Decimal>>
  52. }
  53. impl Predictor {
  54. // 时间窗口大小(微秒)
  55. // const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
  56. // const TIME_DIFF_RANGE_MICROS: i64 = 15 * 60_000_000;
  57. const TRADE_LONG_RANGE_MICROS: i64 = 10 * 60_000_000;
  58. // const SPREAD_RANGE_MICROS: i64 = 15 * 60_000_000;
  59. // const TRADE_SHORT_RANGE_MICROS: i64 = 2 * 60_000_000;
  60. // const ONE_MILLION: Decimal = dec!(1_000_000);
  61. // const TWENTY_THOUSAND: Decimal = dec!(20_000);
  62. const DONT_VIEW: Decimal = dec!(14142135623730951);
  63. pub fn new(_cci_arc: Arc<Mutex<CentralControlInfo>>, params: Params) -> Self {
  64. // 创建数据通道
  65. // 创建一个无界通道
  66. let (tx, mut rx) = futures_channel::mpsc::unbounded::<Vec<Decimal>>();
  67. let account_port = params.port.clone();
  68. tokio::spawn(async move {
  69. let len = 17usize;
  70. let mut prev_save_time = Decimal::from(Utc::now().timestamp_millis());
  71. let mut debugs: Vec<VecDeque<Option<Decimal>>> = vec![VecDeque::new(); len];
  72. while let Some(value) = rx.next().await {
  73. // 数据填充到对应位置
  74. for i in 0..len {
  75. if value[i] == Self::DONT_VIEW {
  76. debugs[i].push_back(None);
  77. } else {
  78. debugs[i].push_back(Some(value[i]));
  79. }
  80. }
  81. // 长度限制
  82. if debugs[0].len() > 500_000 {
  83. for i in 0..len {
  84. debugs[i].pop_front(); // 从前面移除元素
  85. }
  86. }
  87. let now = Decimal::from(Utc::now().timestamp_millis());
  88. if now - prev_save_time < dec!(30000) {
  89. continue;
  90. }
  91. let debugs_clone = debugs.clone();
  92. let temp_html_str = tokio::task::spawn_blocking(move || {
  93. utils::build_html_file(&debugs_clone)
  94. }).await.unwrap();
  95. let path = format!("./db/{}.html", account_port);
  96. utils::write_to_file(&temp_html_str, path).await;
  97. prev_save_time = Decimal::from(Utc::now().timestamp_millis());
  98. }
  99. });
  100. let predictor = Self {
  101. // 接针版本
  102. depth_vec: vec![Depth::new(); params.ref_exchange.len()],
  103. fair_price_std_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
  104. fair_price_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
  105. price_avg_times_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
  106. price_avg_times_long_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
  107. spread_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
  108. record_vec: VecDeque::new(),
  109. trade_price_long_vec: FixedTimeRangeDeque::new(Self::TRADE_LONG_RANGE_MICROS),
  110. mid_price: Default::default(),
  111. fair_price: Default::default(),
  112. ask_price: Default::default(),
  113. bid_price: Default::default(),
  114. last_price: Default::default(),
  115. optimal_ask_price: Default::default(),
  116. optimal_bid_price: Default::default(),
  117. ask_delta: Default::default(),
  118. bid_delta: Default::default(),
  119. is_ready: false,
  120. inventory: Default::default(),
  121. pos_avg_price: Default::default(),
  122. pos_amount: Default::default(),
  123. balance: Default::default(),
  124. prev_balance: Default::default(),
  125. signal: Default::default(),
  126. last_update_time: Default::default(),
  127. last_index: Default::default(),
  128. prev_insert_time: Default::default(),
  129. prev_save_time: Decimal::from(Utc::now().timestamp_millis()),
  130. init_time: Decimal::from(Utc::now().timestamp_millis()),
  131. prev_update_open_params_time: Default::default(),
  132. params,
  133. debug_sender: tx,
  134. };
  135. predictor
  136. }
  137. pub async fn on_depth(&mut self, depth: &Depth, index: usize) {
  138. self.last_update_time = depth.time;
  139. self.last_index = Decimal::from(index);
  140. if index == 233 {
  141. self.ask_price = depth.asks[0].price;
  142. self.bid_price = depth.bids[0].price;
  143. self.mid_price = (self.ask_price + self.bid_price) / Decimal::TWO;
  144. } else {
  145. self.update_fair_price(depth, index).await;
  146. self.depth_vec[index] = depth.clone();
  147. }
  148. if self.mid_price.is_zero() {
  149. return;
  150. }
  151. self.processor(depth.time, false).await;
  152. }
  153. pub async fn on_trade(&mut self, trade: &Trade, _index: usize) {
  154. self.last_price = trade.price;
  155. self.trade_price_long_vec.push_back(trade.price);
  156. // self.processor().await;
  157. }
  158. pub async fn on_ticker(&mut self, _ticker: &Ticker) {}
  159. pub async fn on_record(&mut self, _record: &Record) {}
  160. pub async fn on_inventory(&mut self, pos_amount: &Decimal, pos_avg_price: &Decimal, min_amount_value: &Decimal, update_time: Decimal) {
  161. if self.mid_price.is_zero() {
  162. return;
  163. }
  164. let prev_pos_amount = self.pos_amount;
  165. self.pos_amount = pos_amount.clone();
  166. self.pos_avg_price = pos_avg_price.clone();
  167. self.inventory = (pos_amount / (min_amount_value / self.mid_price)).trunc();
  168. // 小于1但不为0的情况,需要平完
  169. if self.inventory.is_zero() && !pos_amount.is_zero() {
  170. self.inventory = if pos_amount > &Decimal::ZERO {
  171. Decimal::ONE
  172. } else {
  173. Decimal::NEGATIVE_ONE
  174. };
  175. }
  176. if prev_pos_amount != self.pos_amount {
  177. self.processor(update_time, true).await;
  178. }
  179. }
  180. pub async fn on_balance(&mut self, balance: Decimal) {
  181. self.balance = balance;
  182. }
  183. pub fn get_real_rate(price_vec: &FixedTimeRangeDeque<Decimal>) -> Decimal {
  184. let last_fair_price = price_vec.deque.iter().last().unwrap();
  185. let min_price = price_vec.deque.iter().min().unwrap();
  186. let max_price = price_vec.deque.iter().max().unwrap();
  187. let up_rate = (last_fair_price - min_price) / min_price;
  188. let down_rate = (max_price - last_fair_price) / max_price;
  189. if up_rate > down_rate {
  190. up_rate
  191. } else {
  192. -down_rate
  193. }
  194. }
  195. pub async fn update_fair_price(&mut self, depth: &Depth, index: usize) {
  196. if self.mid_price.is_zero() {
  197. return;
  198. }
  199. let a1 = &depth.asks[0];
  200. let b1 = &depth.bids[0];
  201. // https://quant.stackexchange.com/questions/50651/how-to-understand-micro-price-aka-weighted-mid-price
  202. let total = a1.value + b1.value;
  203. // let fair_price = (a1.price + b1.price) / Decimal::TWO;
  204. // 生成fp
  205. self.fair_price_vec[index] = a1.price * b1.value / total + b1.price * a1.value / total;
  206. self.fair_price_vec[index].rescale(self.mid_price.scale());
  207. // 求价格倍率
  208. self.price_avg_times_vec[index] = if !self.is_ready {
  209. self.fair_price_vec[index] / self.mid_price
  210. } else {
  211. self.price_avg_times_vec[index] * dec!(0.9998) + dec!(0.0002) * self.fair_price_vec[index] / self.mid_price
  212. };
  213. self.price_avg_times_long_vec[index] = if !self.is_ready {
  214. self.fair_price_vec[index] / self.mid_price
  215. } else {
  216. self.price_avg_times_long_vec[index] * dec!(0.9999) + dec!(0.0001) * self.fair_price_vec[index] / self.mid_price
  217. };
  218. // 合成公平价格
  219. self.fair_price_std_vec[index] = self.fair_price_vec[index] / self.price_avg_times_vec[index];
  220. // 开仓信号处理
  221. self.signal = Decimal::ZERO;
  222. for (i, price_avg_times_long) in self.price_avg_times_long_vec.iter().enumerate() {
  223. if price_avg_times_long.is_zero() {
  224. return;
  225. }
  226. let price_avg_times_short = self.price_avg_times_vec[i];
  227. self.spread_vec[i] = price_avg_times_short - price_avg_times_long;
  228. self.signal = self.signal + self.spread_vec[i];
  229. }
  230. // self.signal = self.signal / self.params.min_spread;
  231. // self.signal.rescale(0);
  232. // 生成最终用于挂单的公平价格
  233. let fair_price_sum: Decimal = self.fair_price_std_vec.iter().sum();
  234. let fair_price_count = self.fair_price_std_vec.iter()
  235. .filter(|&&value| value != Decimal::new(0, 0)) // 过滤掉0
  236. .count();
  237. if fair_price_count != 0 {
  238. self.fair_price = fair_price_sum / Decimal::from(fair_price_count);
  239. }
  240. }
  241. pub async fn update_delta(&mut self) {
  242. if self.mid_price.is_zero() {
  243. return;
  244. }
  245. let now = Decimal::from(Utc::now().timestamp_millis());
  246. if now - self.prev_update_open_params_time > dec!(60_000)
  247. || self.prev_balance != self.balance {
  248. self.update_open_params().await;
  249. self.prev_balance = self.balance;
  250. self.prev_update_open_params_time = now;
  251. }
  252. for fair_price in &self.fair_price_vec {
  253. if fair_price.is_zero() {
  254. return;
  255. }
  256. }
  257. let is_close_long = self.inventory > Decimal::ZERO;
  258. let is_close_short = self.inventory < Decimal::ZERO;
  259. if is_close_long {
  260. self.ask_delta = dec!(0);
  261. self.bid_delta = dec!(-2);
  262. self.optimal_ask_price = self.fair_price + self.fair_price * self.params.close;
  263. self.optimal_bid_price = Self::DONT_VIEW;
  264. } else if is_close_short {
  265. self.bid_delta = dec!(0);
  266. self.ask_delta = dec!(-2);
  267. self.optimal_bid_price = self.fair_price - self.fair_price * self.params.close;
  268. self.optimal_ask_price = Self::DONT_VIEW;
  269. } else {
  270. if self.signal > Decimal::ZERO {
  271. self.bid_delta = dec!(0);
  272. self.ask_delta = dec!(-2);
  273. self.optimal_bid_price = self.fair_price - self.fair_price * (self.params.open - self.signal);
  274. self.optimal_ask_price = Self::DONT_VIEW;
  275. } else if self.signal < Decimal::ZERO {
  276. self.ask_delta = dec!(0);
  277. self.bid_delta = dec!(-2);
  278. self.optimal_ask_price = self.fair_price + self.fair_price * (self.params.open + self.signal);
  279. self.optimal_bid_price = Self::DONT_VIEW;
  280. } else {
  281. self.bid_delta = dec!(0);
  282. self.ask_delta = dec!(0);
  283. self.optimal_bid_price = self.fair_price - self.fair_price * self.params.open;
  284. self.optimal_ask_price = self.fair_price + self.fair_price * self.params.open;
  285. }
  286. }
  287. self.optimal_ask_price.rescale(self.mid_price.scale());
  288. self.optimal_bid_price.rescale(self.mid_price.scale());
  289. }
  290. pub fn check_ready(&mut self) {
  291. if self.is_ready {
  292. return;
  293. }
  294. if self.mid_price.is_zero() {
  295. return;
  296. }
  297. for fair_price in &self.fair_price_vec {
  298. if fair_price.is_zero() {
  299. return;
  300. }
  301. }
  302. if self.ask_price.is_zero() {
  303. return;
  304. }
  305. if self.bid_price.is_zero() {
  306. return;
  307. }
  308. if self.balance.is_zero() {
  309. return;
  310. }
  311. self.is_ready = true;
  312. info!("========================================行情数据预热完毕==================================")
  313. }
  314. // #[instrument(skip(self), level="TRACE")]
  315. async fn processor(&mut self, data_time: Decimal, is_hard_update: bool) {
  316. self.check_ready();
  317. if !self.is_ready {
  318. return;
  319. }
  320. self.update_delta().await;
  321. // let cci_arc = self.cci_arc.clone();
  322. let now = data_time;
  323. let mid_price = self.mid_price;
  324. let ask_price = Self::DONT_VIEW;
  325. let bid_price = Self::DONT_VIEW;
  326. let optimal_ask_price = self.optimal_ask_price;
  327. let optimal_bid_price = self.optimal_bid_price;
  328. let last_price = Self::DONT_VIEW;
  329. let fair_price = self.fair_price;
  330. let spread = if self.trade_price_long_vec.len() > 1 {
  331. let front = self.trade_price_long_vec.deque.front().unwrap();
  332. let back = self.trade_price_long_vec.deque.back().unwrap();
  333. (back / front) - Decimal::ONE
  334. } else {
  335. Decimal::ZERO
  336. };
  337. let spread_min = Self::DONT_VIEW;
  338. let spread_max = Self::DONT_VIEW;
  339. // let spread = self.price_times_avg;
  340. // let spread_max = self.fair_price_vec[1] / self.fair_price_vec[0];
  341. // let spread_min = self.fair_price / self.mid_price;
  342. let inventory = self.inventory;
  343. let sigma_square = self.params.open;
  344. let gamma = self.balance;
  345. let kappa = Decimal::ZERO;
  346. let flow_ratio = Decimal::ZERO;
  347. let need_append = now - self.prev_insert_time > dec!(500);
  348. if !need_append && !is_hard_update {
  349. return;
  350. }
  351. if !is_hard_update {
  352. self.prev_insert_time = Decimal::from(Utc::now().timestamp_millis())
  353. }
  354. let pos_avg_price = self.pos_avg_price;
  355. self.debug_sender.unbounded_send(vec![
  356. now,
  357. mid_price,
  358. ask_price,
  359. bid_price,
  360. last_price,
  361. spread,
  362. spread_max,
  363. spread_min,
  364. optimal_ask_price,
  365. optimal_bid_price,
  366. inventory,
  367. sigma_square,
  368. gamma,
  369. kappa,
  370. flow_ratio,
  371. fair_price,
  372. pos_avg_price
  373. ]).unwrap();
  374. }
  375. // #[instrument(skip(self, ref_ticker_map), level="TRACE")]
  376. pub fn get_ref_price(&mut self, _ref_ticker_map: &BTreeMap<String, Ticker>) -> Vec<Vec<Decimal>> {
  377. vec![]
  378. }
  379. pub async fn update_open_params(&mut self) {
  380. let url = "http://is.skyfffire.com:18888/ia/get_indicator";
  381. let symbol = self.params.pair.to_lowercase();
  382. let exchange = self.params.exchange.to_lowercase();
  383. let params = json!({
  384. "indicator": "msv",
  385. "query": {
  386. "exchange": exchange,
  387. "symbol": symbol,
  388. "minute_time_range": "10",
  389. "mills_back": "37"
  390. }
  391. });
  392. // 创建 HTTP 客户端
  393. let client = Client::new();
  394. // 发送 GET 请求
  395. let response_rst = client.post(url)
  396. .json(&params)
  397. .send()
  398. .await;
  399. match response_rst {
  400. Ok(response) => {
  401. // 错误处理
  402. if response.status().is_success() {
  403. let response_text = response.text().await.unwrap();
  404. let parsed: Value = serde_json::from_str(response_text.as_str()).unwrap();
  405. let msv = parsed["data"]["msv"].clone();
  406. let msv_decimals: Vec<Decimal> = msv.as_array()
  407. .unwrap() // 确保 parsed 是一个数组
  408. .iter()
  409. .filter_map(|item| {
  410. // 尝试提取第二个值并转换为 Decimal
  411. if let Some(value) = item.get(1) {
  412. value.as_str().unwrap_or("0").parse::<Decimal>().ok()
  413. } else {
  414. None
  415. }
  416. })
  417. .collect();
  418. let max_abs_value = msv_decimals.iter()
  419. .map(|&value| value.abs()) // 获取每个数的绝对值
  420. .fold(Decimal::new(0, 0), |a, b| a.max(b)); // 计算最大值
  421. let prev_open = self.params.open.clone();
  422. self.params.open = if max_abs_value.is_zero() {
  423. panic!("十分钟内毫无波动的行情,停机。")
  424. } else {
  425. max(max(self.params.min_open, dec!(0.0004)), max_abs_value / Decimal::ONE_HUNDRED)
  426. };
  427. if self.params.open != prev_open {
  428. info!("open: {} -> {}", prev_open, self.params.open);
  429. }
  430. } else {
  431. error!("自动参数挂了:{}", response.status());
  432. }
  433. }
  434. Err(_) => {}
  435. }
  436. }
  437. }