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/

    Signals are not generating on intraday one minute data

    General Code/Help
    2
    4
    953
    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.
    • Ramesh Gangappa
      Ramesh Gangappa last edited by

      result1.JPG

      Wanted to generate cross over signals on one minute data from csv file.
      Used panda dataframe to extract the data.

      Need help
      code1.JPG

      Thanks
      Ramesh

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

        Unbelievable as it may seem ... one cannot quote where your error is ... because quoting images is impossible.

        But if you look at the chart you will see that the data is 1-Day which means you haven't told the platform (hence the broker also not) that your data is 1-Minute

        Read: Backtrader Community - FAQ - timeframe/compression - https://community.backtrader.com/topic/381/faq

        1 Reply Last reply Reply Quote 1
        • Ramesh Gangappa
          Ramesh Gangappa last edited by backtrader

          Thanks a lot, now data is set to 1-Minute.
          Signals are generating but it is displaying out of the boundary, how can I set signal position near to price or cross over.
          result2.png

          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 backtrader.feeds as btfeeds
          import pandas as pd
          import random
          import json
          
          
          # Import the backtrader platform
          import backtrader as bt
          
          
          class PandasData(btfeeds.DataBase):
          
            params = (
              ('fromdate', datetime.datetime(2019, 12, 6)),
              ('todate', datetime.datetime(2019, 12, 10)),
              ('nullvalue', 0.0),
              ('dtformat', ('%Y-%m-%dT%H:%M:%S%z')),
              #('tmformat', ('%H.%M.%S')),
              ('timeframe', bt.TimeFrame.Minutes),
              ('datetime', 0),
              ('open', 1),
              ('high', 2),
              ('low', 3),
              ('close', 4),
              ('volume', 5),
              ('openinterest', -1)
          ) 
          
          # 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 enough cash
                  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:  # 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)
          
                  elif order.status in [order.Canceled, order.Margin, order.Rejected]:
                      self.log('Order Canceled/Margin/Rejected')
          
                  # 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, './BANKNIFTY19DECFUT.csv')
          
              dataframe = pd.read_csv(datapath,
                                          skiprows=0,
                                          header=0,
                                          parse_dates=True,
                                          index_col=0)
              
              data = bt.feeds.PandasData(dataname=dataframe,
                                  name='BANKNIFTY',
                                  fromdate=datetime.datetime(2019, 12, 6),
                                  todate=datetime.datetime(2019, 12, 9),
          
                                  timeframe=bt.TimeFrame.Minutes, compression=1,
                                  sessionstart=datetime.time(9, 0), sessionend=datetime.time(16, 0)
              )
              print(dataframe)
              # Add the Data Feed to Cerebro
              cerebro.adddata(data)
          
              # Broker
              cerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')'))
          
          
              # Set our desired cash start
              cerebro.broker.setcash(100000.0)
          
              # Add a FixedSize sizer according to the stake
              cerebro.addsizer(bt.sizers.FixedSize, stake=1)
          
              # Set the commission
              cerebro.broker.setcommission(commission=0.0)
          
              #print(cerebro.broker.getposition(data=None, broker=None))
              # 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(start=datetime.date(2019, 12, 6), end=datetime.date(2019, 12, 10))
          
          B 1 Reply Last reply Reply Quote 0
          • B
            backtrader administrators @Ramesh Gangappa last edited by

            @Ramesh-Gangappa said in Signals are not generating on intraday one minute data:

            Signals are generating but it is displaying out of the boundary

            No. They are being displayed according to the default configuration (there has to be one) and your data has a low variability, which doesn't cope well with the defaults.

            @Ramesh-Gangappa said in Signals are not generating on intraday one minute data:

            how can I set signal position near to price or cross over.

            You read this and disable the default configuration (stdstats=True) and manually add the BuySell observer with your desired configuration (i.e.: no distance to execution price)

            • Docs - Observers and Statistics - https://www.backtrader.com/docu/observers-and-statistics/observers-and-statistics/

            Or you change the plotting configuration to let the observer influence the y-axis scale

            • Docs - Plotting - https://www.backtrader.com/docu/plotting/plotting/ - See plotylimited
            1 Reply Last reply Reply Quote 0
            • 1 / 1
            • First post
              Last post
            Copyright © 2016, 2017, 2018 NodeBB Forums | Contributors
            $(document).ready(function () { app.coldLoad(); }); }