thsauto


Namethsauto JSON
Version 0.3.4 PyPI version JSON
download
home_page
Summaryths automation test
upload_time2024-03-08 07:12:59
maintainer
docs_urlNone
author
requires_python>=3.8
licenseMIT
keywords ths automation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # thsauto
同花顺Android版模拟炒股自动化测试封装

## 目标用户
只适合资金量少的散户。自动化测试技术速度慢,稳定性也一般,达不到专业人士的要求。

资金量大的个人或机构,请使用专业软件。如:迅投QMT、恒生PTrade、掘金量化、卡方科技等,或券商自研软件。
它们带扫文件单功能,能实现批量委托,速度更快。注意:软件虽支持,但券商可能不开放扫单权限,请提前向客户经理认真确认。

## 起源
[THSTrader](https://github.com/nladuo/THSTrader) 项目代码优化不够,安装了大量库效率低。所以决定学习后重写。

## 对比
### [easytrader](https://github.com/shidenggui/easytrader)
1. 原理:`pywinauto`进行鼠标键盘模拟
2. 优点:PC版客户端可以设置省略弹出框,所以委托速度还行。下一笔约1~2秒,但赶不上专用软件的扫单功能。
3. 缺点:PC版新客户端复制列表时需要输入验证码,由于鼠标键盘占用,所以得独占电脑
### [THSTrader](https://github.com/nladuo/THSTrader)
1. 原理:使用Google的`UIAutomator`技术进行辅助控制。使用`easyocr`对截图进行文本识别
2. 优点:Android版比PC版支持的券商更多
3. 缺点:截图识别效率太低、速度慢。截图对位置大小有要求,分辨率不能随意改动。依赖`pytorch`等库,还需外网下载识别模型。
### [thsauto](https://github.com/wukan1986/thsauto)
1. 原理:使用Google的`UIAutomator`技术进行辅助控制。使用`XPath`进行文字提取,跳过了文本识别
2. 优点:支持的券商多。支持本地和远程,不占用鼠标键盘,不独占电脑
3. 缺点:Android版客户端没有跳过弹出对话框的设置,所以速度要慢于PC版。下一笔约3~5秒。目前还无法与无障碍工具联动

- 下单耗时(越小越好):easytrader < thsauto <= THSTrader
- 查询耗时(越小越好):easytrader < thsauto << THSTrader
- 市场占有率(越大越好):Android > PC,所以在不能使用easytrader的情况下也许能用thsauto/THSTrader

## `uiautomator2`的局限
1. 查询界面时,不可见部分查询不到,需要滑动实现
2. 无法遍历列表控件,通过滑动变通实现,很难保证不重复、不遗漏
3. 持仓列表不会重复,委托列表由于报单速度慢,重复的可能性小
4. 设置分辨率长屏,同时显示更多行,需要滑动的次数少,能缓解此局限
5. 可惜,目前无法与`无障碍服务`共存

## 安装
```commandline
# 普通版
pip install -U thsauto
# CLI版和Web版
pip install -U thsauto[cli]
```
或二次开发
```commandline
git clone --depth=1 https://github.com/wukan1986/thsauto.git
cd thsauto
pip install -e .[cli]
```

## 安装雷电模拟器
下载页:https://ldmnq.com/other/version-history-and-release-notes.html  
安装包名类似于`ldinst_9.0.57.2.exe`,约400MB~500MB,而不是`ldplayer9_ld_112_ld.exe`(约3MB)

## 模拟器设置分辨率
1. 软件设置 -> 性能设置 -> 手机版 ->720*1280(dpi 320)
    - 此分变率在`weditor`显示中正好匹配,可用于二次开发。
2. 自定义-> 360*1500(dpi 180)
    - 实盘时,此分变率在本人电脑`2560*1600`下比较合适
    - 宽360小于720,字体小,界面中可以显示更多行
    - 高1500小于1600,能显示更多行,又能防止长屏过长时软件界面压缩导致界面模糊
    - dpi 120与dpi 180显示的委托列表行数一样多,目前使用的dpi 180
    
## 安装同花顺APP
下载页:https://m.10jqka.com.cn/ 右上角按钮进行下载。需下载Android版(文件扩展名为`apk`)

## 安装配置ADB
将安装路径`D:\leidian\LDPlayer9`添加到`环境变量`后可在控制台中使用`adb`命令

## 测试连接模拟器
查看模拟器设备名,一般默认值为`emulator-5554`
```commandline
adb kill-server
adb devices
```

## 演示
本自动化测试工具没有`登录`和`切换账号`功能,所以需要用户自己先打开指定界面。
1. 打开同花顺APP
2. 最下导航栏 -> 交易
3. 最上导航栏 -> 模拟 或 A股
4. 点击中间区域(买入、卖出、撤单、持仓、查询)五个图标按钮中任意一个,即可进入交易界面
5. 然后可以运行`demo.py`
6. 注意:任何步骤执行完毕,都不应当出现弹出对话框未关闭的情况,否则会阻断之后的执行。如果遇到能复现的错误,请截图并保留日志

### VSCode运行[demo示例](examples/demo.py)
```python
from thsauto import THS

# 初次使用请在`debug=True`模式下多测试几次
# 再次测试在模拟炒股下再开启`debug=False`
# 然后再在其它账号下`debug=True`模式下测试
# 最后是其它账号下`debug=False`下交易
t = THS(debug=True, skip_popup=False)
t.connect(addr="emulator-5554")

# 资产
t.get_balance()
"""
{'总资产': 200202.81,
 '浮动盈亏': 202.81,
 '当日参考盈亏': 89.01,
 '当日参考盈亏率': 0.0004,
 '持仓市值': 12454.0,
 '可用资金': 172459.9,
 '可取资金': 0.0}
"""

# 持仓
t.get_positions()
"""
	名称	市值	盈亏	盈亏率	持仓	可用	成本	现价
0	美的集团	5526.0	2.23	0.00040	100	100	55.238	55.26
1	招商银行	3156.0	11.00	0.00350	100	100	31.450	31.56
2	万科A	2688.0	196.92	0.07908	200	0	12.455	13.44
3	贵州轮胎	705.0	-5.22	-0.00730	100	100	7.102	7.05
4	中国银行	379.0	-2.12	-0.00560	100	100	3.811	3.79
"""

# 委托
t.get_orders(break_after_done=True)
"""
名称	委托时间	委托价	成交均价	委托量	已成交量	买卖	状态
0	浦发银行	21:16:56	5.00	0.0	100	0	买入	未成交
1	浦发银行	21:14:41	10.50	0.0	100	0	买入	未成交
2	浦发银行	10:07:39	10.50	0.0	100	0	买入	未成交
3	浦发银行	02:15:10	10.50	0.0	100	0	买入	未成交
4	浦发银行	01:50:09	10.50	0.0	100	0	买入	未成交
5	万科A	22:10:22	10.00	0.0	100	0	卖出	未成交
6	万科A	21:48:15	15.00	0.0	100	0	卖出	未成交
7	白云机场	16:58:46	11.76	0.0	200	0	买入	未成交
8	白云机场	16:26:47	11.76	0.0	100	0	买入	未成交
9	白云机场	16:58:37	11.76	0.0	100	0	买入	全部撤单
10	白云机场	16:27:05	11.76	0.0	200	0	买入	全部撤单
"""

# 委托。未处理的原始数据
t.orders
"""
[('浦发银行', '21:16:56', '5.000', '0.000', '100', '0', '买入', '未成交'),
 ('浦发银行', '21:14:41', '10.500', '0.000', '100', '0', '买入', '未成交'),
 ('浦发银行', '10:07:39', '10.500', '0.000', '100', '0', '买入', '未成交'),
 ('浦发银行', '02:15:10', '10.500', '0.000', '100', '0', '买入', '未成交'),
 ('浦发银行', '01:50:09', '10.500', '0.000', '100', '0', '买入', '未成交'),
 ('万  科 A', '22:10:22', '10.000', '0.000', '100', '0', '卖出', '未成交'),
 ('万  科 A', '21:48:15', '15.000', '0.000', '100', '0', '卖出', '未成交'),
 ('白云机场', '16:58:46', '11.760', '0.000', '200', '0', '买入', '未成交'),
 ('白云机场', '16:26:47', '11.760', '0.000', '100', '0', '买入', '未成交'),
 ('白云机场', '16:58:37', '11.760', '0.000', '100', '0', '买入', '全部撤单'),
 ('白云机场', '16:27:05', '11.760', '0.000', '200', '0', '买入', '全部撤单')]
"""

# 支持股票代码
confirm, prompt = t.buy(100, 5, code='600000')
confirm, prompt
"""
({'标题': '委托买入确认',
  '账户': 'A516832234',
  '名称': '浦发银行',
  '代码': '600000',
  '数量': 100,
  '价格': 5.0},
 {'标题': '系统信息', '内容': '委托已提交,合同号为:3672942466'})
"""

# 撤第一条
confirm, prompt = t.cancel_single(t.order_at(0))
confirm, prompt
"""
({'标题': '委托撤单确认',
  '操作': '撤买入单',
  '名称': '浦发银行',
  '代码': '600000',
  '数量': 100,
  '价格': 5.0},
 {})
"""
```

## Web服务
为实现跨语言的调用,还使用`FastAPI`实现了Web服务。注意:需使用`pip install -U thsauto[cli]`安装

```commandline
# 启动Web服务
# python -m thsauto run --host=0.0.0.0 --port=5000
thsauto run --host=0.0.0.0 --port=5000

# 支持的Web请求
curl http://127.0.0.1:5000/connect?addr=emulator-5554
curl http://127.0.0.1:5000/refresh
curl http://127.0.0.1:5000/get_balance
curl http://127.0.0.1:5000/get_positions
curl http://127.0.0.1:5000/get_orders
curl http://127.0.0.1:5000/order_at/0  # get_orders后的顺序
curl http://127.0.0.1:5000/buy?qty=100&price=nan&code=000001
curl http://127.0.0.1:5000/sell?qty=100&price=5.1&code=000001
curl http://127.0.0.1:5000/cancels/all # 支持的参数all buy sell
curl http://127.0.0.1:5000/cancel/0  # get_orders后的顺序

```

## CLI命令
同时还提供了`CLI`接口,它实际上访问`Web`服务来实现相应功能,所以需先启动服务。注意:需使用`pip install -U thsauto[cli]`安装

```commandline
# 启动Web服务
thsauto run --host=0.0.0.0 --port=5000

# 支持的CLI指令
thsauto connect --addr=emulator-5554
thsauto refresh
thsauto get_balance
thsauto get_positions
thsauto get_orders
thsauto order_at --idx=0
thsauto buy --qty=100 --price=nan --code=000001
thsauto sell --qty=100 --price=5.1 --code=000001
thsauto cancels --opt=all
thsauto cancel --idx=0
```

如果之前启动时使用的是特殊IP和端口,可以通过环境变量临时设定
```commandline
# 启动Web服务
thsauto run --host=127.0.0.1 --port=8080

# Windows平台设置环境变量
set THSAUTO_HOST=127.0.0.1
set THSAUTO_PORT=8080
thsauto connect --addr=emulator-5554

# Linux平台设置环境变量
export THSAUTO_HOST=127.0.0.1
export THSAUTO_PORT=8080
thsauto connect --addr=emulator-5554

```

## 聚宽远程下单
本功能基于`Web服务`和`CLI命令`
1. `Web服务`: 安装在远程云服务器上,接收来自聚宽的`HTTP`请求
2. `CLI命令`: 部署在客户端,将`Python调用`转换成`HTTP`请求

仅复制`cli.py`文件或代码到聚宽中,部分修改调用。详情参考[joinquant示例](examples/joinquant.py)

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "thsauto",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "ths,automation",
    "author": "",
    "author_email": "wukan <wu-kan@163.com>",
    "download_url": "https://files.pythonhosted.org/packages/8d/ea/a0b5bf7cc8f75ebb307d38cd2551542ccbb6244c47c70e81e5a5fc69ff28/thsauto-0.3.4.tar.gz",
    "platform": null,
    "description": "# thsauto\n\u540c\u82b1\u987aAndroid\u7248\u6a21\u62df\u7092\u80a1\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c01\u88c5\n\n## \u76ee\u6807\u7528\u6237\n\u53ea\u9002\u5408\u8d44\u91d1\u91cf\u5c11\u7684\u6563\u6237\u3002\u81ea\u52a8\u5316\u6d4b\u8bd5\u6280\u672f\u901f\u5ea6\u6162\uff0c\u7a33\u5b9a\u6027\u4e5f\u4e00\u822c\uff0c\u8fbe\u4e0d\u5230\u4e13\u4e1a\u4eba\u58eb\u7684\u8981\u6c42\u3002\n\n\u8d44\u91d1\u91cf\u5927\u7684\u4e2a\u4eba\u6216\u673a\u6784\uff0c\u8bf7\u4f7f\u7528\u4e13\u4e1a\u8f6f\u4ef6\u3002\u5982\uff1a\u8fc5\u6295QMT\u3001\u6052\u751fPTrade\u3001\u6398\u91d1\u91cf\u5316\u3001\u5361\u65b9\u79d1\u6280\u7b49\uff0c\u6216\u5238\u5546\u81ea\u7814\u8f6f\u4ef6\u3002\n\u5b83\u4eec\u5e26\u626b\u6587\u4ef6\u5355\u529f\u80fd\uff0c\u80fd\u5b9e\u73b0\u6279\u91cf\u59d4\u6258\uff0c\u901f\u5ea6\u66f4\u5feb\u3002\u6ce8\u610f\uff1a\u8f6f\u4ef6\u867d\u652f\u6301\uff0c\u4f46\u5238\u5546\u53ef\u80fd\u4e0d\u5f00\u653e\u626b\u5355\u6743\u9650\uff0c\u8bf7\u63d0\u524d\u5411\u5ba2\u6237\u7ecf\u7406\u8ba4\u771f\u786e\u8ba4\u3002\n\n## \u8d77\u6e90\n[THSTrader](https://github.com/nladuo/THSTrader) \u9879\u76ee\u4ee3\u7801\u4f18\u5316\u4e0d\u591f\uff0c\u5b89\u88c5\u4e86\u5927\u91cf\u5e93\u6548\u7387\u4f4e\u3002\u6240\u4ee5\u51b3\u5b9a\u5b66\u4e60\u540e\u91cd\u5199\u3002\n\n## \u5bf9\u6bd4\n### [easytrader](https://github.com/shidenggui/easytrader)\n1. \u539f\u7406\uff1a`pywinauto`\u8fdb\u884c\u9f20\u6807\u952e\u76d8\u6a21\u62df\n2. \u4f18\u70b9\uff1aPC\u7248\u5ba2\u6237\u7aef\u53ef\u4ee5\u8bbe\u7f6e\u7701\u7565\u5f39\u51fa\u6846\uff0c\u6240\u4ee5\u59d4\u6258\u901f\u5ea6\u8fd8\u884c\u3002\u4e0b\u4e00\u7b14\u7ea61~2\u79d2\uff0c\u4f46\u8d76\u4e0d\u4e0a\u4e13\u7528\u8f6f\u4ef6\u7684\u626b\u5355\u529f\u80fd\u3002\n3. \u7f3a\u70b9\uff1aPC\u7248\u65b0\u5ba2\u6237\u7aef\u590d\u5236\u5217\u8868\u65f6\u9700\u8981\u8f93\u5165\u9a8c\u8bc1\u7801\uff0c\u7531\u4e8e\u9f20\u6807\u952e\u76d8\u5360\u7528\uff0c\u6240\u4ee5\u5f97\u72ec\u5360\u7535\u8111\n### [THSTrader](https://github.com/nladuo/THSTrader)\n1. \u539f\u7406\uff1a\u4f7f\u7528Google\u7684`UIAutomator`\u6280\u672f\u8fdb\u884c\u8f85\u52a9\u63a7\u5236\u3002\u4f7f\u7528`easyocr`\u5bf9\u622a\u56fe\u8fdb\u884c\u6587\u672c\u8bc6\u522b\n2. \u4f18\u70b9\uff1aAndroid\u7248\u6bd4PC\u7248\u652f\u6301\u7684\u5238\u5546\u66f4\u591a\n3. \u7f3a\u70b9\uff1a\u622a\u56fe\u8bc6\u522b\u6548\u7387\u592a\u4f4e\u3001\u901f\u5ea6\u6162\u3002\u622a\u56fe\u5bf9\u4f4d\u7f6e\u5927\u5c0f\u6709\u8981\u6c42\uff0c\u5206\u8fa8\u7387\u4e0d\u80fd\u968f\u610f\u6539\u52a8\u3002\u4f9d\u8d56`pytorch`\u7b49\u5e93\uff0c\u8fd8\u9700\u5916\u7f51\u4e0b\u8f7d\u8bc6\u522b\u6a21\u578b\u3002\n### [thsauto](https://github.com/wukan1986/thsauto)\n1. \u539f\u7406\uff1a\u4f7f\u7528Google\u7684`UIAutomator`\u6280\u672f\u8fdb\u884c\u8f85\u52a9\u63a7\u5236\u3002\u4f7f\u7528`XPath`\u8fdb\u884c\u6587\u5b57\u63d0\u53d6\uff0c\u8df3\u8fc7\u4e86\u6587\u672c\u8bc6\u522b\n2. \u4f18\u70b9\uff1a\u652f\u6301\u7684\u5238\u5546\u591a\u3002\u652f\u6301\u672c\u5730\u548c\u8fdc\u7a0b\uff0c\u4e0d\u5360\u7528\u9f20\u6807\u952e\u76d8\uff0c\u4e0d\u72ec\u5360\u7535\u8111\n3. \u7f3a\u70b9\uff1aAndroid\u7248\u5ba2\u6237\u7aef\u6ca1\u6709\u8df3\u8fc7\u5f39\u51fa\u5bf9\u8bdd\u6846\u7684\u8bbe\u7f6e\uff0c\u6240\u4ee5\u901f\u5ea6\u8981\u6162\u4e8ePC\u7248\u3002\u4e0b\u4e00\u7b14\u7ea63~5\u79d2\u3002\u76ee\u524d\u8fd8\u65e0\u6cd5\u4e0e\u65e0\u969c\u788d\u5de5\u5177\u8054\u52a8\n\n- \u4e0b\u5355\u8017\u65f6(\u8d8a\u5c0f\u8d8a\u597d)\uff1aeasytrader < thsauto <= THSTrader\n- \u67e5\u8be2\u8017\u65f6(\u8d8a\u5c0f\u8d8a\u597d)\uff1aeasytrader < thsauto << THSTrader\n- \u5e02\u573a\u5360\u6709\u7387(\u8d8a\u5927\u8d8a\u597d)\uff1aAndroid > PC\uff0c\u6240\u4ee5\u5728\u4e0d\u80fd\u4f7f\u7528easytrader\u7684\u60c5\u51b5\u4e0b\u4e5f\u8bb8\u80fd\u7528thsauto/THSTrader\n\n## `uiautomator2`\u7684\u5c40\u9650\n1. \u67e5\u8be2\u754c\u9762\u65f6\uff0c\u4e0d\u53ef\u89c1\u90e8\u5206\u67e5\u8be2\u4e0d\u5230\uff0c\u9700\u8981\u6ed1\u52a8\u5b9e\u73b0\n2. \u65e0\u6cd5\u904d\u5386\u5217\u8868\u63a7\u4ef6\uff0c\u901a\u8fc7\u6ed1\u52a8\u53d8\u901a\u5b9e\u73b0\uff0c\u5f88\u96be\u4fdd\u8bc1\u4e0d\u91cd\u590d\u3001\u4e0d\u9057\u6f0f\n3. \u6301\u4ed3\u5217\u8868\u4e0d\u4f1a\u91cd\u590d\uff0c\u59d4\u6258\u5217\u8868\u7531\u4e8e\u62a5\u5355\u901f\u5ea6\u6162\uff0c\u91cd\u590d\u7684\u53ef\u80fd\u6027\u5c0f\n4. \u8bbe\u7f6e\u5206\u8fa8\u7387\u957f\u5c4f\uff0c\u540c\u65f6\u663e\u793a\u66f4\u591a\u884c\uff0c\u9700\u8981\u6ed1\u52a8\u7684\u6b21\u6570\u5c11\uff0c\u80fd\u7f13\u89e3\u6b64\u5c40\u9650\n5. \u53ef\u60dc\uff0c\u76ee\u524d\u65e0\u6cd5\u4e0e`\u65e0\u969c\u788d\u670d\u52a1`\u5171\u5b58\n\n## \u5b89\u88c5\n```commandline\n# \u666e\u901a\u7248\npip install -U thsauto\n# CLI\u7248\u548cWeb\u7248\npip install -U thsauto[cli]\n```\n\u6216\u4e8c\u6b21\u5f00\u53d1\n```commandline\ngit clone --depth=1 https://github.com/wukan1986/thsauto.git\ncd thsauto\npip install -e .[cli]\n```\n\n## \u5b89\u88c5\u96f7\u7535\u6a21\u62df\u5668\n\u4e0b\u8f7d\u9875\uff1ahttps://ldmnq.com/other/version-history-and-release-notes.html  \n\u5b89\u88c5\u5305\u540d\u7c7b\u4f3c\u4e8e`ldinst_9.0.57.2.exe`\uff0c\u7ea6400MB~500MB\uff0c\u800c\u4e0d\u662f`ldplayer9_ld_112_ld.exe`\uff08\u7ea63MB\uff09\n\n## \u6a21\u62df\u5668\u8bbe\u7f6e\u5206\u8fa8\u7387\n1. \u8f6f\u4ef6\u8bbe\u7f6e -> \u6027\u80fd\u8bbe\u7f6e -> \u624b\u673a\u7248 ->720*1280(dpi 320)\n    - \u6b64\u5206\u53d8\u7387\u5728`weditor`\u663e\u793a\u4e2d\u6b63\u597d\u5339\u914d\uff0c\u53ef\u7528\u4e8e\u4e8c\u6b21\u5f00\u53d1\u3002\n2. \u81ea\u5b9a\u4e49-> 360*1500(dpi 180)\n    - \u5b9e\u76d8\u65f6\uff0c\u6b64\u5206\u53d8\u7387\u5728\u672c\u4eba\u7535\u8111`2560*1600`\u4e0b\u6bd4\u8f83\u5408\u9002\n    - \u5bbd360\u5c0f\u4e8e720\uff0c\u5b57\u4f53\u5c0f\uff0c\u754c\u9762\u4e2d\u53ef\u4ee5\u663e\u793a\u66f4\u591a\u884c\n    - \u9ad81500\u5c0f\u4e8e1600\uff0c\u80fd\u663e\u793a\u66f4\u591a\u884c\uff0c\u53c8\u80fd\u9632\u6b62\u957f\u5c4f\u8fc7\u957f\u65f6\u8f6f\u4ef6\u754c\u9762\u538b\u7f29\u5bfc\u81f4\u754c\u9762\u6a21\u7cca\n    - dpi 120\u4e0edpi 180\u663e\u793a\u7684\u59d4\u6258\u5217\u8868\u884c\u6570\u4e00\u6837\u591a\uff0c\u76ee\u524d\u4f7f\u7528\u7684dpi 180\n    \n## \u5b89\u88c5\u540c\u82b1\u987aAPP\n\u4e0b\u8f7d\u9875\uff1ahttps://m.10jqka.com.cn/ \u53f3\u4e0a\u89d2\u6309\u94ae\u8fdb\u884c\u4e0b\u8f7d\u3002\u9700\u4e0b\u8f7dAndroid\u7248(\u6587\u4ef6\u6269\u5c55\u540d\u4e3a`apk`)\n\n## \u5b89\u88c5\u914d\u7f6eADB\n\u5c06\u5b89\u88c5\u8def\u5f84`D:\\leidian\\LDPlayer9`\u6dfb\u52a0\u5230`\u73af\u5883\u53d8\u91cf`\u540e\u53ef\u5728\u63a7\u5236\u53f0\u4e2d\u4f7f\u7528`adb`\u547d\u4ee4\n\n## \u6d4b\u8bd5\u8fde\u63a5\u6a21\u62df\u5668\n\u67e5\u770b\u6a21\u62df\u5668\u8bbe\u5907\u540d\uff0c\u4e00\u822c\u9ed8\u8ba4\u503c\u4e3a`emulator-5554`\n```commandline\nadb kill-server\nadb devices\n```\n\n## \u6f14\u793a\n\u672c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5de5\u5177\u6ca1\u6709`\u767b\u5f55`\u548c`\u5207\u6362\u8d26\u53f7`\u529f\u80fd\uff0c\u6240\u4ee5\u9700\u8981\u7528\u6237\u81ea\u5df1\u5148\u6253\u5f00\u6307\u5b9a\u754c\u9762\u3002\n1. \u6253\u5f00\u540c\u82b1\u987aAPP\n2. \u6700\u4e0b\u5bfc\u822a\u680f -> \u4ea4\u6613\n3. \u6700\u4e0a\u5bfc\u822a\u680f -> \u6a21\u62df \u6216 A\u80a1\n4. \u70b9\u51fb\u4e2d\u95f4\u533a\u57df\uff08\u4e70\u5165\u3001\u5356\u51fa\u3001\u64a4\u5355\u3001\u6301\u4ed3\u3001\u67e5\u8be2\uff09\u4e94\u4e2a\u56fe\u6807\u6309\u94ae\u4e2d\u4efb\u610f\u4e00\u4e2a\uff0c\u5373\u53ef\u8fdb\u5165\u4ea4\u6613\u754c\u9762\n5. \u7136\u540e\u53ef\u4ee5\u8fd0\u884c`demo.py`\n6. \u6ce8\u610f\uff1a\u4efb\u4f55\u6b65\u9aa4\u6267\u884c\u5b8c\u6bd5\uff0c\u90fd\u4e0d\u5e94\u5f53\u51fa\u73b0\u5f39\u51fa\u5bf9\u8bdd\u6846\u672a\u5173\u95ed\u7684\u60c5\u51b5\uff0c\u5426\u5219\u4f1a\u963b\u65ad\u4e4b\u540e\u7684\u6267\u884c\u3002\u5982\u679c\u9047\u5230\u80fd\u590d\u73b0\u7684\u9519\u8bef\uff0c\u8bf7\u622a\u56fe\u5e76\u4fdd\u7559\u65e5\u5fd7\n\n### VSCode\u8fd0\u884c[demo\u793a\u4f8b](examples/demo.py)\n```python\nfrom thsauto import THS\n\n# \u521d\u6b21\u4f7f\u7528\u8bf7\u5728`debug=True`\u6a21\u5f0f\u4e0b\u591a\u6d4b\u8bd5\u51e0\u6b21\n# \u518d\u6b21\u6d4b\u8bd5\u5728\u6a21\u62df\u7092\u80a1\u4e0b\u518d\u5f00\u542f`debug=False`\n# \u7136\u540e\u518d\u5728\u5176\u5b83\u8d26\u53f7\u4e0b`debug=True`\u6a21\u5f0f\u4e0b\u6d4b\u8bd5\n# \u6700\u540e\u662f\u5176\u5b83\u8d26\u53f7\u4e0b`debug=False`\u4e0b\u4ea4\u6613\nt = THS(debug=True, skip_popup=False)\nt.connect(addr=\"emulator-5554\")\n\n# \u8d44\u4ea7\nt.get_balance()\n\"\"\"\n{'\u603b\u8d44\u4ea7': 200202.81,\n '\u6d6e\u52a8\u76c8\u4e8f': 202.81,\n '\u5f53\u65e5\u53c2\u8003\u76c8\u4e8f': 89.01,\n '\u5f53\u65e5\u53c2\u8003\u76c8\u4e8f\u7387': 0.0004,\n '\u6301\u4ed3\u5e02\u503c': 12454.0,\n '\u53ef\u7528\u8d44\u91d1': 172459.9,\n '\u53ef\u53d6\u8d44\u91d1': 0.0}\n\"\"\"\n\n# \u6301\u4ed3\nt.get_positions()\n\"\"\"\n\t\u540d\u79f0\t\u5e02\u503c\t\u76c8\u4e8f\t\u76c8\u4e8f\u7387\t\u6301\u4ed3\t\u53ef\u7528\t\u6210\u672c\t\u73b0\u4ef7\n0\t\u7f8e\u7684\u96c6\u56e2\t5526.0\t2.23\t0.00040\t100\t100\t55.238\t55.26\n1\t\u62db\u5546\u94f6\u884c\t3156.0\t11.00\t0.00350\t100\t100\t31.450\t31.56\n2\t\u4e07\u79d1A\t2688.0\t196.92\t0.07908\t200\t0\t12.455\t13.44\n3\t\u8d35\u5dde\u8f6e\u80ce\t705.0\t-5.22\t-0.00730\t100\t100\t7.102\t7.05\n4\t\u4e2d\u56fd\u94f6\u884c\t379.0\t-2.12\t-0.00560\t100\t100\t3.811\t3.79\n\"\"\"\n\n# \u59d4\u6258\nt.get_orders(break_after_done=True)\n\"\"\"\n\u540d\u79f0\t\u59d4\u6258\u65f6\u95f4\t\u59d4\u6258\u4ef7\t\u6210\u4ea4\u5747\u4ef7\t\u59d4\u6258\u91cf\t\u5df2\u6210\u4ea4\u91cf\t\u4e70\u5356\t\u72b6\u6001\n0\t\u6d66\u53d1\u94f6\u884c\t21:16:56\t5.00\t0.0\t100\t0\t\u4e70\u5165\t\u672a\u6210\u4ea4\n1\t\u6d66\u53d1\u94f6\u884c\t21:14:41\t10.50\t0.0\t100\t0\t\u4e70\u5165\t\u672a\u6210\u4ea4\n2\t\u6d66\u53d1\u94f6\u884c\t10:07:39\t10.50\t0.0\t100\t0\t\u4e70\u5165\t\u672a\u6210\u4ea4\n3\t\u6d66\u53d1\u94f6\u884c\t02:15:10\t10.50\t0.0\t100\t0\t\u4e70\u5165\t\u672a\u6210\u4ea4\n4\t\u6d66\u53d1\u94f6\u884c\t01:50:09\t10.50\t0.0\t100\t0\t\u4e70\u5165\t\u672a\u6210\u4ea4\n5\t\u4e07\u79d1A\t22:10:22\t10.00\t0.0\t100\t0\t\u5356\u51fa\t\u672a\u6210\u4ea4\n6\t\u4e07\u79d1A\t21:48:15\t15.00\t0.0\t100\t0\t\u5356\u51fa\t\u672a\u6210\u4ea4\n7\t\u767d\u4e91\u673a\u573a\t16:58:46\t11.76\t0.0\t200\t0\t\u4e70\u5165\t\u672a\u6210\u4ea4\n8\t\u767d\u4e91\u673a\u573a\t16:26:47\t11.76\t0.0\t100\t0\t\u4e70\u5165\t\u672a\u6210\u4ea4\n9\t\u767d\u4e91\u673a\u573a\t16:58:37\t11.76\t0.0\t100\t0\t\u4e70\u5165\t\u5168\u90e8\u64a4\u5355\n10\t\u767d\u4e91\u673a\u573a\t16:27:05\t11.76\t0.0\t200\t0\t\u4e70\u5165\t\u5168\u90e8\u64a4\u5355\n\"\"\"\n\n# \u59d4\u6258\u3002\u672a\u5904\u7406\u7684\u539f\u59cb\u6570\u636e\nt.orders\n\"\"\"\n[('\u6d66\u53d1\u94f6\u884c', '21:16:56', '5.000', '0.000', '100', '0', '\u4e70\u5165', '\u672a\u6210\u4ea4'),\n ('\u6d66\u53d1\u94f6\u884c', '21:14:41', '10.500', '0.000', '100', '0', '\u4e70\u5165', '\u672a\u6210\u4ea4'),\n ('\u6d66\u53d1\u94f6\u884c', '10:07:39', '10.500', '0.000', '100', '0', '\u4e70\u5165', '\u672a\u6210\u4ea4'),\n ('\u6d66\u53d1\u94f6\u884c', '02:15:10', '10.500', '0.000', '100', '0', '\u4e70\u5165', '\u672a\u6210\u4ea4'),\n ('\u6d66\u53d1\u94f6\u884c', '01:50:09', '10.500', '0.000', '100', '0', '\u4e70\u5165', '\u672a\u6210\u4ea4'),\n ('\u4e07  \u79d1 A', '22:10:22', '10.000', '0.000', '100', '0', '\u5356\u51fa', '\u672a\u6210\u4ea4'),\n ('\u4e07  \u79d1 A', '21:48:15', '15.000', '0.000', '100', '0', '\u5356\u51fa', '\u672a\u6210\u4ea4'),\n ('\u767d\u4e91\u673a\u573a', '16:58:46', '11.760', '0.000', '200', '0', '\u4e70\u5165', '\u672a\u6210\u4ea4'),\n ('\u767d\u4e91\u673a\u573a', '16:26:47', '11.760', '0.000', '100', '0', '\u4e70\u5165', '\u672a\u6210\u4ea4'),\n ('\u767d\u4e91\u673a\u573a', '16:58:37', '11.760', '0.000', '100', '0', '\u4e70\u5165', '\u5168\u90e8\u64a4\u5355'),\n ('\u767d\u4e91\u673a\u573a', '16:27:05', '11.760', '0.000', '200', '0', '\u4e70\u5165', '\u5168\u90e8\u64a4\u5355')]\n\"\"\"\n\n# \u652f\u6301\u80a1\u7968\u4ee3\u7801\nconfirm, prompt = t.buy(100, 5, code='600000')\nconfirm, prompt\n\"\"\"\n({'\u6807\u9898': '\u59d4\u6258\u4e70\u5165\u786e\u8ba4',\n  '\u8d26\u6237': 'A516832234',\n  '\u540d\u79f0': '\u6d66\u53d1\u94f6\u884c',\n  '\u4ee3\u7801': '600000',\n  '\u6570\u91cf': 100,\n  '\u4ef7\u683c': 5.0},\n {'\u6807\u9898': '\u7cfb\u7edf\u4fe1\u606f', '\u5185\u5bb9': '\u59d4\u6258\u5df2\u63d0\u4ea4\uff0c\u5408\u540c\u53f7\u4e3a\uff1a3672942466'})\n\"\"\"\n\n# \u64a4\u7b2c\u4e00\u6761\nconfirm, prompt = t.cancel_single(t.order_at(0))\nconfirm, prompt\n\"\"\"\n({'\u6807\u9898': '\u59d4\u6258\u64a4\u5355\u786e\u8ba4',\n  '\u64cd\u4f5c': '\u64a4\u4e70\u5165\u5355',\n  '\u540d\u79f0': '\u6d66\u53d1\u94f6\u884c',\n  '\u4ee3\u7801': '600000',\n  '\u6570\u91cf': 100,\n  '\u4ef7\u683c': 5.0},\n {})\n\"\"\"\n```\n\n## Web\u670d\u52a1\n\u4e3a\u5b9e\u73b0\u8de8\u8bed\u8a00\u7684\u8c03\u7528\uff0c\u8fd8\u4f7f\u7528`FastAPI`\u5b9e\u73b0\u4e86Web\u670d\u52a1\u3002\u6ce8\u610f\uff1a\u9700\u4f7f\u7528`pip install -U thsauto[cli]`\u5b89\u88c5\n\n```commandline\n# \u542f\u52a8Web\u670d\u52a1\n# python -m thsauto run --host=0.0.0.0 --port=5000\nthsauto run --host=0.0.0.0 --port=5000\n\n# \u652f\u6301\u7684Web\u8bf7\u6c42\ncurl http://127.0.0.1:5000/connect?addr=emulator-5554\ncurl http://127.0.0.1:5000/refresh\ncurl http://127.0.0.1:5000/get_balance\ncurl http://127.0.0.1:5000/get_positions\ncurl http://127.0.0.1:5000/get_orders\ncurl http://127.0.0.1:5000/order_at/0  # get_orders\u540e\u7684\u987a\u5e8f\ncurl http://127.0.0.1:5000/buy?qty=100&price=nan&code=000001\ncurl http://127.0.0.1:5000/sell?qty=100&price=5.1&code=000001\ncurl http://127.0.0.1:5000/cancels/all # \u652f\u6301\u7684\u53c2\u6570all buy sell\ncurl http://127.0.0.1:5000/cancel/0  # get_orders\u540e\u7684\u987a\u5e8f\n\n```\n\n## CLI\u547d\u4ee4\n\u540c\u65f6\u8fd8\u63d0\u4f9b\u4e86`CLI`\u63a5\u53e3\uff0c\u5b83\u5b9e\u9645\u4e0a\u8bbf\u95ee`Web`\u670d\u52a1\u6765\u5b9e\u73b0\u76f8\u5e94\u529f\u80fd\uff0c\u6240\u4ee5\u9700\u5148\u542f\u52a8\u670d\u52a1\u3002\u6ce8\u610f\uff1a\u9700\u4f7f\u7528`pip install -U thsauto[cli]`\u5b89\u88c5\n\n```commandline\n# \u542f\u52a8Web\u670d\u52a1\nthsauto run --host=0.0.0.0 --port=5000\n\n# \u652f\u6301\u7684CLI\u6307\u4ee4\nthsauto connect --addr=emulator-5554\nthsauto refresh\nthsauto get_balance\nthsauto get_positions\nthsauto get_orders\nthsauto order_at --idx=0\nthsauto buy --qty=100 --price=nan --code=000001\nthsauto sell --qty=100 --price=5.1 --code=000001\nthsauto cancels --opt=all\nthsauto cancel --idx=0\n```\n\n\u5982\u679c\u4e4b\u524d\u542f\u52a8\u65f6\u4f7f\u7528\u7684\u662f\u7279\u6b8aIP\u548c\u7aef\u53e3\uff0c\u53ef\u4ee5\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u4e34\u65f6\u8bbe\u5b9a\n```commandline\n# \u542f\u52a8Web\u670d\u52a1\nthsauto run --host=127.0.0.1 --port=8080\n\n# Windows\u5e73\u53f0\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\nset THSAUTO_HOST=127.0.0.1\nset THSAUTO_PORT=8080\nthsauto connect --addr=emulator-5554\n\n# Linux\u5e73\u53f0\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\nexport THSAUTO_HOST=127.0.0.1\nexport THSAUTO_PORT=8080\nthsauto connect --addr=emulator-5554\n\n```\n\n## \u805a\u5bbd\u8fdc\u7a0b\u4e0b\u5355\n\u672c\u529f\u80fd\u57fa\u4e8e`Web\u670d\u52a1`\u548c`CLI\u547d\u4ee4`\n1. `Web\u670d\u52a1`: \u5b89\u88c5\u5728\u8fdc\u7a0b\u4e91\u670d\u52a1\u5668\u4e0a\uff0c\u63a5\u6536\u6765\u81ea\u805a\u5bbd\u7684`HTTP`\u8bf7\u6c42\n2. `CLI\u547d\u4ee4`: \u90e8\u7f72\u5728\u5ba2\u6237\u7aef\uff0c\u5c06`Python\u8c03\u7528`\u8f6c\u6362\u6210`HTTP`\u8bf7\u6c42\n\n\u4ec5\u590d\u5236`cli.py`\u6587\u4ef6\u6216\u4ee3\u7801\u5230\u805a\u5bbd\u4e2d\uff0c\u90e8\u5206\u4fee\u6539\u8c03\u7528\u3002\u8be6\u60c5\u53c2\u8003[joinquant\u793a\u4f8b](examples/joinquant.py)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "ths automation test",
    "version": "0.3.4",
    "project_urls": null,
    "split_keywords": [
        "ths",
        "automation"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dcf12c7f351f6b8c6b2c76b60f0be56be4b01c48a0fec5d873323c650f9ce9b5",
                "md5": "029c6e463d07153788864745ea6beba0",
                "sha256": "088341e6e3687ead4def6f735873ae1c3a870a5e045f00477f2070bfea5c54bd"
            },
            "downloads": -1,
            "filename": "thsauto-0.3.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "029c6e463d07153788864745ea6beba0",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 19852,
            "upload_time": "2024-03-08T07:12:57",
            "upload_time_iso_8601": "2024-03-08T07:12:57.852540Z",
            "url": "https://files.pythonhosted.org/packages/dc/f1/2c7f351f6b8c6b2c76b60f0be56be4b01c48a0fec5d873323c650f9ce9b5/thsauto-0.3.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8deaa0b5bf7cc8f75ebb307d38cd2551542ccbb6244c47c70e81e5a5fc69ff28",
                "md5": "a0bbfc69f23b04e85fa77a6a70f44c97",
                "sha256": "48c965402ec4cf568ed818db23871ef88d3b874c82e81b387754bc303e195715"
            },
            "downloads": -1,
            "filename": "thsauto-0.3.4.tar.gz",
            "has_sig": false,
            "md5_digest": "a0bbfc69f23b04e85fa77a6a70f44c97",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 21326,
            "upload_time": "2024-03-08T07:12:59",
            "upload_time_iso_8601": "2024-03-08T07:12:59.798215Z",
            "url": "https://files.pythonhosted.org/packages/8d/ea/a0b5bf7cc8f75ebb307d38cd2551542ccbb6244c47c70e81e5a5fc69ff28/thsauto-0.3.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-08 07:12:59",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "thsauto"
}
        
Elapsed time: 0.20299s