Skip to content

Commit

Permalink
目的:让joinquant follow能运行起来。 (#377)
Browse files Browse the repository at this point in the history
修改内容:
1)将原来在usage.md中的,有关问题解决的,移到了help.md中
2)重新编排了usage.md
3) fellower.py增加了re_search函数,以解决原来的re_find函数导致的“look-behind requires fixed-width pattern”错误。
4)joinquant_follower.py修改了函数:extract_strategy_id和 extract_strategy_name, 以能取到正确的id和name;修改了stock_shuffle_to_prefix函数中transaction["datetime"]在转换时的一个小错误。

修改效果:joinquant follow可用了。
局部测试中,已经可以顺利取到历史交易记录并送入交易队列中。(调试的时候,将joinquant_follower的create_query_transaction_params函数中,today_str = '2020-5-29'这样去强行赋予了一个历史日期)。所以,today_str恢复原状了,应该可以取到实时数据了,这有待观察。
【唉,很笨的调试方法】。
  • Loading branch information
qzhjiang authored May 30, 2020
1 parent d98f38a commit 52a71c3
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 96 deletions.
11 changes: 11 additions & 0 deletions docs/help.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
# 某些同花顺客户端不允许拷贝 `Grid` 数据

现在默认获取 `Grid` 数据的策略是通过剪切板拷贝,有些券商不允许这种方式,导致无法获取持仓等数据。为解决此问题,额外实现了一种通过将 `Grid` 数据存为文件再读取的策略,
使用方式如下:

```python
from easytrader import grid_strategies

user.grid_strategy = grid_strategies.Xls
```

# 无法保存对应的 xls 文件

有些系统默认的临时文件目录过长,使用 xls 策略时无法正常保存,可通过如下方式修改为自定义目录
Expand Down
179 changes: 100 additions & 79 deletions docs/usage.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# 引入
## 一、引入

```python
import easytrader
```

# 设置券商类型
## 二、设置交易客户端类型

**华泰客户端**

Expand All @@ -25,32 +25,50 @@ user = easytrader.use('gj_client')
user = easytrader.use('ths')
```

注: 通用同花顺客户端是指对应券商官网提供的基于同花顺修改的软件版本,类似银河的双子星(同花顺版本), 海王星(通达信版本)
注: 通用同花顺客户端是指对应券商官网提供的基于同花顺修改的软件版本,类似银河的双子星(同花顺版本),国金证券网上交易独立下单程序(核新PC版)等。

**雪球**

# 设置账户信息
```python
user = easytrader.use('xq')
```


## 三、启动并连接客户端

登陆账号有两种方式,`使用参数``使用配置文件`
### (一)同花顺客户端

使用通用同花顺客户端不支持自动登陆,所以无需设置,参看下文`直接连接通用同花顺客户端`
通用同花顺客户端不支持自动登录,需要先手动登录。

**参数登录(推荐)**
请手动打开并登录客户端后,运用connect函数连接客户端。

```python
user.connect(r'客户端xiadan.exe路径') # 类似 r'C:\htzqzyb2\xiadan.exe'
```

### (二)非同花顺客户端

非同花顺的客户端,可以调用prepare函数自动登录。

调用prepare时所需的参数,可以通过`函数参数``配置文件` 赋予。

**1. 函数参数(推荐)**

```
user.prepare(user='用户名', password='雪球、银河客户端为明文密码', comm_password='华泰通讯密码,其他券商不用')
```

注: 雪球比较特殊,见下列配置文件格式

**使用配置文件**
**2. 配置文件**

```python
user.prepare('/path/to/your/yh_client.json') // 配置文件路径
user.prepare('/path/to/your/yh_client.json') # 配置文件路径
```

****: 使用配置文件模式, 配置文件需要自己用编辑器编辑生成, 请勿使用记事本, 推荐使用 [notepad++](https://notepad-plus-plus.org/zh/) 或者 [sublime text](http://www.sublimetext.com/)
注: 配置文件需自己用编辑器编辑生成, **请勿使用记事本**, 推荐使用 [notepad++](https://notepad-plus-plus.org/zh/) 或者 [sublime text](http://www.sublimetext.com/)

**格式如下**
**配置文件格式如下:**

银河/国金客户端

Expand Down Expand Up @@ -81,33 +99,11 @@ user.prepare('/path/to/your/yh_client.json') // 配置文件路径
"portfolio_code": "组合代码(例:ZH818559)",
"portfolio_market": "交易市场(例:us 或者 cn 或者 hk)"
}
```

# 直接连接通用同花顺客户端
## 四、交易相关

