Navigation

    Backtrader Community

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/

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

    General Code/Help
    4
    8
    3797
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      kuuhmu last edited by

      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()
      
      1 Reply Last reply Reply Quote 0
      • B
        backtrader administrators last edited by

        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

        K 1 Reply Last reply Reply Quote 1
        • K
          kuuhmu last edited by

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

          A 1 Reply Last reply Reply Quote 0
          • K
            kuuhmu @backtrader last edited by

            @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.

            1 Reply Last reply Reply Quote 0
            • A
              ab_trader @kuuhmu last edited by

              @kuuhmu check out discussion here
              https://community.backtrader.com/topic/236/check-hold-period

              • If my answer helped, hit reputation up arrow at lower right corner of the post.
              • Python Debugging With Pdb
              • New to python and bt - check this out
              1 Reply Last reply Reply Quote 0
              • B
                backtrader administrators last edited by

                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

                • See this post for leverage: Blog - BTFD (Buy The F... Dip)

                • And the broker docs for the call: Docs - Broker in the method setcommission

                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.

                1 Reply Last reply Reply Quote 0
                • A
                  Askhat Sharipov last edited by

                  @kuuhmu said in Ploblem for Order and execute. buy() sell():

                  And in plot is no buy or sell mark.

                  How did you resolve the issue with missed buy sell marks using Pandas data load? Even if we place Starting Portfolio Value to 10K (now BUY, SELL will be executed), buy-sell marks would be still missed.

                  1 Reply Last reply Reply Quote 0
                  • B
                    backtrader administrators last edited by

                    His/Her marks were NOT missing, because no operations were executed.

                    In your case, you may want to share:

                    • Operations log
                    • Chart

                    Which would be the minimum to ascertain that you indeed are missing your marks.

                    1 Reply Last reply Reply Quote 0
                    • 1 / 1
                    • First post
                      Last post
                    Copyright © 2016, 2017, 2018, 2019, 2020, 2021 NodeBB Forums | Contributors