返回介绍

教程

发布于 2024-05-30 23:56:07 字数 5409 浏览 0 评论 0 收藏 0

服务端

此教程主要内容是基于 flask 和 ctpbee 来快速开发一个简单的个人终端,以此来让你快速了解 ctpbee 的特性 让我们先来思考一个交易终端需要怎么样的功能

  • 登录到交易所
  • 获取实时行情
  • 下单,撤单
  • 指标支持

想好以上四点我们开始基于 ctpbee 来设计一个架构,让你快速了解 ctpbee 的代码组织:

个人终端前端 <--> flaskweb 服务器 <--> ctpbee <--> 期货公司柜台

看到上面你是不是有点懵逼,说好的简单的,哈哈哈冷静分析, 其实只需要 200+的代码就可以解决上述的问题 当然开始之前你可能需要掌握点 flask 的基本知识

  • 1 让我们先看个人终端前端 <---> flaskweb 服务器,

    • 前端发送到请求到 flaskweb 服务器可以用 ajax 或者用表单提交, 但是对于期货的这种解决方案场景下, 势必是有大量数据需要实时更新的, 如果去实时更新数据,在目前的场景下有两种解决方案 1,轮询 2, websocket,论寻的代价太高了 而且实现的方式不够优雅直接 pass 掉,那便使用 websocket 了,我们在此处使用了 flask 的组件 flask-socketio(一位很有名的大佬写的, 这个地方我们简单带过, 文档参见 https://flask-socketio.readthedocs.io/en/latest/ ) 来作为我们的 websocket 服务端,前端使用 socketio 来作为客户端(文档参见 https://socket.io/docs/ )
  • 2 我们在看 flaskweb 服务器 <--->ctpbee

    • 我们设想的场景是单用户存在下
    • 第一步 肯定是要 flask 先拿到登录信息, 然后登录创建 CtpBee 核心对象
    • 第二步 需要在 flask 里面任意拿到 CtpBee 变量, 得益于 ctpbee 的 current_app , 你可以在任意地点进行导入使用,好像好像就搞定了? 是不是出乎意料的简单
  • 3 最后 ctpbee <--->期货公司柜台

    这个地方 ctpbee 已经帮助你写了 相应的处理代码,你只需要在我开放的 CtpbeeApi 层进行编写处理代码即可哦

光说不练假把式 首先我们来创建 flask 服务器的对象, ctpbee 最初的设计就是仿造 flask 的 ,两者使用非常简单

我们在此处使用 flask 的工厂模式

  • __init__.py , create_app 下

    • 代码:

      from flask import Flask, g
      
      from .ext import io
      from .views import LoginView, MarketView, OrderView, IndexView, AccountView, OpenOrderView
      
      
      def create_app():
          app = Flask(__name__, static_folder="./static", template_folder="./templates")
          app.add_url_rule("/login", view_func=LoginView.as_view("login"), methods=['GET', "POST"])
          app.add_url_rule("/market", view_func=MarketView.as_view("market"), methods=['GET', "POST"])
          app.add_url_rule("/order_request/symbol=<symbol>", view_func=OrderView.as_view("order_request"), methods=['GET'])
          app.add_url_rule("/index", view_func=IndexView.as_view("index"), methods=['GET'])
          app.add_url_rule("/account", view_func=AccountView.as_view("account"), methods=['GET'])
          app.add_url_rule("/order_solve", view_func=OpenOrderView.as_view("order_solve"), methods=['POST', 'DELETE'])
      
          io.init_app(app)
          return app
      
    • ext 是全局模块, view 是视图模块

    • 首先创建 Flask 核心对象, __name__ 为导入名字, static_folder 指定静态文件资源目录, template_folder 制定模板文件目录

    • 通过 app.add_url_rule 将视图类插入进去

    • io 为创建的 SocketIO 核心对象, 在此处使用他的 init_app 方法进行初始化

    • 最后返回 app 变量

  • ext.py ::
    • 代码:

      from flask_socketio import SocketIO
      io = SocketIO()
      current_user = None
      
    • 创建 io 服务端和判断当前是否登录的 current_user 对象

  • default_settings.py
    • 关键代码:

      class DefaultSettings(CtpbeeApi):
      
          def __init__(self, name, app, socket_io: SocketIO):
              super().__init__(name, app)
              self.io = socket_io
      
      
          def on_account(self, account: AccountData) -> None:
              data = {
                  "type": "account",
                  "data": account._to_dict()
              }
              self.io.emit('account', data)
          ....
      
    • 继承 CtpbeeApi, 此处需要使用载入的 socket 服务端,所以重写了__init__方法, 这里意味着如果你需要扩展其他参数,就必须使用 super().__init__(name, app) 来载入初始化父类

    • 同时你必须要重写掉所有的 on_***方法,来实现你的自己的方法。最后通过 self.io.emit("account", data) , account 和 data 是对应的事件名称和时间数据,将数据发送回前端

  • 视图函数 views.py
    • 登录 LoginView
      • get 方法渲染了登录页面 https://127.0.0.1:5000/login
      • post 制订了登录流程 从前端获得表单信息,然后创建 app 变量, 然后将 DefaultSettings 实例化为 default , 再载入进去,最后开启处理,值得注意的是你需要在最后单独开启一个线程循环查询持仓和账户信息
    • 行情 MarketView
      • post 接受 symbol,调用 current_app.subscribe 进行订阅行情, 然后推送前端
      • get 渲染订阅界面
    • 发单界面 OrderView
      • get 渲染发单界面,需要向界面传递 symbol
    • 发单接口 OpenOrderView

      • post 发单信息,从前端获取相应信息,然后通过 helper.generate_order_req_by_str 生成请求,再通过 current_app 进行下单
      • delete 撤单 ,从前端获取相应信息,然后通过 helper.generate_cancle_req_by_str 生成撤单请求,再通过 current_app 进行下单
    • 注销登录 LogoutView

      • get 访问即注销当前用户
    • 首页 IndexView

      -get 渲染首页页面信息,值得注意的是这里把所有的合约信息都传了回去,这是为了方便订阅的时候进行代码补齐

    这样一个具备完整功能的终端便开发完毕了, 服务端只花了 200 行不到 300 行的代码就解决了这种应用场景, 当然如果你想阅读前端代码也是可以的。

客户端

接下来我将阐如何基于 boostrap 和 socketio 来构建前端客户端:

isdeveloping...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文