登录  | 立即注册

游客您好!登录后享受更多精彩

QQ登录

只需一步,快速开始

查看: 7334|回复: 0

VNPY量化交易项目打包exe方法,可在未安装Python电脑运行

[复制链接]

65

主题

110

帖子

1347

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1347
发表于 2022-4-18 11:42:52 | 显示全部楼层 |阅读模式
关注支持VNPY的3件事
1.右上角Fork和Star代码  https://gitee.com/vnpypro/vnpy
2.关注VNPY官方社区 https://q.vnpy.cn 常见技术问题
3.在 https://www.vnpy.cn 首页关注VNPY官方微信公众号,扫描下方微信二维码,或微信搜“VNPY官方”


bbb.png



打包前,请确保已经按《VNPY3.0 官方快速入门教程》完成虚拟环境配置
https://q.vnpy.cn/comm/forum.php?mod=viewthread&tid=13&page=1&extra=#pid13


(1) 我们是通过pyinstaller 打包,首先要在python开发环境安装pyinstaller

同样在步骤(2)Pycharm  的Terminal 标签下运行   pip install pyinstaller     完成pyinstaller安装




(2) 双击vntrader.py 通过PyCharm打开项目


v1.png



(3) 将PyCharm切换到Terminal  命令行标签
(这里的命令行是匹配我们设置好的Anacanda的base虚拟环境,请确保该虚拟环境已经可以调试运行,否则打包可能不成功)



运行指令  pyinstaller -D -w vntrader.py  

进入大约10分钟的转换编译过程。

v2.png



注意:因为是多进程回测,在编译前,务必在vntrader.py程序入口加一行,以后的新版本会默认加入这行代码,老版本请自行添加。  multiprocessing.freeze_support()

否则开启多进程回测时会导致无法进入回测,而是不断开启多个 vntrader.exe进程。

VNPY的main()入口函数变成这样:


def main():
    multiprocessing.freeze_support()
    globalvar.currpath = os.path.abspath(os.path.dirname(__file__))
    # logging.basicConfig(level=logging.DEBUG)
    app = QtWidgets.QApplication(sys.argv)
    window = globalvar.ui.MyWindow()
    globalvar.ui.setupUi(window)
    item = QtWidgets.QTableWidgetItem("1")
    item.setCheckState(QtCore.Qt.Unchecked)
    window.setWindowTitle("VNPY官方[社区开源版] (https://www.vnpy.cn 探索更真实的量化交易世界)")
    window.setWindowFlags(QtCore.Qt.WindowMinMaxButtonsHint | QtCore.Qt.WindowCloseButtonHint)
    window.tabifyDockWidget(globalvar.ui.dockWidget1, globalvar.ui.dockWidget2)
    globalvar.ui.dockWidget1.raise_()
    # setup stylesheet
    print(qdarkstyle.load_stylesheet_pyqt5())
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    # auto quit after 2s when testing on travis-ci
    if "--travis" in sys.argv:
        QtCore.QTimer.singleShot(2000, app.exit)
    OnTimer_checkstranger()
    window.setWindowIcon(QIcon('ico/vnpy.ico'))
    window.showMaximized()
    window.show()
    tt = module_td.TDThread()
    tt.signal_td_tick.connect(globalvar.ui.callback_td_info)  # 进程连接回传到GUI的事件
    tt.start()
    tm = module_md.MDThread()
    tm.signal_md_tick.connect(globalvar.ui.callback_md_tick)  # 进程连接回传到GUI的事件
    tm.start()
    trynum = 0
    while not (globalvar.tdinit or globalvar.mdinit):
        globalvar.vnfa.AsynSleep(200)
        trynum += 1
        if trynum > 15:
            # 如果超过15次无法登录行情服务器和交易服务器,则直接进入窗口界面
            break
    globalvar.vnfa.AsynSleep(300)
    globalvar.vk = module_kline.MyKlineService(globalvar.ui.callback_kline)
    globalvar.vk.ui = globalvar.ui
    globalvar.vnfa.AsynSleep(300)
    InitReadConfig()
    CheckInvestor()
    app.exec_()
    os._exit(1)







打包后,是通过C++重新编译的pyd格式,


性能就是C++。

有一部门细节在 优化中


这个发行版主要用于回测演示

正式版本会进一步优化文件大小,进一步升级功能


注意,由于talib无法通过Anacanda安装,所以打包时会提示缺少一个talib.strem模块,其实就是缺少stream.cp39-win_amd64.pyd这个文件, 该文件已经放在开源项目里,将stream.cp39-win_amd64.pyd放到打包目录中的Talib目录即可。


开源项目目录准备的文件

开源项目目录准备的文件

开源项目目录准备的文件

拷贝到打包后的talib目录下

拷贝到打包后的talib目录下


拷贝到打包后的talib目录下


虽然代码是Python,但是打包过程中,已经自动转C++代码自动编译,就是二进制文件pyd格式(而不是字节码,不再是脚本)。
打包成功后在项目里生成dist\vntrader目录,该目录就是绿色版的vnpy发行版,运行vntrader.exe即可进入程序。



V3.png



点击运行vntrader.exe进入  vnpy客户端页面,点击策略标签的 “回测”

对比下编译后C++编译 和源代码py运行速度的差别吧。


v4.jpg




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|VNPY官方Python开源量化社区 ( 沪ICP备17025576号 )

GMT+8, 2024-12-31 01:14 , Processed in 0.078730 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表