-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathcase4.md
202 lines (134 loc) · 5.91 KB
/
case4.md
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# case 4:如何将JAQS对接VNPY进行实盘交易
社区很多朋友咨询,如何正确使用JAQS对接vnpy进行实盘交易,本文将完整介绍这一过程,解决大家的疑惑。
如果你想直接撸代码,请访问[这里](https://github.com/PKUJohnson/LearnJaqsByExample/blob/master/notebook/case4.zip)
## 1. 正确安装vnpy
vnpy目前最稳定的python环境是py2.7(32位),因此我们建议的安装方式是:
### 下载并安装anaconda。
下载地址:[Anaconda 5.0.1 for python2.7 32bit](https://www.anaconda.com/download/)

### 下载并安装vnpy。
**需要注意,不能使用pip安装,需要从github下载dev分支的代码**
[下载地址](https://github.com/vnpy/vnpy),注意选择dev分支。

下载完成后,目录结构如下, 请在刚才安装的Anacanda,也就是“python2.7 32位”环境下,运行install.bat,安装vnpy。

## 2. 安装JAQS
请在刚才安装的Anacanda,也就是“python2.7 32位”环境下,执行两步:
+ 安装python-snappy,从[这里](https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-snappys) 下载python-snappy的安装包。

```shell
pip install python_snappy-0.5.1-cp27-cp27m-win32.whl
```
+ 安装JAQS
```shell
pip install jaqs
```
## 3. 启动vnpy的JAQS服务
进入刚才下载的vnpy的代码目录,位于examples\JaqsService下,目录下的文件结构如下:

有三个重要的文件需要修改:
+ CTP_connect.json - CTP连接的信息
+ JS_setting.json - JAQS服务信息
+ run.py - 启动JAQS的脚本
CTP_connect.json
```
{
"brokerID": "9999",
"mdAddress": "tcp://180.168.146.187:10011",
"tdAddress": "tcp://180.168.146.187:10001",
"userID": "userID",
"password": "password"
}
```
JS_setting.json
```
{
"host": "127.0.0.1",
"port": 8901
}
```
+ JS_setting.json 配置JAQS的服务监听地址,一般不用修改。
+ CTP_connect.json 配置CTP服务器地址和账户信息,需要修改成你实盘的地址和账户信息。
run.py
```python
def main():
"""主程序入口"""
# 创建Qt应用对象
qApp = createQApp()
# 创建事件引擎
ee = EventEngine()
# 创建主引擎
me = MainEngine(ee)
# 添加交易接口
me.addGateway(ctpGateway)
# 添加上层应用
me.addApp(jaqsService)
# 创建主窗口
mw = MainWindow(me, ee)
mw.showMaximized()
# 在主线程中启动Qt事件循环
sys.exit(qApp.exec_())
if __name__ == '__main__':
main()
```
run.py是一个主程序,在这个主程序里面,添加了ctpGateway和jaqsService两个模块。
ctpGateway是真正的实盘交易通道,jaqsService是服务转接模块。
启动方法很简单,运行 python run.py 即可!
运行成功,则会出现vnpy经典的主界面,如下图所示:

在“功能”菜单,会出现一个“Jaqs服务”,点击之后,是一个消息文本框,用于查看jaqs服务的运行日志。
这是表明,JAQS的服务已经启动成功了。
## 4. 启动CTP交易通道
这个和vnpy启动其他交易通道的方法完全相同,在系统菜单下,点击“连接CTP”即可。

运行成功的界面如下:


## 5. 启动JAQS策略,对接vnpy
这里我们举一个特别简单的策略的例子,来说明一下JAQS策略如何进行实盘。策略原理:
+ (1) 做rb1805.SHF和rb1810.SHF的价差套利,如果价差超过195,则空rb1805.SHF,多rb1810.SHF,如果价差小于180,则反向做。
+ (2) 为了演示效果,只开仓不平仓。
+ (3) 策略启动后,根据tick数据,实时计算价差。
+ (4) 每次策略启动只做一次来回。
参考代码如下:
```python
data_config = {
"remote.data.address": "tcp://data.tushare.org:8910",
"remote.data.username": "phone",
"remote.data.password": "token"
}
trade_config = {
"remote.trade.address": "tcp://127.0.0.1:8901",
"remote.trade.username": "username",
"remote.trade.password": "password"
}
def run_strategy():
tapi = RealTimeTradeApi(trade_config, prod_type = "jaqs")
ins = EventLiveTradeInstance()
ds = RemoteDataService()
strat = SpreadAlgo()
pm = PortfolioManager()
props = {
"symbol" : "rb1805.SHF,rb1810.SHF",
"tick_sizes" : [1.0, 1.0],
"open_spread" : 195,
"close_spread" : 180
}
props.update(data_config)
props.update(trade_config)
context = model.Context(data_api=ds, trade_api=tapi,
instance=ins, strategy=strat, pm=pm)
ins.init_from_config(props)
ds.subscribe(props['symbol'])
ins.run()
if __name__ == "__main__":
run_strategy()
```
只要将交易发送的地址,修改成“tcp://127.0.0.1:8901”,这个地址就是之前vnpy启动本地Jaqs服务的地址。
SpreadAlgo策略代码不在文章中贴出,请大家直接下载代码。
运行后,策略会根据条件,选择是否开仓,在vnpy的界面,可以看到开仓结果。

是不是很简单?
## 6. 想尝试一下?
请访问www.quantos.org,下载安装JAQS,开始自己的量化旅程吧。
这里的东西都是开源和免费的。