如何使用Win32com库实现同花顺程序化交易

企业微信

为什么有人想用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“抓住”同花顺窗口

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操控同花顺,本质上是在模拟人工操作。同花顺的用户协议可能禁止自动化交易,一旦被检测到,账户可能被限制。股票和期货市场都严查异常交易行为。你的程序如果频繁报单撤单,可能触发交易所监控。

自动化交易是为了提高效率,不是用来钻空子。把精力放在策略逻辑和风险控制上,工具只是工具。

转载请注明出处:https://www.lianghuajiaoyi.top/wenzhang/Win32com-867.html