|
|
@@ -29,6 +29,16 @@ bounds = [(10, 1000.0), # A 的范围
|
|
|
# 假设S0是初始的参考价格
|
|
|
S0 = -1
|
|
|
|
|
|
+
|
|
|
+def on_message(_ws, message):
|
|
|
+ json_message = json.loads(message)
|
|
|
+
|
|
|
+ if json_message["channel"] == "futures.order_book" and json_message["event"] == "all":
|
|
|
+ on_message_depth(json_message)
|
|
|
+ elif json_message["channel"] == "futures.trades" and json_message["event"] == "update":
|
|
|
+ on_message_trade(json_message)
|
|
|
+
|
|
|
+
|
|
|
def get_tick_size_from_prices(ask_price, bid_price):
|
|
|
# 获取价格的小数位数
|
|
|
ask_decimal_places = len(str(ask_price).split('.')[1])
|
|
|
@@ -40,42 +50,61 @@ def get_tick_size_from_prices(ask_price, bid_price):
|
|
|
return tick_size
|
|
|
|
|
|
|
|
|
-def on_message_trade(_ws, message):
|
|
|
+def on_message_trade(json_message):
|
|
|
global trade_snapshots
|
|
|
- json_message = json.loads(message)
|
|
|
- logger.info(json_message)
|
|
|
- # trade = {
|
|
|
- # 'price': float(json_message['data']['p']),
|
|
|
- # 'qty': float(json_message['data']['q']),
|
|
|
- # 'timestamp': pd.to_datetime(json_message['data']['T'], unit='ms'),
|
|
|
- # 'side': 'sell' if json_message['data']['m'] else 'buy'
|
|
|
- # }
|
|
|
- # trade_snapshots.append(trade)
|
|
|
- # process_depth_data()
|
|
|
-
|
|
|
-
|
|
|
-def on_message_depth(_ws, message):
|
|
|
+
|
|
|
+ # 解析 Gate.io 的成交信息
|
|
|
+ for trade_origin in json_message['result']:
|
|
|
+ price = trade_origin['price']
|
|
|
+ size = trade_origin['size']
|
|
|
+ timestamp = pd.to_datetime(trade_origin['create_time_ms'], unit='ms')
|
|
|
+
|
|
|
+ # 转换为需要的格式
|
|
|
+ trade = {
|
|
|
+ 'price': float(price),
|
|
|
+ 'qty': float(size),
|
|
|
+ 'timestamp': timestamp
|
|
|
+ }
|
|
|
+
|
|
|
+ # 买卖方向判断
|
|
|
+ if trade["qty"] > 0:
|
|
|
+ trade["side"] = "buy"
|
|
|
+ else:
|
|
|
+ trade["side"] = "sell"
|
|
|
+
|
|
|
+ trade_snapshots.append(trade)
|
|
|
+ process_depth_data()
|
|
|
+
|
|
|
+
|
|
|
+def on_message_depth(json_message):
|
|
|
global order_book_snapshots, spread_delta_snapshots
|
|
|
- json_message = json.loads(message)
|
|
|
- # bids = [[float(price), float(quantity)] for price, quantity in json_message['data']['b'][:10]]
|
|
|
- # asks = [[float(price), float(quantity)] for price, quantity in json_message['data']['a'][:10]]
|
|
|
- # timestamp = pd.to_datetime(json_message['data']['E'], unit='ms')
|
|
|
- # depth = {
|
|
|
- # 'bids': bids,
|
|
|
- # 'asks': asks,
|
|
|
- # 'timestamp': timestamp
|
|
|
- # }
|
|
|
- # order_book_snapshots.append(depth)
|
|
|
- #
|
|
|
- # # 求价差
|
|
|
- # ask_price = Decimal(str(asks[0][0]))
|
|
|
- # bid_price = Decimal(str(bids[0][0]))
|
|
|
- # tick_size = get_tick_size_from_prices(ask_price, bid_price)
|
|
|
- # spread = float(ask_price - bid_price)
|
|
|
- # spread_delta = int(spread / tick_size)
|
|
|
- # spread_delta_snapshots.append(spread_delta)
|
|
|
- #
|
|
|
- # process_depth_data()
|
|
|
+
|
|
|
+ # 解析 Gate.io 的深度信息
|
|
|
+ result = json_message['result']
|
|
|
+ bids = result['bids']
|
|
|
+ asks = result['asks']
|
|
|
+ timestamp = pd.to_datetime(result['t'], unit='ms')
|
|
|
+
|
|
|
+ # 转换为 Binance 兼容的格式
|
|
|
+ asks_converted = [[float(ask['p']), float(ask['s'])] for ask in asks[:10]]
|
|
|
+ bids_converted = [[float(bid['p']), float(bid['s'])] for bid in bids[:10]]
|
|
|
+
|
|
|
+ depth = {
|
|
|
+ 'bids': bids_converted,
|
|
|
+ 'asks': asks_converted,
|
|
|
+ 'timestamp': timestamp
|
|
|
+ }
|
|
|
+ order_book_snapshots.append(depth)
|
|
|
+
|
|
|
+ # 求价差
|
|
|
+ ask_price = Decimal(str(asks_converted[0][0]))
|
|
|
+ bid_price = Decimal(str(bids_converted[0][0]))
|
|
|
+ tick_size = get_tick_size_from_prices(ask_price, bid_price)
|
|
|
+ spread = float(ask_price - bid_price)
|
|
|
+ spread_delta = int(spread / tick_size)
|
|
|
+ spread_delta_snapshots.append(spread_delta)
|
|
|
+
|
|
|
+ process_depth_data()
|
|
|
|
|
|
|
|
|
def calculate_phi(prices, k, S0):
|