迅投实盘1:一个简单的下单程序,跑通python实盘全流程

博主使用迅投投研的程序开始要写实盘的代码了,这个系列的博客就是记录使用迅投的各种方法,一边学习一边记录。

迅投把python分为两个版本:

  1. 内置python:指的是使用迅投客户端,客户端可以新建python脚本写策略
  2. 原生python:使用xtquant包就可以通过本地python操作客户端执行策略

内置python依赖客户端编辑器且无法调试,因此这个系列博主尽可能的使用本地的python,在Pycharm中进行开发。

迅投官方知识库:https://dict.thinktrader.net/
xtquant官方说明文档:https://dict.thinktrader.net/nativeApi/start_now.html

下单的示例程序

程序逻辑说明

这里我们就执行一个最简单的操作,看是否打通了整个流程:

  1. 需要先安装好python环境,并且把xtquant的压缩包放到根目录,使用如下代码判断环境是否配置好
import time, datetime, sys from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback from xtquant.xttype import StockAccount from xtquant import xtconstant from loguru import logger # 一个日志模块,安装方式:pip install loguruimport pandas as pd # 常用数据分析工具,安装方式:pip install pandas
  1. 首先是一些很套路的写法,用于链接本地python与终端
# 步骤1. 初始化 path =r'E:\迅投极速交易终端睿智融科版\userdata'# 这个填"自己的终端安装路径\userdata" session_id =int(time.time())# 这个可以自定义,确保唯一即可 xt_trader = XtQuantTrader(path, session_id) account = StockAccount('xxxxx','STOCK')# 在终端中找到自己的股票账号
  1. 配置交易环境
    代码中下单等操作均为异步(迅投很擅长高频交易,所以建议从一开始就有异步下单的习惯)
classMyXtQuantTraderCallback(XtQuantTraderCallback):defon_disconnected(self):""" 连接断开 :return: """print(datetime.now(),'连接断开回调')defon_stock_order(self, order):""" 委托回报推送 :param order: XtOrder对象 :return: """print(datetime.now(),'委托回调 投资备注', order.order_remark)defon_stock_trade(self, trade):""" 成交变动推送 :param trade: XtTrade对象 :return: """print(datetime.now(),'成交回调', trade.order_remark,f"委托方向(48买 49卖) {trade.offset_flag} 成交价格 {trade.traded_price} 成交数量 {trade.traded_volume}")defon_order_error(self, order_error):""" 委托失败推送 :param order_error:XtOrderError 对象 :return: """# print("on order_error callback")# print(order_error.order_id, order_error.error_id, order_error.error_msg)print(f"委托报错回调 {order_error.order_remark}{order_error.error_msg}")defon_cancel_error(self, cancel_error):""" 撤单失败推送 :param cancel_error: XtCancelError 对象 :return: """print(datetime.now(), sys._getframe().f_code.co_name)defon_order_stock_async_response(self, response):""" 异步下单回报推送 :param response: XtOrderResponse 对象 :return: """print(f"异步委托回调 投资备注: {response.order_remark}")defon_cancel_order_stock_async_response(self, response):""" :param response: XtCancelOrderResponse 对象 :return: """print(datetime.now(), sys._getframe().f_code.co_name)defon_account_status(self, status):""" :param response: XtAccountStatus 对象 :return: """print(datetime.now(), sys._getframe().f_code.co_name)# 步骤2.连接交易 trade_call_back = MyXtQuantTraderCallback() xt_trader.register_callback(trade_call_back) xt_trader.start()# 启动交易线程# 步骤3.连接交易主推 connect_result = xt_trader.connect() subscribe_result = xt_trader.subscribe(account)# 获取交易主推

其中MyXtQuantTraderCallback这个是实盘中,出现事件后的回调类,函数名都是固定的,注意不要修改。

更多细节请参考:XtQuant.Xttrade 交易模块

  1. 最后一步就是下单操作了

