Giter VIP home page Giter VIP logo

vnpy_webtrader's Introduction

VeighNa框架的Web服务模块

说明

针对B-S架构需求设计的Web服务应用模块,实现了提供主动函数调用(REST)和被动数据推送(Websocket)的Web服务器。

目前仅提供了基础的交易和管理接口,用户根据自己的需求扩展支持其他VeighNa应用模块的Web接口(如CTA策略自动交易等)。

安装

安装环境推荐基于3.0.0版本以上的【VeighNa Studio】。

直接使用pip命令:

pip install vnpy_webtrader

或者下载源代码后,解压后在cmd中运行:

pip install .

架构

  • 基于Fastapi-Restful实现的主动函数调用功能,数据流程:

    1. 用户点击浏览器中的某个按钮,发起Restful功能调用;
    2. Web服务器收到Restful请求,将其转化为RPC功能调用发送给交易服务器;
    3. 交易服务器收到RPC请求,执行具体的功能逻辑,并返回结果;
    4. Web服务器返回Restful请求的结果给浏览器。
  • 基于Fastapi-Websocket实现的被动数据推送功能,数据流程:

    1. 交易服务器的事件引擎转发某个事件推送,并推送给RPC客户端(Web服务器);
    2. Web服务器收到事件推送后,将其转化为json格式,并通过Websocket发出;
    3. 浏览器通过Websocket收到推送的数据,并渲染在Web前端界面上。
  • 将程序分为两个进程的主要原因包括:

    1. 交易服务器中的策略运行和数据计算的运算压力较大,需要保证尽可能保证低延时效率;
    2. Web服务器需要面对互联网访问,将交易相关的逻辑剥离能更好保证安全性。

vnpy_webtrader's People

Contributors

edanflame avatar noranhe avatar vnpy avatar xuxin3101 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

vnpy_webtrader's Issues

子进程无法及时退出

环境

  • 操作系统: Windows 10
  • Python版本: VNStudio-2.4.0
  • vn.py版本: v2.4.0发行版

Issue类型

三选一:Bug

预期程序行为

使用ctrl+C后整个程序全部关闭

实际程序行为

使用ctrl+C后,主进程关闭,子进程中的rpcClient继续运行,导致子进程无法关闭,并在30秒后打印:

RpcServer has no response over 30.0 seconds, please check you connection.

然后子进程才会退出

进程未能及时销毁

在多次启动并关闭webtrader后,后台进程无法及时杀死,导致当前端口被占用,更换接口才能运行。

import WebTradeApp报错

linux环境下执行script里面的脚本时

from vnpy_webtrader import WebTradeApp

会直接报错:

Traceback (most recent call last):
  File "run.py", line 5, in <module>
    from vnpy_webtrader import WebTradeApp
ImportError: cannot import name 'WebTradeApp' from 'vnpy_webtrader' (/usr/local/lib/python3.8/dist-packages/vnpy_webtrader-1.0.1-py3.8.egg/vnpy_webtrader/__init__.py)

安装包配置中未包括static目录及目录下的index.html文件

安装包配置中未包括static目录及目录下的index.html文件。因此启动 webserver 后无法访问对应页面。服务端报错:
File "/usr/local/lib/python3.7/site-packages/vnpy_webtrader/web.py", line 141, in index with open(index_path) as f: FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.7/site-packages/vnpy_webtrader/static/index.html'

建议webtrader配置文件里补充上监听地址及监听端口

作用:可以自定义端口,以及在docker运行时,需要在容器里监听0.0.0.0, 端口映射到宿主机才能访问生效。
微信截图_20210819111222

vi /usr/lib/python3.7/site-packages/vnpy_webtrader/ui/widget.py

import sys

from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import QtWidgets, QtCore
from vnpy.trader.utility import load_json, save_json, get_file_path

from ..engine import APP_NAME, WebEngine


