Skip to content

Commit bdfe35a

Browse files
committed
test bracket buy
1 parent c4d5066 commit bdfe35a

2 files changed

+277
-0
lines changed
+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
from datetime import datetime, timedelta
2+
import backtrader as bt
3+
import numpy as np
4+
5+
from keras.models import model_from_json
6+
7+
8+
class SmaCross(bt.Strategy):
9+
params = dict(
10+
limit=0.005,
11+
limdays=2,
12+
limdays2=1000,
13+
)
14+
15+
def __init__(self):
16+
self.dataclose = self.datas[0].close
17+
self.order = None
18+
self.orefs = list()
19+
20+
# self.signal_add(bt.SIGNAL_LONG, bt.ind.CrossOver(sma1, sma2))
21+
# load json and create model
22+
json_file = open('model.json', 'r')
23+
loaded_model_json = json_file.read()
24+
json_file.close()
25+
self.model = model_from_json(loaded_model_json)
26+
# load weights into new model
27+
self.model.load_weights("model.h5")
28+
print("Loaded model from disk")
29+
30+
# evaluate loaded model on test data
31+
self.model.compile(loss='mean_squared_error', optimizer='adam')
32+
33+
def log(self, txt, dt=None):
34+
''' Logging function fot this strategy'''
35+
dt = dt or self.datas[0].datetime.date(0)
36+
print('%s, %s' % (dt.isoformat(), txt))
37+
38+
def notify_order(self, order):
39+
print('{}: Order ref: {} / Type {} / Status {}'.format(
40+
self.data.datetime.date(0),
41+
order.ref, 'Buy' * order.isbuy() or 'Sell',
42+
order.getstatusname()))
43+
44+
if order.status == order.Completed:
45+
self.holdstart = len(self)
46+
47+
if not order.alive() and order.ref in self.orefs:
48+
self.orefs.remove(order.ref)
49+
50+
def notify_trade(self, trade):
51+
if not trade.isclosed:
52+
return
53+
54+
self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
55+
(trade.pnl, trade.pnlcomm))
56+
57+
def next(self):
58+
predicted_close = self.model.predict(np.array([[[self.dataclose[0]]]]))
59+
predicted_close = predicted_close[0][0]
60+
prev_predicted_close = self.model.predict(np.array([[[self.dataclose[-1]]]]))
61+
prev_predicted_close = prev_predicted_close[0][0]
62+
63+
if self.orefs:
64+
return # pending orders do nothing
65+
66+
if not self.position:
67+
if predicted_close > prev_predicted_close:
68+
close = self.data.close[0]
69+
p1 = close * (1.0 - self.p.limit)
70+
p2 = p1 - 0.02 * close
71+
p3 = p1 + 0.06 * close
72+
print('p1: {:.4f}, p2: {:.4f}, p3: {:.4f}'.format(
73+
p1,
74+
p2,
75+
p3
76+
))
77+
78+
valid1 = timedelta(self.p.limdays)
79+
valid2 = valid3 = timedelta(self.p.limdays2)
80+
81+
os = self.buy_bracket(
82+
price=p1, valid=valid1,
83+
stopprice=p2, stopargs=dict(valid=valid2),
84+
limitprice=p3, limitargs=dict(valid=valid3), )
85+
86+
self.orefs = [o.ref for o in os]
87+
88+
# if not self.position:
89+
# if predicted_close > prev_predicted_close:
90+
# self.order = self.buy()
91+
# else:
92+
# if predicted_close < prev_predicted_close:
93+
# self.order = self.sell()
94+
95+
cerebro = bt.Cerebro()
96+
97+
data = bt.feeds.GenericCSVData(
98+
dataname='eur_usd_1d.csv',
99+
separator=',',
100+
dtformat=('%Y%m%d'),
101+
tmformat=('%H%M%S'),
102+
datetime=0,
103+
time=-1,
104+
open=2,
105+
high=3,
106+
low=4,
107+
close=5,
108+
volume=6,
109+
openinterest=-1
110+
)
111+
112+
# data = bt.feeds.YahooFinanceData(dataname='YHOO', fromdate=datetime(2011, 1, 1),
113+
# todate=datetime(2012, 12, 31))
114+
cerebro.adddata(data)
115+
cerebro.broker.setcash(1000.0)
116+
117+
cerebro.addsizer(bt.sizers.FixedSize, stake=100)
118+
119+
cerebro.addstrategy(SmaCross)
120+
# Print out the starting conditions
121+
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
122+
123+
# Run over everything
124+
cerebro.run()
125+
126+
# Print out the final result
127+
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
128+
129+
# cerebro.plot()

bt_with_prediction_lstm_with_sp_tp.py