比如我们买入平安银行100股,按照最新价下单:

xt_trader.order_stock_async(account,'000001.SZ', xtconstant.STOCK_BUY,100, xtconstant.LATEST_PRICE,-1,'测试下单函数',"测试下单函数")

这个下单函数适用于股票期货期权等,实际上这是一个委托,详细说明如下:

deforder_stock_async(self, account, stock_code, order_type, order_volume, price_type, price, strategy_name='',order_remark=''):""" :param account: 证券账号 :param stock_code: 证券代码, 例如"600000.SH" :param order_type: 委托类型, 23:买, 24:卖 :param order_volume: 委托数量, 股票以'股'为单位, 债券以'张'为单位 :param price_type: 报价类型, 详见帮助手册 :param price: 报价价格, 如果price_type为指定价, 那price为指定的价格, 否则填0 :param strategy_name: 策略名称 :param order_remark: 委托备注 :return: 返回下单请求序号, 成功委托后的下单请求序号为大于0的正整数, 如果为-1表示委托失败 """

这里的所有字段都可以参考:委托 XtOrder

完整代码

import time, datetime, sys from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback from xtquant.xttype import StockAccount from xtquant import xtconstant from loguru import logger classMyXtQuantTraderCallback(XtQuantTraderCallback):defon_disconnected(self):""" 连接断开 :return: """print(datetime.now(),'连接断开回调')defon_stock_order(self, order):""" 委托回报推送 :param order: XtOrder对象 :return: """print(datetime.now(),'委托回调 投资备注', order.order_remark)defon_stock_trade(self, trade):""" 成交变动推送 :param trade: XtTrade对象 :return: """print(datetime.now(),'成交回调', trade.order_remark,f"委托方向(48买 49卖) {trade.offset_flag} 成交价格 {trade.traded_price} 成交数量 {trade.traded_volume}")defon_order_error(self, order_error):""" 委托失败推送 :param order_error:XtOrderError 对象 :return: """# print("on order_error callback")# print(order_error.order_id, order_error.error_id, order_error.error_msg)print(f"委托报错回调 {order_error.order_remark}{order_error.error_msg}")defon_cancel_error(self, cancel_error):""" 撤单失败推送 :param cancel_error: XtCancelError 对象 :return: """print(datetime.now(), sys._getframe().f_code.co_name)defon_order_stock_async_response(self, response):""" 异步下单回报推送 :param response: XtOrderResponse 对象 :return: """print(f"异步委托回调 投资备注: {response.order_remark}")defon_cancel_order_stock_async_response(self, response):""" :param response: XtCancelOrderResponse 对象 :return: """print(datetime.now(), sys._getframe().f_code.co_name)defon_account_status(self, status):""" :param response: XtAccountStatus 对象 :return: """print(datetime.now(), sys._getframe().f_code.co_name)# 步骤1. 初始化 path =r'E:\迅投极速交易终端睿智融科版\userdata'# 这里写自己的迅投路径 session_id =int(time.time()) xt_trader = XtQuantTrader(path, session_id) account = StockAccount('xxxxxxx','STOCK')# 这里写自己的股票代码# 步骤2.连接交易 trade_call_back = MyXtQuantTraderCallback() xt_trader.register_callback(trade_call_back) xt_trader.start()# 启动交易线程# 步骤3.连接交易主推 connect_result = xt_trader.connect() subscribe_result = xt_trader.subscribe(account)# 获取交易主推# 执行下单! logger.debug("准备下单") xt_trader.order_stock_async(account,'000001.SZ', xtconstant.STOCK_BUY,100, xtconstant.LATEST_PRICE,-1,'测试下单函数',"测试下单函数") logger.success("下单完成")