需要先手动登陆客户端到交易窗口,然后运用下面的代码连接交易窗口

```python
user.connect(r'客户端xiadan.exe路径') # 类似 r'C:\htzqzyb2\xiadan.exe'
```

## 某些同花顺客户端不允许拷贝 `Grid` 数据导致无法获取持仓等问题的解决办法

现在默认获取 `Grid` 数据的策略是通过剪切板拷贝,有些券商不允许这种方式,所以额外实现了一种通过将 `Grid` 数据存为文件再读取的策略,
使用方式如下:

```python
from easytrader import grid_strategies

user.grid_strategy = grid_strategies.Xls
```

### 交易相关

以下用法以银河为例

#### 获取资金状况:
### 1. 获取资金状况

```python
user.balance
Expand All @@ -124,7 +120,7 @@ user.balance
'资金帐号': 'xxx'}]
```

#### 获取持仓:
### 2. 获取持仓

```python
user.position
Expand All @@ -148,7 +144,7 @@ user.position
'证券名称': '工商银行'}]
```

#### 买入:
### 3. 买入

```python
user.buy('162411', price=0.55, amount=100)
Expand All @@ -162,7 +158,7 @@ user.buy('162411', price=0.55, amount=100)

注: 系统可以配置是否返回成交回报。如果没配的话默认返回 `{"message": "success"}`

#### 卖出:
### 4. 卖出

```python
user.sell('162411', price=0.55, amount=100)
Expand All @@ -174,13 +170,13 @@ user.sell('162411', price=0.55, amount=100)
{'entrust_no': 'xxxxxxxx'}
```

#### 一键打新
### 5. 一键打新

```python
user.auto_ipo()
```

#### 撤单
### 6. 撤单

```python
user.cancel_entrust('buy/sell 获取的 entrust_no')
Expand All @@ -193,7 +189,7 @@ user.cancel_entrust('buy/sell 获取的 entrust_no')
```


#### 当日成交
### 7. 查询当日成交

```python
user.today_trades
Expand All @@ -215,7 +211,7 @@ user.today_trades
'证券名称': '华宝油气'}]
```

#### 当日委托
### 8. 查询当日委托

```python
user.today_entrusts
Expand Down Expand Up @@ -253,7 +249,7 @@ user.today_entrusts
```


#### 查询今天可以申购的新股信息
### 9. 查询今日可申购新股

```python
from easytrader.utils.stock import get_today_ipo_data
Expand All @@ -270,58 +266,73 @@ print(ipo_data)
'apply_code': '申购代码'}]
```

#### 退出客户端软件
### 10. 刷新数据

```
user.exit()
user.refresh()
```

#### 刷新数据
### 11. 雪球组合比例调仓 ###

```python
user.adjust_weight('股票代码', 目标比例)
```
user.refresh()

例如,`user.adjust_weight('000001', 10)`是将平安银行在组合中的持仓比例调整到10%。

## 五、退出客户端软件

```python
user.exit()
```

### 远端服务器模式
## 六、远端服务器模式

远端服务器模式是交易服务端和量化策略端分离的模式。

#### 在服务器上启动服务
**交易服务端**通常是有固定`IP`地址的云服务器,该服务器上运行着`easytrader`交易服务。而**量化策略端**可能是`JoinQuant、RiceQuant、Vn.Py`,物理上与交易服务端不在同一台电脑上。交易服务端被动或主动获取交易信号,并驱动**交易软件**(交易软件包括运行在同一服务器上的下单软件,比如同花顺`xiadan.exe`,或者运行在另一台服务器上的雪球`xq`)。

远端模式下,`easytrader`交易服务通过以下两种方式获得交易信号并驱动交易软件:

### (一) 被动接收远端量化策略发送的交易相关指令

#### 交易服务端——启动服务

```python
from easytrader import server

server.run(port=1430) # 默认端口为 1430
```

#### 远程客户端调用
#### 量化策略端——调用服务

```python
from easytrader import remoteclient

user = remoteclient.use('使用客户端类型,可选 yh_client, ht_client', host='服务器ip', port='服务器端口,默认为1430')
user = remoteclient.use('使用客户端类型,可选 yh_client, ht_client, ths, xq等', host='服务器ip', port='服务器端口,默认为1430')

