Thsrobot 是一款专为同花顺设计的自动化交易工具,支持所有同花顺合作券商,具有以下特点:
轻量高效:程序体积小,下单任务响应速度极快(1秒内完成)
安全可靠:完全本地运行
功能全面:⽀持 账户资⾦查询、 持仓查询、 委托查询、 成交查询、 股票买⼊、 股票卖出等操作。
操作系统:使用 Windows 10及以上版本,云服务使用 Window Server2019 及以上(64位)
必要软件:同花顺官方PC版
Microsoft Visual C++:系统上需要安装 Microsoft Visual C++ 可再发行程序包,这个需要你更新到最新版本状态; window 64下载、window 32下载,更多查看Microsoft Visual C++
下载地址:同花顺官网下载
安装步骤:
默认安装即可,不同版本安装目录结构可能有所差异,一般安装在目录 C:\同花顺软件\同花顺\同花顺
首次手动登录并添加券商账户 (打开同花顺,在右上角,点击“委托”,添加券商账户,选择你的证券公司,完成账号登陆)
完成交易界面测试(确保能正常打开下单界面)
下载地址:window 64下载、window 32下载,更多查看Microsoft Visual C++
安装步骤:
默认安装即可
价格设置(重要!!! ):
系统 > 交易设置 >
默认买入价格 → 设置"空"
默认卖出价格 → 设置"空"
示例截图:
快捷交易:
系统 > 快速交易 >
买入时是否需要确认 → 设为"否"
卖出时是否需要确认 → 设为"否"
示例截图:
创建专用目录(推荐 C:\app)
将 thsrobot.exe 放入目录
首次运行:右键选择 以管理员身份运行
首次运行后自动生成 config.yaml,需修改以下关键参数,修改完成再次运行thsrobot.exe 程序:
备注:你也可以提前手动创建配置
xxxxxxxxxx
login-auth account资金账户 company证券公司 credit-account你的信用账户 credit-password你的信用密码 password资金密码 ths-account同花顺账户 ths-password同花顺密码 transaction-modestockmodeprodplatform password量子象限平台密码 urlhttps//dev.liangzxx.com/api/thsrobot username量子象限平台账户port80web-auth disablefalse secret-idDo1W7EmBM3WxofnYQR_05A== secret-keyn50OX6RFDkWyDjORmzm_z45iTcNQw04WmnZkrIBqqEI=
基础路径:http://localhost:80/api/v1
| 功能 | 请求方式 | 接口路径 | 请求参数示例(JSON) | 说明 |
|---|---|---|---|---|
| 同步买入 | POST | /stock/buy | {"code":"002188","price":1.22,"volume":100,"acceptRisk": false} | 直接返回操作结果,可能包含失败提示 |
| 异步买入 | POST | /stock/sync/buy | {"code":"002188","price":1.22,"volume":100,"acceptRisk": false} | 提交后立即返回"提交成功",实际结果需通过其他接口查询 |
| 同步卖出 | POST | /stock/sell | {"code":"002188","price":1.22,"volume":100,"acceptRisk": false} | 同同步买入逻辑 |
| 异步卖出 | POST | /stock/sync/sell | {"code":"002188","price":1.22,"volume":100,"acceptRisk": false} | 同异步买入逻辑 |
| 同步撤单 | POST | /stock/cancel | {"cancelType": 0} | cancelType:0=全部撤单,1=撤买入单,2=撤卖出单 |
| 异步撤单 | POST | /stock/sync/cancel | {"cancelType": 0} | 同同步撤单逻辑 |
| 查询资金信息 | GET | /stock/assets | - | 返回可用金额、总资产、持仓盈亏等数据 |
| 查询委托记录 | GET | /stock/order | - | 返回当前所有委托单的详细信息(委托价格、数量、状态等) |
| 查询持仓 | GET | /stock/position | - | 返回持仓股票的代码、数量、成本价、盈亏等 |
| 查询成交记录 | GET | /stock/trade | - | 返回历史成交记录(成交时间、价格、数量等) |
xxxxxxxxxx{ "status": 0, // 0=成功,非0=失败 "message": "提示信息", "data": {} // 具体数据(查询类接口返回)}xxxxxxxxxx# coding:utf-8
import hashlibimport hmacimport jsonimport timeimport uuidfrom urllib.parse import urlparse, parse_qs, urlencode
import requestsfrom requests.auth import AuthBase
your_server_addr ="http://localhost:8080/api/v1/stock/"secretId ="bWYgDxe1ZBiQK4Tt4XCP6vYCWY3QuYxm"secretKey ="bWYgDxe1ZBiQK4Tt4XCP6vYCWY3QuYxm"
# 认证签名class SignAuth(AuthBase): def __init__(self, secret_id:str = secretKey, secret_key:str = secretKey): self.secret_id = secret_id self.secret_key = secret_key
def __call__(self, r): # 获取当前时间戳和nonce timestamp = str(int(time.time())) nonce = str(uuid.uuid4()) body = r.body or b""
parsed_url = urlparse(r.url) query_params = parse_qs(parsed_url.query) # 获取查询参数字典 # 对查询参数进行排序 sorted_query_params = dict(sorted(query_params.items())) # 将排序后的查询参数重新编码为字符串 sorted_params_str = urlencode(sorted_query_params, doseq=True)
# 构造待签名字符串 sign_data = [ r.method, r.path_url.split("?")[0], sorted_params_str, timestamp, nonce, body.decode('utf-8') if isinstance(body, bytes) else body ]
sign_data = '\n'.join(sign_data)
# 使用HMAC算法和SHA256哈希函数创建签名 signature = hmac.new(self.secret_key.encode('utf-8'), sign_data.encode('utf-8'), hashlib.sha256)
# 将签名转换为Base64编码的字符串 signature = signature.digest().hex()
# 添加必要的认证头 authorization = f"hmac id=\"{self.secret_id}\", ts=\"{timestamp}\", nonce=\"{nonce}\", sig=\"{signature}\""
r.headers['Authorization'] = authorization return r
#股票买入方法def buy_stock(stock_code,price,vol): start_time = time.time() print('开始买入:'+stock_code+' 价格:'+str(price)+' 数量:'+str(vol)) result=requests.post(your_server_addr+"buy", json={ "code": stock_code, "price": price, "volume": vol }, auth=SignAuth()) print(result.json()) end_time = time.time() elapsed_time = end_time - start_time print(f"买入执行耗时: {elapsed_time} 秒")
#股票卖出方法def sell_stock(stock_code,price,vol): start_time = time.time() print('开始卖出:'+stock_code+' 价格:'+str(price)+' 数量:'+str(vol)) stock_code=stock_code[:6] result=requests.post(your_server_addr+"sell", json={ "code": stock_code, "price": price, "volume": vol }, auth=SignAuth()) print(result.json) end_time = time.time() elapsed_time = end_time - start_time print(f"卖出执行耗时: {elapsed_time} 秒")
#委撤撤单方法def cancel_stock(cancelType): start_time = time.time() print('开始全部撤单') result=requests.post(your_server_addr+"cancel", json={ "cancelType": cancelType }, auth=SignAuth()) print(result.json) end_time = time.time() elapsed_time = end_time - start_time print(f"卖出执行耗时: {elapsed_time} 秒")
#获取账户资金方法def get_account(): result=requests.get(your_server_addr+"funding", auth=SignAuth()).text data_dict=json.loads(result) return data_dict['data']
#获取委托信息方法def get_order(): result=requests.get(your_server_addr+"order", auth=SignAuth()).text data_dict=json.loads(result) if 'data' in data_dict.keys(): return data_dict['data'] else: return
#获取持仓方法def get_position(): result=requests.get(your_server_addr+"position", auth=SignAuth()).text data_dict=json.loads(result) return data_dict['data']
############################以下为方法的调用示例##############################if 1: #获取账号账户信息 print('开始获取账户信息') account1=get_account() print(account1) account_total1=float(account1['total']) print("账号总资金:"+str(account_total1))
if 1: #获取持仓信息 print('开始获取持仓信息') holdings_dict={} holdings = get_position() if holdings and len(holdings)>0: for i in holdings: if int(i['可用余额'])>0: stock_code=i['证券代码'] holdings_dict[stock_code]=int(i['可用余额']) print('账号持仓') print(holdings_dict)
if 1: #股票买入,注:此处买入的价格,必须为现价的+-2%以内(不然会被交易所废单 ),买入数量必须是100的整数倍 buy_stock('002936',2.01,100)
if 1: #获取委托信息 print('开始获取委托信息') print(get_order())
if __name__ == '__main__': print(get_order()) print(get_account() ) print(get_position() ) print(get_position() )
保持同花顺登录
程序运行期间,同花顺客户端必须保持登录状态
程序运行期间,禁止对桌面做任何操作
测试验证
首次使用前,必须通过小额订单(如1手)验证功能正常性
检查成交记录是否与预期一致(通过 /stock/trade 接口)
价格输入规范
价格参数需精确到小数点后两位(如 1.22)
运行环境限制
仅支持Windows系统(推荐Windows 10及以上版本, Window Server2019及以上)
验证码识别失败
若频繁失败,手动登录同花顺清除验证码缓存
接口调用错误
code 非0时,根据 message 字段排查:
实盘自动化工具安装、配制、使用,以及聚宽策略接入示例及讲解,见《视频教程》
