In the results you will see the problem. Here are my codes and result examples.
every time pre_load consume time :2.123161554336548
date: 2021-03-25
price 50557.69458913322
takeprofit: 53085.57931858989
stoploss: 48029.809859676556
501
2021-03-25, BUY EXECUTED, Price: 50557.69, Cost: 80000.00, Comm 80.00, Bar 501.00
2021-03-26, SELL EXECUTED, Price: 53085.58, Cost: 80000.00, Comm 84.00, Bar 501.00
2021-03-26, Order Canceled/Margin/Rejected
#######2021-03-26 BTCUSDTTF2 price 50557.69 Closed: PnL Gross 4000.0, Net 3836.0#######
date: 2021-04-17
price 56047.47360016612
takeprofit: 58849.84728017443
stoploss: 53245.099920157816
642
2021-04-18, BUY EXECUTED, Price: 56047.47, Cost: 83068.80, Comm 83.07, Bar 642.00
2021-04-18, SELL EXECUTED, Price: 53245.10, Cost: 83068.80, Comm 78.92, Bar 642.00
2021-04-18, Order Canceled/Margin/Rejected
#######2021-04-18 BTCUSDTTF2 price 56047.47 Closed: PnL Gross -4153.44, Net -4315.42#######
date: 2021-04-18
price 56049.13806918237
takeprofit: 58851.59497264149
stoploss: 53246.681165723254
643
2021-04-18, BUY EXECUTED, Price: 56049.14, Cost: 79616.46, Comm 79.62, Bar 643.00
2021-04-18, SELL EXECUTED, Price: 53246.68, Cost: 79616.46, Comm 75.64, Bar 643.00
2021-04-18, Order Canceled/Margin/Rejected
#######2021-04-18 BTCUSDTTF2 price 56049.14 Closed: PnL Gross -3980.82, Net -4136.08#######
date: 2021-04-18
price 56056.961502129896
takeprofit: 58859.809577236396
stoploss: 53254.113427023396
644
2021-04-18, BUY EXECUTED, Price: 55000.01, Cost: 74868.82, Comm 74.87, Bar 644.00
2021-04-18, SELL EXECUTED, Price: 53254.11, Cost: 74868.82, Comm 72.49, Bar 644.00
2021-04-18, Order Canceled/Margin/Rejected
#######2021-04-18 BTCUSDTTF2 price 55000.01 Closed: PnL Gross -2376.6, Net -2523.96#######
date: 2021-04-18
price 56079.02556398865
takeprofit: 58882.97684218809
stoploss: 53275.07428578922
648
2021-04-18, BUY EXECUTED, Price: 55720.66, Cost: 73813.70, Comm 73.81, Bar 648.00
2021-04-22, SELL EXECUTED, Price: 53275.07, Cost: 73813.70, Comm 70.57, Bar 648.00
2021-04-22, Order Canceled/Margin/Rejected
#######2021-04-22 BTCUSDTTF2 price 55720.66 Closed: PnL Gross -3239.69, Net -3384.08#######
date: 2021-04-27
price 55334.898813251966
takeprofit: 58101.64375391457
stoploss: 52568.15387258936
701
2021-04-27, BUY EXECUTED, Price: 54981.86, Cost: 71124.48, Comm 71.12, Bar 701.00
2021-04-29, SELL EXECUTED, Price: 52568.15, Cost: 71124.48, Comm 68.00, Bar 701.00
2021-04-29, Order Canceled/Margin/Rejected
#######2021-04-29 BTCUSDTTF2 price 54981.86 Closed: PnL Gross -3122.37, Net -3261.49#######
date: 2021-05-03
price 55956.12936976721
takeprofit: 58753.93583825557
stoploss: 53158.32290127884
738
2021-05-04, BUY EXECUTED, Price: 55956.13, Cost: 68971.97, Comm 68.97, Bar 738.00
2021-05-04, SELL EXECUTED, Price: 53158.32, Cost: 68971.97, Comm 65.52, Bar 738.00
2021-05-04, Order Canceled/Margin/Rejected
#######2021-05-04 BTCUSDTTF2 price 55956.13 Closed: PnL Gross -3448.6, Net -3583.09#######
date: 2021-05-05
price 55993.48594642696
takeprofit: 58793.16024374831
stoploss: 53193.81164910561
747
2021-05-05, BUY EXECUTED, Price: 54858.35, Cost: 64765.36, Comm 64.77, Bar 747.00
2021-05-08, SELL EXECUTED, Price: 58793.16, Cost: 64765.36, Comm 69.41, Bar 747.00
2021-05-08, Order Canceled/Margin/Rejected
#######2021-05-08 BTCUSDTTF2 price 54858.35 Closed: PnL Gross 4645.41, Net 4511.23#######
date: 2021-05-09
price 56236.06174008065
takeprofit: 59047.86482708469
stoploss: 53424.25865307661
771
2021-05-09, BUY EXECUTED, Price: 56236.06, Cost: 69714.48, Comm 69.71, Bar 771.00
2021-05-10, SELL EXECUTED, Price: 59047.86, Cost: 69714.48, Comm 73.20, Bar 771.00
2021-05-10, Order Canceled/Margin/Rejected
#######2021-05-10 BTCUSDTTF2 price 56236.06 Closed: PnL Gross 3485.72, Net 3342.81#######
date: 2021-05-10
price 56262.81097297412
takeprofit: 59075.951521622825
stoploss: 53449.67042432541
778
2021-05-10, BUY EXECUTED, Price: 56262.81, Cost: 72388.73, Comm 72.39, Bar 778.00
2021-05-10, SELL EXECUTED, Price: 53449.67, Cost: 72388.73, Comm 68.77, Bar 778.00
2021-05-10, Order Canceled/Margin/Rejected
#######2021-05-10 BTCUSDTTF2 price 56262.81 Closed: PnL Gross -3619.44, Net -3760.59#######
date: 2021-05-10
price 56266.91049510851
takeprofit: 59080.25601986394
stoploss: 53453.56497035308
780
2021-05-10, BUY EXECUTED, Price: 55733.76, Cost: 68722.85, Comm 68.72, Bar 780.00
2021-05-11, SELL EXECUTED, Price: 53453.56, Cost: 68722.85, Comm 65.91, Bar 780.00
2021-05-11, Order Canceled/Margin/Rejected
#######2021-05-11 BTCUSDTTF2 price 55733.76 Closed: PnL Gross -2811.61, Net -2946.24#######
date: 2021-05-11
price 56274.56630029635
takeprofit: 59088.29461531117
stoploss: 53460.83798528153
784
2021-05-11, BUY EXECUTED, Price: 55210.47, Cost: 65755.92, Comm 65.76, Bar 784.00
2021-05-12, SELL EXECUTED, Price: 53460.84, Cost: 65755.92, Comm 63.67, Bar 784.00
2021-05-12, Order Canceled/Margin/Rejected
#######2021-05-12 BTCUSDTTF2 price 55210.47 Closed: PnL Gross -2083.82, Net -2213.25#######
date: 2021-05-31
price 48309.38748860005
takeprofit: 50724.85686303005
stoploss: 45893.91811417005
903
2021-05-31, BUY EXECUTED, Price: 35850.17, Cost: 48423.69, Comm 48.42, Bar 903.00
2021-05-31, SELL EXECUTED, Price: 35850.17, Cost: 48423.69, Comm 48.42, Bar 903.00
2021-05-31, Order Canceled/Margin/Rejected
#######2021-05-31 BTCUSDTTF2 price 35850.17 Closed: PnL Gross 0.0, Net -96.85#######
date: 2021-05-31
price 48304.230663942246
takeprofit: 50719.44219713936
stoploss: 45889.01913074513
904
2021-05-31, BUY EXECUTED, Price: 36836.46, Cost: 49702.13, Comm 49.70, Bar 904.00
2021-05-31, SELL EXECUTED, Price: 36836.46, Cost: 49702.13, Comm 49.70, Bar 904.00
2021-05-31, Order Canceled/Margin/Rejected
#######2021-05-31 BTCUSDTTF2 price 36836.46 Closed: PnL Gross 0.0, Net -99.4#######
date: 2021-05-31
price 48294.75301333754
takeprofit: 50709.49066400442
stoploss: 45880.01536267066
905
2021-05-31, BUY EXECUTED, Price: 36961.16, Cost: 49819.31, Comm 49.82, Bar 905.00
2021-05-31, SELL EXECUTED, Price: 36961.16, Cost: 49819.31, Comm 49.82, Bar 905.00
2021-05-31, Order Canceled/Margin/Rejected
#######2021-05-31 BTCUSDTTF2 price 36961.16 Closed: PnL Gross 0.0, Net -99.64#######
date: 2021-05-31
price 48281.637467536864
takeprofit: 50695.71934091371
stoploss: 45867.55559416002
906
2021-05-31, BUY EXECUTED, Price: 36865.75, Cost: 49643.34, Comm 49.64, Bar 906.00
2021-06-01, SELL EXECUTED, Price: 36865.75, Cost: 49643.34, Comm 49.64, Bar 906.00
2021-06-01, Order Canceled/Margin/Rejected
#######2021-06-01 BTCUSDTTF2 price 36865.75 Closed: PnL Gross 0.0, Net -99.29#######
Profit Percent: 5 Stop-loss Percent: 5 Final PnL: -18829.35
Total Trades: 16
Winning Trades: 3
Losing Trades: 13
81170.64902433063
import backtrader as bt
import backtrader.analyzers as btanalyzers
import matplotlib.pyplot as plt
from Vidya import Vidya
import math
from PrintAnalyzers import printTradeAnalysis, printSQN
from utils import size_by_percent
from get_binance_data import get_data
import datetime as dt
TF1 = '30m'
TF2 = '4h'
PERIOD = 50
START_DATE = dt.datetime(2021, 1, 1)
END_DATE = dt.datetime(2021, 6, 1)
class VidyaTouchStrategy(bt.Strategy):
params = dict(profit_percent=5, stop_loss_percent=5,
cash_percent=80, oneplot=True, hold=40)
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):
self.startcash = self.broker.getvalue()
self.inds = dict()
self.orders = dict()
self.o = dict() # orders per data (main, stop, limit, manual-close)
self.holding = dict() # holding periods per data
self.winning_trades = 0
self.losing_trades = 0
self.last_order_bar = 0
for i, d in enumerate(self.datas):
dn = d._name
if "TF1" not in dn:
self.inds[d] = dict()
self.inds[d]['vidya100'] = self.vidya100 = Vidya(
d, period=PERIOD, above_percent=1.03)
if i > 0:
if self.p.oneplot:
d.plotinfo.plotmaster = self.datas[0]
def next(self):
for i, d in enumerate(self.datas):
date, dn = self.datetime.date(), d._name # Get time and stock code
if "TF1" not in dn:
is_not_last = True # len(self) < len(d.high.array) - 3
pos = self.getposition(d).size
touched_above = self.inds[d]['vidya100'].buy_price[0] if is_not_last and self.inds[
d]['vidya100'].touched_above[0] else None
stop_loss = touched_above * \
(1 - self.p.stop_loss_percent /
100) if touched_above else None
take_profit = touched_above * \
(1 + self.p.profit_percent /
100) if touched_above else None
if not pos and not self.o.get(d, None) and self.last_order_bar != len(d):
if touched_above and not math.isnan(touched_above):
print(
f"date: {date}\nprice {touched_above}\ntakeprofit: {take_profit}\nstoploss: {stop_loss}\n")
stake_size = size_by_percent(
percent=self.p.cash_percent, current_price=touched_above, current_cash=self.broker.get_cash())
self.o[d] = self.buy_bracket(
data=d,
size=stake_size,
price=touched_above,
tradeid="qwe",
oargs=dict(valid=dt.timedelta(1)),
stopprice=stop_loss,
# stopargs=dict(valid=valid2),
limitprice=take_profit,
# limitargs=dict(valid=valid3),
)
self.last_order_bar = len(d)
print(self.last_order_bar)
self.holding[d] = 0
def notify_trade(self, trade):
dt = self.data.datetime.date()
if trade.isclosed:
print('#######{} {} price {} Closed: PnL Gross {}, Net {}#######\n'.format(
dt,
trade.data._name,
round(trade.price, 2),
round(trade.pnl, 2),
round(trade.pnlcomm, 2)))
if round(trade.pnlcomm, 2) > 0:
self.winning_trades += 1
else:
self.losing_trades += 1
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
if order.status in [order.Completed]:
if order.isbuy():
self.log(
'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f, Bar %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm,
self.last_order_bar))
else: # Sell
self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f, Bar %.2f' %
(order.executed.price,
order.executed.value,
order.executed.comm,
self.last_order_bar))
self.remove_orders(order)
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.remove_orders(order)
self.log('Order Canceled/Margin/Rejected')
def stop(self):
pnl = round(self.broker.getvalue() - self.startcash, 2)
print('Profit Percent: {} Stop-loss Percent: {} Final PnL: {}'.format(
self.p.profit_percent, self.p.stop_loss_percent, pnl, ))
print(
f"Total Trades: {self.winning_trades + self.losing_trades}\n Winning Trades: {self.winning_trades} \n Losing Trades: {self.losing_trades}")
def remove_orders(self, order):
for key, value in self.o.items():
new_list = []
for idx, elm in enumerate(value):
if elm.tradeid != order.tradeid:
new_list.append(elm)
else:
self.o[key] = new_list
tickers = [
'BTCUSDT',
# 'ETHUSDT',
# 'ADAUSDT',
# 'LINKUSDT',
# 'XRPUSDT',
# 'TRONUSDT',
]
for ticker in tickers:
cerebro = bt.Cerebro()
df = get_data(ticker, TF1, START_DATE, END_DATE)
data = bt.feeds.PandasData(
dataname=df, timeframe=bt.TimeFrame.Minutes, compression=1)
cerebro.adddata(data, name=ticker+"TF1")
df2 = get_data(ticker, TF2, START_DATE, END_DATE)
data2 = bt.feeds.PandasData(
dataname=df2, )
cerebro.adddata(data2, name=ticker+"TF2")
cerebro.addstrategy(VidyaTouchStrategy)
cerebro.broker.setcash(100000)
cerebro.broker.setcommission(commission=0.001)
cerebro.addobserver(bt.observers.Trades)
cerebro.addobserver(bt.observers.BuySell)
cerebro.addanalyzer(btanalyzers.SharpeRatio, _name="sharpe")
cerebro.addanalyzer(btanalyzers.TradeAnalyzer, _name="trade")
# cerebro.addwriter(bt.WriterFile, csv=False)
back = cerebro.run(stdstats=False)
print(cerebro.broker.getvalue())
printTradeAnalysis(back[0].analyzers.trade.get_analysis())
print(back[0].analyzers.sharpe.get_analysis())
# cerebro.plot(style='candle')