Git Product home page Git Product logo

thstrader's Introduction

THSTrader

量化交易工具。同花顺手机版模拟炒股python API,基于uiautomator2和图色方法实现。【可自行扩展到实盘,见最后】

为什么有这个项目

本来看到了这个easytrader这个项目,不过这个客户端已经过时了(被强制更新)。于是乎,自己看了一遍easytrader的源码,写了一个自己的版本。旧版本为PC版本,已经不能用了,如有兴趣请查看PC同花顺-旧版分支。

安装说明

需要Windows系统哈,别的系统可以考虑自己连接安卓真机改一下截图的参数。

1. Python依赖

我使用的是Python3.9,以上版本应该也可以。

git clone https://github.com/nladuo/THSTrader.git
cd THSTrader
pip install -r requirements.txt

2. 安装雷电9模拟器

下载链接:https://res.ldmnq.com/download/leidian9/ldinst_9.0.48.0.exe

3. 配置模拟器分辨率

模拟器分辨率我用的是720x1280,320dpi,如需其他分辨率请自行修改代码里的参数。

4. 安装同花顺APP

在模拟器上安装同花顺APP,链接:https://pan.baidu.com/s/1IuoXaOfKgckUTi91hUiqlQ ,提取码:449w。

安装好之后请登录同花顺APP找到模拟炒股那里保证模拟炒股可以使用,如果不知道怎么操作可以看后面的B站视频。

5. 安装配置ADB

首先下载ADB,下载后添加到系统的环境变量中。雷电模拟器也自带了ADB,可以去安装目录下的LDPlayer9下面找到。

操作接口(API)

操作演示视频见:https://www.bilibili.com/video/BV1sX4y147Qe/。咱也不求赞助,如果本项目对你有帮助,请给个B站的关注。

测试连接模拟器

首先检查设备,如果是只有一个雷电模拟器的话,一般都是emulator-5554这个。

adb kill-server
adb devices

然后初始化uiautomator2

python -m uiautomator2 init

连接设备

from THS.THSTrader import THSTrader
trader = THSTrader(r"emulator-5554")    # 连接手机

获取当前可用资金

trader.get_balance()

返回:

{
	'总资产': 199987.96,
	'可用余额': 170632.4,
	'股票市值': 10146.0
}

** 注意:这里总资产并不是可用余额+股票市值,有一些资金可能代表未成交的金额。 **

获取当前持有的股票

说明:获取当前持仓的速度会比较慢,后续需要优化。

trader.get_position()

返回:

[{
	'股票名称': '美的集团',
	'股票余额': 100,
	'可用余额': 0
}, {
	'股票名称': '平安银行',
	'股票余额': 200,
	'可用余额': 200
}, {
	'股票名称': '浦发银行',
	'股票余额': 100,
	'可用余额': 100
}, {
	'股票名称': '工商银行',
	'股票余额': 100,
	'可用余额': 100
}, {
	'股票名称': '**银行',
	'股票余额': 100,
	'可用余额': 100
}]

因为A股是T+1,可用余额为当前可以卖出下单的。

买入股票

trader.buy(stock_no="601988", amount=300, price=3.94)

返回:

{
	'success': True,
	'msg': '委托已提交。合同号为:3549926014',
	'stock_name': '**银行',
	'amount': '300',
	'price': '3.94',
	'type': '买入'
}

卖出股票

trader.sell(stock_no="601988", amount=100, price=4.00)

返回:

{
	'success': True,
	'msg': '委托已提交。合同号为:3549959358',
	'stock_name': '**银行',
	'amount': '100',
	'price': '4.0',
	'type': '卖出'
}

获取当前可撤单列表

说明:获取当前可撤单列表会比较慢,后续需要优化。

trader.get_avail_withdrawals()

返回:

[{
	'股票名称': '美的集团',
	'委托价格': 58.33,
	'委托数量': 100,
	'委托类型': '卖出'
}, {
	'股票名称': '**银行',
	'委托价格': 3.97,
	'委托数量': 100,
	'委托类型': '买入'
}, {
	'股票名称': '**银行',
	'委托价格': 3.97,
	'委托数量': 100,
	'委托类型': '买入'
}, {
	'股票名称': '五粮液',
	'委托价格': 184.09,
	'委托数量': 100,
	'委托类型': '买入'
}]

