[Python] next () only keeps accessing the last bars of the datas[1]

Discussão em 'Python' iniciado por Stack, Abril 8, 2025.

  1. Stack

    Stack Membro Participativo

    When i tried to import multiple csv files into self.data using backtrader, except for the first datas[0], the rest of the dataset accessed only the last bar in the next() function These are the two data sets I tested(same form):

    enter code here
    datetime open ... volume openintrest
    datetime ...
    2025-01-17 06:00:00 2025-01-17 06:00:00 100156.98 ... 287.20439 0
    2025-01-17 06:30:00 2025-01-17 06:30:00 99596.80 ... 256.37462 0
    2025-01-17 07:00:00 2025-01-17 07:00:00 99838.25 ... 498.32045 0
    2025-01-17 07:30:00 2025-01-17 07:30:00 99891.23 ... 161.58102 0
    2025-01-17 08:00:00 2025-01-17 08:00:00 99987.30 ... 531.72307 0


    Here is the simpfiy code:

    enter code here
    from datetime import timedelta, datetime
    import ccxt
    import backtrader as bt
    import pandas as pd
    import os

    class TestStrategy(bt.Strategy):

    def __init__(self):#计算指标
    self.dataclose=self.datas[1].lines.open
    def next(self):#调用指标和策略
    dt = self.datas[1].lines.datetime.date(0)
    self.log(dt,self.dataclose[0])
    def log(self,dt,text):
    print(dt,text)

    if __name__=='__main__':
    cerebro = bt.Cerebro()
    since_time = datetime(year=2024, month=11, day=1)
    to_time = datetime(year=2025, month=4, day=1)
    file_path = ["E:/PycharmProjects/PythonProject/backtrader/data/2025-01-28 15:30:
    00.csv",
    "E:/PycharmProjects/PythonProject/backtrader/data/2025-01-16 22:00:
    00.csv"]
    for i in file_path:#Two data sets are imported
    df = pd.read_csv(i, parse_dates=['datetime']) # 将 datetime 列解析为日期时间类型
    df.index = pd.to_datetime(df.datetime)
    df['openintrest'] = 0
    df = df[['open', 'high', 'low', 'close', 'volume', 'openintrest']]
    data = bt.feeds.PandasData(
    dataname=df,
    fromdate=since_time,
    todate=to_time,
    )
    cerebro.adddata(data)


    cerebro.addstrategy(TestStrategy)
    cerebro.run


    When I try to access the first dataset:

    enter code here
    class TestStrategy(bt.Strategy):

    def __init__(self):#计算指标
    self.dataclose=self.datas[0].lines.open
    def next(self):#调用指标和策略
    dt = self.datas[0].lines.datetime.date(0)
    self.log(dt,self.dataclose[0])
    def log(self,dt,text):
    print(dt,text)


    The result output is:

    enter code here
    2025-01-17 99596.8
    2025-01-17 99838.25
    2025-01-17 99891.23
    2025-01-17 99987.3
    2025-01-17 100156.0
    2025-01-17 100120.58


    But try to access the second dataset:

    enter code here
    class TestStrategy(bt.Strategy):

    def __init__(self):#计算指标
    self.dataclose=self.datas[1].lines.open
    def next(self):#调用指标和策略
    dt = self.datas[1].lines.datetime.date(0)
    self.log(dt,self.dataclose[0])
    def log(self,dt,text):
    print(dt,text)


    The output is:

    enter code here
    2025-01-15 98729.41
    2025-01-15 98729.41
    2025-01-15 98729.41
    2025-01-15 98729.41
    2025-01-15 98729.41
    2025-01-15 98729.41


    next () only keeps accessing the last bar of the datas[1] date. If there is anything unclear, please point out, thank you for your help

    Continue reading...

Compartilhe esta Página