簡體   English   中英

如何從 Binance API 提取實時數據並同時在 Matplotlib 上繪制? 我可以單獨做,但不能一起做

[英]How can I pull live data from Binance API and simultaneously plot it on Matplotlib? I can do both individually but not together

我有以下兩批代碼; 第一個從 Binance API 中提取數據:

while True: 
    await socket.__aenter__()
    msg = await socket.recv() 
    frame = createFrame(msg)
    frame.to_sql("BTCUSDT", engine, if_exists = 'append', index = False) 
    print(frame)   

上面的輸出看起來像這樣:

在此處輸入圖像描述

每秒都會生成一行新數據。

以上當然會連續運行,除非被中斷。

然后我有下面的代碼,它從上表中提取數據。 但我遇到的問題是上面的代碼不會停止運行,所以我們永遠不會看到下面的代碼。 我當然可以在一定數量的行之后停止上面的操作,但我想要的是將實時數據提取到下面的代碼中。 有什么想法可以重新排列我的代碼來實現這一點嗎?

x_axis = []
y_axis = []

def animate(i): 
    x_axis.append(frame.iloc[-1][1])
    y_axis.append(frame.iloc[-1][2])
    
    plt.cla()
    plt.plot(x_axis,y_axis)
    

ani = FuncAnimation(plt.gcf(),animate,interval = 1000)

plt.show()
    

我剛剛實現了這段代碼並找到了你的問題。 在這段代碼中,您可以看到我如何混合 matplot 從 Binance 獲取數據。 我對數據所做的事情並不重要,它只是一個演示。

順便說一句,您必須使用 FuncAnimation 來顯示實時數據,無論來源來自何處。 這個實現有可能的流程,請求的時間間隔與動畫的刷新有關。

import requests
import pandas as pd
import matplotlib.pyplot as plt
from time import sleep
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

我將我的“屬性”保留在函數之外以更新動畫。

# Capital initial.
initial_capital         = 100
# Montant du capital à investir.
operation_invest_rate   = 0.1
# Capital cumulatif investi pendant la durée de l'opération.
invest_capital          = initial_capital*operation_invest_rate
# Frais de transaction.
fee_rate                = 0.001
# Interval de transaction.
trade_time_interval     =  2000
# Ticker choisi.                                    
token_selected          = "ATOKEN"
# Source de données.
data_door               = "https://api.binance.com/api/v3/depth"

另外我實例化了圖表。 在這種情況下是散點圖。 我還使用數組將未來值存儲在函數中以進行后續更新。

# Stockage pour visualisation.
prix_achat    = []
prix_vente    = []
fig = plt.figure()
ax = plt.axes()
ax.set_xlabel("Prix d'achat", fontsize=15)
ax.set_ylabel("Prix de vente", fontsize=15)
ax.set_title("Prix d'achat vs Prix de vente", fontsize=20)
ax.grid(True)
ax.scatter(prix_achat, prix_vente, color='blue', alpha=0.3)

在這里,您可以觀察到更新函數的實現,我必須嵌入所有查詢和數據操作,因為它是唯一將在動畫過程中運行的函數。 我的“道具”被稱為全局變量(不好的做法),因此它們在內部和外部都可以訪問。

def update(i):
    global initial_capital
    global operation_invest_rate
    global invest_capital
    global fee_rate
    global trade_time_interval                                   
    global token_selected
    global data_door

在這里,我對數據進行“填充”。 這不重要,轉到下一條評論。

    r = requests.get(data_door,params=dict(symbol=token_selected))
    results = r.json()

    # Lier les données de réponse et définir les métadonnées.
    frames ={
        side: pd.DataFrame(
            data=results[side], 
            columns=["price", "quantity"],
            dtype=float)
        for side in ["bids", "asks"]
        }

    # Assigner les colonnes.
    frames_list = [frames[side].assign(side=side) for side in frames]

    # Definir les axes.
    data = pd.concat(frames_list, axis="index", ignore_index=True, sort=True)

    # Groupes de données par niveau de prix.
    price_summary = data.groupby("side").price.describe()

    print(price_summary)
    spread = price_summary._get_value("asks","mean") - price_summary._get_value("bids","mean")
    spread_percent = spread / price_summary._get_value("asks","mean")

    

這是您問題的答案。 新數據可用后,您可以將其添加到原始數據中並重新調用圖表。

    # Mise a jour du graphique.
    prix_achat.append(buy_unit_price)
    prix_vente.append(sell_unit_price)
    ax.scatter(prix_achat, prix_vente, color='blue', alpha=0.5)

定義函數后,您可以調用動畫並顯示圖形。

animation = FuncAnimation(plt.gcf(), update, interval=trade_time_interval)
plt.tight_layout()
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM