Python自动化交易学习笔记(10)——1.添加卖出条件参数配置,2.交易单位大小
Demo10主要介绍如何自定义策略参数。
Demo10主要做了两处修改:
-
1234567
1.
在策略中添加了自定义参数:<br><br>params
=
(
(
'exitbars'
,
5
),
)
2.
在使用时,可使用
self
.params.exitbars进行调用:
if
len
(
self
) >
=
(
self
.bar_executed
+
self
.params.exitbars):
12# 设置交易单位大小
cerebro.addsizer(bt.sizers.FixedSize, stake
=
100
)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116from
__future__
import
(absolute_import, division, print_function,
unicode_literals)
import
datetime
# 用于datetime对象操作
import
os.path
# 用于管理路径
import
sys
# 用于在argvTo[0]中找到脚本名称
import
backtrader as bt
# 引入backtrader框架
# 创建策略
class
TestStrategy(bt.Strategy):
params
=
(
(
'exitbars'
,
5
),
)
def
log(
self
, txt, dt
=
None
):
''' 策略的日志函数'''
dt
=
dt
or
self
.datas[
0
].datetime.date(
0
)
print
(
'%s, %s'
%
(dt.isoformat(), txt))
def
__init__(
self
):
# 引用data[0]数据的收盘价数据
self
.dataclose
=
self
.datas[
0
].close
# 用于记录订单状态
self
.order
=
None
self
.buyprice
=
None
self
.buycomm
=
None
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(
'买入执行, 价格: %.2f, 成交金额: %.2f, 佣金 %.2f'
%
(order.executed.price,
order.executed.value,
order.executed.comm))
self
.buyprice
=
order.executed.price
self
.buycomm
=
order.executed.comm
else
:
# 卖
self
.log(
'卖出执行, 价格: %.2f, 买入成交金额: %.2f, 佣金 %.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(
'权益, 赢亏 %.2f, 总赢亏(含佣金) %.2f'
%
(trade.pnl, trade.pnlcomm))
def
next
(
self
):
# 日志输出收盘价数据
self
.log(
'收盘价, %.2f'
%
self
.dataclose[
0
])
# 检查是否有订单等待处理,如果是就不再进行其他下单
if
self
.order:
return
# 检查是否已经进场
if
not
self
.position:
# 还未进场,则只能进行买入
# 当日收盘价小于前一日收盘价
if
self
.dataclose[
0
] <
self
.dataclose[
-
1
]:
# 前一日收盘价小于前前日收盘价
if
self
.dataclose[
-
1
] <
self
.dataclose[
-
2
]:
# 买买买
self
.log(
'买入信号, %.2f'
%
self
.dataclose[
0
])
# 记录订单避免二次下单
self
.order
=
self
.buy()
# 如果已经在场内,则可以进行卖出操作
else
:
# 卖卖卖
if
len
(
self
) >
=
(
self
.bar_executed
+
self
.params.exitbars):
self
.log(
'卖出信号, %.2f'
%
self
.dataclose[
0
])
# 记录订单避免二次下单
self
.order
=
self
.sell()
# 创建cerebro实体
cerebro
=
bt.Cerebro()
# 添加策略
cerebro.addstrategy(TestStrategy)
# 先找到脚本的位置,然后根据脚本与数据的相对路径关系找到数据位置
# 这样脚本从任意地方被调用,都可以正确地访问到数据
modpath
=
os.path.dirname(os.path.abspath(sys.argv[
0
]))
datapath
=
os.path.join(modpath,
'F:/GZH/自动化交易/历史数据/sh.600173history_k_data2021-12-31-2021-12-31.csv'
)
# 创建价格数据
data
=
bt.feeds.GenericCSVData(
dataname
=
datapath,
fromdate
=
datetime.datetime(
2019
,
10
,
1
),
todate
=
datetime.datetime(
2020
,
2
,
29
),
nullvalue
=
0.0
,
dtformat
=
(
'%Y/%m/%d'
),
datetime
=
0
,
open
=
1
,
high
=
2
,
low
=
3
,
close
=
4
,
volume
=
5
,
openinterest
=
-
1
)
# 在Cerebro中添加价格数据
cerebro.adddata(data)
# 设置启动资金
cerebro.broker.setcash(
100000.0
)
# 设置交易单位大小
cerebro.addsizer(bt.sizers.FixedSize, stake
=
100
)
# 设置佣金为千分之一
cerebro.broker.setcommission(commission
=
0.001
)
# 打印开始信息
print
(
'开始权益: %.2f'
%
cerebro.broker.getvalue())
# 遍历所有数据
cerebro.run()
# 打印最后结果
print
(
'最终权益: %.2f'
%
cerebro.broker.getvalue())
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142C:\Python38\python.exe F:
/
test
/
src
/
com
/
gzh
/
demo10.py
开始权益:
100000.00
2019
-
10
-
08
, 收盘价,
5.22
2019
-
10
-
09
, 收盘价,
5.27
2019
-
10
-
10
, 收盘价,
5.26
2019
-
10
-
11
, 收盘价,
5.24
2019
-
10
-
11
, 买入信号,
5.24
2019
-
10
-
14
, 买入执行, 价格:
5.34
, 成交金额:
534.00
, 佣金
0.53
2019
-
10
-
14
, 收盘价,
5.23
2019
-
10
-
15
, 收盘价,
5.17
2019
-
10
-
16
, 收盘价,
5.20
2019
-
10
-
17
, 收盘价,
5.25
2019
-
10
-
18
, 收盘价,
5.12
2019
-
10
-
21
, 收盘价,
5.10
2019
-
10
-
21
, 卖出信号,
5.10
2019
-
10
-
22
, 卖出执行, 价格:
5.10
, 买入成交金额:
534.00
, 佣金
0.51
2019
-
10
-
22
, 权益, 赢亏
-
24.00
, 总赢亏(含佣金)
-
25.04
2019
-
10
-
22
, 收盘价,
5.25
2019
-
10
-
23
, 收盘价,
5.23
2019
-
10
-
24
, 收盘价,
5.29
2019
-
10
-
25
, 收盘价,
5.29
2019
-
10
-
28
, 收盘价,
5.22
2019
-
10
-
29
, 收盘价,
5.23
2019
-
10
-
30
, 收盘价,
5.17
2019
-
10
-
31
, 收盘价,
5.12
2019
-
10
-
31
, 买入信号,
5.12
2019
-
11
-
01
, 买入执行, 价格:
5.12
, 成交金额:
512.00
, 佣金
0.51
2019
-
11
-
01
, 收盘价,
5.23
2019
-
11
-
04
, 收盘价,
5.24
2019
-
11
-
05
, 收盘价,
5.22
2019
-
11
-
06
, 收盘价,
5.12
2019
-
11
-
07
, 收盘价,
5.15
2019
-
11
-
08
, 收盘价,
5.12
2019
-
11
-
08
, 卖出信号,
5.12
2019
-
11
-
11
, 卖出执行, 价格:
5.09
, 买入成交金额:
512.00
, 佣金
0.51
2019
-
11
-
11
, 权益, 赢亏
-
3.00
, 总赢亏(含佣金)
-
4.02
2019
-
11
-
11
, 收盘价,
5.02
2019
-
11
-
11
, 买入信号,
5.02
2019
-
11
-
12
, 买入执行, 价格:
5.02
, 成交金额:
502.00
, 佣金
0.50
2019
-
11
-
12
, 收盘价,
5.02
2019
-
11
-
13
, 收盘价,
5.00
2019
-
11
-
14
, 收盘价,
5.07
2019
-
11
-
15
, 收盘价,
5.00
2019
-
11
-
18
, 收盘价,
4.94
2019
-
11
-
19
, 收盘价,
5.05
2019
-
11
-
19
, 卖出信号,
5.05
2019
-
11
-
20
, 卖出执行, 价格:
5.08
, 买入成交金额:
502.00
, 佣金
0.51
2019
-
11
-
20
, 权益, 赢亏
6.00
, 总赢亏(含佣金)
4.99
2019
-
11
-
20
, 收盘价,
5.07
2019
-
11
-
21
, 收盘价,
5.00
2019
-
11
-
22
, 收盘价,
4.95
2019
-
11
-
22
, 买入信号,
4.95
2019
-
11
-
25
, 买入执行, 价格:
4.93
, 成交金额:
493.00
, 佣金
0.49
2019
-
11
-
25
, 收盘价,
4.98
2019
-
11
-
26
, 收盘价,
4.95
2019
-
11
-
27
, 收盘价,
4.92
2019
-
11
-
28
, 收盘价,
4.89
2019
-
11
-
29
, 收盘价,
4.91
2019
-
12
-
02
, 收盘价,
4.91
2019
-
12
-
02
, 卖出信号,
4.91
2019
-
12
-
03
, 卖出执行, 价格:
4.91
, 买入成交金额:
493.00
, 佣金
0.49
2019
-
12
-
03
, 权益, 赢亏
-
2.00
, 总赢亏(含佣金)
-
2.98
2019
-
12
-
03
, 收盘价,
4.95
2019
-
12
-
04
, 收盘价,
4.94
2019
-
12
-
05
, 收盘价,
5.05
2019
-
12
-
06
, 收盘价,
5.10
2019
-
12
-
09
, 收盘价,
5.10
2019
-
12
-
10
, 收盘价,
5.03
2019
-
12
-
11
, 收盘价,
5.06
2019
-
12
-
12
, 收盘价,
5.02
2019
-
12
-
13
, 收盘价,
5.03
2019
-
12
-
16
, 收盘价,
5.01
2019
-
12
-
17
, 收盘价,
5.09
2019
-
12
-
18
, 收盘价,
5.10
2019
-
12
-
19
, 收盘价,
5.06
2019
-
12
-
20
, 收盘价,
5.00
2019
-
12
-
20
, 买入信号,
5.00
2019
-
12
-
23
, 买入执行, 价格:
4.98
, 成交金额:
498.00
, 佣金
0.50
2019
-
12
-
23
, 收盘价,
4.95
2019
-
12
-
24
, 收盘价,
4.98
2019
-
12
-
25
, 收盘价,
5.20
2019
-
12
-
26
, 收盘价,
5.26
2019
-
12
-
27
, 收盘价,
5.16
2019
-
12
-
30
, 收盘价,
5.18
2019
-
12
-
30
, 卖出信号,
5.18
2019
-
12
-
31
, 卖出执行, 价格:
5.20
, 买入成交金额:
498.00
, 佣金
0.52
2019
-
12
-
31
, 权益, 赢亏
22.00
, 总赢亏(含佣金)
20.98
2019
-
12
-
31
, 收盘价,
5.21
2020
-
01
-
02
, 收盘价,
5.21
2020
-
01
-
03
, 收盘价,
5.27
2020
-
01
-
06
, 收盘价,
5.23
2020
-
01
-
07
, 收盘价,
5.22
2020
-
01
-
07
, 买入信号,
5.22
2020
-
01
-
08
, 买入执行, 价格:
5.20
, 成交金额:
520.00
, 佣金
0.52
2020
-
01
-
08
, 收盘价,
5.08
2020
-
01
-
09
, 收盘价,
5.24
2020
-
01
-
10
, 收盘价,
5.21
2020
-
01
-
13
, 收盘价,
5.21
2020
-
01
-
14
, 收盘价,
5.17
2020
-
01
-
15
, 收盘价,
5.11
2020
-
01
-
15
, 卖出信号,
5.11
2020
-
01
-
16
, 卖出执行, 价格:
5.11
, 买入成交金额:
520.00
, 佣金
0.51
2020
-
01
-
16
, 权益, 赢亏
-
9.00
, 总赢亏(含佣金)
-
10.03
2020
-
01
-
16
, 收盘价,
5.06
2020
-
01
-
16
, 买入信号,
5.06
2020
-
01
-
17
, 买入执行, 价格:
5.07
, 成交金额:
507.00
, 佣金
0.51
2020
-
01
-
17
, 收盘价,
5.01
2020
-
01
-
20
, 收盘价,
4.99
2020
-
01
-
21
, 收盘价,
4.99
2020
-
01
-
22
, 收盘价,
4.99
2020
-
01
-
23
, 收盘价,
4.88
2020
-
02
-
03
, 收盘价,
4.39
2020
-
02
-
03
, 卖出信号,
4.39
2020
-
02
-
04
, 卖出执行, 价格:
4.22
, 买入成交金额:
507.00
, 佣金
0.42
2020
-
02
-
04
, 权益, 赢亏
-
85.00
, 总赢亏(含佣金)
-
85.93
2020
-
02
-
04
, 收盘价,
4.43
2020
-
02
-
05
, 收盘价,
4.43
2020
-
02
-
06
, 收盘价,
4.66
2020
-
02
-
07
, 收盘价,
4.73
2020
-
02
-
10
, 收盘价,
4.72
2020
-
02
-
11
, 收盘价,
4.70
2020
-
02
-
11
, 买入信号,
4.70
2020
-
02
-
12
, 买入执行, 价格:
4.70
, 成交金额:
470.00
, 佣金
0.47
2020
-
02
-
12
, 收盘价,
4.77
2020
-
02
-
13
, 收盘价,
4.68
2020
-
02
-
14
, 收盘价,
4.66
2020
-
02
-
17
, 收盘价,
4.75
2020
-
02
-
18
, 收盘价,
4.67
2020
-
02
-
19
, 收盘价,
4.64
2020
-
02
-
19
, 卖出信号,
4.64
2020
-
02
-
20
, 卖出执行, 价格:
4.64
, 买入成交金额:
470.00
, 佣金
0.46
2020
-
02
-
20
, 权益, 赢亏
-
6.00
, 总赢亏(含佣金)
-
6.93
2020
-
02
-
20
, 收盘价,
4.66
2020
-
02
-
21
, 收盘价,
4.77
2020
-
02
-
24
, 收盘价,
4.70
2020
-
02
-
25
, 收盘价,
4.73
2020
-
02
-
26
, 收盘价,
4.85
2020
-
02
-
27
, 收盘价,
4.86
2020
-
02
-
28
, 收盘价,
4.84
最终权益:
99891.03
Process finished with exit code
0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2019-06-18 git下载安装