Ver código fonte

这个版本是展示纯粹的订单流数据的版本。

skyffire 1 ano atrás
pai
commit
03851b579f
2 arquivos alterados com 16 adições e 52 exclusões
  1. 15 51
      binance_order_flow/data_processing.py
  2. 1 1
      binance_order_flow/ws_client.py

+ 15 - 51
binance_order_flow/data_processing.py

@@ -4,7 +4,7 @@ import pandas as pd
 import time
 import queue
 import threading
-
+from datetime import datetime
 from logger_config import logger
 
 # Initialize the DataFrame
@@ -15,12 +15,12 @@ previous_order_book = None
 fill_probabilities = {}
 order_disappearances = {}
 order_executions = {}
+spoofing_probabilities = {}
 last_trade = {'price': None, 'qty': None, 'side': None}
 messages = queue.Queue()  # 创建一个线程安全队列
 
 stop_event = threading.Event()
 
-
 def on_message_trade(_ws, message):
     global df_trades, order_executions, last_trade
     json_message = json.loads(message)
@@ -28,7 +28,7 @@ def on_message_trade(_ws, message):
         'price': float(json_message['data']['p']),
         'qty': float(json_message['data']['q']),
         'timestamp': pd.to_datetime(json_message['data']['T'], unit='ms'),
-        'side': 'buy' if json_message['data']['m'] else 'sell'  # 'm' indicates是否买方是做市商
+        'side': 'sell' if json_message['data']['m'] else 'buy'  # 'm' indicates是否买方是做市商
     }
     trade_df = pd.DataFrame([trade])
     if not trade_df.empty and not trade_df.isna().all().all():
@@ -40,11 +40,10 @@ def on_message_trade(_ws, message):
         if price not in order_executions:
             order_executions[price] = 0
         order_executions[price] += trade['qty']
-        calculate_fill_probabilities()
-
+        show_message()
 
 def on_message_depth(_ws, message):
-    global df_order_book, order_disappearances, previous_order_book
+    global df_order_book, order_disappearances, previous_order_book, spoofing_probabilities
     json_message = json.loads(message)
     bids = json_message['data']['b'][:10]  # Top 10 bids
     asks = json_message['data']['a'][:10]  # Top 10 asks
@@ -56,59 +55,24 @@ def on_message_depth(_ws, message):
     }
     df_order_book = pd.DataFrame([order_book])
 
-    if previous_order_book is not None:
-        # 计算订单消失量
-        for level in range(10):
-            bid_price = df_order_book['bid_price'].iloc[0][level]
-            ask_price = df_order_book['ask_price'].iloc[0][level]
-            bid_qty = df_order_book['bid_qty'].iloc[0][level]
-            ask_qty = df_order_book['ask_qty'].iloc[0][level]
-
-            prev_bid_qty = previous_order_book['bid_qty'].iloc[0][level]
-            prev_ask_qty = previous_order_book['ask_qty'].iloc[0][level]
-
-            # 计算bid订单消失量
-            if bid_price not in order_disappearances:
-                order_disappearances[bid_price] = 0
-            if prev_bid_qty > bid_qty:
-                disappearances = (prev_bid_qty - bid_qty)
-                order_disappearances[bid_price] += disappearances if disappearances > 0 else 0
-
-            # 计算ask订单消失量
-            if ask_price not in order_disappearances:
-                order_disappearances[ask_price] = 0
-            if prev_ask_qty > ask_qty:
-                disappearances = (prev_ask_qty - ask_qty)
-                order_disappearances[ask_price] += disappearances if disappearances > 0 else 0
-
-    previous_order_book = df_order_book
-    calculate_fill_probabilities()
+    show_message()
 
 
 # 计算成交概率
-def calculate_fill_probabilities():
-    global order_executions, order_disappearances, fill_probabilities, df_order_book
+def show_message():
+    global df_order_book, last_trade
 
-    for price in order_disappearances:
-        if price in order_executions:
-            disappearances = order_disappearances[price]
-            executions = order_executions[price]
-            # 确保成交概率不大于1
-            fill_probabilities[price] = executions / disappearances if disappearances > 0 else 0
-        else:
-            fill_probabilities[price] = 0
-
-    if fill_probabilities and not df_order_book.empty and last_trade['price'] is not None:
+    if not df_order_book.empty and last_trade['price'] is not None:
         last_price = last_trade['price']
-        asks = [[price, fill_probabilities[price]] for price in fill_probabilities.keys() if
-                price > last_price and price in fill_probabilities]
-        bids = [[price, fill_probabilities[price]] for price in fill_probabilities.keys() if
-                price < last_price and price in fill_probabilities]
+        asks = [[price, qty] for price, qty in
+                zip(df_order_book['ask_price'].iloc[0], df_order_book['ask_qty'].iloc[0])]
+        bids = [[price, qty] for price, qty in
+                zip(df_order_book['bid_price'].iloc[0], df_order_book['bid_qty'].iloc[0])]
+
         asks_sorted = sorted(asks, key=lambda x: x[0])
         bids_sorted = sorted(bids, key=lambda x: x[0], reverse=True)
 
-        # last_qty = last_trade['qty']
-        last_qty = 0
+        last_qty = last_trade['qty']
         side = last_trade['side']
         data = {
             "asks": asks_sorted,

+ 1 - 1
binance_order_flow/ws_client.py

@@ -5,7 +5,7 @@ from logger_config import logger
 from data_processing import on_message_trade, on_message_depth, stop_event
 
 # Binance WebSocket API URL
-SYMBOL = "tokenusdt"
+SYMBOL = "rsr" + "usdt"
 SOCKET_TRADE = "wss://fstream.binance.com/stream?streams=" + SYMBOL + "@trade"
 SOCKET_DEPTH = "wss://fstream.binance.com/stream?streams=" + SYMBOL + "@depth20@100ms"