@tvxsta
Algotrader.

Backtrader, как вынести значение времени и работать с ним как с переменной?

пытаюсь вынести параметр времени в init , для дальнейшей работы с ней в next как с переменной. В функции log , я пробовал переопределить её на печать time , чтобы хоть как то понять как это работает в отладчике , но в итоге получил значения времени для каждого бара 00:00:00 при меняющихся значениях OHLC .
Попытался определить self.DataTime = self.datas[0].time ( по аналогии с другими параметрами ) - но получил ошибку , так как такой атрибут не предусмотрен, пробовал делать срезы преобразовав datetime в строку но там опять - нули. Я понимаю что будто подставляется параметр по умолчанию но текущее значение как вытащить, не понимаю.

import datetime
import backtrader as bt

class ShowBarPriceVolume(bt.Strategy):

    def log(self, txt, dt=None):
        """Вывод строки с датой на консоль"""
        dt = bt.num2date(self.datas[0].datetime[0]).date() if dt is None else dt  # Заданная дата или дата текущего бара
        print(f'{dt.strftime("%d.%m.%Y")},{txt}')  # Выводим дату с заданным текстом на консоль

    def __init__(self):
        """Инициализация торговой системы"""
#        self.DataTime = self.datas[0].time # 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'time' - Ошибка, нет такого атрибута LineSeries
        self.DataOpen = self.datas[0].open
        self.DataHigh = self.datas[0].high
        self.DataLow = self.datas[0].low
        self.DataClose = self.datas[0].close
        self.DataVolume = self.datas[0].volume

    def next(self):
        """Получение следующего бара"""
        self.log(f'Open={self.DataOpen[0]:0f}, High={self.DataHigh[0]:0f}, Low={self.DataLow[0]:0f}, Close={self.DataClose[0]:0f}, Volume={self.DataVolume[0]:.0f}')

if __name__ == '__main__':  # Точка входа при запуске этого скрипта
    cerebro = bt.Cerebro()  # Инициируем "движок" BackTrader
    cerebro.addstrategy(ShowBarPriceVolume)  # Привязываем торговую систему
    data = bt.feeds.GenericCSVData(
        dataname = 'ADAe.csv',
        separator = ',',
        dtformat=('%Y-%m-%d'),
        tmformat=('%H:%M:%S'),
        datetime=0,
        time=1,      #<----------------------------------------------------  столбец тайм проинициализирован
        high=2,
        low=3,
        open=4,
        close=5,
        volume=6,
        openinterest=-1,
        fromdate = datetime.datetime(2021,1,1),
        todate = datetime.datetime(2022,11,10))
    cerebro.adddata(data)  # Привязываем исторические данные
    cerebro.broker.setcash(1000000)  # Стартовый капитал для "бумажной" торговли
    print(f'Старовый капитал: {cerebro.broker.getvalue():.2f}')
    cerebro.run()  # Запуск торговой системы
    print(f'Конечный капитал: {cerebro.broker.getvalue():.2f}')
    # cerebro.plot()  # Рисуем график


Вот CSV :

  • DATA,TIME,OPEN,HIGH,LOW,CLOSE,VOLUME
    2021-01-01,00:00:00,0.18134,0.18146,0.18123,0.1813,214849.4
    2021-01-01,00:01:00,0.18134,0.18146,0.18127,0.1814,573157.4
    2021-01-01,00:02:00,0.1814,0.1814,0.1811,0.18113,118479.8
    2021-01-01,00:03:00,0.18105,0.18105,0.18077,0.18092,378490.9
    2021-01-01,00:04:00,0.18084,0.18089,0.18039,0.18052,434363.7
    2021-01-01,00:05:00,0.18052,0.18059,0.18007,0.1801,794197.9
    2021-01-01,00:06:00,0.1801,0.1802,0.17994,0.17997,237119.3
    2021-01-01,00:07:00,0.17996,0.17998,0.17934,0.17938,540475.5
    2021-01-01,00:08:00,0.1794,0.17978,0.17912,0.17978,1692622.2


Результат сейчас :

  • 01.01.2021,Open=0.181230, High=0.181340, Low=0.181460, Close=0.181300, Volume=214849
    01.01.2021,Open=0.181270, High=0.181340, Low=0.181460, Close=0.181400, Volume=573157
    01.01.2021,Open=0.181100, High=0.181400, Low=0.181400, Close=0.181130, Volume=118480
    01.01.2021,Open=0.180770, High=0.181050, Low=0.181050, Close=0.180920, Volume=378491
    01.01.2021,Open=0.180390, High=0.180840, Low=0.180890, Close=0.180520, Volume=434364
    01.01.2021,Open=0.180070, High=0.180520, Low=0.180590, Close=0.180100, Volume=794198
    01.01.2021,Open=0.179940, High=0.180100, Low=0.180200, Close=0.179970, Volume=237119
    01.01.2021,Open=0.179340, High=0.179960, Low=0.179980, Close=0.179380, Volume=540476
    01.01.2021,Open=0.179120, High=0.179400, Low=0.179780, Close=0.179780, Volume=1692622
    Конечный капитал: 1000000.00
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
@tvxsta Автор вопроса
Algotrader.
Решение найдено, в параметры bt.feeds.GenericCSVData добавил две строчки :
timeframe=bt.TimeFrame.Minutes,
        compression=15


Далее просто сделал срез, и теперь параметры времени можно использовать в качестве переменных :
tm = self.datas[0].datetime.time()
time_string = tm.strftime("%H:%M:%S")
hour = int(time_string[0:2])
minute = int(time_string[3:5])
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы