Signals are not generating on intraday one minute data
-
Wanted to generate cross over signals on one minute data from csv file.
Used panda dataframe to extract the data.Need help
Thanks
Ramesh -
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 is1-Minute
Read: Backtrader Community - FAQ - timeframe/compression - https://community.backtrader.com/topic/381/faq
-
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, 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))
-
@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 theBuySell
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
- Docs - Plotting - https://www.backtrader.com/docu/plotting/plotting/ - See
plotylimited
- Docs - Plotting - https://www.backtrader.com/docu/plotting/plotting/ - See