Ploblem for Order and execute. buy() sell()



  • I use in sample code on Quickstart and change some data to PandaData.
    data it OK .
    But when i run. the result stake , price , comm is 0 like result below.
    And in plot is no buy or sell mark.
    finally i want to know to set backtest to exit like , after 6 tick or 6 line of data then exit order . I use it for binary option .

    Result

    Starting Portfolio Value: 1000.00
    2017-01-09, Close, 15144.02
    2017-01-09, BUY CREATE, 15144.02
    2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2017-01-09, Close, 15147.62
    2017-01-09, BUY CREATE, 15147.62
    2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2017-01-09, Close, 15143.85
    2017-01-09, BUY CREATE, 15143.85
    2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2017-01-09, Close, 15149.78
    2017-01-09, BUY CREATE, 15149.78
    2017-01-09, BUY EXECUTED, Price: 0.00, Cost: 0.00, Comm 0.00
    2017-01-09, Close, 15144.56
    2017-01-09, Close, 15144.45
    [<__main__.TestStrategy object at 0x0000017B7FDDD780>]
    Final Portfolio Value: 1000.00
    
    

    Plot
    0_1489427950566_figure_0.png
    Code

    from __future__ import (absolute_import, division, print_function,
                            unicode_literals)
    
    import datetime  # For datetime objects
    import os.path  # To manage paths
    import sys  # To find out the script name (in argv[0])
    
    # Import the backtrader platform
    import backtrader as bt
    
    import pandas as pd
    
    #for test
    import json
    import matplotlib
    import matplotlib.pyplot as plt
    #matplotlib.style.use('seaborn-paper')
    
    with open('test/r100 (1).json','r') as f:
        history = json.load(f)
    history_pd = pd.DataFrame(columns=['open','high','low','close','volume','openinterest'])
    history_pd.close = pd.to_numeric(pd.Series(history['history']['prices']))
    history_pd.open = history_pd.close
    history_pd.high = history_pd.close
    history_pd.low = history_pd.close
    history_pd.index = pd.to_datetime(pd.Series(history['history']['times']),unit='s')
    history_pd.index.name = 'date'
    
    #data = bt.feeds.PandasData(dataname = history_pd) 
    
    
    
    # Create a Stratey
    class TestStrategy(bt.Strategy):
        params = (
            ('maperiod', 15),
        )
    
        def log(self, txt, dt=None):
            ''' Logging function fot this strategy'''
            dt = dt or self.datas[0].datetime.date(0)
            print('%s, %s' % (dt.isoformat(), txt))
    
        def __init__(self):
            # Keep a reference to the "close" line in the data[0] dataseries
            self.dataclose = self.datas[0].close
    
            # To keep track of pending orders and buy price/commission
            self.order = None
            self.buyprice = None
            self.buycomm = None
    
            # Add a MovingAverageSimple indicator
            self.sma = bt.indicators.SimpleMovingAverage(
                self.datas[0], period=self.params.maperiod)
    
            # Indicators for the plotting show
            bt.indicators.ExponentialMovingAverage(self.datas[0], period=25)
            bt.indicators.WeightedMovingAverage(self.datas[0], period=25,
                                                subplot=True)
            bt.indicators.StochasticSlow(self.datas[0])
            bt.indicators.MACDHisto(self.datas[0])
            rsi = bt.indicators.RSI(self.datas[0])
            bt.indicators.SmoothedMovingAverage(rsi, period=10)
            bt.indicators.ATR(self.datas[0], plot=False)
    
        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
    
            # Check if an order has been completed
            # Attention: broker could reject order if not enougth cash
            if order.status in [order.Completed, order.Canceled, order.Margin]:
                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:  # Sell
                    self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                             (order.executed.price,
                              order.executed.value,
                              order.executed.comm))
    
                self.bar_executed = len(self)
    
            # Write down: no pending order
            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):
            # Simply log the closing price of the series from the reference
            self.log('Close, %.2f' % self.dataclose[0])
    
            # Check if an order is pending ... if yes, we cannot send a 2nd one
            if self.order:
                return
    
            # Check if we are in the market
            if not self.position:
    
                # Not yet ... we MIGHT BUY if ...
                if self.dataclose[0] > self.sma[0]:
    
                    # BUY, BUY, BUY!!! (with all possible default parameters)
                    self.log('BUY CREATE, %.2f' % self.dataclose[0])
    
                    # Keep track of the created order to avoid a 2nd order
                    self.order = self.buy()
    
            else:
    
                if self.dataclose[0] < self.sma[0]:
                    # SELL, SELL, SELL!!! (with all possible default parameters)
                    self.log('SELL CREATE, %.2f' % self.dataclose[0])
    
                    # Keep track of the created order to avoid a 2nd order
                    self.order = self.sell()
    
    
    if __name__ == '__main__':
        # Create a cerebro entity
        cerebro = bt.Cerebro()
    
        # Add a strategy
        cerebro.addstrategy(TestStrategy)
    
        # Datas are in a subfolder of the samples. Need to find where the script is
        # because it could have been called from anywhere
        modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
        #datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')
    
        # Create a Data Feed
        #data = bt.feeds.YahooFinanceCSVData(
        #    dataname=datapath,
        #    # Do not pass values before this date
        #    fromdate=datetime.datetime(2000, 1, 1),
        #    # Do not pass values before this date
        #    todate=datetime.datetime(2000, 12, 31),
        #    # Do not pass values after this date
        #    reverse=False)
        data = bt.feeds.PandasData(dataname = history_pd) 
        # Add the Data Feed to Cerebro
        cerebro.adddata(data)
    
        # Set our desired cash start
        cerebro.broker.setcash(1000.0)
    
        # Add a FixedSize sizer according to the stake
        cerebro.addsizer(bt.sizers.FixedSize, stake=10)
    
        # Set the commission
        cerebro.broker.setcommission(commission=0.90)
    
        # Print out the starting conditions
        print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
    
        # Run over everything
        cerebro.run()
    
        # Print out the final result
        print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
    
        # Plot the result
        cerebro.plot()
    

  • administrators

    Your starting cash is 1000 and the value of the asset is over 15000

    Starting Portfolio Value: 1000.00
    2017-01-09, Close, 15144.02
    2017-01-09, BUY CREATE, 15144.02
    

    It would be very difficult for the system to execute any operation, because the cash is not enough to acquire even a single item of the asset.

    Options

    Easiest

    • Increase your cash with cerebro.broker.set_cash(x) (apparently you are already reducing it to 1000, because the default is 10000)

    Advanced

    • Tell the system it is a future-like asset and reduce the margin to 1. You will be able to have over 15000 items of the asset in your portfolio

    • Create your own CommissionInfo scheme and decide how much an item of the asset costs



  • Thank you.
    finally i want to know to set backtest to exit like , after 6 tick or 6 line of data then exit order .



  • @backtrader Is it like a stock i must buy at close value , like 15144.02 Dollas and sell when it up to 16000 .. ? Cause i cannot buy at 15144.02 because i have 1000 of money.
    I use forex and binary option , sorry for i'm out understanding.




  • administrators

    If the asset has a value of 15000 you cannot buy with 1000 monetary units.

    If the value of a share of AAPL is 600 dollar you cannot buy it with 10 dollars.

    Your asset is obviously something you can acquire with less money, probably through leverage

    You seem to need a leverage which goes over 15 (probably 20 would be better)

    finally i want to know to set backtest to exit like , after 6 tick or 6 line of data then exit order .

    You can always know the number of bars of a data feed by using len(data) and from there calculate how many bars have elapsed.


Log in to reply
 

Looks like your connection to Backtrader Community was lost, please wait while we try to reconnect.