
为什么有人想用Win32com搞同花顺程序化交易
机构做程序化交易,用的往往是券商提供的专用API接口,速度快、稳定、合规。个人交易者想实现股票或期货的自动下单,正规渠道要么门槛高,要么费用贵。同花顺是大多数人看盘下单的工具,它本身不开放官方API,Win32com库就成了一个“旁门左道”。Win32com是Python的一个库,它能调用Windows系统的COM组件,直接操控同花顺的窗口、按钮、输入框。说白了,就是让Python像人一样去点同花顺的界面。
这条路子并不优雅,但确实能跑通。适合资金量不大、策略频率不高的个人交易者。股票T+1、期货T+0,只要你对自动化交易有需求,又不想折腾复杂接口,Win32com是个可用的起点。
准备工作:环境、账户、同花顺版本
你需要在Windows系统上安装Python,然后用pip安装pywin32库。这个库包含win32com模块。Python版本建议3.7以上,32位和64位都行,但要和同花顺客户端位数一致。同花顺有很多版本,普通版、独立交易版、券商定制版。测试下来,普通的同花顺PC客户端最容易操控,因为它的窗口类名和控件ID相对固定。

开通股票或期货账户,登录同花顺。期货的话,同花顺可以连接大多数期货公司的交易接口,你需要在同花顺里配置好交易账号。股票同理,添加你的券商账户。
核心原理:如何用Win32com“抓住”同花顺窗口
Win32com通过查找窗口标题或类名来定位同花顺。先运行同花顺,然后写几行代码列出所有窗口,找到包含“同花顺”字样的窗口句柄。句柄是Windows给每个窗口的编号。拿到主窗口句柄后,再遍历子窗口,找到下单面板、股票代码输入框、价格输入框、买入按钮等。
这里最大的坑是:同花顺每次重启,窗口句柄可能变。不要硬编码句柄数字,要用窗口类名和控件ID来动态查找。另一个坑是,同花顺的界面可能用自绘控件,Win32com无法直接读取文本。这时候需要结合键盘模拟或者鼠标点击坐标。
实战步骤:从连接同花顺到发出第一笔委托
第一步,启动同花顺并登录。用win32com.client.Dispatch启动同花顺的进程。等界面加载完毕。
第二步,找到下单窗口。同花顺的下单窗口通常标题包含“网上股票交易系统”或“下单”。用win32gui.FindWindow查找。找到后,激活窗口。
第三步,输入股票代码。下单窗口里有一个编辑框,你需要用win32gui.SendMessage发送WM_SETTEXT消息来设置文本。或者用键盘模拟,先点击输入框,再用win32api.keybd_event逐字输入。键盘模拟更通用,但速度慢。
第四步,输入价格和数量。同样操作。价格框可能支持市价、限价,通过发送按键切换。
第五步,点击买入或卖出按钮。找到按钮的句柄,发送BM_CLICK消息。或者模拟鼠标点击。
第六步,处理确认弹窗。很多券商下单后会弹出确认框,你需要再找到那个弹窗,点击“确定”。这一步容易漏掉,导致委托发不出去。
代码示例(仅演示查找窗口和点击按钮):
import win32gui
import win32con
import time
# 查找同花顺主窗口
def find_main_window():
def callback(hwnd, windows):
if win32gui.IsWindowVisible(hwnd):
title = win32gui.GetWindowText(hwnd)
if "同花顺" in title and "下单" not in title:
windows.append(hwnd)
return True
windows = []
win32gui.EnumWindows(callback, windows)
return windows[0] if windows else None
# 查找子控件
def find_child_by_class(parent, class_name):
def callback(hwnd, result):
if win32gui.GetClassName(hwnd) == class_name:
result.append(hwnd)
return True
result = []
win32gui.EnumChildWindows(parent, callback, result)
return result
读取持仓和成交回报
程序化交易不能只发单,还要知道成交了没有。Win32com可以读取同花顺界面上的持仓列表。持仓列表通常是一个ListView或SysListView32控件。用win32gui.SendMessage发送LVM_GETITEMTEXT消息,可以逐行读取股票名称、数量、成本价。成交回报类似,找到委托列表控件,定时轮询。
这一块很考验耐心。不同券商、不同版本的同花顺,控件结构差异很大。你可能需要先用Spy++这个工具查看窗口层级。Spy++是Visual Studio自带的,能显示每个控件的类名和ID。
期货程序化交易的特别注意点
期货和股票不同,有夜盘、有保证金、有平今仓。同花顺下单时,期货的指令类型更多:开仓、平仓、平今。你需要在下单界面选择正确的指令。很多期货公司有投机、套保选项,不要选错。
期货价格变动快,Win32com模拟点击的延迟可能达到几百毫秒。对于日内高频策略,这个延迟是致命的。Win32com只适合低频趋势策略,比如一天交易几次。期货有涨跌停板,你的程序要判断价格是否超出限制,否则委托会被废单。
风险控制比自动化本身更重要
用Win32com做程序化交易,最大的风险是失控。比如窗口没找到,代码抛异常,程序卡死。或者下单后没收到确认,程序重复下单。你必须加几层保护:
第一层,单账户最大持仓限制。每次下单前检查已有持仓。
第二层,单笔最大手数限制。不要用市价单,尽量用限价单。
第三层,心跳检测。每隔几秒确认同花顺还活着,窗口没消失。
第四层,人工急停。设置一个快捷键,按下后程序立刻停止所有操作。
第五层,日志记录。每一笔委托、每一次成交、每一个错误,都要写文件。事后能复盘。
替代方案与合规提醒
Win32com不是唯一的路。你也可以用按键精灵、AutoHotkey,或者直接向券商申请API接口。国内很多券商对个人开放了量化交易接口,门槛是资金50万以上。期货公司也有类似接口,比如CTP。如果你打算认真做程序化交易,尽早转向正规接口。
合规方面,用Win32com操控同花顺,本质上是在模拟人工操作。同花顺的用户协议可能禁止自动化交易,一旦被检测到,账户可能被限制。股票和期货市场都严查异常交易行为。你的程序如果频繁报单撤单,可能触发交易所监控。
自动化交易是为了提高效率,不是用来钻空子。把精力放在策略逻辑和风险控制上,工具只是工具。