After some more working on it, I feel I am close to working through the problem (just have to wait for markets to open again on sunday night). When I run my latest script, I receive this error:
TWS Time at connection:20190111 15:00:43 EST
Traceback (most recent call last):
File "D:/Dropbox/Parker Magic Dropbox/Elliot Parker/Drums/QuantStrategyProjectFiles/__init__ (1) (1) (1).py", line 222, in <module>
run()
File "D:/Dropbox/Parker Magic Dropbox/Elliot Parker/Drums/QuantStrategyProjectFiles/__init__ (1) (1) (1).py", line 219, in run
cerebro.run()
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1127, in run
runstrat = self.runstrategies(iterstrat)
2018-12-12 AAPL-STK-SMART-USD
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1298, in runstrategies
not pos
self._runnext(runstrats)
tradetoday finish
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 1630, in _runnext
strat._next()
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\strategy.py", line 325, in _next
super(Strategy, self)._next()
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\lineiterator.py", line 270, in _next
self.prenext()
File "D:/Dropbox/Parker Magic Dropbox/Elliot Parker/Drums/QuantStrategyProjectFiles/__init__ (1) (1) (1).py", line 110, in prenext
self.next()
File "D:/Dropbox/Parker Magic Dropbox/Elliot Parker/Drums/QuantStrategyProjectFiles/__init__ (1) (1) (1).py", line 116, in next
pos = self.getposition(d).size
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\strategy.py", line 1366, in getposition
return broker.getposition(data)
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\brokers\ibbroker.py", line 306, in getposition
return self.ib.getposition(data.tradecontract, clone=clone)
File "C:\Users\Elliot Parker\Anaconda3\lib\site-packages\backtrader\lineseries.py", line 461, in __getattr__
return getattr(self.lines, name)
AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'tradecontract'
So it is able to recognise the first datafeed, but is unable to recognize the second datafeed's name and date, this I am not sure how to solve. I might try cleaning up that file as so it only has one of each date, sorted, etc.
My latest script:
import datetime
import backtrader as bt
from http.cookiejar import _debug
from Functions.PandasData_Extend import PandasData_Extend
import pandas as pd
import pytz
# Create a Stratey
class ADRLeader(bt.Strategy):
StrategyInformation = dict(
StrategyName='NextDayStrategyBinsS',
Notes='US Leads AUS, BHP, Bin 0, Short| Freebandz',
OrderExecutionType='Market',
BuyLogic='%Bracket',
SellLogic='%Bracket',
DateRun=datetime.datetime.now(),
DataGranularity='Day'
)
params = dict(
ma=bt.ind.SMA,
p1=5,
p2=15,
limit=0.005,
limdays=1,
limdays2=1,
hold=1,
usebracket=False, # use order_target_size
switchp1p2=False, # switch prices of order1 and order2
limu=0.005,
limd=0.01,
valid=1,
when=bt.timer.SESSION_START,
bin=0,
)
def __init__(self):
self.add_timer(when=self.p.when)
self.orefs = list()
self.order = None
self.o = dict()
self.signal = self.datas[1].PercentileDailyPctChange
self.tradetoday = 0
def notify_data(self, data, status, *args, **kwargs):
# print('*' * 5, 'DATA NOTIF:', data._getstatusname(status), *args)
if status == data.LIVE:
self.datastatus = 1
def notify_store(self, msg, *args, **kwargs):
# print('*' * 5, 'STORE NOTIF:', msg)
return
def notify_order(self, order):
if order.status == order.Completed:
# self.holdstart = len(self)
# print('Order Completed')
# print(self.datas[0].datetime.datetime())
# print(order.price)
return
if order.status == order.Accepted:
# print('Order Accepted')
return
if not order.alive() and order.ref in self.orefs:
self.orefs.remove(order.ref)
if order.isbuy():
if order.status == order.Submitted:
# print('Order Submitted BUY')
# print(order.price)
# print(str(order.price) + 'Order Buy Price')
return
if order.issell():
if order.status == order.Submitted:
# print('Order Submitted SELL')
# print(order.price)
return
def notify_trade(self, trade):
if trade.isclosed:
# print('tradeclosed')
# date = self.datas[0].datetime.datetime()
# print(self.datas[0].datetime.datetime())
# print(date, trade.pnl, trade.pnlcomm)
# tradetoday = (bt.num2date(trade.dtopen)).date()
# print(trade.ref)
# self.listforall.append(tradetoday)
# print('tradetoday')
# print(tradetoday)
self.tradetoday = 1
if trade.isopen:
# print('tradeopen')
# date = self.datas[0].datetime.datetime()
# time = self.datas[0].datetime.time(0)
# print(date, trade.price)
return
def notify_timer(self, timer, when):
# print(str(when.time()) +' '+' juice')
if when.time() == datetime.time(0,0):
# print('Its a new day')
# print(self.datas[0].datetime.datetime())
self.tradetoday = 0
else:
# print('does not')
return
def prenext(self):
self.next()
def next(self):
for i, d in enumerate(self.datas):
dt, dn = self.datetime.date(), d._name
pos = self.getposition(d).size
# print(AAPL-STK-SMART-USD)
print('{} {}'.format(dt, dn))
# print(i[0])
#Setting up the Not in Position
if i == 0:
pos = self.getposition(d).size
# print('position size start')
# print(pos)
# print('position size finish')
else:
pass
if pos == 0:
print('not pos')
#Setting up the If Not traded today
if not self.tradetoday == 1:
# print('tradetoday start')
# print(self.tradetoday)
print('tradetoday finish')
if (len(self.datas[i]) > 0):
# print(self.datetime.date())
#print(self.signal)
print('top')
# print(self.data0.Close)
print('bottom')
# print (self.data0.l.close[-1])
if d._dataname.PercentileDailyPctChange[+1] == 12:
print('PercentileValue')
print(d.datetime.datetime().isoformat())
print(d._dataname.PercentileDailyPctChange[+1])
print('PercentileValueFinish')
if i == 0:
print(d.close[0])
# self.buy(data=d, )
elif i == 0:
print('0')
print('Currency Latest Close')
print(self.datas[0].datetime.datetime().isoformat())
print(d.close[0])
print('Currency Latest Finish')
else:
print('nope')
return
else:
print('In Position')
return
else:
print('no datasets coming in')
return
def start(self):
if self.data0.contractdetails is not None:
# print('yo')
# print('Timezone from ContractDetails: {}'.format(
# self.data0.contractdetails.m_timeZoneId))
return
header = ['Datetime', 'Open', 'High', 'Low', 'Close']
# print(', '.join(header))
self.done = False
def run(args=None):
cerebro = bt.Cerebro()
storekwargs = dict(
host='127.0.0.1', port=7496,
clientId=None, reconnect=100, timeout=10.0, _debug=False)
ibstore = bt.stores.IBStore(**storekwargs)
broker = ibstore.getbroker()
cerebro.setbroker(broker)
# 'EUR.USD-CASH-IDEALPRO'
# AAPL-STK-SMART-USD
# , tradename='AAPL-CFD-SMART-USD'
# , tradename = 'BHP-CFD-SMART-AUD'
# BHP-STK-SMART-AUD
data0 = ibstore.getdata(reqRealTimeBars=True, dataname='AAPL-STK-SMART-USD', rtbar=False,
timeframe=bt.TimeFrame.Seconds, compression=1)
# cerebro.resampledata(data0, timeframe=bt.TimeFrame.Seconds,
# compression=3)
cerebro.adddata(data0)
# print('remix')
# print(data0)
# cerebro.adddata(data0, name='d0')
StockPercentile = pd.read_csv(r'D:\Dropbox\Parker Magic Dropbox\Elliot Parker\Drums\QuantStrategyResults\AUSLeadsUSPercentile.csv',
header=0, index_col=0, parse_dates=True)
StockPercentile = StockPercentile[~StockPercentile.index.duplicated(keep='first')]
StockPercentile = StockPercentile.sort_index(ascending=False)
StockPercentile = pd.DataFrame(StockPercentile.iloc[:, :])
# print(StockPercentile)
data1 = PandasData_Extend(dataname=StockPercentile, timeframe=bt.TimeFrame.Days, compression=1)
# cerebro.resampledata(data1)
# cerebro.replaydata(data1)
cerebro.adddata(data1)
cerebro.addstrategy(ADRLeader)
cerebro.run()
if __name__ == '__main__':
run()