|
@@ -3,10 +3,12 @@ use std::sync::Arc;
|
|
|
use chrono::{Utc};
|
|
use chrono::{Utc};
|
|
|
use futures_channel::mpsc::UnboundedSender;
|
|
use futures_channel::mpsc::UnboundedSender;
|
|
|
use futures_util::StreamExt;
|
|
use futures_util::StreamExt;
|
|
|
|
|
+use reqwest::Client;
|
|
|
use rust_decimal::prelude::*;
|
|
use rust_decimal::prelude::*;
|
|
|
use rust_decimal_macros::dec;
|
|
use rust_decimal_macros::dec;
|
|
|
|
|
+use serde_json::{json, Value};
|
|
|
use tokio::sync::{Mutex};
|
|
use tokio::sync::{Mutex};
|
|
|
-use tracing::{info};
|
|
|
|
|
|
|
+use tracing::{error, info};
|
|
|
use global::cci::CentralControlInfo;
|
|
use global::cci::CentralControlInfo;
|
|
|
use global::fixed_time_range_deque::FixedTimeRangeDeque;
|
|
use global::fixed_time_range_deque::FixedTimeRangeDeque;
|
|
|
use global::params::Params;
|
|
use global::params::Params;
|
|
@@ -31,6 +33,7 @@ pub struct Predictor {
|
|
|
pub pos_amount: Decimal, // 原始持仓量
|
|
pub pos_amount: Decimal, // 原始持仓量
|
|
|
pub pos_avg_price: Decimal, // 原始持仓价格
|
|
pub pos_avg_price: Decimal, // 原始持仓价格
|
|
|
pub balance: Decimal, // 初始余额
|
|
pub balance: Decimal, // 初始余额
|
|
|
|
|
+ pub prev_balance: Decimal,
|
|
|
|
|
|
|
|
pub signal: Decimal, // 大于0代表此时是正向信号,小于0则相反
|
|
pub signal: Decimal, // 大于0代表此时是正向信号,小于0则相反
|
|
|
|
|
|
|
@@ -49,6 +52,7 @@ pub struct Predictor {
|
|
|
pub prev_insert_time: Decimal,
|
|
pub prev_insert_time: Decimal,
|
|
|
pub prev_save_time: Decimal,
|
|
pub prev_save_time: Decimal,
|
|
|
pub init_time: Decimal,
|
|
pub init_time: Decimal,
|
|
|
|
|
+ pub prev_update_open_params_time: Decimal,
|
|
|
|
|
|
|
|
pub params: Params,
|
|
pub params: Params,
|
|
|
|
|
|
|
@@ -136,6 +140,7 @@ impl Predictor {
|
|
|
pos_avg_price: Default::default(),
|
|
pos_avg_price: Default::default(),
|
|
|
pos_amount: Default::default(),
|
|
pos_amount: Default::default(),
|
|
|
balance: Default::default(),
|
|
balance: Default::default(),
|
|
|
|
|
+ prev_balance: Default::default(),
|
|
|
|
|
|
|
|
signal: Default::default(),
|
|
signal: Default::default(),
|
|
|
|
|
|
|
@@ -146,6 +151,7 @@ impl Predictor {
|
|
|
prev_save_time: Decimal::from(Utc::now().timestamp_millis()),
|
|
prev_save_time: Decimal::from(Utc::now().timestamp_millis()),
|
|
|
init_time: Decimal::from(Utc::now().timestamp_millis()),
|
|
init_time: Decimal::from(Utc::now().timestamp_millis()),
|
|
|
|
|
|
|
|
|
|
+ prev_update_open_params_time: Default::default(),
|
|
|
params,
|
|
params,
|
|
|
|
|
|
|
|
debug_sender: tx,
|
|
debug_sender: tx,
|
|
@@ -266,11 +272,21 @@ impl Predictor {
|
|
|
self.signal.rescale(0);
|
|
self.signal.rescale(0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- pub fn update_delta(&mut self) {
|
|
|
|
|
|
|
+ pub async fn update_delta(&mut self) {
|
|
|
if self.mid_price.is_zero() {
|
|
if self.mid_price.is_zero() {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ let now = Decimal::from(Utc::now().timestamp_millis());
|
|
|
|
|
+
|
|
|
|
|
+ if now - self.prev_update_open_params_time > dec!(60_000)
|
|
|
|
|
+ || self.prev_balance != self.balance {
|
|
|
|
|
+ self.update_open_params().await;
|
|
|
|
|
+
|
|
|
|
|
+ self.prev_balance = self.balance;
|
|
|
|
|
+ self.prev_update_open_params_time = now;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
for fair_price in &self.fair_price_vec {
|
|
for fair_price in &self.fair_price_vec {
|
|
|
if fair_price.is_zero() {
|
|
if fair_price.is_zero() {
|
|
|
return;
|
|
return;
|
|
@@ -356,7 +372,7 @@ impl Predictor {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- self.update_delta();
|
|
|
|
|
|
|
+ self.update_delta().await;
|
|
|
|
|
|
|
|
// let cci_arc = self.cci_arc.clone();
|
|
// let cci_arc = self.cci_arc.clone();
|
|
|
let now = data_time;
|
|
let now = data_time;
|
|
@@ -418,4 +434,68 @@ impl Predictor {
|
|
|
pub fn get_ref_price(&mut self, _ref_ticker_map: &BTreeMap<String, Ticker>) -> Vec<Vec<Decimal>> {
|
|
pub fn get_ref_price(&mut self, _ref_ticker_map: &BTreeMap<String, Ticker>) -> Vec<Vec<Decimal>> {
|
|
|
vec![]
|
|
vec![]
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ pub async fn update_open_params(&mut self) {
|
|
|
|
|
+ let url = "http://is.skyfffire.com:18888/ia/get_indicator";
|
|
|
|
|
+ let symbol = self.params.pair.to_lowercase();
|
|
|
|
|
+ let exchange = self.params.exchange.to_lowercase();
|
|
|
|
|
+
|
|
|
|
|
+ let params = json!({
|
|
|
|
|
+ "indicator": "msv",
|
|
|
|
|
+ "query": {
|
|
|
|
|
+ "exchange": exchange,
|
|
|
|
|
+ "symbol": symbol,
|
|
|
|
|
+ "minute_time_range": "10",
|
|
|
|
|
+ "mills_back": "37"
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 创建 HTTP 客户端
|
|
|
|
|
+ let client = Client::new();
|
|
|
|
|
+
|
|
|
|
|
+ // 发送 GET 请求
|
|
|
|
|
+ let response = client.post(url)
|
|
|
|
|
+ .json(¶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();
|
|
|
|
|
+ let msv = parsed["data"]["msv"].clone();
|
|
|
|
|
+
|
|
|
|
|
+ let msv_decimals: Vec<Decimal> = msv.as_array()
|
|
|
|
|
+ .unwrap() // 确保 parsed 是一个数组
|
|
|
|
|
+ .iter()
|
|
|
|
|
+ .filter_map(|item| {
|
|
|
|
|
+ // 尝试提取第二个值并转换为 Decimal
|
|
|
|
|
+ if let Some(value) = item.get(1) {
|
|
|
|
|
+ value.as_str().unwrap_or("0").parse::<Decimal>().ok()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ None
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ .collect();
|
|
|
|
|
+
|
|
|
|
|
+ let max_abs_value = msv_decimals.iter()
|
|
|
|
|
+ .map(|&value| value.abs()) // 获取每个数的绝对值
|
|
|
|
|
+ .fold(Decimal::new(0, 0), |a, b| a.max(b)); // 计算最大值
|
|
|
|
|
+
|
|
|
|
|
+ let prev_open = self.params.open.clone();
|
|
|
|
|
+
|
|
|
|
|
+ self.params.open = if max_abs_value.is_zero() {
|
|
|
|
|
+ panic!("十分钟内毫无波动的行情,停机。")
|
|
|
|
|
+ } else {
|
|
|
|
|
+ max_abs_value / Decimal::ONE_HUNDRED
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ if self.params.open != prev_open {
|
|
|
|
|
+ info!("open: {} -> {}", prev_open, self.params.open);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ error!("自动参数挂了:{}", response.status());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|