|
|
@@ -4,10 +4,12 @@ use std::sync::Arc;
|
|
|
use chrono::{Utc};
|
|
|
use futures_channel::mpsc::UnboundedSender;
|
|
|
use futures_util::StreamExt;
|
|
|
+use reqwest::Client;
|
|
|
use rust_decimal::prelude::*;
|
|
|
use rust_decimal_macros::dec;
|
|
|
+use serde_json::{json, Value};
|
|
|
use tokio::sync::{Mutex};
|
|
|
-use tracing::{info};
|
|
|
+use tracing::{error, info};
|
|
|
use global::cci::CentralControlInfo;
|
|
|
use global::fixed_time_range_deque::FixedTimeRangeDeque;
|
|
|
use global::params::Params;
|
|
|
@@ -430,7 +432,7 @@ impl Predictor {
|
|
|
pub fn update_spread(&mut self) {
|
|
|
}
|
|
|
|
|
|
- pub fn update_delta(&mut self) {
|
|
|
+ pub async fn update_delta(&mut self) {
|
|
|
if self.fair_price.is_zero() {
|
|
|
return;
|
|
|
}
|
|
|
@@ -439,11 +441,12 @@ impl Predictor {
|
|
|
// 根据马尔科夫链调整挂单策略
|
|
|
let now = Decimal::from(Utc::now().timestamp_millis());
|
|
|
if now - self.prev_flush_state_time > dec!(60_000) {
|
|
|
- self.state_matrix = vec![
|
|
|
- vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
- vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
- vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
- ];
|
|
|
+ // self.state_matrix = vec![
|
|
|
+ // vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ // vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ // vec![dec!(0.33), dec!(0.33), dec!(0.33)],
|
|
|
+ // ];
|
|
|
+ self.update_state_matrix().await;
|
|
|
|
|
|
self.state = 0usize;
|
|
|
let profit_list = vec![dec!(0.33), dec!(0.33), dec!(0.33)];
|
|
|
@@ -491,10 +494,12 @@ impl Predictor {
|
|
|
let is_open_long = self.force_order_value < -self.params.open
|
|
|
&& (self.mid_price < self.prev_trade_price * dec!(0.999) || self.prev_trade_price.is_zero())
|
|
|
&& self.inventory < self.params.grid
|
|
|
+ && false
|
|
|
&& self.bid_delta == dec!(-2);
|
|
|
let is_open_short = self.force_order_value > self.params.open
|
|
|
&& (self.mid_price > self.prev_trade_price * dec!(1.001) || self.prev_trade_price.is_zero())
|
|
|
&& self.inventory > -self.params.grid
|
|
|
+ && false
|
|
|
&& self.ask_delta == dec!(-2);
|
|
|
|
|
|
if is_open_long {
|
|
|
@@ -567,7 +572,7 @@ impl Predictor {
|
|
|
}
|
|
|
|
|
|
self.update_t_diff();
|
|
|
- self.update_delta();
|
|
|
+ self.update_delta().await;
|
|
|
self.update_optimal_ask_and_bid();
|
|
|
|
|
|
// let mut smm = Decimal::ZERO;
|
|
|
@@ -634,4 +639,42 @@ impl Predictor {
|
|
|
pub fn get_ref_price(&mut self, _ref_ticker_map: &BTreeMap<String, Ticker>) -> Vec<Vec<Decimal>> {
|
|
|
vec![]
|
|
|
}
|
|
|
+
|
|
|
+ pub async fn update_state_matrix(&mut self) {
|
|
|
+ let url = "http://mms.skyfffire.com:9000/getStateData";
|
|
|
+ let symbol = self.params.ref_pair[0].to_lowercase();
|
|
|
+ let params = json!({
|
|
|
+ "symbol": symbol,
|
|
|
+ });
|
|
|
+
|
|
|
+ // 创建 HTTP 客户端
|
|
|
+ let client = Client::new();
|
|
|
+
|
|
|
+ // 发送 GET 请求
|
|
|
+ let response = client.get(url)
|
|
|
+ .query(¶ms)
|
|
|
+ .send()
|
|
|
+ .await.unwrap();
|
|
|
+
|
|
|
+ // 错误处理
|
|
|
+ if response.status().is_success() {
|
|
|
+ let response_text = response.text().await.unwrap();
|
|
|
+ let parsed: Value = serde_json::from_str(response_text.as_str()).unwrap();
|
|
|
+
|
|
|
+ self.state_matrix = parsed["state_matrix"]
|
|
|
+ .as_array()
|
|
|
+ .unwrap()
|
|
|
+ .iter()
|
|
|
+ .map(|row| {
|
|
|
+ row.as_array()
|
|
|
+ .unwrap()
|
|
|
+ .iter()
|
|
|
+ .map(|v| Decimal::from_str(v.as_str().unwrap()).unwrap())
|
|
|
+ .collect()
|
|
|
+ })
|
|
|
+ .collect();
|
|
|
+ } else {
|
|
|
+ error!("状态转移链挂了:{}", response.status());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|