其他用法同上
```
user.buy(......)

user.sell(......)

#### 雪球组合调仓

```python
user.adjust_weight('000001', 10)
# 交易函数用法同上,见“四、交易相关”
```

### (二) 主动监控远端量化策略的成交记录或仓位变化


### 跟踪 joinquant / ricequant 的模拟交易
#### 1. 跟踪 `joinquant` / `ricequant` 的模拟交易

#### 初始化跟踪的 trader
##### 1) 初始化跟踪的 trader

这里以雪球为例, 也可以使用银河之类 easytrader 支持的券商
这里以雪球为例, 也可以使用银河之类 `easytrader` 支持的券商

```
xq_user = easytrader.use('xq')
xq_user.prepare('xq.json')
```

#### 初始化跟踪 joinquant / ricequant 的 follower
##### 2) 初始化跟踪 `joinquant` / `ricequant` 的 follower

```
target = 'jq' # joinquant
Expand All @@ -330,7 +341,7 @@ follower = easytrader.follower(target)
follower.login(user='rq/jq用户名', password='rq/jq密码')
```

#### 连接 follower 和 trader
##### 3) 连接 follower 和 trader

##### joinquant
```
Expand All @@ -339,33 +350,45 @@ follower.follow(xq_user, 'jq的模拟交易url')

注: jq的模拟交易url指的是对应模拟交易对应的可以查看持仓, 交易记录的页面, 类似 `https://www.joinquant.com/algorithm/live/index?backtestId=xxx`

正常会输出

![enjoy it](https://raw.githubusercontent.com/shidenggui/assets/master/easytrader/joinquant.jpg)

注: 启动后发现跟踪策略无输出,那是因为今天模拟交易没有调仓或者接收到的调仓信号过期了,默认只处理120s内的信号,想要测试的可以用下面的命令:

```python
jq_follower.follow(user, '模拟交易url',
trade_cmd_expire_seconds=100000000000, cmd_cache=False)
```

- trade_cmd_expire_seconds 默认处理多少秒内的信号

- cmd_cache 是否读取已经执行过的命令缓存,以防止重复执行

目录下产生的 cmd_cache.pk,是用来存储历史执行过的交易指令,防止在重启程序时重复执行交易过的指令,可以通过 `follower.follow(xxx, cmd_cache=False)` 来关闭。

##### ricequant

```
follower.follow(xq_user, run_id)
```
注:ricequant的run_id即PT列表中的ID。

正常会输出

![](https://raw.githubusercontent.com/shidenggui/assets/master/easytrader/joinquant.jpg)
#### 2. 跟踪雪球的组合

enjoy it

### 跟踪 雪球的组合

#### 初始化跟踪的 trader
##### 1) 初始化跟踪的 trader

同上

#### 初始化跟踪 雪球组合 的 follower
##### 2) 初始化跟踪 雪球组合 的 follower

```
xq_follower = easytrader.follower('xq')
xq_follower.login(cookies='雪球 cookies,登陆后获取,获取方式见 https://smalltool.github.io/2016/08/02/cookie/')
```

#### 连接 follower 和 trader
##### 3) 连接 follower 和 trader

```
xq_follower.follow(xq_user, 'xq组合ID,类似ZH123456', total_assets=100000)
Expand All @@ -380,34 +403,32 @@ xq_follower.follow(xq_user, 'xq组合ID,类似ZH123456', total_assets=100000)
* 雪球额外支持 adjust_sell 参数,决定是否根据用户的实际持仓数调整卖出股票数量,解决雪球根据百分比调仓时计算出的股数有偏差的问题。当卖出股票数大于实际持仓数时,调整为实际持仓数。目前仅在银河客户端测试通过。 当 users 为多个时,根据第一个 user 的持仓数决定


#### 多用户跟踪多策略
#### 3. 多用户跟踪多策略

```
follower.follow(users=[xq_user, yh_user], strategies=['组合1', '组合2'], total_assets=[10000, 10000])
```

#### 目录下产生的 cmd_cache.pk

这是用来存储历史执行过的交易指令,防止在重启程序时重复执行交易过的指令,可以通过 `follower.follow(xxx, cmd_cache=False)` 来关闭
#### 4. 其它与跟踪有关的问题

#### 使用市价单跟踪模式,目前仅支持银河
使用市价单跟踪模式,目前仅支持银河

```
follower.follow(***, entrust_prop='market')
```

#### 调整下单间隔, 默认为0s。调大可防止卖出买入时卖出单没有及时成交导致的买入金额不足
调整下单间隔, 默认为0s。调大可防止卖出买入时卖出单没有及时成交导致的买入金额不足

```
follower.follow(***, send_interval=30) # 设置下单间隔为 30 s
```
#### 设置买卖时的滑点
设置买卖时的滑点

```
follower.follow(***, slippage=0.05) # 设置滑点为 5%
```

### 命令行模式
## 七、命令行模式

#### 登录

Expand Down
Loading

0 comments on commit 52a71c3

Please sign in to comment.