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()

и сюжет бэк-теста:

График вывода моей торговой стратегии Как показано на графике, я не вижу точной точки, в которой каждая сделка открывается и закрывается, чтобы оценить прибыль и убыток моих сделок, как я могу отобразить каждую сделку от открытия до закрытия на графике?

Это становится длительным вопросом. Большое спасибо за помощь заранее!!!

0 ответов

Другие вопросы по тегам