Binance websocket发送重复数据



这是我的代码获得期货tick数据。它似乎正在工作,但在一些滴答声中,我再次收到相同的数据。

import pandas as pd
from binance.client import Client
from binance import BinanceSocketManager
import asyncio
api_key ='***'
api_secret ='***'
#Individual Futures Socket
client1 = Client(api_key=api_key,api_secret=api_secret)
bsm = BinanceSocketManager(client1)
socket = bsm.individual_symbol_ticker_futures_socket(symbol='ETHUSDT')
#Convert to dataframe
def createframe(msg):
df = pd.DataFrame([msg['data']])
df = df.loc[:, ['s', 'E', 'c']]
df.columns = ['symbol', 'Time', 'Price']
df.Price = df.Price.astype(float)
df.Time = pd.to_datetime(df.Time, unit='ms')
return df
async def main():
while True:
await socket.__aenter__()
msg = await socket.recv()
frame = createframe(msg)
print(frame)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

得到如下输出:

symbol                    Time    Price
0  ETHUSDT 2021-08-09 08:50:19.574  2960.49
symbol                    Time    Price
0  ETHUSDT 2021-08-09 08:50:20.060  2960.33
symbol                    Time    Price
0  ETHUSDT 2021-08-09 08:50:20.060  2960.33

最后两个输出是相同的。是否有一种方法可以避免这种情况,因为我要将数据框保存到sqlite数据库中,并且不想重复行。

这对我很有效。

async def main():
async with bsm.individual_symbol_ticker_futures_socket(symbol='ETHUSDT') as socket:
while True:
msg = await socket.recv()
frame = createframe(msg)
print(frame)
if __name__ == "__main__":
await main()

我也有同样的问题。

不确定现在是否与你相关,但这是我的解决方案。

我发现,如果我用await socket.__aenter__()注释掉这行,我就不会收到重复的值,从测试中,这似乎是有效的。

BinanceSocketManager需要异步编程:

试试以下:

import asyncio
from binance import AsyncClient

async def main():
client1 = await AsyncClient.create()
bsm = BinanceSocketManager(client1)
socket = bsm.individual_symbol_ticker_futures_socket(symbol='ETHUSDT')
async with socket as tscm:
while True:
msg = await tscm.recv()
frame = createframe(msg)
print(frame)
await client.close_connection()
if __name__ == "__main__":
await main()

最新更新