@rajanprabu
Hi @rajanprabu , this is complete code for ohlc_TCS
from kiteconnect import KiteConnect
import pandas as pd
import datetime as dt
import os
import time
import numpy as np
import backtrader as bt
from cerebro_stra import *
cwd = os.chdir(".....\\strategy")
#generate trading session
access_token = open("access_token.txt",'r').read()
key_secret = open("api_keys.txt",'r').read().split()
kite = KiteConnect(api_key=key_secret[0])
kite.set_access_token(access_token)
#get dump of all NSE instruments
instrument_dump = kite.instruments("NSE")
instrument_df = pd.DataFrame(instrument_dump)
def instrumentLookup(instrument_df,symbol):
"""Looks up instrument token for a given script from instrument dump"""
try:
return instrument_df[instrument_df.tradingsymbol==symbol].instrument_token.values[0]
except:
return -1
# Below is only for 5 minutes interveral
def fetchOHLCExtended(ticker,from_date,to_date,interval):
"""extracts historical data and outputs in the form of dataframe
inception date string format - dd-mm-yyyy"""
instrument = instrumentLookup(instrument_df,ticker)
from_date = dt.datetime.strptime(from_date, "%d-%m-%Y")
to_date = dt.datetime.strptime(to_date, "%d-%m-%Y")
data = pd.DataFrame(columns=['date', 'open', 'high', 'low', 'close', 'volume'])
while True:
if (to_date.date() - from_date.date() ) <= dt.timedelta(100):
data = data.append(pd.DataFrame(kite.historical_data(instrument,from_date,to_date,interval)),ignore_index=True)
break
else:
to_date = from_date + dt.timedelta(100)
data = data.append(pd.DataFrame(kite.historical_data(instrument,from_date,to_date,interval)),ignore_index=True)
from_date = to_date
data.set_index("date")
return data
from_date = "01-10-2020"
to_date = "05-01-2021"
#
ohlc_TCS = fetchOHLCExtended("TCS",from_date, to_date, '5minute')
ohlc_TCS.info()
ohlc_TCS['date'] = pd.to_datetime(ohlc_TCS['date'], format = "%m/%d/%Y %H:%M:%S %z" )
ohlc_TCS.info()
cerebro = bt.Cerebro()
cerebro.broker.set_cash(100000)
cerebro.broker.setcommission(commission=0.001)
data = bt.feeds.PandasData(dataname=ohlc_TCS)
cerebro.adddata(data)
cerebro.addstrategy(macdStrategy)
print('Starting Portfolio Value : %0.2f' % cerebro.broker.getvalue())
cerebro.run()
cerebro.plot()
print('Final Portfolio Value : %0.2f' % cerebro.broker.getvalue())
Below is the code for strategy, is slightly tweaked from strategy code from backtrader site.
import math
import backtrader as bt
from backtrader.indicators import EMA
import argparse
import datetime
import os.path
import time
import sys
import backtrader as bt
import backtrader.feeds as btfeeds
import backtrader.indicators as btind
class macdStrategy(bt.Strategy):
lines = ('macd', 'signal', 'histo',)
params = (('period_me1', 12), ('period_me2', 26), ('period_signal', 9),)
def log(self,txt, dt = None):
dt = dt or self.datas[0].datatime.data(0)
print('%s, %s' % (dt.isoformat(), txt))
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
self.log('ORDER ACCEPTED/SUBMITTED', dt=order.created.dt)
self.order = order
return
if order.status in [order.Expired]:
self.log('BUY EXPIRED')
elif 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
elif order.issell():
self.log(
'SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
# Sentinel to None: new orders allowed
self.order = None
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
me1 = EMA(self.data, period=self.p.period_me1)
me2 = EMA(self.data, period=self.p.period_me2)
self.lines.macd = me1 - me2
self.lines.signal = EMA(self.l.macd, period=self.p.period_signal)
self.lines.histo = self.l.macd - self.l.signal
self.crossover = btind.CrossOver(self.lines.macd, self.lines.signal)
def next(self):
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:
if self.crossover > 0:
self.log('BUY CREATE, %.2f' %self.dataclose[0])
self.order = self.buy()
else:
# Already in the market ... we might sell
if self.crossover < 0:
self.log('SELL CREATE, %.2f' %self.dataclose[0])
self.order = self.sell()
i have one more api code for kite connect, if above code is not enough, i can supply that one as well.