пытаюсь вынести параметр времени в 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