Python Backtrader закрывает ордера
Я новичок в backtrader (Backtrader: https://www.backtrader.com/docu/quickstart/quickstart.html)and я пытаюсь протестировать свой код, но теперь я не знаю, как правильно попросить backtrader закрыть существующую позицию для меня. Я попытался просмотреть блоги Backtrader, но не нашел страницу, которая объясняет, как я должен это делать. Таким образом, я был бы очень признателен, если кто-нибудь может предложить некоторые идеи! Ниже приведен раздел для ввода торговой логики в шаблоне backtrader:
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 28 21:06:23 2018
@author: lenovo
"""
import backtrader as bt
import backtrader.feeds as btfeeds
import os
import datetime
import sys # To find out the script name (in argv[0])
class TestStrategy(bt.Strategy):
def log(self, txt, dt=None):
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
def __init__(self):
self.dataclose = self.datas[0].close
self.order = None
self.buyprice = None
self.buycomm = None
self.rsim30=bt.indicators.RSI(self.data.close, period=14)
self.rsim60=bt.indicators.RSI(self.data1.close, period=14)
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
# Buy/Sell order submitted/accepted to/by broker - Nothing to do
return
if order.status in [order.Completed]:
if order.isbuy():
self.log(
'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
else:
self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
self.bar_executed = len(self)
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
self.order = None
def notify_trade(self, trade):
if not trade.isclosed:
return
self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
(trade.pnl, trade.pnlcomm))
def next(self): # input trade logid in this function
self.log('Close, %.2f' % self.dataclose[0])
if self.order:
return
if not self.position:
if self.rsim30<30 and self.rsim60<30:
self.log('BUY CREATE, %.2f' % self.dataclose[0])
self.order = self.buy()
elif self.rsim30>70 and self.rsim60>70:
self.log('SELL CREATE, %.2f' % self.dataclose[0])
self.order = self.sell()
if self.position:
if self.rsim30>70 and self.rsim60>70:
self.close(exectype=bt.Order.Close)
self.log('BUY CREATE, exectype Close, price %.2f' %
self.data.close[0])
if self.rsim30<30 and self.rsim60<30:
self.close(exectype=bt.Order.Close)
self.log('SELL CREATE, exectype Close, price %.2f' %
self.data.close[0])
if __name__ == '__main__':
cerebro = bt.Cerebro()
cerebro.addstrategy(TestStrategy)
modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
datapath = os.path.join(modpath, 'USDJPYpro30.csv')
datapath1 = os.path.join(modpath, 'USDJPYpro60.csv')
# Create a Data Feed
data = btfeeds.GenericCSVData(
dataname=datapath,
fromdate=datetime.datetime(2018, 1, 1),
dtformat=('%Y.%m.%d'),
tmformat=('%H:%M'),
datetime=0,
time=1,
high=3,
low=4,
open=2,
close=5,
volume=6,
timeframe= bt.TimeFrame.Minutes,
compression= 30
)
data1 = btfeeds.GenericCSVData(
dataname=datapath1,
fromdate=datetime.datetime(2018, 1, 1),
dtformat=('%Y.%m.%d'),
tmformat=('%H:%M'),
datetime=0,
time=1,
high=3,
low=4,
open=2,
close=5,
volume=6,
timeframe= bt.TimeFrame.Minutes,
compression= 60
)
cerebro.adddata(data)
cerebro.adddata(data1)
cerebro.broker.setcash(10000.0)
cerebro.addsizer(bt.sizers.FixedSize, stake=0.05)
cerebro.broker.setcommission(commission=0.00)
print('Starting Balance: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Final Balance: %.2f' % cerebro.broker.getvalue())
cerebro.plot()
Моя торговая логика такая же, как и выше в def next(self):, я не уверен, открываю ли я длинные / короткие позиции по текущим доступным рыночным ценам.
И моя логика закрытия позиций, кажется, не работает так, как я хочу, то есть, если RSIm30>70 и RSIm60>70, закройте мои существующие длинные позиции на рынке, если RSIm30<30 и RSIm60<30. закрыть мои существующие короткие позиции на рынке. Ниже приведен фрагмент вывода Python:
2018-08-25, SELL EXECUTED, Price: 111.21, Cost: -400.36, Comm 0.00
2018-08-25, SELL EXECUTED, Price: 111.21, Cost: -400.36, Comm 0.00
2018-08-25, SELL EXECUTED, Price: 111.21, Cost: -400.36, Comm 0.00
2018-08-25, SELL EXECUTED, Price: 111.21, Cost: -400.36, Comm 0.00
2018-08-25, SELL EXECUTED, Price: 111.21, Cost: -400.36, Comm 0.00
2018-08-25, SELL EXECUTED, Price: 111.21, Cost: -400.36, Comm 0.00
2018-08-25, OPERATION PROFIT, GROSS 0.27, NET 0.27
2018-08-25, Close, 111.16
2018-08-25, Close, 111.19
2018-08-25, Close, 111.15
2018-08-25, Close, 111.16
2018-08-25, Close, 111.19
2018-08-25, Close, 111.19
2018-08-25, Close, 111.18
2018-08-25, Close, 111.17
2018-08-25, Close, 111.22
2018-08-25, Close, 111.20
2018-08-27, Close, 111.31
2018-08-27, Close, 111.29
2018-08-27, Close, 111.26
2018-08-27, Close, 111.23
2018-08-27, Close, 111.25
2018-08-27, Close, 111.28
2018-08-27, Close, 111.26
2018-08-27, Close, 111.21
2018-08-27, Close, 111.19
2018-08-27, Close, 111.22
2018-08-27, Close, 111.00
2018-08-27, Close, 111.02
2018-08-27, Close, 111.04
2018-08-27, Close, 111.05
2018-08-27, Close, 111.11
2018-08-27, Close, 111.08
2018-08-27, Close, 111.08
2018-08-27, Close, 111.01
2018-08-27, Close, 111.02
2018-08-27, Close, 111.09
2018-08-27, Close, 111.07
2018-08-27, Close, 111.15
2018-08-27, Close, 111.15
2018-08-27, Close, 111.17
2018-08-27, Close, 111.16
2018-08-27, Close, 111.11
2018-08-27, Close, 111.11
2018-08-27, Close, 111.11
2018-08-27, Close, 111.08
2018-08-27, Close, 111.00
2018-08-27, Close, 110.99
2018-08-27, Close, 111.01
2018-08-27, Close, 110.99
2018-08-27, Close, 111.03
2018-08-27, Close, 111.00
2018-08-27, Close, 111.03
2018-08-27, Close, 111.05
2018-08-27, Close, 111.08
2018-08-28, Close, 111.04
2018-08-28, Close, 111.03
2018-08-28, Close, 111.02
2018-08-28, Close, 111.08
2018-08-28, Close, 111.09
2018-08-28, Close, 111.09
2018-08-28, Close, 111.09
2018-08-28, Close, 111.07
2018-08-28, Close, 111.07
2018-08-28, Close, 111.07
2018-08-28, Close, 111.03
2018-08-28, Close, 111.03
2018-08-28, Close, 111.06
2018-08-28, Close, 111.06
2018-08-28, Close, 111.17
2018-08-28, Close, 111.12
2018-08-28, Close, 111.16
2018-08-28, Close, 111.20
2018-08-28, Close, 111.24
2018-08-28, Close, 111.26
2018-08-28, Close, 111.31
2018-08-28, BUY CREATE, exectype Close, price 111.31
2018-08-28, Close, 111.33
2018-08-28, BUY CREATE, exectype Close, price 111.33
2018-08-28, Close, 111.33
и выходной абзац с сообщением о моем сюжете:
D:\Anaconda3\lib\site-packages\backtrader\plot\plot.py:127: UserWarning:
This call to matplotlib.use() has no effect because the backend has already
been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.
The backend was *originally* set to 'module://ipykernel.pylab.backend_inline' by the following code:
File "D:\Anaconda3\lib\site-packages\spyder\utils\ipython\start_kernel.py", line 269, in <module>
main()
File "D:\Anaconda3\lib\site-packages\spyder\utils\ipython\start_kernel.py", line 253, in main
kernel.initialize()
File "<decorator-gen-124>", line 2, in initialize
File "D:\Anaconda3\lib\site-packages\traitlets\config\application.py", line 87, in catch_config_error
return method(app, *args, **kwargs)
File "D:\Anaconda3\lib\site-packages\ipykernel\kernelapp.py", line 472, in initialize
self.init_code()
File "D:\Anaconda3\lib\site-packages\IPython\core\shellapp.py", line 262, in init_code
self._run_exec_lines()
File "D:\Anaconda3\lib\site-packages\IPython\core\shellapp.py", line 288, in _run_exec_lines
self.shell.run_cell(line, store_history=False)
File "D:\Anaconda3\lib\site-packages\ipykernel\zmqshell.py", line 537, in run_cell
return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)
File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2666, in run_cell
self.events.trigger('post_run_cell', result)
File "D:\Anaconda3\lib\site-packages\IPython\core\events.py", line 88, in trigger
func(*args, **kwargs)
File "D:\Anaconda3\lib\site-packages\ipykernel\pylab\backend_inline.py", line 160, in configure_once
activate_matplotlib(backend)
File "D:\Anaconda3\lib\site-packages\IPython\core\pylabtools.py", line 311, in activate_matplotlib
matplotlib.pyplot.switch_backend(backend)
File "D:\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 231, in switch_backend
matplotlib.use(newbackend, warn=False, force=True)
File "D:\Anaconda3\lib\site-packages\matplotlib\__init__.py", line 1410, in use
reload(sys.modules['matplotlib.backends'])
File "D:\Anaconda3\lib\importlib\__init__.py", line 166, in reload
_bootstrap._exec(spec, module)
File "D:\Anaconda3\lib\site-packages\matplotlib\backends\__init__.py", line 16, in <module>
line for line in traceback.format_stack()
и сюжет бэк-теста:
График вывода моей торговой стратегии Как показано на графике, я не вижу точной точки, в которой каждая сделка открывается и закрывается, чтобы оценить прибыль и убыток моих сделок, как я могу отобразить каждую сделку от открытия до закрытия на графике?
Это становится длительным вопросом. Большое спасибо за помощь заранее!!!