Hi there,
the aim of this simple script is to find the optimal interval to use in the turtle strategy,
however I am getting an error that I cannot untangle. Here the code:
import backtrader as bt
import datetime
# might want to try changing the position of this
closes = []
in_position = False
class Turtle_Strategy(bt.Strategy):
params = (
('interval', 20),
)
def __init__(self):
self.start_cash = self.broker.getvalue()
self.interval = self.params.interval
def next(self):
closes.append(self.data.close)
if len(closes) >= self.params.interval:
local_min = min(closes[-self.params.interval - 1:-1])
local_max = max(closes[-self.params.interval - 1:-1])
if closes[-1] <= local_min:
in_position = True
self.buy(size=100)
if closes[-1] >= local_max: # and in_position:
self.sell(size=100)
in_position = False
def stop(self):
pnl = round(self.broker.getvalue() - self.start_cash, 2)
print('Interval: {} Final PnL: {}'.format(self.params.interval, pnl))
if __name__ == '__main__':
# Variable for our starting cash
start_cash = 10000
# Create an instance of cerebro
cerebro = bt.Cerebro()
# Add our strategy
cerebro.optstrategy(Turtle_Strategy, interval=range(14, 20))
# data
data = bt.feeds.GenericCSVData(dataname='/path/data.csv',
# fromdate=datetime.datetime(2020, 1, 1),
# todate=datetime.datetime(2020, 1, 12),
dtformat='%Y-%m-%d',
tmformat='%H:%M:%S',
datetime=0,
open=1,
high=2,
low=3,
close=4,
volume=5,
time=6,
openinterest=-1)
# Add the data to Cerebro
cerebro.adddata(data)
# Set our desired cash start
cerebro.broker.setcash(start_cash)
# Run over everything
starts = cerebro.run()
Here the error
/Users/trading_bot/env/bin/python /Users/trading_bot/turtule/turtle_optimizer.py
Interval: 16 Final PnL: 0.0
Interval: 15 Final PnL: 0.0
Interval: 17 Final PnL: 0.0
Interval: 14 Final PnL: 0.0
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/Users/anaconda3/lib/python3.7/multiprocessing/pool.py", line 121, in worker
result = (True, func(*args, **kwds))
File "/Users/giacomofederle/trading_bot/env/lib/python3.7/site-packages/backtrader/cerebro.py", line 1007, in __call__
return self.runstrategies(iterstrat, predata=predata)
File "/Users/trading_bot/env/lib/python3.7/site-packages/backtrader/cerebro.py", line 1293, in runstrategies
self._runonce(runstrats)
File "/Users/trading_bot/env/lib/python3.7/site-packages/backtrader/cerebro.py", line 1695, in _runonce
strat._oncepost(dt0)
File "/Users/trading_bot/env/lib/python3.7/site-packages/backtrader/strategy.py", line 311, in _oncepost
self.nextstart() # only called for the 1st value
File "/Users/trading_bot/env/lib/python3.7/site-packages/backtrader/lineiterator.py", line 347, in nextstart
self.next()
File "/Users/trading_bot/turtule/turtle_optimizer.py", line 21, in next
local_min = min(closes[-self.params.interval - 1:-1])
TypeError: __bool__ should return bool, returned LineOwnOperation
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Userstrading_bot/turtule/turtle_optimizer.py", line 71, in <module>
starts = cerebro.run()
File "/Users/trading_bot/env/lib/python3.7/site-packages/backtrader/cerebro.py", line 1143, in run
for r in pool.imap(self, iterstrats):
File "/Users/anaconda3/lib/python3.7/multiprocessing/pool.py", line 774, in next
raise value
TypeError: __bool__ should return bool, returned LineOwnOperation
Process finished with exit code 1
Thank you very much in advance, I am looking forward to some suggestions