-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstrategy.py
68 lines (59 loc) · 2.5 KB
/
strategy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import backtrader as bt
# now we develop a portfolio trading strategy
class TestStrategy(bt.Strategy):
params = (
("hold_days", 10),
)
def __init__(self):
# Keep a reference to the "close" line in the data[0] dataseries
self.hold_counters = {d._name: 0 for d in self.datas}
self.in_positions = {d._name: False for d in self.datas}
def next(self):
for i, d in enumerate(self.datas):
if self.in_positions[d._name]:
if self.hold_counters[d._name] >= self.params.hold_days:
self.sell(data=d, size=20)
self.in_positions[d._name] = False
self.hold_counters[d._name] = 0
else:
self.hold_counters[d._name] += 1
elif d.signal[0] == 1:
self.buy(data=d, size=20)
self.in_positions[d._name] = True
def notify_order(self, order):
# 未被处理的订单
if order.status in [order.Submitted, order.Accepted]:
return
# 已经处理的订单
if order.status in [order.Completed, order.Canceled, order.Margin]:
if order.isbuy():
self.log(
"Order Reference: %.0f, Executed Price: %.2f, Executed Amount: %.2f, Commission: %.2f, Executed Volume: %.2f, Stock Name: %s"
% (
order.ref,
order.executed.price,
order.executed.price * abs(order.executed.size),
order.executed.comm,
order.executed.size,
order.data._name,
)
) # 股票名称
else: # Sell
self.log(
"Order Reference: %.0f, Executed Price: %.2f, Executed Amount: %.2f, Commission: %.2f, Executed Volume: %.2f, Stock Name: %s"
% (
order.ref,
order.executed.price,
order.executed.price * abs(order.executed.size),
order.executed.comm,
order.executed.size,
order.data._name,
)
)
def log(self, txt):
dt = str(self.datas[0].datetime.datetime())
print("%s, %s" % (dt, txt))
def stop(self):
self.log(
"The Excessive Return is {}.".format(self.broker.getvalue() / 100_000 - 1 - 0.03),
)