买卖撤单

说明:撤单操作速度比较慢,后续需要优化。

trader.withdraw(stock_name="**银行", t="买入", amount=300, price=3.94)

返回:

{
	'success': True,
}

实盘

经过群友测试,可以使用实盘,可以使用uiautomator2+weditor然后筛选元素,修改THSTrader.__back_to_moni_page

交流群

更新可能没那么及时这里提供一个交流群。群号:399623752(1群),562639692(2群)。

LICENSE

GPL-3.0

thstrader's People

Contributors

nladuo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

thstrader's Issues

ImportError: DLL load failed: 找不到指定的模块。

C:\Users\Administrator>python C:\Users\Administrator\Desktop\work\THSTrader\test.py
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\work\THSTrader\test.py", line 4, in
from THS.THSTrader import THSTrader
File "C:\Users\Administrator\Desktop\work\THSTrader\THS\THSTrader.py", line 5, in
import pandas as pd
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas_init_.py", line 42, in
from pandas.core.api import *
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\api.py", line 10, in
from pandas.core.groupby.groupby import Grouper
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\groupby_init_.py", line 2, in
from pandas.core.groupby.groupby import (
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\groupby\groupby.py", line 49, in
from pandas.core.frame import DataFrame
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\frame.py", line 74, in
from pandas.core.series import Series
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\series.py", line 3978, in
Series._add_series_or_dataframe_operations()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\generic.py", line 8891, in _add_series_or_dataframe_operations
from pandas.core import window as rwindow
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\window.py", line 36, in
import pandas._libs.window as _window
ImportError: DLL load failed: 找不到指定的模块。

adbutils.errors.AdbError: unknown host service

作者你好,我的python版本3.9,用的是雷电模拟器9,相关包的依赖也安装了

adb devices
显示为
List of devices attached
emulator-5554   device

但是在运行下列代码时,会出现unknown host service

python -m uiautomator2 init
显示为
adbutils.errors.AdbError: unknown host service

想问一下这是什么原因导致的,非常感谢,以下是完整显示

 python -m uiautomator2 init
[I 230628 00:49:01 init:156] uiautomator2 version: 2.16.23
[I 230628 00:49:01 init:373] Install minicap, minitouch
[D 230628 00:49:01 init:59] Use cached assets: C:\Users\Administrator\.uiautomator2\cache\minitouch-69336c8f34\minitouch
[D 230628 00:49:01 init:238] Push to /data/local/tmp/minitouch:0755
[D 230628 00:49:01 init:59] Use cached assets: C:\Users\Administrator\.uiautomator2\cache\minicap.so-0750876ce8\minicap.so
[D 230628 00:49:01 init:238] Push to /data/local/tmp/minicap.so:0755
[D 230628 00:49:01 init:59] Use cached assets: C:\Users\Administrator\.uiautomator2\cache\minicap-3d0b86b17d\minicap
[D 230628 00:49:01 init:238] Push to /data/local/tmp/minicap:0755
[D 230628 00:49:01 init:256] apk-debug package-info: {'package_name': 'com.github.uiautomator', 'version_name': '2.3.3', 'version_code': 2003003, 'flags': ['DEBUGGABLE', 'HAS_CODE', 'ALLOW_CLEAR_USER_DATA', 'ALLOW_BACKUP'], 'first_install_time': datetime.datetime(2023, 6, 28, 0, 33, 9), 'last_update_time': datetime.datetime(2023, 6, 28, 0, 33, 9), 'signature': 'ae17cd86], past signatures:['}
[D 230628 00:49:01 init:257] apk-debug-test package-info: {'package_name': 'com.github.uiautomator.test', 'version_name': 'null', 'version_code': 0, 'flags': ['DEBUGGABLE', 'HAS_CODE', 'ALLOW_CLEAR_USER_DATA', 'ALLOW_BACKUP'], 'first_install_time': datetime.datetime(2023, 6, 28, 0, 33, 9), 'last_update_time': datetime.datetime(2023, 6, 28, 0, 33, 9), 'signature': 'ae17cd86], past signatures:['}
[I 230628 00:49:01 init:391] Already installed com.github.uiautomator apks
[D 230628 00:49:01 init:167] Shell: ('/data/local/tmp/atx-agent', 'server', '--stop')
[D 230628 00:49:02 init:295] Real version: [0, 10, 0], Expect version: [0, 10, 0]
[D 230628 00:49:02 init:167] Shell: ('/data/local/tmp/atx-agent', 'server', '--nouia', '-d', '--addr', '127.0.0.1:7912')
[I 230628 00:49:02 init:350] Check atx-agent version
Traceback (most recent call last):
  File "C:\ProgramData\anaconda3\envs\py39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\ProgramData\anaconda3\envs\py39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\uiautomator2\__main__.py", line 289, in <module>
    main()
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\uiautomator2\__main__.py", line 279, in main
    actions[args.subparser](args)
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\uiautomator2\__main__.py", line 36, in cmd_init
    init.install()
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\uiautomator2\init.py", line 393, in install
    self.setup_atx_agent()
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\uiautomator2\init.py", line 351, in setup_atx_agent
    self.check_atx_agent_version()
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\decorator.py", line 232, in fun
    return caller(func, *(extras + args), **kw)
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\retry\api.py", line 73, in retry_decorator
    return __retry_internal(partial(f, *args, **kwargs), exceptions, tries, delay, max_delay, backoff, jitter,
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\retry\api.py", line 33, in __retry_internal
    return f()
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\uiautomator2\init.py", line 358, in check_atx_agent_version
    port = self._device.forward_port(7912)
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\adbutils\_device.py", line 244, in forward_port
    for f in self.forward_list():
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\adbutils\_device.py", line 252, in forward_list
    c = self.open_transport("list-forward")
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\adbutils\_device.py", line 89, in open_transport
    c.check_okay()
  File "C:\ProgramData\anaconda3\envs\py39\lib\site-packages\adbutils\_adb.py", line 134, in check_okay
    raise AdbError(self.read_string_block())
adbutils.errors.AdbError: unknown host service

timed out

`# -- coding: utf-8 --

import time

from tools.THS.THSTrader import THSTrader

if name == "main":
trader = THSTrader(r"C:\海通同花顺\xiadan.exe") # 连接客户端

print(trader.get_balance())                            # 获取当前可用资金

print(trader.get_position())                           # 获取当前持有的股票

print(trader.sell(stock_no="162411", amount=100, price=0.238))  # 卖出股票

result = trader.buy(stock_no="162411", amount=100, price=0.218)  # 买入股票
print(result)
time.sleep(5)
if result["success"] == True:						   # 如果买入下单成功,尝试撤单
    print("撤单测试--->", end="")
    print(trader.cancel_entrust(entrust_no=result["entrust_no"]))

`

timed out

没用楼主的版本,而是用了,证券公司的同花顺版本。

所需依赖的版本问题

你好, 我今天试了一下你的这个脚本,我是直接pip install requirements.txt 这样安装的依赖,结果发现安装的版本和你代码里面用的很多api都不一样了,希望能在requirements.txt里面标注所依赖的库的版本号,谢谢。 如果想一起交流策略方面的,可以加我QQ:5108926

好像“买入”功能失效了。

问题出在这,
self.main_wnd.window(control_id=0x408, class_name="Edit"). .set_text(str(stock_no)) # 设置股票代码
这个元素的定位是成功的,draw_outline()可以正常显示,但set_text后毫无反应

复制持仓数据之后,验证码如何绕过

def __get_grid_data(self, is_records=True):
    """ 获取grid里面的数据 """
    self.__click_update_button()
    time.sleep(0.5)
    grid = self.main_wnd.window(control_id=0x417, class_name='CVirtualGridCtrl')
    grid.set_focus()
    time.sleep(0.5)
    pywinauto.keyboard.send_keys('^c')
    data = clipboard.GetData()
    df = pd.read_csv(io.StringIO(data), delimiter='\t', na_filter=False)
    if is_records:
        return df.to_dict('records')
    else:
        return df

请教验证码如何处理的,没有发现验证码处理的逻辑

pywinauto.findwindows.ElementNotFoundError

我在win10的环境下,用楼主百度网盘中提供的同花顺软件,运行不起来,具体表现:

  1. pandas指定的0.23.0版本安装不了,最低版本可安装0.24.2,该软件版本差异应该不影响使用
  2. pywinauto中的SendKeys应该替换为send_keys, 之前使用的是一个已废弃的api, 不影响使用
  3. 运行test.py, 能正常连接同花顺客户端,之后获取可用资金失败,猜测可能是该程序与百度云中的同花顺客户端版本不兼容,提供的文件句柄不正确,具体错误为:pywinauto.findwindows.ElementNotFoundError: {'control_id': 1038, 'class_name': 'Static', 'top_level_only': False, 'parent': <win32_element_info.HwndElementInfo - '网上股票交易系统5.0', AfxFrameOrView42s, 723342>, 'backend': 'win32'},这个错误有时候会出现
  4. 获取可用资金时还会出现检测到您正在拷贝数据,为保护您的帐号数据安全,请先输入验证码,这时候程序不会自动输入验证码,导致获取失败

希望楼主提供解决方法,若是版本问题,还望更新客户端软件或者更新程序

import THSTrader直接报错

import THSTrader就会直接报错

报错信息如下
D:\IDE\Miniconda\main\envs\stocks\python.exe "D:/Personal/Dropbox (个人)/Projects/Python/Stocks/Stock_autotrader.py"
Traceback (most recent call last):
File "D:\IDE\Miniconda\main\envs\stocks\lib\ctypes_init_.py", line 121, in WINFUNCTYPE
return _win_functype_cache[(restype, argtypes, flags)]
KeyError: (<class 'ctypes.HRESULT'>, (<class 'ctypes.c_long'>, <class 'comtypes.automation.tagVARIANT'>, <class 'comtypes.LP_POINTER(IUIAutomationCondition)'>), 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "D:/Personal/Dropbox (个人)/Projects/Python/Stocks/Stock_autotrader.py", line 7, in
from THS.THS.THSTrader import THSTrader
File "D:\Personal\Dropbox (个人)\Projects\Python\Stocks\THS\THS\THSTrader.py", line 1, in
import pywinauto
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto_init_.py", line 89, in
from . import findwindows
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto\findwindows.py", line 42, in
from . import controls
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto\controls_init_.py", line 36, in
from . import uiawrapper # register "uia" back-end (at the end of uiawrapper module)
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto\controls\uiawrapper.py", line 47, in
from ..uia_defines import IUIA
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto\uia_defines.py", line 181, in
pattern_ids = _build_pattern_ids_dic()
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto\uia_defines.py", line 169, in _build_pattern_ids_dic
if hasattr(IUIA().ui_automation_client, cls_name):
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto\uia_defines.py", line 50, in call
cls._instances[cls] = super(_Singleton, cls).call(*args, **kwargs)
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\pywinauto\uia_defines.py", line 60, in init
self.UIA_dll = comtypes.client.GetModule('UIAutomationCore.dll')
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\comtypes\client_generate.py", line 110, in GetModule
mod = _CreateWrapper(tlib, pathname)
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\comtypes\client_generate.py", line 184, in _CreateWrapper
mod = _my_import(fullname)
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\comtypes\client_generate.py", line 24, in my_import
return import(fullname, globals(), locals(), ['DUMMY'])
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\comtypes\gen_944DE083_8FB8_45CF_BCB7_C477ACB2F897_0_1_0.py", line 571, in
( ['out', 'retval'], POINTER(POINTER(IUIAutomationElement)), 'element' )),
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\comtypes_init
.py", line 329, in setattr
self.make_methods(value)
File "D:\IDE\Miniconda\main\envs\stocks\lib\site-packages\comtypes_init
.py", line 698, in make_methods
prototype = WINFUNCTYPE(restype, *argtypes)
File "D:\IDE\Miniconda\main\envs\stocks\lib\ctypes_init
.py", line 123, in WINFUNCTYPE
class WinFunctionType(_CFuncPtr):
TypeError: item 2 in argtypes passes a union by value, which is unsupported.

Process finished with exit code 1
这是怎么回事

想请教您如何获得control_id

作者您好,我是个私募从业人员,有两个问题想要请教您:
1想请教您如何获得control_id,我在窗口下调用self.main_wnd.print_control_identifiers()发现也无法返回子窗口的control_id
2.获得grid中内容的方法,我看您是用的模拟键盘鼠标,把数据取到剪切板中再进行分析读取;为何无法取得grid的窗口,继而通过窗口继续调取数据?(跳过ocr识别的时间)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.