class WebManager(QtWidgets.QWidget):
    """网页服务器管理界面"""

    setting_filename = "web_trader_setting.json"
    setting_filepath = get_file_path(setting_filename)

    def __init__(self, main_engine: MainEngine, event_engine: EventEngine):
        """"""
        super().__init__()

        self.main_engine: MainEngine = main_engine
        self.event_engine: EventEngine = event_engine
        self.web_engine: WebEngine = main_engine.get_engine(APP_NAME)

        self.init_ui()

    def init_ui(self):
        """初始化界面"""
        self.setWindowTitle("Web服务")

        setting = load_json(self.setting_filepath)
        username = setting.get("username", "vnpy")
        password = setting.get("password", "vnpy")
        req_address = setting.get("req_address", "tcp://127.0.0.1:2014")
        sub_address = setting.get("sub_address", "tcp://127.0.0.1:4102")
        host = setting.get("host", "127.0.0.1")
        port = setting.get("port", "8000")

        self.username_line = QtWidgets.QLineEdit(username)
        self.password_line = QtWidgets.QLineEdit(password)
        self.req_line = QtWidgets.QLineEdit(req_address)
        self.sub_line = QtWidgets.QLineEdit(sub_address)
        self.host = QtWidgets.QLineEdit(host)
        self.port = QtWidgets.QLineEdit(port)

        self.start_button = QtWidgets.QPushButton("启动")
        self.start_button.clicked.connect(self.start)

        self.text_edit = QtWidgets.QTextEdit()
        self.text_edit.setReadOnly(True)

        form = QtWidgets.QFormLayout()
        form.addRow("用户名", self.username_line)
        form.addRow("密码", self.password_line)
        form.addRow("请求地址", self.req_line)
        form.addRow("请阅地址", self.sub_line)
        form.addRow("监听地址", self.host)
        form.addRow("监听端口", self.port)
        form.addRow(self.start_button)

        hbox = QtWidgets.QHBoxLayout()
        hbox.addLayout(form)
        hbox.addWidget(self.text_edit)
        self.setLayout(hbox)

        self.resize(1000, 500)

    def start(self):
        """启动引擎"""
        username: str = self.username_line.text()
        password: str = self.password_line.text()
        req_address: str = self.req_line.text()
        sub_address: str = self.sub_line.text()
        host: str = self.host.text()
        port: str = self.port.text()

        # 保存配置
        setting = {
            "username": username,
            "password": password,
            "req_address": req_address,
            "sub_address": sub_address,
            "host": host,
            "port": port
        }
        save_json(self.setting_filepath, setting)

        # 启动RPC
        self.web_engine.start_server(req_address, sub_address)
        self.start_button.setDisabled(True)

        # 初始化Web服务子进程
        self.process = QtCore.QProcess(self)
        self.process.setProcessChannelMode(self.process.MergedChannels)

        self.process.readyReadStandardOutput.connect(self.data_ready)
        self.process.readyReadStandardError.connect(self.data_ready)
        self.process.started.connect(self.web_started)
        self.process.finished.connect(self.web_finished)

        # 启动子进程
#         cmd = [
#             "-m"
#             "uvicorn",
#             "vnpy_webtrader.web:app",
#             "--reload"
#         ]
        
        cmd = [
            "-m"
            "uvicorn",
            "vnpy_webtrader.web:app",
            "--host=" + host,
            "--port=" + port,
            "--reload"
        ]       
        
        self.process.start(sys.executable, cmd)

    def web_started(self) -> None:
        """Web进程启动"""
        self.text_edit.append("Web服务器启动")

        for w in [
            self.username_line,
            self.password_line,
            self.req_line,
            self.sub_line,
            self.host,
            self.port,
            self.start_button
        ]:
            w.setEnabled(False)

    def web_finished(self) -> None:
        """Web进程结束"""
        self.text_edit.append("Web服务器停止")

    def data_ready(self) -> None:
        """更新进程有数据可读"""
        text = bytes(self.process.readAll())

        try:
            text = text.decode("UTF8")
        except UnicodeDecodeError:
            text = text.decode("GBK")

        self.text_edit.append(text)

vnpy2.9 Ubuntu18下no ui启动问题

vnpy2.9版本下, 尝试no ui 启动vnpy_webtrader
参照GitHub 上被remove的代码启动
https://github.com/vnpy/vnpy_webtrader/blob/306c3c7e42315cb82be567db65a8d700e1710282/script/no_ui.py

发现触发币安send_order时候环境和启动时候环境不一致,send_order时候部分变量没有被初始化,导致接口调用失败

微信图片_20220209191118
/docs的界面能正常打开,访问账号余额也能正常访问,就是发送订单发送不了
本地win10 的ui版本是能正常下单的

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.