执行完成后,就可以在终端的【交易】->【股票交易】中看到结果了,其中:

  1. 所有的委托都会在"任务列表"中展示,这是详细的说明委托的结果与当前成交进度
  2. 所有委托也会在"委托"这个界面中展示
  3. 成交的结果会显示在"成交"界面
  4. 当前的持仓会在"持仓"界面(有时候持仓界面来不及及时刷新,等一会即可)

Read more

《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 位运算基础前置知识: 位1的个数 比特位计数 汉明距离 只出现一次的数字 只出现一次的数字||| 34. 判断字符是否唯一 题目链接: 题目描述: 题目示例: 解法(位图的思想): 算法思路: C++算法代码: 算法总结及流程解析: 35. 丢失的数字 题目链接: 题目描述: 题目示例: 解法(位运算): 算法思路: C++算法代码: 算法总结及流程解析: 结束语 位运算基础前置知识:       回顾了上面位运算基础前置的知识这里有五道非常简单的题可以试试手,都是考察位运算的题目: 位1的个数 191.

By Ne0inhk
【线性表系列终篇】链表试炼:LeetCode Hot 100 经典题目实战解析

【线性表系列终篇】链表试炼:LeetCode Hot 100 经典题目实战解析

🏠个人主页:黎雁 🎬作者简介:C/C++/JAVA后端开发学习者 ❄️个人专栏:C语言、数据结构(C语言)、EasyX、游戏、规划、程序人生 ✨ 从来绝巘须孤往,万里同尘即玉京 文章目录 * 【线性表系列终篇】链表试炼:LeetCode Hot 100 经典题目实战解析 * 文章摘要 * 一、试炼前的准备:链表解题核心技巧回顾 * 二、试炼开始:经典题目实战解析 * 题目一:反转链表 (LeetCode 206) * 解法一:迭代(双指针) * 解法二:递归 * 题目二:环形链表 (LeetCode 141) * 解法:快慢指针(Floyd判圈算法) * 题目三:合并两个有序链表 (LeetCode 21)

By Ne0inhk
HDFS读写操作深度解析:流程详解与设计挑战

HDFS读写操作深度解析:流程详解与设计挑战

HDFS读写操作深度解析:流程详解与设计挑战 * 引言 * 一、HDFS架构概述 * 二、HDFS写操作流程详解 * 2.1 写操作流程图 * 2.2 写操作详细步骤 * 阶段1:请求与验证 * 阶段2:获取块分配信息 * 阶段3:建立管道 * 阶段4:数据传输 * 阶段5:完成写入 * 三、HDFS读操作流程详解 * 3.1 读操作流程图 * 3.2 读操作详细步骤 * 阶段1:获取元数据 * 阶段2:选择最优DataNode * 阶段3:并行读取数据块 * 阶段4:数据验证与重组 * 阶段5:完成读取 * 四、读写操作的设计挑战 * 4.1 设计挑战全景图 * 4.2 数据一致性挑战 * 挑战:

By Ne0inhk
从树到森林——决策树、随机森林与可解释性博弈

从树到森林——决策树、随机森林与可解释性博弈

从树到森林——决策树、随机森林与可解释性博弈 “如果你不能向酒吧侍者解释清楚你的模型,那你可能还没真正理解它。” 而决策树,正是那个既能讲清道理,又能打胜仗的算法。 一、为什么需要树模型? 线性模型优雅、透明,但它有一个致命假设:特征与目标之间是线性关系。 现实世界却充满非线性、交互效应和分段规则: * “如果年龄 > 60 且 血压 > 140,则高风险”; * “当用户点击过广告 A 且未购买,则推送优惠券 B”。 这些条件判断天然适合用“树”来表达。 🎯 本章目标:理解决策树如何通过“提问”进行预测;掌握信息增益、基尼不纯度等分裂准则;实现一棵简单的决策树;理解集成思想:从单棵树到随机森林;辩证看待“可解释性”:树真的那么透明吗? 二、决策树:用问答游戏做预测 1. 直觉:像玩“

By Ne0inhk