For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See:

Signals are not generating on intraday one minute data

  • result1.JPG

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

    Need help


  • administrators

    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 -

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

    from __future__ import (absolute_import, division, print_function,
    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]
            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)
            #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
            # 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():
                        'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                    self.buyprice = order.executed.price
                    self.buycomm = order.executed.comm
                else:  # Sell
                    self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                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:
            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:
            # 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 =
                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
        # 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,
        data = bt.feeds.PandasData(dataname=dataframe,
                            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)
        # Add the Data Feed to Cerebro
        # Broker = bt.brokers.BackBroker(**eval('dict(' + + ')'))
        # Set our desired cash start
        # Add a FixedSize sizer according to the stake
        cerebro.addsizer(bt.sizers.FixedSize, stake=1)
        # Set the commission
        #print(, broker=None))
        # Print out the starting conditions
        print('Starting Portfolio Value: %.2f' %
        # Run over everything
        # Print out the final result
        print('Final Portfolio Value: %.2f' %
        # Plot the result
        cerebro.plot(, 12, 6),, 12, 10))

  • administrators

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

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

Log in to reply