predictor.rs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. use std::cmp::{max, min};
  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 rust_decimal::prelude::*;
  8. use rust_decimal_macros::dec;
  9. use tokio::sync::{Mutex};
  10. use tracing::{info};
  11. use global::cci::CentralControlInfo;
  12. use global::fixed_time_range_deque::FixedTimeRangeDeque;
  13. use global::params::Params;
  14. use standard::{Depth, Record, Ticker, Trade};
  15. use crate::utils;
  16. #[derive(Debug, Clone)]
  17. pub struct Predictor {
  18. pub depth_vec: Vec<Depth>, // 深度队列
  19. pub volume_vec: Vec<Decimal>, // 交易量队列
  20. pub trade_long_vec: FixedTimeRangeDeque<Trade>, // 交易队列
  21. pub trade_short_vec: FixedTimeRangeDeque<Trade>, // 交易队列
  22. pub trade_fixed_vec: Vec<Trade>, // 交易队列(观察持仓后的资金流)
  23. pub spread_vec: Vec<Decimal>, // 价差队列
  24. pub record_vec: VecDeque<Record>, // 蜡烛队列
  25. pub mid_price: Decimal, // 中间价
  26. pub ask_price: Decimal, // 卖一价
  27. pub bid_price: Decimal, // 买一价
  28. pub last_price: Decimal, // 最后成交价
  29. pub trades_volume_short: Decimal, // 过去10秒的成交量总和
  30. pub trades_volume_short_ema: Decimal, // 过去10秒的成交量总和的ema
  31. pub spread: Decimal, // 当前价差
  32. pub spread_ema_1000: Decimal, // 价差的ema,1000级别
  33. pub optimal_ask_price: Decimal, // 卖出挂单价
  34. pub optimal_bid_price: Decimal, // 买入挂单价
  35. pub profit_point: Decimal, // 利润点数
  36. pub profit_point_ema: Decimal, // 利润点数的ema
  37. pub profit_point_vec: Vec<Decimal>, // 利润队列
  38. pub inventory: Decimal, // 库存,也就是q
  39. pub pos_amount: Decimal, // 原始持仓量
  40. pub pos_avg_price: Decimal, // 原始持仓价格
  41. pub level: Decimal, // martin
  42. pub money_flow: Decimal, // 资金流
  43. pub ask_delta: Decimal, // δa
  44. pub bid_delta: Decimal, // δb
  45. pub mid_price_time_vec: FixedTimeRangeDeque<Decimal>, // 中间价格队列,
  46. pub fair_price_time_vec: FixedTimeRangeDeque<Decimal>, // 公平价格队列,
  47. pub fair_price_long_time_vec: FixedTimeRangeDeque<Decimal>, //
  48. pub fair_price_vec: Vec<Decimal>, // 公平价格列表,0表示做市所,1表示参考所
  49. pub fair_price: Decimal, // 公平价格
  50. pub fair_price_ema_short: Decimal, // 公平价格_ema
  51. pub fair_price_ema_long: Decimal, // 公平价格_ema
  52. pub fair_rate_focus_open: Decimal, // 变化幅度焦点
  53. pub mid_price_focus_open: Decimal, // 观测焦点时的价格
  54. pub fair_rate_focus_close: Decimal, // 变化幅度焦点
  55. pub fair_price_focus_close: Decimal, // 观测焦点时的价格
  56. pub fair_price_when_ordering: Decimal, // 下单时的公平价格
  57. pub price_times_avg: Decimal, // 公平所与做市所的价格倍率的平均值
  58. pub is_ready: bool, // 是否已准备好
  59. pub prev_trade_time: i64, // 上次交易时间,也就是t
  60. pub t_diff: Decimal, // (T-t)
  61. pub last_update_time: Decimal, // 最后更新时间(depth)
  62. pub last_index: Decimal, // 最后更新的index
  63. pub prev_insert_time: Decimal,
  64. pub prev_save_time: Decimal,
  65. pub init_time: Decimal,
  66. pub params: Params,
  67. pub debug_sender: UnboundedSender<Vec<Decimal>>
  68. }
  69. impl Predictor {
  70. // 时间窗口大小(微秒)
  71. // const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
  72. const TIME_DIFF_RANGE_MICROS: i64 = 15 * 60_000_000;
  73. const TRADE_LONG_RANGE_MICROS: i64 = 60_000_000;
  74. // const SPREAD_RANGE_MICROS: i64 = 15 * 60_000_000;
  75. const TRADE_SHORT_RANGE_MICROS: i64 = 2 * 60_000_000;
  76. // const ONE_MILLION: Decimal = dec!(1_000_000);
  77. // const TWENTY_THOUSAND: Decimal = dec!(20_000);
  78. const DONT_VIEW: Decimal = dec!(14142135623730951);
  79. pub fn new(_cci_arc: Arc<Mutex<CentralControlInfo>>, params: Params) -> Self {
  80. // 创建数据通道
  81. // 创建一个无界通道
  82. let (tx, mut rx) = futures_channel::mpsc::unbounded::<Vec<Decimal>>();
  83. let account_port = params.port.clone();
  84. tokio::spawn(async move {
  85. let len = 16usize;
  86. let mut prev_save_time = Decimal::from(Utc::now().timestamp_millis());
  87. let mut debugs: Vec<VecDeque<Option<Decimal>>> = vec![VecDeque::new(); len];
  88. while let Some(value) = rx.next().await {
  89. // 数据填充到对应位置
  90. for i in 0..len {
  91. if value[i] == Self::DONT_VIEW {
  92. debugs[i].push_back(None);
  93. } else {
  94. debugs[i].push_back(Some(value[i]));
  95. }
  96. }
  97. // 长度限制
  98. if debugs[0].len() > 500_000 {
  99. for i in 0..len {
  100. debugs[i].pop_front(); // 从前面移除元素
  101. }
  102. }
  103. let now = Decimal::from(Utc::now().timestamp_millis());
  104. if now - prev_save_time < dec!(60000) {
  105. continue;
  106. }
  107. let debugs_clone = debugs.clone();
  108. let temp_html_str = tokio::task::spawn_blocking(move || {
  109. utils::build_html_file(&debugs_clone)
  110. }).await.unwrap();
  111. let path = format!("./db/{}.html", account_port);
  112. utils::write_to_file(&temp_html_str, path).await;
  113. prev_save_time = Decimal::from(Utc::now().timestamp_millis());
  114. }
  115. });
  116. let predictor = Self {
  117. // 接针版本
  118. depth_vec: vec![Depth::new(); 10],
  119. fair_price_vec: vec![Decimal::ZERO; 10],
  120. volume_vec: vec![Decimal::ZERO; 10],
  121. // 老的队列
  122. spread_vec: vec![],
  123. trade_long_vec: FixedTimeRangeDeque::new(Self::TRADE_LONG_RANGE_MICROS),
  124. trade_short_vec: FixedTimeRangeDeque::new(Self::TRADE_SHORT_RANGE_MICROS),
  125. trade_fixed_vec: vec![],
  126. profit_point_vec: vec![],
  127. record_vec: VecDeque::new(),
  128. mid_price: Default::default(),
  129. ask_price: Default::default(),
  130. bid_price: Default::default(),
  131. last_price: Default::default(),
  132. trades_volume_short: Default::default(),
  133. trades_volume_short_ema: Default::default(),
  134. spread: Default::default(),
  135. spread_ema_1000: Default::default(),
  136. optimal_ask_price: Default::default(),
  137. optimal_bid_price: Default::default(),
  138. inventory: Default::default(),
  139. ask_delta: Default::default(),
  140. bid_delta: Default::default(),
  141. fair_price_time_vec: FixedTimeRangeDeque::new((params.second_observation_time.to_f64().unwrap() * 1_000_000f64).to_i64().unwrap()),
  142. fair_price_long_time_vec: FixedTimeRangeDeque::new(5 * 60_000_000),
  143. mid_price_time_vec: FixedTimeRangeDeque::new(100_000),
  144. fair_price: Default::default(),
  145. fair_price_ema_short: Default::default(),
  146. fair_price_ema_long: Default::default(),
  147. fair_rate_focus_open: Default::default(),
  148. mid_price_focus_open: Default::default(),
  149. fair_rate_focus_close: Default::default(),
  150. fair_price_focus_close: Default::default(),
  151. fair_price_when_ordering: Default::default(),
  152. price_times_avg: Default::default(),
  153. is_ready: false,
  154. prev_trade_time: Utc::now().timestamp_micros(),
  155. t_diff: Default::default(),
  156. level: Default::default(),
  157. pos_amount: Default::default(),
  158. money_flow: Default::default(),
  159. profit_point: Default::default(),
  160. profit_point_ema: Default::default(),
  161. last_update_time: Default::default(),
  162. last_index: Default::default(),
  163. pos_avg_price: Default::default(),
  164. prev_insert_time: Default::default(),
  165. prev_save_time: Decimal::from(Utc::now().timestamp_millis()),
  166. init_time: Decimal::from(Utc::now().timestamp_millis()),
  167. params,
  168. debug_sender: tx,
  169. };
  170. predictor
  171. }
  172. pub async fn on_depth(&mut self, depth: &Depth, index: usize) {
  173. self.last_update_time = depth.time;
  174. self.last_index = Decimal::from(index);
  175. if index == 0 {
  176. self.ask_price = depth.asks[0].price;
  177. self.bid_price = depth.bids[0].price;
  178. self.mid_price = (self.ask_price + self.bid_price) / Decimal::TWO;
  179. self.mid_price_time_vec.push_back(self.mid_price);
  180. if !self.inventory.is_zero() {
  181. let mut profit_now = if self.inventory > Decimal::ZERO {
  182. (self.mid_price - self.pos_avg_price) / self.pos_avg_price
  183. } else {
  184. (self.pos_avg_price - self.mid_price) / self.pos_avg_price
  185. };
  186. profit_now -= dec!(0.001);
  187. profit_now.rescale(8);
  188. self.profit_point_vec.push(profit_now);
  189. // let total: Decimal = self.profit_fixed_vec.iter().sum();
  190. self.profit_point = profit_now;
  191. self.profit_point_ema = self.profit_point_ema * dec!(0.99) + self.profit_point * dec!(0.01);
  192. }
  193. }
  194. self.update_fair_price(depth, index).await;
  195. self.update_spread();
  196. self.depth_vec[index] = depth.clone();
  197. if self.mid_price.is_zero() {
  198. return;
  199. }
  200. self.processor().await;
  201. }
  202. pub async fn on_trade(&mut self, trade: &Trade, _index: usize) {
  203. self.trade_long_vec.push_back(trade.clone());
  204. self.trade_short_vec.push_back(trade.clone());
  205. if !self.inventory.is_zero() {
  206. self.trade_fixed_vec.push(trade.clone());
  207. if self.trade_fixed_vec.len() > 100 {
  208. let (bought_sum, sold_sum): (Decimal, Decimal) = self.trade_fixed_vec.iter()
  209. .fold((Decimal::ZERO, Decimal::ZERO), |(buy_sum, sell_sum), item| {
  210. if item.size > Decimal::ZERO {
  211. (buy_sum + item.value.abs(), sell_sum)
  212. } else if item.size < Decimal::ZERO {
  213. (buy_sum, sell_sum + item.value.abs())
  214. } else {
  215. (buy_sum, sell_sum)
  216. }
  217. });
  218. self.money_flow = (bought_sum - sold_sum) / (bought_sum + sold_sum);
  219. self.money_flow.rescale(4);
  220. }
  221. }
  222. self.last_price = trade.price;
  223. // self.processor().await;
  224. }
  225. pub async fn update_level(&mut self) {
  226. self.level = (Decimal::NEGATIVE_ONE + (Decimal::ONE + dec!(8) * self.inventory.abs()).sqrt().unwrap()) / Decimal::TWO;
  227. self.level = min(self.level, dec!(6));
  228. }
  229. pub async fn on_ticker(&mut self, _ticker: &Ticker) {}
  230. pub async fn on_record(&mut self, _record: &Record) {}
  231. pub async fn on_inventory(&mut self, pos_amount: &Decimal, pos_avg_price: &Decimal, min_amount_value: &Decimal) {
  232. if self.mid_price.is_zero() {
  233. return;
  234. }
  235. let prev_inventory = self.inventory;
  236. self.pos_amount = pos_amount.clone();
  237. self.pos_avg_price = pos_avg_price.clone();
  238. self.inventory = (pos_amount / (min_amount_value / self.mid_price)).trunc();
  239. // 小于1但不为0的情况,需要平完
  240. if self.inventory.is_zero() && !pos_amount.is_zero() {
  241. self.inventory = if pos_amount > &Decimal::ZERO {
  242. Decimal::ONE
  243. } else {
  244. Decimal::NEGATIVE_ONE
  245. };
  246. }
  247. if prev_inventory != self.inventory && prev_inventory.is_zero() {
  248. self.prev_trade_time = Utc::now().timestamp_micros();
  249. }
  250. // 重置fair数据,用于重新计算幅度
  251. if prev_inventory != self.inventory {
  252. self.fair_price_time_vec.deque.clear();
  253. }
  254. // 重置资金流计算
  255. if prev_inventory != self.inventory && self.inventory.is_zero() {
  256. self.trade_fixed_vec.clear();
  257. self.profit_point_vec.clear();
  258. self.profit_point = Decimal::ZERO;
  259. self.profit_point_ema = Decimal::ZERO;
  260. self.money_flow = Decimal::ZERO;
  261. }
  262. self.update_level().await;
  263. self.processor().await;
  264. }
  265. pub fn get_real_rate(price_vec: &FixedTimeRangeDeque<Decimal>) -> Decimal {
  266. let last_fair_price = price_vec.deque.iter().last().unwrap();
  267. let min_price = price_vec.deque.iter().min().unwrap();
  268. let max_price = price_vec.deque.iter().max().unwrap();
  269. let up_rate = (last_fair_price - min_price) / min_price;
  270. let down_rate = (max_price - last_fair_price) / max_price;
  271. if up_rate > down_rate {
  272. up_rate
  273. } else {
  274. -down_rate
  275. }
  276. }
  277. pub async fn update_fair_price(&mut self, depth: &Depth, index: usize) {
  278. if self.mid_price.is_zero() {
  279. return;
  280. }
  281. let a1 = &depth.asks[0];
  282. let b1 = &depth.bids[0];
  283. // https://quant.stackexchange.com/questions/50651/how-to-understand-micro-price-aka-weighted-mid-price
  284. let total = a1.value + b1.value;
  285. let fair_price = a1.price * b1.value / total + b1.price * a1.value / total;
  286. // let fair_price = (a1.price + b1.price) / Decimal::TWO;
  287. self.fair_price_vec[index] = if self.fair_price_vec[index].is_zero() {
  288. fair_price
  289. } else {
  290. self.fair_price_vec[index] * dec!(0.5) + fair_price * dec!(0.5)
  291. };
  292. self.fair_price_vec[index].rescale(self.mid_price.scale());
  293. self.volume_vec[index] = a1.size + b1.size;
  294. // 合成公平价格
  295. if !self.fair_price_vec[0].is_zero() && !self.fair_price_vec[1].is_zero() {
  296. self.price_times_avg = if self.price_times_avg.is_zero() {
  297. self.fair_price_vec[1] / self.fair_price_vec[0]
  298. } else {
  299. self.price_times_avg * dec!(0.9995) + dec!(0.0005) * self.fair_price_vec[1] / self.fair_price_vec[0]
  300. };
  301. // 进行价格归一化处理,公平所的价格有可能是带前缀的
  302. // let fair_price_part0 = self.fair_price_vec[0] * dec!(0.2);
  303. // let fair_price_part1 = (self.fair_price_vec[1] / self.price_times_avg) * dec!(0.8);
  304. self.fair_price = self.fair_price_vec[1] / self.price_times_avg;
  305. self.fair_price_time_vec.push_back(self.fair_price);
  306. self.fair_price_long_time_vec.push_back(self.fair_price);
  307. self.fair_price_ema_long = if self.fair_price_ema_long.is_zero() {
  308. self.fair_price
  309. } else {
  310. self.fair_price_ema_long * dec!(0.67) + self.fair_price * dec!(0.33)
  311. };
  312. self.fair_price_ema_short = if self.fair_price_ema_short.is_zero() {
  313. self.fair_price
  314. } else {
  315. self.fair_price_ema_short * dec!(0.999) + self.fair_price * dec!(0.001)
  316. };
  317. if self.fair_price_time_vec.len() < 2 {
  318. return;
  319. }
  320. let mut rate = Self::get_real_rate(&self.fair_price_time_vec);
  321. let mut long_rate = Self::get_real_rate(&self.fair_price_long_time_vec);
  322. rate.rescale(8);
  323. long_rate.rescale(8);
  324. // 重置开仓焦点,条件1
  325. if !self.fair_rate_focus_open.is_zero() {
  326. if self.fair_rate_focus_open > Decimal::ZERO && self.spread_ema_1000 < Decimal::ZERO {
  327. self.fair_rate_focus_open = Decimal::ZERO;
  328. }
  329. if self.fair_rate_focus_open < Decimal::ZERO && self.spread_ema_1000 > Decimal::ZERO {
  330. self.fair_rate_focus_open = Decimal::ZERO;
  331. }
  332. }
  333. // 重置开仓焦点,条件2
  334. if !self.fair_rate_focus_open.is_zero() && !self.inventory.is_zero() {
  335. self.fair_rate_focus_open = Decimal::ZERO;
  336. }
  337. // 重置开仓焦点,条件3
  338. if !self.mid_price_focus_open.is_zero() {
  339. let focus_rate = (self.mid_price - self.mid_price_focus_open) / self.mid_price_focus_open;
  340. if self.fair_rate_focus_open > Decimal::ZERO && focus_rate < Decimal::NEGATIVE_ONE * self.params.open_activate / Decimal::TWO {
  341. self.fair_rate_focus_open = Decimal::ZERO;
  342. }
  343. if self.fair_rate_focus_open < Decimal::ZERO && focus_rate > self.params.open_activate / Decimal::TWO {
  344. self.fair_rate_focus_open = Decimal::ZERO;
  345. }
  346. }
  347. // 更新程序关注的开仓焦点
  348. if self.fair_rate_focus_open.is_zero() && self.inventory.is_zero() {
  349. // 只有有强度的rate才有资格被称为针
  350. if rate.abs() > self.params.open_activate {
  351. // 向上涨,并且fair下穿mid,视为观测阶段开始
  352. if rate > Decimal::ZERO {
  353. self.fair_rate_focus_open = rate;
  354. self.mid_price_focus_open = self.mid_price;
  355. }
  356. // 向下跌,并且fair上穿mid,视为观测阶段开始
  357. if rate < Decimal::ZERO {
  358. self.fair_rate_focus_open = rate;
  359. self.mid_price_focus_open = self.mid_price;
  360. }
  361. }
  362. }
  363. // ============================ 平仓逻辑处理 =======================
  364. // close_rate:
  365. // 大于0:当前价格在均线之上
  366. // 小于0:当前价格在均线之下
  367. let close_rate = rate.clone();
  368. // 重置平仓焦点,条件1
  369. if !self.fair_rate_focus_close.is_zero() && self.inventory.is_zero() {
  370. self.fair_rate_focus_close = Decimal::ZERO;
  371. }
  372. // 重置平仓焦点,条件2
  373. if !self.fair_rate_focus_close.is_zero() && self.fair_rate_focus_close > dec!(-0.1) {
  374. let focus_rate = (self.mid_price - self.fair_price_focus_close) / self.fair_price_focus_close;
  375. if self.fair_rate_focus_close > Decimal::ZERO && focus_rate < Decimal::NEGATIVE_ONE * self.params.close_activate / Decimal::TWO {
  376. self.fair_rate_focus_close = Decimal::ZERO;
  377. }
  378. if self.fair_rate_focus_close < Decimal::ZERO && focus_rate > self.params.close_activate / Decimal::TWO {
  379. self.fair_rate_focus_close = Decimal::ZERO;
  380. }
  381. }
  382. // 更新程序关注的平仓焦点
  383. let close_activate = self.params.open_activate / Decimal::TWO;
  384. if self.fair_rate_focus_close.is_zero() && !self.inventory.is_zero() && close_rate.abs() > close_activate {
  385. // 多单平仓逻辑
  386. if self.inventory > Decimal::ZERO && close_rate > Decimal::ZERO {
  387. // 是否强干扰平仓
  388. let target_price = if self.params.is_strong_interfere {
  389. self.pos_avg_price + self.params.open_activate * self.mid_price * self.t_diff
  390. } else {
  391. self.pos_avg_price
  392. };
  393. if self.mid_price > target_price {
  394. self.fair_rate_focus_close = close_rate;
  395. self.fair_price_focus_close = self.mid_price;
  396. } else if self.t_diff.is_zero() {
  397. self.fair_rate_focus_close = close_rate;
  398. self.fair_price_focus_close = self.mid_price;
  399. }
  400. }
  401. // 空单平仓逻辑
  402. if self.inventory < Decimal::ZERO && close_rate < Decimal::ZERO {
  403. // 是否强干扰平仓
  404. let target_price = if self.params.is_strong_interfere {
  405. self.pos_avg_price - self.params.open_activate * self.mid_price * self.t_diff
  406. } else {
  407. self.pos_avg_price
  408. };
  409. if self.mid_price < target_price {
  410. self.fair_rate_focus_close = close_rate;
  411. self.fair_price_focus_close = self.fair_price;
  412. } else if self.t_diff.is_zero() {
  413. self.fair_rate_focus_close = close_rate;
  414. self.fair_price_focus_close = self.fair_price;
  415. }
  416. }
  417. }
  418. // ============================ 止损逻辑处理1 =======================
  419. if self.fair_rate_focus_close.is_zero() && !self.inventory.is_zero() && self.profit_point < dec!(-0.01) {
  420. self.fair_rate_focus_close = dec!(-0.11);
  421. self.fair_price_focus_close = self.mid_price;
  422. // let prev_open_activate = self.params.open_activate;
  423. // self.params.open_activate = self.params.open_activate * dec!(1.5);
  424. info!("----------------------------------------");
  425. // info!("止损,参数调整:{} -> {}", prev_open_activate, self.params.open_activate);
  426. info!("硬止损, 在价格{}处,成本价{},价值={}, p={}。", self.fair_price_focus_close, self.pos_avg_price, self.pos_avg_price*self.pos_amount, self.profit_point);
  427. info!("----------------------------------------");
  428. }
  429. // ============================ 止损逻辑处理2 =======================
  430. if self.fair_rate_focus_close.is_zero() && !self.inventory.is_zero() && self.profit_point_vec.len() > 1 {
  431. let prev_profit_point = self.profit_point_vec[self.profit_point_vec.len() - 2];
  432. let profit_point = self.profit_point_vec[self.profit_point_vec.len() - 1];
  433. if (prev_profit_point >= Decimal::ZERO && profit_point < Decimal::ZERO) || (prev_profit_point > Decimal::ZERO && profit_point <= Decimal::ZERO) {
  434. self.fair_rate_focus_close = dec!(-0.12);
  435. self.fair_price_focus_close = self.mid_price;
  436. info!("----------------------------------------");
  437. info!("止损逻辑2, 在价格{}处,成本价{},价值={}, p={}。", self.fair_price_focus_close, self.pos_avg_price, self.pos_avg_price*self.pos_amount, self.profit_point);
  438. info!("----------------------------------------");
  439. }
  440. }
  441. }
  442. // // 判断价格是否回归
  443. // if !self.is_regressed && self.inventory > Decimal::ZERO && self.spread_sma_1000 < max(self.spread_sma, self.spread_sma_2000) {
  444. // self.is_regressed = true
  445. // } else if !self.is_regressed && self.inventory < Decimal::ZERO && self.spread_sma_1000 > min(self.spread_sma, self.spread_sma_2000) {
  446. // self.is_regressed = true
  447. // }
  448. }
  449. pub fn update_spread(&mut self) {
  450. if self.mid_price.is_zero() || self.fair_price.is_zero() {
  451. return;
  452. }
  453. self.spread = (self.fair_price - self.mid_price) / self.mid_price;
  454. // self.spread.rescale(8);
  455. self.spread_vec.push(self.spread);
  456. self.spread_ema_1000 = if self.spread_ema_1000.is_zero() {
  457. self.spread
  458. } else {
  459. self.spread_ema_1000 * dec!(0.999) + self.spread * dec!(0.001)
  460. };
  461. // self.spread_sma_1000.rescale(8);
  462. // self.spread_sma_1000_time_vec.push_back(self.spread_ema_1000);
  463. while self.spread_vec.len() > 1_000 {
  464. self.spread_vec.remove(0);
  465. }
  466. }
  467. pub fn update_delta(&mut self) {
  468. // -2表示不想成交
  469. // -1表示市价成交(委托对手盘的价格,但不一定能市价成交),这里再想想吧,经常委托出去没成交,明显比别人慢了
  470. // 0是买一/卖一成交
  471. if self.fair_price.is_zero() {
  472. return;
  473. }
  474. // 可能是趋势
  475. // let is_open_long = self.spread_sma_1000 - self.spread_sma > self.params.open && self.fair_price > self.mid_price;
  476. // let is_open_short = self.spread_sma_1000 - self.spread_sma < self.params.open * Decimal::NEGATIVE_ONE && self.fair_price < self.mid_price;
  477. // 可能是接针
  478. let is_open_long = self.fair_rate_focus_open < Decimal::ZERO && self.fair_price > self.mid_price;
  479. let is_open_short = self.fair_rate_focus_open > Decimal::ZERO && self.fair_price < self.mid_price;
  480. let is_close_long = self.inventory > Decimal::ZERO && (self.fair_rate_focus_close > Decimal::ZERO || self.fair_rate_focus_close < dec!(-0.1));
  481. let is_close_short = self.inventory < Decimal::ZERO && (self.fair_rate_focus_close < Decimal::ZERO || self.fair_rate_focus_close < dec!(-0.1));
  482. self.bid_delta = dec!(-2);
  483. self.ask_delta = dec!(-2);
  484. if is_close_long {
  485. // let close_rate = (self.error_rate / dec!(0.5)) * self.params.close;
  486. //
  487. // self.ask_delta = self.mid_price * close_rate;
  488. self.ask_delta = self.mid_price * self.params.close;
  489. } else if is_close_short {
  490. // let close_rate = (self.error_rate / dec!(0.5)) * self.params.close;
  491. //
  492. // self.bid_delta = self.mid_price * close_rate;
  493. self.bid_delta = self.mid_price * self.params.close;
  494. } else if is_open_long {
  495. // let is_open_long_market = self.spread_sma_1000 - self.spread_sma > self.params.open_market;
  496. // self.bid_delta = if is_open_long_market {
  497. // dec!(-1)
  498. // } else {
  499. // dec!(0)
  500. // };
  501. self.bid_delta = self.params.open * self.mid_price;
  502. } else if is_open_short {
  503. // let is_open_short_market = self.spread_sma_1000 - self.spread_sma < self.params.open_market * Decimal::NEGATIVE_ONE;
  504. // self.ask_delta = if is_open_short_market {
  505. // dec!(-1)
  506. // } else {
  507. // dec!(0)
  508. // }
  509. self.ask_delta = self.params.open * self.mid_price;
  510. }
  511. }
  512. pub fn update_optimal_ask_and_bid(&mut self) {
  513. self.optimal_ask_price = if self.ask_delta == dec!(-1) {
  514. self.bid_price
  515. } else if self.ask_delta == dec!(-2) {
  516. Self::DONT_VIEW
  517. } else {
  518. max(self.ask_price + self.ask_delta, self.bid_price)
  519. };
  520. self.optimal_bid_price = if self.bid_delta == dec!(-1) {
  521. self.ask_price
  522. } else if self.bid_delta == dec!(-2) {
  523. Self::DONT_VIEW
  524. } else {
  525. min(self.bid_price - self.bid_delta, self.ask_price)
  526. };
  527. self.optimal_ask_price.rescale(self.mid_price.scale());
  528. self.optimal_bid_price.rescale(self.mid_price.scale());
  529. }
  530. pub fn update_t_diff(&mut self) {
  531. if self.prev_trade_time > 0 {
  532. let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
  533. self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::TIME_DIFF_RANGE_MICROS).unwrap(), Decimal::ZERO);
  534. } else {
  535. self.t_diff = Decimal::ONE;
  536. }
  537. }
  538. pub fn check_ready(&mut self) {
  539. if self.is_ready {
  540. return;
  541. }
  542. if self.mid_price == Decimal::ZERO {
  543. return;
  544. }
  545. if self.fair_price == Decimal::ZERO {
  546. return;
  547. }
  548. if self.ask_price == Decimal::ZERO {
  549. return;
  550. }
  551. if self.bid_price == Decimal::ZERO {
  552. return;
  553. }
  554. if self.trade_long_vec.len() < 100 {
  555. return;
  556. }
  557. self.is_ready = true;
  558. info!("========================================行情数据预热完毕==================================")
  559. }
  560. // #[instrument(skip(self), level="TRACE")]
  561. async fn processor(&mut self) {
  562. self.check_ready();
  563. if !self.is_ready {
  564. return;
  565. }
  566. self.trades_volume_short = self.trade_short_vec.deque.iter().map(|item| item.value).sum();
  567. self.trades_volume_short_ema = if self.trades_volume_short_ema.is_zero() {
  568. self.trades_volume_short
  569. } else {
  570. self.trades_volume_short_ema * dec!(0.9995) + self.trades_volume_short * dec!(0.0005)
  571. };
  572. self.update_t_diff();
  573. self.update_delta();
  574. self.update_optimal_ask_and_bid();
  575. // let mut smm = Decimal::ZERO;
  576. // if !self.depth_vec[1].time.is_zero() {
  577. // let sma = self.depth_vec[1].asks[0].price;
  578. // let smb = self.depth_vec[1].bids[0].price;
  579. // smm = (sma + smb) / Decimal::TWO;
  580. // }
  581. // let cci_arc = self.cci_arc.clone();
  582. let now = Decimal::from_i64(Utc::now().timestamp_millis()).unwrap();
  583. let mid_price = self.mid_price;
  584. let ask_price = self.ask_price;
  585. let bid_price = self.bid_price;
  586. let last_price = self.last_price;
  587. let fair_price = self.fair_price;
  588. let spread = self.profit_point;
  589. let spread_max = self.profit_point_ema;
  590. let spread_min = Self::DONT_VIEW;
  591. // let spread = self.price_times_avg;
  592. // let spread_max = self.fair_price_vec[1] / self.fair_price_vec[0];
  593. // let spread_min = self.fair_price / self.mid_price;
  594. let optimal_ask_price = self.optimal_ask_price;
  595. let optimal_bid_price = self.optimal_bid_price;
  596. let inventory = self.inventory;
  597. let sigma_square = Self::get_real_rate(&self.fair_price_long_time_vec);
  598. // let sigma_square = self.error_rate;
  599. let gamma = self.fair_rate_focus_open;
  600. let kappa = self.fair_rate_focus_close;
  601. let flow_ratio = Decimal::ZERO;
  602. let need_append = now - self.prev_insert_time > Decimal::ONE_HUNDRED;
  603. if !need_append {
  604. return;
  605. }
  606. self.debug_sender.unbounded_send(vec![
  607. now,
  608. mid_price,
  609. ask_price,
  610. bid_price,
  611. last_price,
  612. spread,
  613. spread_max,
  614. spread_min,
  615. optimal_ask_price,
  616. optimal_bid_price,
  617. inventory,
  618. sigma_square,
  619. gamma,
  620. kappa,
  621. flow_ratio,
  622. fair_price
  623. ]).unwrap();
  624. self.prev_insert_time = Decimal::from(Utc::now().timestamp_millis())
  625. }
  626. // #[instrument(skip(self, ref_ticker_map), level="TRACE")]
  627. pub fn get_ref_price(&mut self, _ref_ticker_map: &BTreeMap<String, Ticker>) -> Vec<Vec<Decimal>> {
  628. vec![]
  629. }
  630. }