ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用Python+EasyTrader+同花顺,5分钟搭建你的第一个自动交易机器人

用Python+EasyTrader+同花顺,5分钟搭建你的第一个自动交易机器人 我的第一台自动交易机器人就是用EasyTrader跑起来的。说实话最初听到“量化交易”“程序化下单”这些词我也觉得是量化工程师和私募机构才能碰的东西。但在研究了一圈开源社区之后我发现只要你电脑上装了同花顺客户端、会一点最简单的Python语法完全可以用一个叫EasyTrader的开源库把“看盘、决策、点鼠标下单”这套重复劳动全部交给程序。今天这篇就把我踩过的坑、验证过的流程完整写出来从一个非量化专业开发者的视角教你5分钟搞定自己的第一个交易机器人。先说清楚它适合谁想把自己手动操作策略固化下来、又不想去开通券商API的普通投资者对Python有一定了解但没写过完整项目的编程爱好者以及那些每天被盘中手动盯单折磨得够呛、想用技术手段解放双手的人。它不适合谁呢——追求毫秒级极速交易的短线高频玩家以及完全不懂Python、连环境变量都没听过的小白当然你要愿意耐心学两个小时也能跑通。1. 整体设计为什么非要用EasyTrader同花顺1.1 市面上的自动化下单方案怎么选如果你去搜索“Python下单”大概率会看到几个方向第一种是直接对接券商官方API比如华泰的MATIC、中金的QMT这类方案最稳定、速度最快但开户门槛普遍较高有的要求资金量达到几十万而且接口文档专业性很强新人光搞懂鉴权就能折腾一周第二种是使用easytrader、easyquotation这类开源项目它们不直接连接交易所而是通过模拟人工操作的方式驱动你本机已经装好的同花顺或通达信客户端完成登录、查询、下单第三种是接一些第三方交易平台比如聚宽、米筐的仿真接口但策略模型和实盘对接之间往往有断层需要额外处理。这三种方案里EasyTrader同花顺的组合是“性价比”最均衡的。它不要求你额外开通什么权限只要有同花顺账户能正常交易就能把Python程序和你的交易客户端连接起来。它本质上是模拟你手动打开客户端、输入代码、敲价格、点买入的操作——所以软件开发领域叫它“UI自动化”在量化圈里大家更喜欢叫“简易交易接口”。1.2 EasyTrader的核心工作原理一句话讲明白EasyTrader之所以能控制同花顺靠的不是什么高深算法而是Windows平台下的UI自动化技术。它读取同花顺客户端的窗口句柄通过发送Windows消息、模拟鼠标键盘事件在对应的输入框里填写内容在按钮上触发点击。这就像你请了一个隐形助理他坐在你的电脑前看着同花顺的界面你说“买入600519100股”他就帮你填单、点确认。理解了这一点你就知道为什么它要求同花顺客户端必须是Windows版为什么下单过程中你不能乱动鼠标键盘去跟它抢控制权也为什么会偶尔出现“卡住不动”之类的兼容性问题。它有自己的优势和局限但作为个人自动化交易的第一步它提供了一个零门槛的入口。1.3 我的选型逻辑和整体架构我在搭建时遵循了一个原则能用简单方案解决绝不上复杂架构。整体架构分为三层。最上层是策略层就是你自己用Python写的判断逻辑比如“如果某股票5日均线上穿10日均线就买入1000块钱”中间是执行层用EasyTrader的API去调用下单买入、卖出、查询持仓最底层是界面层安装好的同花顺客户端负责跟券商服务器通信。我见过很多新人一开始就想用Django搭个网站、用Redis管缓存、用Celery做定时任务结果项目还没跑通光环境依赖就装了一天。我的建议是先用一个Python脚本跑通全流程之后再慢慢加调度、加风控。下面的内容也是按这个思路来写的。2. 环境准备5分钟速装Python与同花顺配置2.1 Python安装避坑指南Python官网的下载按钮在Download那个位置别下错版本。我建议直接用Python 3.7到3.9之间的版本别追最新。最新的Python版本有时候第三方库还没完全适配你用EasyTrader时会遇到奇怪的报错。安装时有一个非常关键的选项——一定要勾选“Add Python to PATH”很多同学装完之后在命令行里输入python提示找不到99%是这个复选框没勾。安装完可以按Win R输入cmd在命令行窗口输入python --version如果能看到类似Python 3.8.10的输出说明环境OK。接着升级一下包管理工具因为后面装库会用到python -m pip install --upgrade pip国内网络环境建议配置清华或阿里云镜像源不然下载第三方库会慢到怀疑人生。配置方式是pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple之后安装库的速度会有一个质的飞跃。2.2 同花顺客户端的安装与登录配置去同花顺官网下载PC版客户端必须是Windows版本的不要用Mac版EasyTrader目前对Mac不支持。安装过程一路下一步就行安装完先手工登录一次确认能正常看到行情和交易界面。这里有两个容易踩的坑。第一下单用的必须是你开通了网上交易的账户如果登录后是模拟盘请在交易界面右上角切换成“正式交易”或者重新用资金账号登录。第二同花顺客户端的行情软件和交易软件有时是两个独立的窗口EasyTrader连接的是“网上股票交易”那个窗口不是行情报价主界面。我的经验是登录后先按F12或者点击工具栏上的“交易”按钮把独立交易窗口调出来EasyTrader就是靠识别这个窗口来工作的。有条件的话建议在同花顺的“系统设置”里找到“自动登录设置”开启自动登录并勾选“关闭客户端时自动退出”这能减少你后续调试时反复输密码的麻烦。不过账户安全方面需要提醒一句开启自动登录后任何能接触你电脑的人都可以直接交易慎用。2.3 安装EasyTrader及依赖库打开命令行依次执行pip install easytrader pip install pywinauto pip install pywin32pywinauto和pywin32是EasyTrader在Windows上做界面控制的核心依赖。如果安装pywin32之后有提示需要运行python Scripts/pywin32_postinstall.py -install别忽略否则后续有的操作会提示找不到win32api。安装完成后可以用一个简单的导入测试来验证python -c import easytrader; print(easytrader.__version__)能输出版本号就说明库装好了。3. 核心细节写代码前的四个关键认知3.1 交易账户类型怎么选EasyTrader支持同花顺universal、通达信、雪球模拟盘等多个渠道。同花顺是这个库支持得最好的方向之一你只需要在初始化时指定user easytrader.use(universal_client)这里我用的是universal_client内部对应的是同花顺独立交易客户端的协议。如果你用佣金宝之类的定制客户端也可以试试universal_client或者对应的其他类型但常规同花顺就用默认即可。3.2 连接时机很关键新手最容易报错的地方是没等客户端完全打开就急着去connect。同花顺在启动的时候要先加载行情、自选股、资讯同时还要做登录校验有时需要十几秒甚至更久才能完全就绪。我的习惯是手动确认交易窗口出现且界面上已经能看见你的账号余额、持仓数据之后再运行Python程序执行connect。等熟了以后才能放心地把启动和连接放进同一个脚本里。3.3 交易操作的基本方法EasyTrader最常用的几个方法如下buy(security, price, amount)买入。security是类似600519的股票代码price是买入价格amount是股数A股要求是100股的整数倍。sell(security, price, amount)卖出。balance获取资金情况。position获取当前持仓。这里重点说下买入方法的内部逻辑。调用buy后EasyTrader会去同花顺交易窗口的买入输入框里填代码、价格、数量然后点击“买入”按钮。它默认用的是限价单不是市价单。所以你传入的price必须是一个合理的、接近当前市价的价格不然要么会直接废单要么会以你填的价格挂在那边等成交。3.4 判断成功还是失败不能只看返回值这也是很多人容易误解的地方。buy方法返回的往往是一个界面响应结果并不代表券商已经帮你成交。真正要确认是否成交要么去调用接口查询当日委托要么等几秒后查询持仓。我的习惯是在买入后主动拉一次position比对数量是否增加把结果写到日志里。这样至少能第一时间发现问题。4. 实操流程手把手写出第一个交易机器人4.1 最简单但完整的示例先让它动起来为了让第一版机器人能跑通就先不做任何策略判断纯粹实现“连接客户端 → 查询持仓 → 模拟买入 → 查询余额”这个闭环。代码也不长import easytrader import time # 1. 创建同花顺客户端实例 user easytrader.use(universal_client) # 2. 连接本地已打开的同花顺交易窗口 user.connect(rC:\同花顺\xiadan.exe) # 这里路径要改成你本机的可执行文件路径 # 3. 等两秒让界面完成交互 time.sleep(2) # 4. 获取账户资金情况 balance user.balance print(可用资金, balance) # 5. 获取当前持仓 positions user.position print(当前持仓, positions) # 6. 买入测试以指定价格买入100股平安银行代码000001 # 注意这行代码会真实下单建议先用小额资金或者模拟盘验证 user.buy(000001, price10.50, amount100) # 7. 查询委托情况确认是否成功 time.sleep(1) print(委托情况, user.entrust)我先把丑话说在前面这段代码最后一步是真金白银的操作。你要是第一次跑强烈建议在同花顺的模拟交易环境下测试或者直接把buy那行注释掉先跑到查询持仓为止。4.2 理解connect的路径参数connect方法里的路径参数填的是同花顺交易程序的执行文件路径。不同版本、不同安装位置可能不一样。常规的默认安装路径是C:\同花顺\xiadan.exe如果你改了安装目录得自己找一下。还有一个更简单的办法右键桌面上的同花顺快捷方式选择“打开文件所在位置”就能定位到安装目录。记下这个路径填进代码里。有同学问能不能直接不传路径只让它连接已经开着的窗口旧版本的EasyTrader确实允许部分场景这么做但为了减少出错我每次都是显式传路径它会自动拉起并连接进程。传路径还有个好处是如果客户端意外退出程序能帮你重新启动。4.3 接入一个最简单的均线策略第一阶段跑通之后就可以把策略逻辑塞进来了。这里给一个极简的双均线策略示例当5日均线从下方上穿10日均线时买入当5日均线下穿10日均线时卖出。它不构成投资建议只是演示操作逻辑。import easytrader import pandas as pd import datetime import time # 模拟获取行情数据实际场景可以从akshare、tushare等数据源拉取 def get_kline(code): # 伪代码返回一个包含收盘价的DataFrame列名为[close] pass user easytrader.use(universal_client) user.connect(rC:\同花顺\xiadan.exe) # 持仓状态管理 hold_flag False # False表示空仓True表示持仓 while True: now datetime.datetime.now() # 只在交易时段运行9:30-11:30, 13:00-15:00 if now.weekday() 5 and ((9 now.hour 12) or (13 now.hour 15)): df get_kline(600519) df[ma5] df[close].rolling(5).mean() df[ma10] df[close].rolling(10).mean() last df.iloc[-1] prev df.iloc[-2] # 金叉 if prev[ma5] prev[ma10] and last[ma5] last[ma10] and not hold_flag: user.buy(600519, pricelast[close], amount100) hold_flag True print(金叉买入) # 死叉 if prev[ma5] prev[ma10] and last[ma5] last[ma10] and hold_flag: user.sell(600519, pricelast[close], amount100) hold_flag False print(死叉卖出) time.sleep(60) # 每60秒检查一次这个策略虽然简单到不能直接上实盘但它把“数据获取、信号判断、执行下单、状态管理”这个框架跑通了。你后续把get_kline换成真实数据源把判断条件换成自己的策略因子就是一个完整的量化交易机器人雏形。4.4 从手动到自动的调度设计上面的while True循环有个问题程序一旦崩溃就没人盯盘了而且每分钟拉一次行情对同花顺客户端的压力也有点大。更稳妥的做法是用系统的“任务计划程序”来定时启动一个Python脚本或者用schedule库做定时任务import schedule import time def job(): print(执行一笔交易检查) # 把你的策略代码封装成这个函数 schedule.every().monday.at(09:35).do(job) schedule.every().tuesday.at(09:35).do(job) # ... 按需添加 while True: schedule.run_pending() time.sleep(30)实测下来用schedule比简单while True要省心不少至少不用担心策略函数里的异常导致整个进程退出而且错开开盘高峰的拥堵时段下单也更稳。5. 进阶玩法条件单、多账号与日志风控5.1 整成“条件单”模式不用一直盯盘很多人写自动化交易的初衷是“挂一个条件单我就去忙别的了”。用EasyTrader做条件单其实很简单让脚本一直循环监控某个价格到了目标价就下单。比如我想等某只股票从当前价跌到20块钱再买入代码可以这么写target_price 20.00 while True: current_price get_price(000002) # 伪代码从数据源取最新价 if current_price target_price: user.buy(000002, pricetarget_price, amount200) break time.sleep(5)这个方案唯一的风险是客户端不能休眠、电脑不能熄屏睡眠、网络不能断。所以我建议跑策略的电脑把电源方案设置为“从不睡眠”并在代码里加一个心跳日志每执行一次循环就往文件里写一行时间方便事后核查是不是某个时段程序不在线。5.2 多账号同时操作如果你同时操作多个同花顺账号可以创建多个user实例。关键点是一个user实例对应一个同花顺客户端进程不能复用。所以“多账号”本质就是“多开客户端”然后在代码里分别连接不同路径user1 easytrader.use(universal_client) user1.connect(rC:\同花顺\xiadan.exe) user2 easytrader.use(universal_client) user2.connect(rD:\同花顺_zhanghu2\xiadan.exe)多进程比多线程更稳定。因为EasyTrader这种界面控制方式挺脆弱的线程切换稍微一乱窗口聚焦跑了命令就可能发到错误的地方。我的一个朋友实测两个账号用两个线程跑偶尔会出现“A账号的下单指令跑到B账号窗口执行”的恐怖事故。所以多账号建议直接开多个Python进程各管各的互不干扰。5.3 给机器人加上风控和日志金融市场最重要的是活得久所以自动化交易一定要加两层风控。第一层是仓位限制比如单笔买入金额不超过总资金的10%或者单日累计买入次数不超过3次。第二层是异常熔断一旦程序检测到连续两次下单失败就停止一切交易操作并发出警报可以简单写一个发送邮件或Server酱通知的函数。日志在调试阶段就能救命。以我自己的习惯每一笔交易都会记录时间、操作、代码、价格、数量、返回结果以及执行完之后的持仓快照。这样不管机器人是对是错都有据可查复盘时才知道问题出在策略逻辑还是执行环节。import logging logging.basicConfig( filenametrade.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) logging.info(准备买入 %s %s股 价格 %s, 600519, 100, 1500.00)6. 常见问题与排查技巧实录6.1 connect一直连不上或者提示超时这个问题90%出在客户端状态上。先看两个地方交易窗口是不是已经完全打开界面上能不能看到你的资产信息如果能看到再确认你是不是用了模拟登录部分模拟盘的窗口控件跟正式版不一样会导致识别失败。还有一个容易被忽略的点同花顺客户端如果开了“记住账号”但没输密码登录后会弹出一个“风险揭示”对话框那个对话框会挡住交易窗口导致后续点击全部失败。提前用脚本自动点击“同意”或者手动关掉它再运行程序。6.2 下单没有反应但程序没报错这种问题最烦人。命令发出去了界面没反应很大概率是当前焦点不在交易窗口上。比如你中途去开了浏览器EasyTrader的点击操作就被带歪了。我的建议是连接成功后用pywinauto把交易窗口强制置顶from pywinauto import Application app Application(backenduia).connect(pathrC:\同花顺\xiadan.exe) app.top_window().set_focus()另外同花顺在交易时间会不断刷新行情界面元素的位置偶尔会变动。如果遇到点击偏移可以试试在buy前加一个time.sleep(0.5)让界面稳定一下。6.3 为什么明明下单成功了可用资金没变别忘了A股是T1交割而且买入成交需要时间。有持仓不等于立即扣款成功资金变动需要以券商清算为准。如果你查询方法返回的balance是券商端的“可用资金”那它更新本来就有延迟。不等成交就直接看资金容易误判。我在代码里一般下单后先查“当日委托”user.entrust等状态变成“已报”或“已成”再查资金。6.4 账户被锁定或需要重新登录同花顺如果检测到异常操作有时会要求重新输入密码或者验证码。自动化脚本没法处理验证码一旦遇到最好的办法是放弃本次操作用短信通知你手工处理。这也是我建议加告警通知的原因。6.5 常见问题速查表现象可能原因解决方式connect超时客户端未完全启动手动打开同花顺并确认交易窗口就绪后再运行提示找不到窗口句柄客户端路径错误或者窗口类型不匹配检查xiadan.exe路径确认用同花顺完整版下单按钮无效风险提示对话框遮挡手动关闭对话框后重启脚本点击错乱窗口焦点被抢设置窗口置顶脚本运行时不操作鼠标键盘查询持仓为空切换了账户或者未登录检查同花顺当前登录账号自动登录失效开启了两步验证简单粗暴的办法是关闭两步验证或改用账号密码登录7. 写在最后的体会我在用EasyTrader之前总觉得量化交易门槛高不可攀。但真正跑通第一笔自动买入之后最大的感受不是“我变厉害了”而是“原来重复劳动真的可以被简单脚本解放”。当然这套方案不能跟券商量化接口比速度、比稳定性它更适合个人投资者用低成本验证自己的想法。最后再分享一个实操中的小技巧任何改动上线前先在同花顺模拟盘里完整跑一个交易日。因为EasyTrader底层依赖客户端界面而同花顺每次升级都可能调整界面控件的命名或位置新版本客户端不一定是好事。我现在用的策略机同花顺版本是锁死不更新的跑了大半年一直很稳。对你来说也一样——自动化交易最怕的不是策略亏钱而是程序最终执行了什么你不知道的操作。保持简单、保持可控、保持可追溯这台机器人才能真正成为你的帮手。
返回列表