+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
from datetime import datetime
2+
import backtrader as bt
3+
import numpy as np
4+
5+
from keras.models import model_from_json
6+
7+
8+
class SmaCross(bt.Strategy):
9+
params = (
10+
('pfast', 100), ('pslow', 300),
11+
('stoploss', 0.01),
12+
('profit_mult', 3),
13+
('prdata', False),
14+
('prtrade', False),
15+
('prorder', False),
16+
)
17+
18+
def __init__(self):
19+
self.dataclose = self.datas[0].close
20+
self.order = None
21+
self.order_dict = {}
22+
23+
# self.signal_add(bt.SIGNAL_LONG, bt.ind.CrossOver(sma1, sma2))
24+
# load json and create model
25+
json_file = open('model.json', 'r')
26+
loaded_model_json = json_file.read()
27+
json_file.close()
28+
self.model = model_from_json(loaded_model_json)
29+
# load weights into new model
30+
self.model.load_weights("model.h5")
31+
print("Loaded model from disk")
32+
33+
# evaluate loaded model on test data
34+
self.model.compile(loss='mean_squared_error', optimizer='adam')
35+
36+
def log(self, txt, dt=None):
37+
''' Logging function fot this strategy'''
38+
dt = dt or self.datas[0].datetime.date(0)
39+
print('%s, %s' % (dt.isoformat(), txt))
40+
41+
def notify_order(self, order):
42+
if order.status in [order.Margin, order.Rejected]:
43+
return
44+
elif order.status == order.Completed:
45+
if 'name' in order.info:
46+
self.broker.cancel(self.order_dict[order.ref])
47+
self.order = None
48+
else:
49+
if order.isbuy():
50+
stop_loss = order.executed.price * (1.0 - (self.p.stoploss))
51+
take_profit = order.executed.price * (1.0 + self.p.profit_mult * (self.p.stoploss))
52+
53+
sl_ord = self.sell(exectype=bt.Order.Stop,
54+
price=stop_loss)
55+
sl_ord.addinfo(name="Stop")
56+
57+
tkp_ord = self.sell(exectype=bt.Order.Limit,
58+
price=take_profit)
59+
tkp_ord.addinfo(name="Prof")
60+
61+
self.order_dict[sl_ord.ref] = tkp_ord
62+
self.order_dict[tkp_ord.ref] = sl_ord
63+
64+
elif order.issell():
65+
stop_loss = order.executed.price * (1.0 + (self.p.stoploss))
66+
take_profit = order.executed.price * (1.0 - 3 * (self.p.stoploss))
67+
68+
sl_ord = self.buy(exectype=bt.Order.Stop,
69+
price=stop_loss)
70+
sl_ord.addinfo(name="Stop")
71+
72+
tkp_ord = self.buy(exectype=bt.Order.Limit,
73+
price=take_profit)
74+
tkp_ord.addinfo(name="Prof")
75+
76+
self.order_dict[sl_ord.ref] = tkp_ord
77+
self.order_dict[tkp_ord.ref] = sl_ord
78+
79+
if self.p.prorder:
80+
print("Open: %s %s %.2f %.2f %.2f" %
81+
(order.ref,
82+
self.data.num2date(order.executed.dt).date().isoformat(),
83+
order.executed.price,
84+
order.executed.size,
85+
order.executed.comm))
86+
87+
def notify_trade(self, trade):
88+
if not trade.isclosed:
89+
return
90+
91+
self.log('OPERATION PROFIT, GROSS %.2f, NET %.2f' %
92+
(trade.pnl, trade.pnlcomm))
93+
94+
def next(self):
95+
# print('Date: ', self.datas[0].datetime.datetime(0))
96+
predicted_close = self.model.predict(np.array([[[self.dataclose[0]]]]))
97+
# predicted_close = scaler.inverse_transform(predicted_close)[0][0]
98+
predicted_close = predicted_close[0][0]
99+
prev_predicted_close = self.model.predict(np.array([[[self.dataclose[-1]]]]))
100+
prev_predicted_close = prev_predicted_close[0][0]
101+
# print('Current close price: ', self.dataclose[0])
102+
# print('Predicted next close price: ', predicted_close)
103+
104+
if self.order:
105+
return
106+
107+
if not self.position:
108+
if predicted_close > prev_predicted_close:
109+
self.order = self.buy()
110+
else:
111+
if predicted_close < prev_predicted_close:
112+
self.order = self.sell()
113+
114+
cerebro = bt.Cerebro()
115+
116+
data = bt.feeds.GenericCSVData(
117+
dataname='eur_usd_1d.csv',
118+
separator=',',
119+
dtformat=('%Y%m%d'),
120+
tmformat=('%H%M%S'),
121+
datetime=0,
122+
time=-1,
123+
open=2,
124+
high=3,
125+
low=4,
126+
close=5,
127+
volume=6,
128+
openinterest=-1
129+
)
130+
131+
# data = bt.feeds.YahooFinanceData(dataname='YHOO', fromdate=datetime(2011, 1, 1),
132+
# todate=datetime(2012, 12, 31))
133+
cerebro.adddata(data)
134+
cerebro.broker.setcash(1000.0)
135+
136+
cerebro.addsizer(bt.sizers.FixedSize, stake=10)
137+
138+
cerebro.addstrategy(SmaCross)
139+
# Print out the starting conditions
140+
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
141+
142+
# Run over everything
143+
cerebro.run()
144+
145+
# Print out the final result
146+
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
147+
148+
# cerebro.plot()

0 commit comments

Comments
 (0)