教程
服务端
此教程主要内容是基于 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 渲染订阅界面
- post 接受 symbol,调用
- 发单界面 OrderView
- get 渲染发单界面,需要向界面传递 symbol
发单接口 OpenOrderView
- post 发单信息,从前端获取相应信息,然后通过
helper.generate_order_req_by_str
生成请求,再通过 current_app 进行下单 - delete 撤单 ,从前端获取相应信息,然后通过
helper.generate_cancle_req_by_str
生成撤单请求,再通过 current_app 进行下单
- post 发单信息,从前端获取相应信息,然后通过
注销登录 LogoutView
- get 访问即注销当前用户
首页 IndexView
-get 渲染首页页面信息,值得注意的是这里把所有的合约信息都传了回去,这是为了方便订阅的时候进行代码补齐
这样一个具备完整功能的终端便开发完毕了, 服务端只花了 200 行不到 300 行的代码就解决了这种应用场景, 当然如果你想阅读前端代码也是可以的。
客户端
接下来我将阐如何基于 boostrap 和 socketio 来构建前端客户端:
isdeveloping...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论