defining code for target price and stoploss price
-
hi, i am trying to get tgt and stoploss price for my startegy . i want 1% stoploss and tgt.
""""
import datetime
from collections import OrderedDict
import backtrader as bt
import backtrader.feeds as btfeeds
from datetime import date
from nsepy import get_history
d = get_history( symbol = "BPCL", start = date(2017,1,1), end = date(2020,5,1))
d.to_csv("BPCL.csv")class mystrategy(bt.SignalStrategy):
def log(self, txt, dt = None):
dt = dt or self.datas[0].datetime.date(0)
print("%s, %s" % (dt, txt))def __init__(self): self.dataclose = self.datas[0].close self.order = None self.buyprice = None self.buycomm = None self.rsi = bt.ind.RSI_EMA(self.datas[0], period = 14) def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return 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: 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") 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): self.log("Close, %.2f" % self.dataclose[0]) if self.order: return if not self.position: if self.rsi < 20: self.log("Buy Create, %.2f" % self.dataclose[0]) self.order = self.buy() else: if self.rsi > 80: self.log("Sell Create, %.2f" % self.dataclose[0]) self.order = self.sell()
def printTradeAnalysis(analyzer):
total_open = analyzer.total.open
total_closed = analyzer.total.closed
total_won = analyzer.won.total
total_lost = analyzer.lost.total
win_streak = analyzer.streak.won.longest
lost_streak = analyzer.streak.lost.longest
pnl_net = round(analyzer.pnl.net.total,2)
strike_rate = (total_won/total_closed)*100h1 = ["Total Open", "Total Closed", "Total Won", "Total Lost"] h2 = ["Strike Rate", "Win Streak", "Losing Streak", "PnL Net"] r1 = [total_open, total_closed, total_won, total_lost] r2 = [strike_rate, win_streak, lost_streak, pnl_net] if len(h1) > len(h2): header_length = len(h1) else: header_length = len(h2) print_list = [h1,r1,h2,r2] row_format = "{:<15}" * (header_length+1) print("Trade Analysis Results:") for row in print_list: print(row_format.format("", *row))
def printSQN(analyzer):
sqn = round(analyzer.sqn, 2)
print("SQN:{}".format(sqn))if name == "main":
cerebro = bt.Cerebro()
cerebro.addstrategy(mystrategy)data = btfeeds.GenericCSVData( dataname='BPCL.csv', fromdate=datetime.datetime(2017, 1, 10), todate=datetime.datetime(2020, 4, 25), nullvalue=0.0, dtformat=('%Y-%m-%d'), datetime=0, high=5, low=6, open=4, close=8, volume=10, openinterest=-1, ) cerebro.adddata(data) startcash = 10000000 cerebro.broker.setcash(startcash) cerebro.addsizer(bt.sizers.FixedSize, stake = 10) cerebro.broker.setcommission(commission = 0.01) cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name = "ta") cerebro.addanalyzer(bt.analyzers.SQN, _name = "sqn") print("Starting Portfolio Value: %.2f" % cerebro.broker.getvalue()) strategies = cerebro.run() firstStrat = strategies[0] printTradeAnalysis(firstStrat.analyzers.ta.get_analysis()) printSQN(firstStrat.analyzers.sqn.get_analysis()) print("Final Portfolio Value: %.2f" % cerebro.broker.getvalue()) cerebro.plot(style = "candlestick")
"""""
data is downloaded from nsepy for backtesting.
plz assist me. -
Please mind the formatting of your posts, and the usage of 'backticks' - see the top of the page. This way your code will be much more readable. Also, there is a preview pane that shows exactly how the post will be visible to others.