Bläddra i källkod

新增交易速率

skyffire 1 år sedan
förälder
incheckning
e3f79c44ca
2 ändrade filer med 65 tillägg och 12 borttagningar
  1. 7 1
      README.MD
  2. 58 11
      src/msv.rs

+ 7 - 1
README.MD

@@ -9,7 +9,9 @@
         "exchange": "gate_usdt_swap",       // 交易所,当前支持[gate_usdt_swap, bitget_usdt_swap]
         "symbol": "btc",                    // 符号,支持大小写,如果不写usdt会自动在后面添加_USDT
         "minute_time_range": "240",         // 查询多少分钟的数据
-        "mills_back": "37"                  // 回溯多少毫秒
+        "mills_back": "37",                 // 回溯多少毫秒
+        "trt": "200",                       // 交易速率阈值,Transaction rate thresholds
+        "trt_minutes_back": "10",           // 交易速率回溯时间
     }
 }
 ```
@@ -25,6 +27,10 @@
             ["1715653817313", "0.03", "2"], // [时间戳, 波动幅度, 强度]
             ["1715653817316", "0.02", "7"], // [时间戳, 波动幅度, 强度]
         ],
+        "tr": [                             // 交易速率
+            ["1715653817313", "1"],         // [时间戳, 高速率]
+            ["1715653817316", "0"],         // [时间戳, 低速率]
+        ],
         "total_size": 3,                    // 总trades条数
         "result_size": 1,                   // 指标数据条数
     },

+ 58 - 11
src/msv.rs

@@ -54,6 +54,23 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
             return response
         }
     };
+    let trt = match parse_str_to_decimal(query_value.clone(), "trt") {
+        Ok(t) => {
+            t.to_i32().unwrap()
+        }
+        Err(response) => {
+            return response
+        }
+    };
+    let trt_minutes_back = match parse_str_to_decimal(query_value.clone(), "trt_minutes_back") {
+        Ok(t) => {
+            t
+        }
+        Err(response) => {
+            return response
+        }
+    };
+    let trt_mills_back = trt_minutes_back * dec!(1000) * dec!(60);
 
     // 链接数据服务器查询数据
     let end_time = Utc::now().timestamp_millis();
@@ -70,7 +87,7 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
         // 数据本地化处理
         let trades = parse_json_to_trades(db_response.data);
         // 指标生成
-        let indicator = generate_msv_by_trades(trades, mills_back);
+        let indicator = generate_msv_by_trades(trades, mills_back, trt, trt_mills_back);
 
         // 返回数据
         let response = Response {
@@ -89,8 +106,9 @@ pub async fn generate_msv(query_value: Value) -> HttpResponse {
 }
 
 // 将trades转换为具体指标
-pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Value {
-    let mut result_data: Vec<Vec<Decimal>> = vec![];
+pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal, trt: i32, trt_mills_back: Decimal) -> Value {
+    let mut msv_data: Vec<Vec<Decimal>> = vec![];
+    let mut tr_data: Vec<Vec<Decimal>> = vec![];
 
     const GAMMA: Decimal = dec!(0.5);
 
@@ -142,8 +160,8 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
             }
 
             // 去重,以及保留最大的波动率
-            if result_data.len() > 0 {
-                let last = result_data[result_data.len() - 1].clone();
+            if msv_data.len() > 0 {
+                let last = msv_data[msv_data.len() - 1].clone();
                 let last_time = last[0];
                 let last_rate = last[1];
 
@@ -151,22 +169,51 @@ pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal) -> Va
                 if last_time == trade.time {
                     // 如果最新的波动率大于最后波动率
                     if rate.abs() > last_rate.abs() {
-                        result_data.remove(result_data.len() - 1);
-                        result_data.push(vec![trade.time, rate, dissociation]);
+                        msv_data.remove(msv_data.len() - 1);
+                        msv_data.push(vec![trade.time, rate, dissociation]);
                     }
                 } else {
-                    result_data.push(vec![trade.time, rate, dissociation]);
+                    msv_data.push(vec![trade.time, rate, dissociation]);
                 }
             } else {
-                result_data.push(vec![trade.time, rate, dissociation]);
+                msv_data.push(vec![trade.time, rate, dissociation]);
+            }
+
+            // 生成速率曲线
+            // 计算区间的预定价格
+            let mut trades_count = 0;
+            let mut high_rate = Decimal::NEGATIVE_ONE;
+            let mut trt_range_index = index;
+            loop {
+                // 第0个就不用计算
+                if trt_range_index == 0 {
+                    break;
+                }
+
+                let flag_trade = trades.get(trt_range_index).unwrap();
+                let trt_range_time = trade.time - flag_trade.time;
+                // 判断回溯时间
+                if trt_range_time > trt_mills_back {
+                    break;
+                }
+
+                // 判断是否满足高速率条件
+                trades_count += 1;
+                if trades_count >= trt {
+                    high_rate = Decimal::ONE;
+                }
+
+                trt_range_index -= 1;
             }
+            tr_data.push(vec![trade.time, high_rate]);
         }
     }
 
     let total_size = trades.len();
-    let result_size = result_data.len();
+    let result_size = msv_data.len();
     json!({
-        "msv": result_data,
+        "msv": msv_data,
+        "tr": tr_data,
         "total_size": total_size,
         "result_size": result_size,
     })