如何在列表中添加数据并用Python Plotly绘图

0 投票
1 回答
735 浏览
提问于 2025-06-18 04:06

你好,我还在尝试制作一个交易机器人,并想把它们的时间和低价数据绘制出来。
我想在特定条件下获取买入信号(当MACD从负值变为正值时)。然后我想把这些信号绘制到数据上,但我无法把它们添加到buy_signal=[]这个地方。
我遇到的错误是:self.plotData(buy_signals = buy_signals) IndexError: list index out of range

import requests
import json
from stockstats import StockDataFrame as Sdf
import plotly.graph_objects as go
from plotly.offline import plot


class TradingModel:
    def __init__(self, symbol):
        self.symbol = symbol
        self.df = self.getData


    def getData(self):

        # define URL
        base = 'https://api.binance.com'
        endpoint = '/api/v3/klines'
        params = '?&symbol='+self.symbol+'&interval=4h'

        url = base + endpoint + params

        # download data
        data = requests.get(url)
        dictionary = data.json()

        # put in dataframe and clean-up
        df = pd.DataFrame.from_dict(dictionary)
        df = df.drop(range(6, 12), axis=1)


        # rename columns and stockstasts
        col_names = ['time', 'open', 'high', 'low', 'close', 'volume']
        df.columns = col_names
        stock = Sdf.retype(df)


        for col in col_names:
            df[col]=df[col].astype(float)
        #defined macdh
        df['macdh']=stock['macdh']


        return  (df)

    def strategy(self):
        df = self.df
        buy_signals=[]
        for i in range(1, len(df['close'])):
                if df['macdh'].iloc[-1]>0 and df['macdh'].iloc[-2]<0:
                    buy_signals.append([df['time'][i], df['low'][i]])

        self.plotData(buy_signals = buy_signals)





    def plotData(self,buy_signal=False):
        df=self.df
        candle=go.Candlestick(
            x=df['time'],
            open=df['open'],
            close=df['close'],
            high=df['high'],
            low=df['low'],
            name="Candlesticks"
        )
        macdh=go.Scatter(
            x=df['time'],
            y=df['macdh'],
            name="Macdh",
            line = dict(color=('rgba(102, 207, 255, 50)')))

        Data=[candle,macdh]

        if buy_signals:
            buys = go.Scatter(
                    x = [item[0] for item in buy_signals],
                    y = [item[1] for item in buy_signals],
                    name = "Buy Signals",
                    mode = "markers",
                )

            sells = go.Scatter(
                    x = [item[0] for item in buy_signals],
                    y = [item[1]*1.04 for item in buy_signals],
                    name = "Sell Signals",
                    mode = "markers",
                )

            data = [candle, macdh, buys, sells]


        # style and display
        layout = go.Layout(title = self.symbol)
        fig = go.Figure(data = data, layout = layout)

        plot(fig, filename=self.symbol)

def Main():
    symbol = "BTCUSDT"
    model = TradingModel(symbol)
    model.strategy()

if __name__ == '__main__':
    Main() ```

相关问题:

  • 暂无相关问题
暂无标签

1 个回答

1

你需要把:

self.plotData(buy_signals[i]) 替换成 self.plotData(buy_signals)

def plotData(self,buy_signal=False): 替换成 def plotData(self,buy_signals=None):

这样就可以正常运行了!

撰写回答