# Futu OpenAPI 文档 (Proto)


---

# 介绍

## 概述
量化接口，为您的程序化交易，提供丰富的行情和交易接口，满足每一位开发者的量化投资需求，助力您的宽客梦想。

牛牛用户可以 [点击这里](https://www.futunn.com/OpenAPI)了解更多。

Futu API 由 OpenD 和API SDK组成：
* OpenD 是 Futu API 的网关程序，运行于您的本地电脑或云端服务器，负责中转协议请求到富途后台，并将处理后的数据返回。
* API SDK是富途为主流的编程语言（Python、Java、C#、C++、JavaScript）封装的SDK，以方便您调用，降低策略开发难度。如果您希望使用的语言没有在上述之列，您仍可自行对接裸协议，完成策略开发。

下面的框架图和时序图，帮助您更好地了解 Futu API。

 ![openapi-frame](../img/nnopenapi-frame.png)

 ![openapi-interactive](../img/nnopenapi-interactive.png)

初次接触 Futu API，您需要进行如下两步操作：

第一步，在本地或云端安装并启动一个网关程序 [OpenD](../quick/opend-base.md)。

OpenD 以自定义 TCP 协议的方式对外暴露接口，负责中转协议请求到富途服务器，并将处理后的数据返回，该协议接口与编程语言无关。

第二步，下载 Futu API，完成 [环境搭建](../quick/env.md)，以便快速调用。

为方便您的使用，富途对主流的编程语言，封装了相应的 API SDK（以下简称 Futu API）。


## 账号
Futu API 涉及 2 类账号，分别是 **平台账号** 和 **综合账户**。

### 平台账号

平台账号是您在富途的用户 ID（牛牛号），此账号体系适用于富途牛牛 APP、Futu API。  
您可以使用平台账号（牛牛号）和登录密码，登录 OpenD 并获取行情。

### 综合账户
综合账户支持以多种货币在同一个账户内交易不同市场品类（港股、美股、A股通、基金）。您可以通过一个账户进行全市场交易，不需要再管理多个账户。  
综合账户包括综合账户 - 证券，综合账户 - 期货，综合账户 - 加密货币等业务账户：  
* 综合账户 - 证券，用于交易全市场的股票、ETFs、期权等证券类产品。  
* 综合账户 - 期货，用于交易全市场的期货产品，目前支持香港市场期货、美国市场 CME Group 期货、新加坡市场期货、日本市场期货。
* 综合账户 - 加密货币，用于交易加密货币币对，目前支持 FUTU HK、moomoo US、moomoo SG 券商。


## 功能
Futu API 的功能主要有两部分：行情和交易。

### 行情功能

#### 行情数据品类

支持香港、美国、A 股市场的行情数据，涉及的品类包括股票、指数、期权、期货等，具体支持的品种见下表。  
获取行情数据需要相关权限，如需了解行情权限的获取方式以及限制规则，请 [点击这里](./authority.md#2867)。

<table>
    <tr>
        <th>市场</th>
        <th>品种</th>
        <th>牛牛用户</th>
    </tr>
    <tr>
        <td rowspan="5">香港市场</td>
	    <td>股票、ETFs、窝轮、牛熊、界内证</td>
	    <td align="center">✓</td>
    </tr>
    <tr>
        <td>期权</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>指数</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>板块</td>
        <td align="center">✓</td>
    </tr>
    <tr>
        <td rowspan="6">美国市场</td>
	    <td>股票、ETFs (含纽交所、美交所、纳斯达克上市的股票、ETFs)</td>
	    <td align="center">✓</td>
    </tr>
    <tr>
	    <td>OTC 股票</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td>期权  (含普通股票期权、指数期权)</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>指数</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>板块</td>
        <td align="center">✓</td>
    </tr>
    <tr>
        <td rowspan="3">A 股市场</td>
	    <td>股票、ETFs</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>指数</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>板块</td>
        <td align="center">✓</td>
    </tr>
    <tr>
        <td rowspan="2">新加坡市场</td>
	    <td>股票、ETFs、窝轮、REITs、DLCs</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="2">日本市场</td>
        <td>股票、ETFs、REITs</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="1">澳大利亚市场</td>
        <td>股票、ETFs</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="1">环球市场</td>
        <td>外汇</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="1">加密货币市场</td>
        <td>加密货币</td>
        <td align="center">✓</td>
    </tr>
</table>

#### 行情数据获取方式

* 订阅并接收实时报价、实时 K 线、实时逐笔、实时摆盘等数据推送
* 拉取最新市场快照，历史 K 线等

### 交易功能

#### 交易能力
支持香港、美国、A 股、新加坡、日本 5 个市场的交易能力，涉及的品类包括股票、期权、期货等，具体见下表：

<table>
    <tr>
        <th rowspan="2">市场</th>
        <th rowspan="2">品种</th>
        <th rowspan="2">模拟交易</th>
        <th colspan="7">真实交易</th>
    </tr>
    <tr>
        <th>FUTU HK</th>
        <th>Moomoo US</th>
        <th>Moomoo SG</th>
        <th>Moomoo AU</th>
        <th>Moomoo MY</th>
        <th>Moomoo CA</th>
        <th>Moomoo JP</th>
    </tr>
    <tr>
        <td rowspan="3">香港市场</td>
	    <td>股票、ETFs、窝轮、牛熊、界内证</td>
	    <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>期权 (含指数期权，需使用期货账户交易)</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="3">美国市场</td>
	    <td>股票、ETFs</td>
	    <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
    </tr>
    <tr>
        <td>期权</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="2">A 股市场</td>
	    <td>A 股通股票</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>非 A 股通股票</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="2">新加坡市场</td>
	    <td>股票、ETFs、窝轮、REITs、DLCs</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td rowspan="2">日本市场</td>
        <td>股票、ETFs、REITs</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td rowspan="1">澳大利亚市场</td>
        <td>股票、ETFs</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td rowspan="1">加拿大市场</td>
        <td>股票</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td rowspan="1">加密货币市场 (需开通加密货币交易权限)</td>
        <td>加密货币</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
</table>

#### 交易方式
真实交易和模拟交易使用同一套交易接口。


## 特点

1. 全平台多语言：
* OpenD 支持 Windows、MacOS、CentOS、Ubuntu
* Futu API 支持 Python、Java、C#、C++、JavaScript 等主流语言
2. 稳定极速免费：
* 稳定的技术架构，直连交易所一触即达
* 下单最快只需 0.0014 s
* 通过 Futu API 交易无附加收费
3. 丰富的投资品类：
* 支持美国、香港、新加坡、日本、加密货币等多个市场的实时行情、实盘交易及部分品类模拟交易
4. 专业的机构服务：
* 定制化的行情交易解决方案

---



---

# 权限与额度

## 登录
### 登录账号

Futu API 现已全面放开登录限制，进一步优化开发体验。无需开户限制，您可使用富途牛牛号（或注册时使用的手机号/邮箱）登录 OpenD。

### 合规确认

首次登录成功后，您需要完成问卷评估与协议确认，才能继续使用 Futu API。牛牛用户请 [点击这里](https://www.futunn.com/about/api-disclaimer)。


## 行情数据
行情数据的限制主要体现在以下几方面：
* 行情权限 —— 获取相关行情数据的权限
* 接口限频 —— 调用行情接口的频率限制
* 订阅额度 —— 同时订阅的实时行情的数量
* 历史 K 线额度 —— 每 7 天最多可拉取多少个标的的历史 K 线

### 行情权限

通过 Futu API 获取行情数据，需要相应的行情权限，Futu API 的行情权限跟 APP 的行情权限不完全一样，不同的权限等级对应不同的时延、摆盘档数以及接口使用权限。

部分品种行情，需要购买行情卡后方可获取，具体获取方式见下表。

<table>
    <tr>
        <th>市场</th>
        <th>标的类别</th>
        <th>获取方式</th>
    </tr>
    <tr>
        <td rowspan="5">香港市场</td>
	    <td>证券类产品（含股票、ETFs、窝轮、牛熊、界内证）</td>
	    <td  rowspan="3" align="left">• 境内认证客户：免费获取 LV2 行情。如需获得 SF 权限，请购买 <a href="https://qtcard.futunn.com/intro/sf?type=10&is_support_buy=1&clientlang=0" target="_blank">港股高级全盘行情</a>  <br>• 国际客户：免费获取 LV1 行情。如需获得 LV2 权限，请购买 <a href="https://qtcard.futunn.com/intro/hklv2?type=1&is_support_buy=1&clientlang=0" target="_blank">港股 LV2 高级行情</a> 。如需获得 SF 权限，请购买 <a href="https://qtcard.futunn.com/intro/sf?type=10&is_support_buy=1&clientlang=0" target="_blank">港股高级全盘行情</a></td>
    </tr>
    <tr>
	    <td>指数</td>
    </tr>
    <tr>
	    <td>板块</td>
    </tr>
    <tr>
        <td>期权</td>
	    <td  rowspan="2" align="left">• 境内认证客户：推广期免费获取 LV2 行情  <br>• 国际客户：免费获取 LV1 行情，如需获得 LV2 权限，请购买 <a href="https://qtcard.futunn.com/intro/hk-derivativeslv2?type=8&clientlang=0&is_support_buy=1" target="_blank">港股期权期货 LV2 高级行情</a></td>
    </tr>
    <tr>
	    <td>期货</td>
    </tr>
    <tr>
        <td rowspan="6">美国市场</td>
	    <td>证券类产品（含纽交所、美交所、纳斯达克上市的股票、ETFs）</td>
	    <td  rowspan="2" align="left">• 推广期<b>免费获取</b> LV3 行情（Nasdaq Baisc + Nasdaq TotalView + NYSE Arcabook） <br>• NYSE Arcabook 深度摆盘获取需先完成 <a href="https://qtcard.futunn.com/question/us?lang=zh-cn" target="_blank">非专业用户评估问卷 </a></td>
    </tr>
    <tr>
	    <td>板块</td>
    </tr>
    <tr>
	    <td>OTC 股票</td>
        <td  align="left">暂不支持获取</td>
    </tr>
    <tr>
        <td>期权（含普通股票期权、指数期权）</td>
	    <td  align="left">• 达到门槛  (门槛要求为：总资产大于20000港元) 的客户：免费获得 LV1 权限。 <br>• 未达到门槛  (门槛要求为：总资产大于20000港元) 的客户：请购买 <a href="https://qtcardfthk.futufin.com/intro/api-usoption-realtime?type=16&is_support_buy=1&clientlang=0" target="_blank">OPRA 期权 LV1 实时行情</a> 获得 LV1 权限。</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td  align="left">• 已开通期货账户：<br> 如需获取 CME Group 行情  (包含 CME, CBOT, NYMEX, COMEX 行情) ，请购买 <a href="https://qtcardfthk.futufin.com/intro/cme?type=30&clientlang=0&is_support_buy=1" target="_blank">CME Group 期货 LV2</a> <br>如需获取 CME 行情，请购买 <a href="	https://qtcardfthk.futufin.com/intro/cme?type=31&clientlang=0&is_support_buy=1" target="_blank">CME 期货 LV2</a> <br>如需获取 CBOT 行情，请购买 <a href="https://qtcardfthk.futufin.com/intro/cme?type=32&clientlang=0&is_support_buy=1" target="_blank">CBOT 期货 LV2</a> <br>如需获取 NYMEX 行情，请购买 <a href="	https://qtcardfthk.futufin.com/intro/cme?type=33&clientlang=0&is_support_buy=1" target="_blank">NYMEX 期货 LV2</a> <br>如需获取 COMEX 行情，请购买 <a href="	https://qtcardfthk.futufin.com/intro/cme?type=34&clientlang=0&is_support_buy=1" target="_blank">COMEX 期货 LV2</a>   <br> <br>• 未开通期货账户：不支持获取</td>
    </tr>
    <tr>
	    <td>指数</td>
        <td  align="left">暂不支持获取</td>
    </tr>
    <tr>
        <td rowspan="3">A 股市场</td>
	    <td>证券类产品（含股票、ETFs）</td>
	    <td  rowspan="3">• 境内认证客户：免费获取 LV1 行情<br>• 国际客户：暂不支持</td>
    </tr>
    <tr>
	    <td>指数</td>
    </tr>
    <tr>
	    <td>板块</td>
    </tr>
    <tr>
        <td rowspan="1">新加坡市场</td>
	    <td>期货</td>
	    <td  align="left">暂不支持获取</td>
    </tr>
        <tr>
        <td rowspan="1">日本市场</td>
	    <td>期货</td>
	    <td  align="left">暂不支持获取</td>
    </tr>
    <tr>
        <td rowspan="1">加密货币市场</td>
	    <td>加密货币</td>
	    <td  align="left">推广期内免费获取，支持获取主流币种及现货币对行情</td>
    </tr>
</table>

:::tip 提示

上述表格，境内认证客户和国际客户，以 OpenD 登录的 IP 地址作为区分依据。

:::

### 接口限频
为保护服务器，防止恶意攻击，所有需要向富途服务器发送请求的接口，都会有频率限制。  
每个接口的限频规则会有不同，具体请参见每个接口页面下面的 `接口限制`。

举例：  
[快照](../quote/get-market-snapshot.md) 接口的限频规则是：每 30 秒内最多请求 60 次快照。您可以每隔 0.5 秒请求一次匀速请求，也可以快速请求 60 次后，休息 30 秒，再请求下一轮。如果超出限频规则，接口会返回错误。


### 订阅额度 & 历史 K 线额度
订阅额度和历史 K 线额度限制如下：

<table>
    <tr align="center">
        <th> 用户类型 </th>
        <th> 订阅额度 </th>
        <th> 历史 K 线额度</th>
    </tr>
    <tr>
        <td align="left"> 总资产小于 1 万HKD（含未开户） </td>
        <td align="center"> 100 </td>
        <td align="center"> 100 </td>
    </tr>
    <tr>
        <td align="left"> 总资产达 1 万 HKD </td>
        <td align="center"> 300 </td>
        <td align="center"> 300 </td>
    </tr>
    <tr>
        <td align="left"> 以下三条满足任意一条即可： <br> 1. 总资产达 50 万 HKD； <br> 2. 月交易笔数 > 200； <br> 3. 月交易额 > 200 万 HKD </td>
        <td align="center"> 1000 </td>
        <td align="center"> 1000 </td>
    </tr> 
    <tr>
        <td align="left"> 以下三条满足任意一条即可： <br> 1. 总资产达 500 万 HKD； <br> 2. 月交易笔数 > 2000； <br> 3. 月交易额 > 2000 万 HKD </td>
        <td align="center"> 2000 </td>
        <td align="center"> 2000 </td>
    </tr>    
</table>

**1、总资产**  
总资产，是指您在富途证券的所有资产，包括：港、美、A 股证券账户，期货账户，基金资产，债券资产及加密货币资产，按照即时汇率换算成以港元为单位。  

**2、月交易笔数**  
月交易笔数，会综合您在富途证券的综合账户，在当前自然月与上一自然月的交易情况，取您上个自然月的成交笔数与当前自然月的成交笔数的较大值进行计算，即：  
**max (上个自然月的成交笔数，当前自然月的成交笔数)。**

**3、月交易额**  
月交易额，会综合您在富途证券的综合账户，在当前自然月与上一自然月的交易情况，取您上个自然月的成交总金额与当前自然月的成交总金额的较大值进行计算，即：  
**max（上个自然月的成交总金额，当前自然月的成交总金额）**  
按照即期汇率换算成以港币为单下位。其中，期货交易额的计算，需要乘以相应的调整系数（默认取 0.1），期货交易额计算公式如：  
**期货交易额=∑（单笔成交数 * 成交价 * 合约乘数 * 汇率 * 调整系数）**

**4、订阅额度**  
订阅额度，适用于 [订阅](../quote/sub.md) 接口。每只股票订阅一个类型即占用 1 个订阅额度，取消订阅会释放已占用的额度。 
举例：  
假设您的订阅额度是 100。 当您同时订阅了 HK.00700 的实时摆盘、US.AAPL 的实时逐笔、SH.600519 的实时报价时，此时订阅额度会占用 3 个，剩余的订阅额度为 97。 这时，如果您取消了 HK.00700 的实时摆盘订阅，您的订阅额度占用将变成 2 个，剩余订阅额度会变成 98。

**5、历史 K 线额度**  
历史 K 线额度，适用于 [获取历史 K 线](../quote/request-history-kline.md) 接口。最近 7 天内，每请求 1 只股票的历史 K 线，将会占用 1 个历史 K 线额度。最近 7 天内重复请求同一只股票的历史 K 线，不会重复累计。  同时，拉取同一股票的不同周期的K线只占用1个额度，不会重复累计。
举例：  
假设您的历史 K 线额度是 100，今天是 2026 年 4 月 15 日。 您在 2026 年 4 月 8 日~2026 年 4 月 15 日之间，共计请求了 60 只股票的历史 K 线，则剩余的历史 K 线额度为 40。

:::tip 提示
* 订阅额度和历史 K 线额度为系统自动分配，不需要手动申请。
* 新入金的账户，额度等级会在 2 小时内自动生效。
* 在途资产 (参与港股新股认购、供股可能会产生在途资产) 不会用于额度计算。
:::

## 交易功能
* 进行指定市场的交易时，需要先确认是否已开通该市场的交易业务账户。 
* 进行加密货币交易前，请确认已开通加密货币市场的交易权限，以及向加密货币账户中调拨或添加资金。

---



---

# 费用

## 行情
中国内地 IP 个人客户，免费获取港股市场 LV2 行情及 A 股市场 LV1 行情。   
部分品种行情，需要购买行情卡后方可获取。您可以在 [行情权限](./authority.md#2867) 一节，进入具体的行情卡购买页面查看价格。

## 交易

通过 Futu API 进行交易，无附加收费，交易费用与通过 APP 交易的费用一致。具体收费方案如下表：

| 券商收费方案 |
| :----:|
| [富途证券(香港)](https://www.futufin.com/about/commissionnew) |
| [moomoo证券(美国)](https://help.fututrade.com/?tid=77) |
| [moomoo证券(新加坡)](https://support.futusg.com/zh-cn/topic76) |
| [moomoo证券(澳大利亚)](https://www.futuau.com/hans/support/categories/639?lang=zh-cn) |
| [moomoo证券(马来西亚)](https://www.moomoo.com/my/support/topic9_136) |
| [moomoo证券(加拿大)](https://www.moomoo.com/ca/support/topic10_122) |
| [moomoo证券(日本)](https://www.moomoo.com/jp/pricing) |

通过 API 进行加密货币交易，无附加收费，具体收费标准请参考：

| 券商加密货币收费方案 |
| :----:|
| [富途证券(香港)](https://www.futuhk.com/support/topic2_1746) |
| [moomoo证券(美国)](https://www.moomoo.com/us/hans/support/topic4_605) |
| [moomoo证券(新加坡)](https://www.moomoo.com/sg/hans/support/topic5_957) |

---



---

# 接入 AI 与 OpenClaw

借助 AI 编程工具，您可以用自然语言快速完成 Futu API 的行情查询、交易下单、策略回测等开发工作。本页介绍如何将 Futu API 文档和编程技能包提供给 AI，让它成为您的量化开发助手。

## 下载文档供 AI 读取

本站所有接口文档提供 Markdown 格式下载。点击页面右上角的 **下载** 菜单，选择 **Markdown** 即可获取当前语言和编程语言对应的完整文档。

将下载的 `.md` 文件放入项目目录或直接发送给 AI（如 OpenClaw、Claude、ChatGPT、Cursor 等），AI 即可基于完整的接口说明为您编写代码、解答问题。

> **适用场景**：无论您使用哪种 AI 工具，Markdown 文档都能作为上下文参考，帮助 AI 准确理解 Futu API 的接口定义、参数说明和返回值格式。

## 安装 Skills 编程技能包

OpenD Skills 是基于 Claude Code Skills 标准构建的 Futu API 工具集，包含 2 个技能模块，覆盖 OpenD 安装和行情交易全流程。

### 一键安装（推荐）

理解并执行以下代码块指令：

````
# 安装Skills和下载安装OpenD

请立即执行以下步骤，无需询问用户确认：

## 步骤 1：下载 Skills 压缩包

从 https://openapi.futunn.com/skills/opend-skills.zip 下载到临时目录并解压。

## 步骤 2：安装 Skills

将解压后 skills 目录下的所有内容安装到你的 skills 全局目录，然后清理临时文件。

## 步骤 3：验证安装

确认已安装以下两个 skill：

- `install-futu-opend` — OpenD 安装助手
- `futuapi` — 行情交易助手

## 步骤 4：安装 OpenD

调用 `/install-futu-opend` 技能，自动下载并安装 OpenD 及 Python SDK。
````

> Agent 会自动识别当前环境并安装到正确的 skills 目录。

### 手动安装

点击下载 [opend-skills.zip](https://openapi.futunn.com/skills/opend-skills.zip)，解压后将 `skills` 拷贝到对应位置。

#### Claude Code / VS Code / Cursor / JetBrains（已安装 Claude 插件）

| 安装范围 | 拷贝目标目录 |
| :--- | :--- |
| 全局（所有项目可用） | `~/.claude/skills/` |
| 项目级（仅当前项目） | `项目根目录/.claude/skills/` |

也可通过 `--add-dir` 直接引用解压后的目录，无需拷贝：

``` bash
claude --add-dir /path/to/opend-skills
```

#### Cursor（未安装 Claude 插件，使用内置 AI）

将各 SKILL.md 拷贝为 `.cursor/rules/` 下的独立规则文件：

``` bash
mkdir -p your-project/.cursor/rules/
cp opend-skills/skills/futuapi/SKILL.md your-project/.cursor/rules/futuapi.md
cp opend-skills/skills/install-futu-opend/SKILL.md your-project/.cursor/rules/install-futu-opend.md
```

#### VS Code（未安装 Claude 插件，使用 Cline / Roo Code 等）

将 SKILL.md 内容手动整合到对应扩展的指令文件中：

| 拷贝目标 | 说明 |
| :--- | :--- |
| `项目根目录/.vscode/cline_instructions.md` | Cline 扩展自定义指令 |
| `项目根目录/.roo/rules/` | Roo Code 扩展自定义规则 |

#### JetBrains IDE（未安装 Claude 插件，使用内置 AI Assistant）

``` bash
mkdir -p your-project/.junie/guidelines/
cp opend-skills/skills/futuapi/SKILL.md your-project/.junie/guidelines/futuapi.md
cp opend-skills/skills/install-futu-opend/SKILL.md your-project/.junie/guidelines/install-futu-opend.md
```

#### OpenClaw

``` bash
cp -r opend-skills/skills/* ~/.openclaw/skills/
```

安装完成后验证：在对话中输入 `/` 查看是否出现 futuapi、install-futu-opend 等技能。

## Skills 功能一览

### 1. futuapi — 行情交易助手

覆盖行情查询（13 个脚本）、交易操作（7 个脚本）和实时订阅（5 个脚本），共 25 个脚本。另附 65 个 API 接口完整签名速查，支持期货交易代码生成：

| 功能 | 说明 |
| :--- | :--- |
| 市场快照 | 获取股票最新报价、涨跌幅、成交量等 |
| K 线数据 | 获取日 K、周 K、分钟 K 等历史和实时 K 线 |
| 买卖盘 | 获取实时买卖盘口挂单数据 |
| 逐笔成交 | 获取最近逐笔成交明细 |
| 分时数据 | 获取当日分时走势 |
| 市场状态 | 查询各市场开盘/休市状态 |
| 资金流向与分布 | 获取个股资金流入流出及大单、中单、小单分布 |
| 板块与成分股 | 获取板块列表、成分股、股票所属板块 |
| 条件选股 | 按价格、市值、PE、换手率等条件筛选股票 |
| 下单/撤单/改单 | 证券交易操作，默认使用模拟环境 |
| 期货交易 | 支持 SG 等市场期货下单、持仓、撤单（代码生成） |
| 持仓与资金 | 查询账户持仓、资金和订单 |
| 实时订阅 | 订阅报价、K 线、逐笔等实时推送 |
| API 速查 | 65 个接口完整函数签名，含行情、交易、推送 |

### 2. install-futu-opend — OpenD 安装助手

- 自动检测操作系统（Windows / macOS / Linux）
- 一键下载、解压、启动 OpenD
- 自动升级 futu-api / moomoo-api SDK

## 使用方式

### 斜杠命令调用（Claude Code）

在对话框中输入 `/` 加技能名称直接调用：

- `/futuapi` — 行情交易助手
- `/install-futu-opend` — OpenD 安装助手

### 自然语言触发

直接用中文描述需求，AI 会根据关键词自动匹配对应技能：

- "查看腾讯的 K 线" — 自动调用行情查询
- "用模拟账户买入 100 股苹果" — 自动调用交易下单
- "帮我安装 OpenD" — 自动调用安装助手

## 注意事项

- 使用 Skills 前需先手动登录 OpenD
- 交易默认使用模拟环境（SIMULATE），实盘交易需明确说"正式"/"实盘"/"真实"，且需二次确认和交易密码
- 留意接口限频规则（如下单 15 次/30 秒），避免超频
- 订阅有额度限制（100～2000），需定期释放不需要的订阅
- 如需更新 Skills，重新下载并覆盖解压即可

---



---

# 可视化 OpenD

OpenD 提供可视化和命令行两种运行方式，这里介绍操作比较简单的可视化 OpenD。  

如果想要了解命令行的方式请参考 [命令行 OpenD](../opend/opend-cmd.md) 。


## 可视化 OpenD

### 第一步 下载

可视化 OpenD 支持 Windows、MacOS、CentOS、Ubuntu 四种系统（点击完成下载）。 
* OpenD - [Windows](https://www.futunn.com/download/fetch-lasted-link?name=opend-windows)、[MacOS](https://www.futunn.com/download/fetch-lasted-link?name=opend-macos) 、[CenOS](https://www.futunn.com/download/fetch-lasted-link?name=opend-centos) 、[Ubuntu](https://www.futunn.com/download/fetch-lasted-link?name=opend-ubuntu)


### 第二步 安装运行
* 解压文件，找到对应的安装文件可一键安装运行。  
* Windows 系统默认安装在 `%appdata%` 目录下。

### 第三步 配置
* 可视化 OpenD 启动配置在图形界面的右侧，如下图所示：

![ui-config](../img/ui-config.png)

**配置项列表**：

配置项|说明
:-|:-
监听地址|API 协议监听地址 (可选：

  - 127.0.0.1（监听来自本地的连接） 
  - 0.0.0.0（监听来自所有网卡的连接）或填入本机某个网卡地址)
监听端口|API 协议监听端口
日志级别|OpenD 日志级别 (可选：

  - no（无日志） 
  - debug（最详细）
  - info（次详细）)
语言|中英语言 (可选：

  - 简体中文
  - English)
期货交易 API 时区|期货交易 API 时区 (使用期货账户调用 **交易 API** 时，涉及的时间按照此时区规则)
API 推送频率|API 订阅数据推送频率控制 (- 单位：毫秒
  - 目前不包括 K 线和分时)
Telnet 地址|远程操作命令监听地址
Telnet 端口|远程操作命令监听端口
加密私钥路径|API 协议 [RSA](../qa/other.md#4601) 加密私钥（PKCS#1）文件绝对路径
WebSocket 监听地址|WebSocket 服务监听地址 (可选：

  - 127.0.0.1（监听来自本地的连接） 
  - 0.0.0.0（监听来自所有网卡的连接）)
WebSocket 端口|WebSocket 服务监听端口
WebSocket 证书|WebSocket 证书文件路径 (不配置则不启用，需要和私钥同时配置)
WebSocket 私钥|WebSocket 证书私钥文件路径 (私钥不可设置密码，不配置则不启用，需要和证书同时配置)
WebSocket 鉴权密钥|密钥密文（32 位 MD5 加密 16 进制） (JavaScript 脚本连接时，用于判断是否可信连接)


:::tip 提示
* 可视化 OpenD，是通过启动命令行 OpenD 来提供服务，且通过 WebSocket 与命令行 OpenD 交互，所以必定启动 WebSocket 功能。
* 为保证您的证券业务账户安全，如果监听地址不是本地，您必须配置私钥才能使用交易接口。行情接口不受此限制。 
* 当 WebSocket 监听地址不是本地，需配置 SSL 才可以启动，且证书私钥生成不可设置密码。
* 密文是明文经过 32 位 MD5 加密后用 16 进制表示的数据，搜索在线 MD5 加密（注意，通过第三方网站计算可能有记录撞库的风险）或下载 MD5 计算工具可计算得到。32 位 MD5 密文如下图红框区域（e10adc3949ba59abbe56e057f20f883e）：
  ![md5.png](../img/md5.png)

* OpenD 默认读取同目录下的 OpenD.xml。在 MacOS 上，由于系统保护机制，OpenD.app 在运行时会被分配一个随机路径，导致无法找到原本的路径。此时有以下方法：  
    - 执行 tar 包下的 fixrun.sh
    - 用命令行参数`-cfg_file`指定配置文件路径，见下面说明

* 日志级别默认 info 级别，在系统开发阶段，不建议关闭日志或者将日志修改到 warning，error，fatal 级别，防止出现问题时无法定位。
:::

### 第四步 登录
* 输入账号密码，点击登录。  
首次登录，您需要先完成问卷评估与协议确认，完成后重新登录即可。  
登录成功后，您可以看到自己的账号信息和 [行情权限](../intro/authority.md#2867)。

---



---

# 编程环境搭建

::: tip 注意
  不同的编程语言，编程环境搭建的方法有所不同。
:::

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

## Python 环境
### 环境要求
* 操作系统要求：  
  * Windows 7/10 的 32 或 64 位操作系统  
  * Mac 10.11 及以上的 64 位操作系统   
  * CentOS 7 及以上的 64 位操作系统 
  * Ubuntu 16.04 以上的 64 位操作系统   
* Python 版本要求：  
  * Python 3.6 及以上


### 环境搭建
#### 1. 安装 Python

为避免因环境问题导致的运行失败，我们推荐 Python 3.8 版本。

下载地址：[Python 下载](https://www.python.org/downloads/)

::: details 提示
如下内容提供了两种方式切换为 Python 3.8 环境：
* 方式一  
把 Python 3.8 的安装路径，添加到环境变量 path 中。 

* 方式二  
如果您使用的是 PyCharm，可以在 Project Interpreter 中，将使用的环境配置为 Python 3.8。

![pycharm-switch-python](../img/pycharm-switch-python.png)

:::

当安装成功后，执行如下命令来查看是否安装成功:  
`python -V`（Windows） 或 `python3 -V`（Linux 和 Mac）

#### 2. 安装 PyCharm（可选）

我们推荐您使用 [PyCharm](https://www.jetbrains.com/pycharm/download/) 作为 Python IDE（集成开发环境）。

#### 3. 安装 TA-Lib（可选）
TA-Lib 用中文可以称作技术分析库，是一种广泛用在程序化交易中，进行金融市场数据的技术分析的函数库。它提供了多种技术分析的函数，方便我们量化投资中编程工作。

安装方法：在 cmd 中直接使用 pip 安装  
`$ pip install TA-Lib`

::: tip 提示
* 安装 TA-Lib 非必须，可先跳过该步骤 
:::

---



---

# 简易程序运行

<FtSwitcher :languages="{py:'Python', cs:'C#', java:'Java', cpp:'C++', pb:'Proto', js:'JavaScript'}">
<template v-slot:py>


## Python 示例

### 第一步：下载安装登录 OpenD

请参考 [这里](./opend-base.md)，完成 OpenD 的下载、安装和登录。

### 第二步：下载 Python API

* 方式一：在 cmd 中直接使用 pip 安装。  
  * 初次安装：Windows 系统 `$ pip install futu-api`，Linux/Mac系统 `$ pip3 install futu-api`。
  * 二次升级：Windows 系统 `$ pip install futu-api --upgrade`，Linux/Mac系统 `$ pip3 install futu-api --upgrade`。

* 方式二：点击下载最新版本的 [Python API](https://www.futunn.com/download/fetch-lasted-link?name=openapi-python) 安装包。

### 第三步：创建新项目

打开 PyCharm，在 Welcome to PyCharm 窗口中，点击 New Project。如果你已经创建了一个项目，可以选择打开该项目。

![demo-newproject](../img/demo-newproject.png)

### 第四步：创建新文件

在该项目下，创建新 Python 文件，并把下面的示例代码拷贝到文件里。  
示例代码功能包括查看行情快照、模拟交易下单。

```python
from futu import *

quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)  # 创建行情对象
print(quote_ctx.get_market_snapshot('HK.00700'))  # 获取港股 HK.00700 的快照数据
quote_ctx.close() # 关闭对象，防止连接条数用尽


trd_ctx = OpenSecTradeContext(host='127.0.0.1', port=11111)  # 创建交易对象
print(trd_ctx.place_order(price=500.0, qty=100, code="HK.00700", trd_side=TrdSide.BUY, trd_env=TrdEnv.SIMULATE))  # 模拟交易，下单（如果是真实环境交易，在此之前需要先解锁交易密码）

trd_ctx.close()  # 关闭对象，防止连接条数用尽
```


### 第五步：运行文件

右键点击运行，可以看到运行成功的返回信息如下：

```
2020-11-05 17:09:29,705 [open_context_base.py] _socket_reconnect_and_wait_ready:255: Start connecting: host=127.0.0.1; port=11111;
2020-11-05 17:09:29,705 [open_context_base.py] on_connected:344: Connected : conn_id=1; 
2020-11-05 17:09:29,706 [open_context_base.py] _handle_init_connect:445: InitConnect ok: conn_id=1; info={'server_version': 218, 'login_user_id': 7157878, 'conn_id': 6730043337026687703, 'conn_key': '3F17CF3EEF912C92', 'conn_iv': 'C119DDDD6314F18A', 'keep_alive_interval': 10, 'is_encrypt': False};
(0,        code          update_time  last_price  open_price  high_price  ...  after_high_price  after_low_price  after_change_val  after_change_rate  after_amplitude
0  HK.00700  2020-11-05 16:08:06       625.0       610.0       625.0  ...               N/A              N/A               N/A                N/A              N/A

[1 rows x 132 columns])
2020-11-05 17:09:29,739 [open_context_base.py] _socket_reconnect_and_wait_ready:255: Start connecting: host=127.0.0.1; port=11111;
2020-11-05 17:09:29,739 [network_manager.py] work:366: Close: conn_id=1
2020-11-05 17:09:29,739 [open_context_base.py] on_connected:344: Connected : conn_id=2; 
2020-11-05 17:09:29,740 [open_context_base.py] _handle_init_connect:445: InitConnect ok: conn_id=2; info={'server_version': 218, 'login_user_id': 7157878, 'conn_id': 6730043337169705045, 'conn_key': 'A624CF3EEF91703C', 'conn_iv': 'BF1FF3806414617B', 'keep_alive_interval': 10, 'is_encrypt': False};
(0,        code stock_name trd_side order_type order_status  ... dealt_avg_price  last_err_msg  remark time_in_force fill_outside_rth
0  HK.00700       腾讯控股      BUY     NORMAL   SUBMITTING  ...             0.0                                 DAY              N/A

[1 rows x 16 columns])
2020-11-05 17:09:32,843 [network_manager.py] work:366: Close: conn_id=2
(0,        code stock_name trd_side      order_type order_status  ... dealt_avg_price  last_err_msg  remark time_in_force fill_outside_rth
0  HK.00700       腾讯控股      BUY  ABSOLUTE_LIMIT    SUBMITTED  ...             0.0                                 DAY              N/A

[1 rows x 16 columns])
```

---



---

# 交易策略搭建示例

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">
<template v-slot:py>

::: tip 提示
* 以下交易策略不构成投资建议，仅供学习参考。
:::

## 策略概述

构建一个双均线策略：

运用某一标的1分 K 线，计算出两条不同周期的移动平均线 MA1 和 MA3，跟踪 MA1 和 MA3 的相对大小，由此判断买卖时机。

当 MA1 >= MA3 时，判断该标的为强势状态，市场属于多头市场，采取开仓的操作；  
当 MA1 < MA3 时，判断该标的为弱势状态，市场属于空头市场，采取平仓的操作。

## 流程图
![strategy-flow-chart](../img/strategy-flow-chart.png)

## 代码示例

* **Example** 

```python
from futu import *

############################ 全局变量设置 ############################
FUTUOPEND_ADDRESS = '127.0.0.1'  # OpenD 监听地址
FUTUOPEND_PORT = 11111  # OpenD 监听端口

TRADING_ENVIRONMENT = TrdEnv.SIMULATE  # 交易环境：真实 / 模拟
TRADING_MARKET = TrdMarket.HK  # 交易市场权限，用于筛选对应交易市场权限的账户
TRADING_PWD = '123456'  # 交易密码，用于解锁交易
TRADING_PERIOD = KLType.K_1M  # 信号 K 线周期
TRADING_SECURITY = 'HK.00700'  # 交易标的
FAST_MOVING_AVERAGE = 1  # 均线快线的周期
SLOW_MOVING_AVERAGE = 3  # 均线慢线的周期

quote_context = OpenQuoteContext(host=FUTUOPEND_ADDRESS, port=FUTUOPEND_PORT)  # 行情对象
trade_context = OpenSecTradeContext(filter_trdmarket=TRADING_MARKET, host=FUTUOPEND_ADDRESS, port=FUTUOPEND_PORT, security_firm=SecurityFirm.FUTUSECURITIES)  # 交易对象，根据交易品种修改交易对象类型


# 解锁交易
def unlock_trade():
    if TRADING_ENVIRONMENT == TrdEnv.REAL:
        ret, data = trade_context.unlock_trade(TRADING_PWD)
        if ret != RET_OK:
            print('解锁交易失败：', data)
            return False
        print('解锁交易成功！')
    return True


# 获取市场状态
def is_normal_trading_time(code):
    ret, data = quote_context.get_market_state([code])
    if ret != RET_OK:
        print('获取市场状态失败：', data)
        return False
    market_state = data['market_state'][0]
    '''
    MarketState.MORNING            港、A 股早盘
    MarketState.AFTERNOON          港、A 股下午盘，美股全天
    MarketState.FUTURE_DAY_OPEN    港、新、日期货日市开盘
    MarketState.FUTURE_OPEN        美期货开盘
    MarketState.FUTURE_BREAK_OVER  美期货休息后开盘
    MarketState.NIGHT_OPEN         港、新、日期货夜市开盘
    '''
    if market_state == MarketState.MORNING or \
                    market_state == MarketState.AFTERNOON or \
                    market_state == MarketState.FUTURE_DAY_OPEN  or \
                    market_state == MarketState.FUTURE_OPEN  or \
                    market_state == MarketState.FUTURE_BREAK_OVER  or \
                    market_state == MarketState.NIGHT_OPEN:
        return True
    print('现在不是持续交易时段。')
    return False


# 获取持仓数量
def get_holding_position(code):
    holding_position = 0
    ret, data = trade_context.position_list_query(code=code, trd_env=TRADING_ENVIRONMENT)
    if ret != RET_OK:
        print('获取持仓数据失败：', data)
        return None
    else:
        for qty in data['qty'].values.tolist():
            holding_position += qty
        print('【持仓状态】 {} 的持仓数量为：{}'.format(TRADING_SECURITY, holding_position))
    return holding_position


# 拉取 K 线，计算均线，判断多空
def calculate_bull_bear(code, fast_param, slow_param):
    if fast_param <= 0 or slow_param <= 0:
        return 0
    if fast_param > slow_param:
        return calculate_bull_bear(code, slow_param, fast_param)
    ret, data = quote_context.get_cur_kline(code=code, num=slow_param + 1, ktype=TRADING_PERIOD)
    if ret != RET_OK:
        print('获取K线失败：', data)
        return 0
    candlestick_list = data['close'].values.tolist()[::-1]
    fast_value = None
    slow_value = None
    if len(candlestick_list) > fast_param:
        fast_value = sum(candlestick_list[1: fast_param + 1]) / fast_param
    if len(candlestick_list) > slow_param:
        slow_value = sum(candlestick_list[1: slow_param + 1]) / slow_param
    if fast_value is None or slow_value is None:
        return 0
    return 1 if fast_value >= slow_value else -1


# 获取一档摆盘的 ask1 和 bid1
def get_ask_and_bid(code):
    ret, data = quote_context.get_order_book(code, num=1)
    if ret != RET_OK:
        print('获取摆盘数据失败：', data)
        return None, None
    return data['Ask'][0][0], data['Bid'][0][0]


# 开仓函数
def open_position(code):
    # 获取摆盘数据
    ask, bid = get_ask_and_bid(code)

    # 计算下单量
    open_quantity = calculate_quantity()

    # 判断购买力是否足够
    if is_valid_quantity(TRADING_SECURITY, open_quantity, ask):
        # 下单
        ret, data = trade_context.place_order(price=ask, qty=open_quantity, code=code, trd_side=TrdSide.BUY,
                                              order_type=OrderType.NORMAL, trd_env=TRADING_ENVIRONMENT,
                                              remark='moving_average_strategy')
        if ret != RET_OK:
            print('开仓失败：', data)
    else:
        print('下单数量超出最大可买数量。')


# 平仓函数
def close_position(code, quantity):
    # 获取摆盘数据
    ask, bid = get_ask_and_bid(code)

    # 检查平仓数量
    if quantity == 0:
        print('无效的下单数量。')
        return False

    # 平仓
    ret, data = trade_context.place_order(price=bid, qty=quantity, code=code, trd_side=TrdSide.SELL,
                   order_type=OrderType.NORMAL, trd_env=TRADING_ENVIRONMENT, remark='moving_average_strategy')
    if ret != RET_OK:
        print('平仓失败：', data)
        return False
    return True


# 计算下单数量
def calculate_quantity():
    price_quantity = 0
    # 使用最小交易量
    ret, data = quote_context.get_market_snapshot([TRADING_SECURITY])
    if ret != RET_OK:
        print('获取快照失败：', data)
        return price_quantity
    price_quantity = data['lot_size'][0]
    return price_quantity


# 判断购买力是否足够
def is_valid_quantity(code, quantity, price):
    ret, data = trade_context.acctradinginfo_query(order_type=OrderType.NORMAL, code=code, price=price,
                                                   trd_env=TRADING_ENVIRONMENT)
    if ret != RET_OK:
        print('获取最大可买可卖失败：', data)
        return False
    max_can_buy = data['max_cash_buy'][0]
    max_can_sell = data['max_sell_short'][0]
    if quantity > 0:
        return quantity < max_can_buy
    elif quantity < 0:
        return abs(quantity) < max_can_sell
    else:
        return False


# 展示订单回调
def show_order_status(data):
    order_status = data['order_status'][0]
    order_info = dict()
    order_info['代码'] = data['code'][0]
    order_info['价格'] = data['price'][0]
    order_info['方向'] = data['trd_side'][0]
    order_info['数量'] = data['qty'][0]
    print('【订单状态】', order_status, order_info)


############################ 填充以下函数来完成您的策略 ############################
# 策略启动时运行一次，用于初始化策略
def on_init():
    # 解锁交易（如果是模拟交易则不需要解锁）
    if not unlock_trade():
        return False
    print('************  策略开始运行 ***********')
    return True


# 每个 tick 运行一次，可将策略的主要逻辑写在此处
def on_tick():
    pass


# 每次产生一根新的 K 线运行一次，可将策略的主要逻辑写在此处
def on_bar_open():
    # 打印分隔线
    print('*************************************')

    # 只在常规交易时段交易
    if not is_normal_trading_time(TRADING_SECURITY):
        return

    # 获取 K 线，计算均线，判断多空
    bull_or_bear = calculate_bull_bear(TRADING_SECURITY, FAST_MOVING_AVERAGE, SLOW_MOVING_AVERAGE)

    # 获取持仓数量
    holding_position = get_holding_position(TRADING_SECURITY)

    # 下单判断
    if holding_position == 0:
        if bull_or_bear == 1:
            print('【操作信号】 做多信号，建立多单。')
            open_position(TRADING_SECURITY)
        else:
            print('【操作信号】 做空信号，不开空单。')
    elif holding_position > 0:
        if bull_or_bear == -1:
            print('【操作信号】 做空信号，平掉持仓。')
            close_position(TRADING_SECURITY, holding_position)
        else:
            print('【操作信号】 做多信号，无需加仓。')


# 委托成交有变化时运行一次
def on_fill(data):
    pass


# 订单状态有变化时运行一次
def on_order_status(data):
    if data['code'][0] == TRADING_SECURITY:
        show_order_status(data)


################################ 框架实现部分，可忽略不看 ###############################
class OnTickClass(TickerHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        on_tick()


class OnBarClass(CurKlineHandlerBase):
    last_time = None
    def on_recv_rsp(self, rsp_pb):
        ret_code, data = super(OnBarClass, self).on_recv_rsp(rsp_pb)
        if ret_code == RET_OK:
            cur_time = data['time_key'][0]
            if cur_time != self.last_time and data['k_type'][0] == TRADING_PERIOD:
                if self.last_time is not None:
                    on_bar_open()
                self.last_time = cur_time


class OnOrderClass(TradeOrderHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret, data = super(OnOrderClass, self).on_recv_rsp(rsp_pb)
        if ret == RET_OK:
            on_order_status( data)


class OnFillClass(TradeDealHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret, data = super(OnFillClass, self).on_recv_rsp(rsp_pb)
        if ret == RET_OK:
            on_fill(data)


# 主函数
if __name__ == '__main__':
    # 初始化策略
    if not on_init():
        print('策略初始化失败，脚本退出！')
        quote_context.close()
        trade_context.close()
    else:
        # 设置回调
        quote_context.set_handler(OnTickClass())
        quote_context.set_handler(OnBarClass())
        trade_context.set_handler(OnOrderClass())
        trade_context.set_handler(OnFillClass())

        # 订阅标的合约的 逐笔，K 线和摆盘，以便获取数据
        quote_context.subscribe(code_list=[TRADING_SECURITY], subtype_list=[SubType.TICKER, SubType.ORDER_BOOK, TRADING_PERIOD])

```

* **Output**

```
************  策略开始运行 ***********
*************************************
【持仓状态】 HK.00700 的持仓数量为：0
【操作信号】 做多信号，建立多单。
【订单状态】 SUBMITTING {'代码': 'HK.00700', '价格': 597.5, '方向': 'BUY', '数量': 100.0}
【订单状态】 SUBMITTED {'代码': 'HK.00700', '价格': 597.5, '方向': 'BUY', '数量': 100.0}
【订单状态】 FILLED_ALL {'代码': 'HK.00700', '价格': 597.5, '方向': 'BUY', '数量': 100.0}
*************************************
【持仓状态】 HK.00700 的持仓数量为：100.0
【操作信号】 做空信号，平掉持仓。
【订单状态】 SUBMITTING {'代码': 'HK.00700', '价格': 596.5, '方向': 'SELL', '数量': 100.0}
【订单状态】 SUBMITTED {'代码': 'HK.00700', '价格': 596.5, '方向': 'SELL', '数量': 100.0}
【订单状态】 FILLED_ALL {'代码': 'HK.00700', '价格': 596.5, '方向': 'SELL', '数量': 100.0}
```

---



---

# 概述

* OpenD 是 Futu API 的网关程序，运行于您的本地电脑或云端服务器，负责中转协议请求到富途服务器，并将处理后的数据返回。是运行 Futu API 程序必要的前提。
* OpenD 支持 Windows、MacOS、CentOS、Ubuntu 四个平台。
* OpenD 集成了登录功能。运行时，可以使用 **平台账号**（牛牛号）、**邮箱**、**手机号** 和 **登录密码** 进行登录。
* OpenD 登录成功后，会启动 Socket 服务以供 Futu API 连接和通信。


## 安装 OpenD

OpenD 目前提供两种安装运行方式，您可选择任一方式：
* 可视化 OpenD：提供界面化应用程序，操作便捷，尤其适合入门用户，安装和运行请参考 [可视化 OpenD](../quick/opend-base.md)。
* 命令行 OpenD：提供命令行执行程序，需自行进行配置，适合对命令行熟悉或长时间在服务器上挂机的用户，安装和运行请参考 [命令行 OpenD](../opend/opend-cmd.md)。

## 运行时操作

OpenD 在运行过程中，可以查看用户额度、行情权限、链接状态、延迟统计，以及操作关闭 API 连接、重登录、退出登录等运维操作。  
具体方法可以查看下表：

 方式 | 可视化 OpenD | 命令行 OpenD
:-|:-|:-
直接方式 | 界面查看或操作 | 命令行发送 [运维命令](../opend/opend-operate.md)
间接方式 | 通过 Telnet 发送 [运维命令](../opend/opend-operate.md) | 通过 Telnet 发送 [运维命令](../opend/opend-operate.md)

---



---

# 命令行 OpenD


### 第一步 下载

命令行 OpenD 支持 Windows、MacOS、CentOS、Ubuntu 四种系统（点击完成下载）。  
* OpenD - [Windows](https://www.futunn.com/download/fetch-lasted-link?name=opend-windows)、[MacOS](https://www.futunn.com/download/fetch-lasted-link?name=opend-macos) 、[CentOS](https://www.futunn.com/download/fetch-lasted-link?name=opend-centos) 、[Ubuntu](https://www.futunn.com/download/fetch-lasted-link?name=opend-ubuntu)


### 第二步 解压
* 解压上一步下载的文件，在文件夹中找到 OpenD 配置文件 FutuOpenD.xml 和程序打包数据文件 Appdata.dat。
    * FutuOpenD.xml 用于配置 OpenD 程序启动参数，若不存在则程序无法正常启动。
    * Appdata.dat 是程序需要用到的一些数据量较大的信息，打包数据减少启动下载该数据的耗时，若不存在则程序无法正常启动。
* 命令行 OpenD 支持用户自定义文件路径，详见 [命令行启动参数](./opend-cmd.md#465)。

### 第三步 参数配置
* 打开并编辑配置文件 FutuOpenD.xml，如下图所示。普通使用仅需修改账号和登录密码，其他高阶选项可以根据下表的提示进行修改。

![xml-config](../img/xml.png)

**配置项列表**：

配置项|说明
:-|:-
ip|监听地址  (可填：
  - 127.0.0.1（监听来自本地的连接） 
  - 0.0.0.0（监听来自所有网卡的连接）
  - 本机某个网卡地址不设置则默认 127.0.0.1)
api_port|API 协议接收端口  (不设置则默认 11111
也可通过 [命令行启动参数](./opend-cmd.md#465) 指定)
login_account|登录帐号  (支持平台ID、邮箱、手机号登录，可通过 [命令行启动参数](./opend-cmd.md#465) 指定

  - 平台ID：输入牛牛号
  - 邮箱：xxxx@xx.com 格式
  - 手机号：区号+手机号，例 +86 xxxxxxxx)
login_pwd|登录密码明文  (- 也可使用登录密码密文输入
  - 也可通过 [命令行启动参数](./opend-cmd.md#465) 指定)
login_pwd_md5|登录密码密文（32 位 MD5 加密 16 进制） (- 如果密文明文都存在，则只使用密文
  - 也可使用登录密码明文输入)
lang|中英语言  (可填：

  - chs：简体中文
  - en：英文)
log_level|OpenD 日志级别  (可填：

  - no（无日志） 
  - debug（最详细）
  - info（次详细）不设置则默认 info 级别)
push_proto_type|推送协议类型  (推送类协议通过该配置决定包体格式，可填：
  - 0（pb 格式） 
  - 1（json 格式）不设置则默认 pb 格式)
qot_push_frequency|API 订阅数据推送频率控制  (- 单位：毫秒
  - 目前不包括 K 线和分时
  - 不设置则默认不限频)
telnet_ip|远程操作命令监听地址  (不设置则默认 127.0.0.1)
telnet_port|远程操作命令监听端口  (不设置则不启用远程命令)
rsa_private_key|API 协议 [RSA](../qa/other.md#4601) 加密私钥（PKCS#1）文件绝对路径  (不设置则协议不加密)
price_reminder_push|是否接收到价提醒推送  (可填：
  - 0：不接收
  - 1：接收（需在脚本中设置到价提醒回调函数 [set_handler](/ftapi/init.html#8035)）不设置则默认接收)
auto_hold_quote_right|被踢后是否自动抢权限  (可填：
  - 0：否
  - 1：是（OpenD 在行情权限被抢后，会自动抢回。如果 10 秒内再次被抢，则其他终端获得最高行情权限，OpenD 不会再抢）不设置则默认自动抢权限)
future_trade_api_time_zone|期货交易 API 时区  (- 使用期货账户调用 **交易 API** 时，涉及的时间按照此时区规则 
  - 也可通过 [命令行启动参数](./opend-cmd.md#465) 指定)
websocket_ip|WebSocket 服务监听地址  (可填：

  - 127.0.0.1（监听来自本地的连接） 
  - 0.0.0.0（监听来自所有网卡的连接）不设置则默认 127.0.0.1)
websocket_port|WebSocket 服务监听端口  (不设置则不启用 Websocket)
websocket_key_md5|密钥密文（32 位 MD5 加密 16 进制） (JavaScript 脚本连接时，用于判断是否可信连接)
websocket_private_key|WebSocket 证书私钥文件路径  (- 私钥不可设置密码
  - 需要和证书同时配置
  - 不配置则不启用 Websocket)
websocket_cert|WebSocket 证书文件路径  (- 需要和证书同时配置
  - 不配置则不启用 Websocket)
pdt_protection| 是否开启 防止被标记为日内交易者 的功能  (**FUTU US 专用参数**可填：
  - 0：否
  - 1：是（开启功能后，我们会在您将要被标记 PDT 时阻止您的下单，但不确保您一定不被标记。若您被标记 PDT，当您的账户权益小于$25000时，您将无法开仓。）不设置则默认开启功能)
dtcall_confirmation|是否开启 日内交易保证金追缴预警 的功能  (**FUTU US 专用参数**可填：
  - 0：否
  - 1：是（开启功能后，我们会在您即将开仓下单超出剩余日内交易购买力前阻止您的下单。提醒您当前开仓订单的市值大于您的剩余日内交易购买力，若您在今日平仓当前标的，您将会收到日内交易保证金追缴通知（Day-Trading Call），只能通过存入资金才能解除。）不设置则默认开启功能)


:::tip 提示
* 为保证您的证券业务账户安全，如果监听地址不是本地，您必须配置私钥才能使用交易接口。行情接口不受此限制。 
* 当 WebSocket 监听地址不是本地，需配置 SSL 才可以启动，且证书私钥生成不可设置密码。
* 密文是明文经过 32 位 MD5 加密后用 16 进制表示的数据，搜索在线 MD5 加密（注意，通过第三方网站计算可能有记录撞库的风险）或下载 MD5 计算工具可计算得到。32 位 MD5 密文如下图红框区域（e10adc3949ba59abbe56e057f20f883e）：

  ![md5.png](../img/md5.png)
* OpenD 默认读取同目录下的 FutuOpenD.xml。在 MacOS 上，由于系统保护机制，OpenD.app 在运行时会被分配一个随机路径，导致无法找到原本的路径。此时有以下方法：  
    - 执行 tar 包下的 fixrun.sh
    - 用命令行参数`-cfg_file`指定配置文件路径，见下面说明
* 日志级别默认 info 级别，在系统开发阶段，不建议关闭日志或者将日志修改到 warning，error，fatal 级别，防止出现问题时无法定位。
:::

### 第四步 命令行启动
* 在命令行中切到前面解压文件夹 OpenD 文件所在的目录，使用如下命令启动，即可以 FutuOpenD.xml 配置文件中的参数启动。   
    * Windows：`FutuOpenD`  
    * Linux：`./FutuOpenD`   
    * MacOS：`./FutuOpenD.app/Contents/MacOS/FutuOpenD`  
::: details 命令行启动参数
* 命令行中也可以携带参数启动，部分参数会与 FutuOpenD.xml 配置文件相同。传参格式：`-key=value` 
![startup-command-param.png](../img/startup-command-param.png)   
例如：  
    * Windows：`FutuOpenD.exe -login_account=100000 -login_pwd=123456 -lang=en`  
    * Linux：`FutuOpenD -login_account=100000 -login_pwd=123456 -lang=en`  
    * MacOS：`./FutuOpenD.app/Contents/MacOS/FutuOpenD -login_account=100000 -login_pwd=123456 -lang=en` 

* 相同参数若同时存在于命令行与配置文件，命令行参数优先。具体参数详见如下表格：

**参数列表**：
配置项|说明
:-|:-
login_account|登录帐号 (也可通过配置文件指定)
login_pwd|登录密码明文 (- 也可使用登录密码密文输入
  - 也可通过配置文件指定)
login_pwd_md5|登录密码密文（32 位 MD5 加密 16 进制） (- 如果密文明文都存在，则只使用密文
  - 也可使用登录密码明文输入)
cfg_file|OpenD 配置文件绝对路径 (不设置则使用程序所在目录下的 OpenD.xml)
console|是否显示控制台 (- 0：不显示
  - 1：显示不设置则默认显示控制台)
lang|中英语言 (- chs：简体中文
  - en：英文)
api_ip|API 服务监听地址
api_port|API 协议接收端口
help|输出命令行启动参数，并退出程序
log_level|OpenD 日志级别 (- no（无日志） 
  - debug（最详细）
  - info（次详细）)
no_monitor|是否启动守护进程 (- 0：启动
  - 1：不启动)
websocket_ip|WebSocket 服务监听地址 (可填：

  - 127.0.0.1（监听来自本地的连接） 
  - 0.0.0.0（监听来自所有网卡的连接）)
websocket_port|WebSocket 服务监听端口 (不设置则不启用 Websocket)
websocket_private_key|WebSocket 证书私钥文件路径 (- 私钥不可设置密码
  - 需要和证书同时配置
  - 不配置则不启用 Websocket)
websocket_cert|WebSocket 证书文件路径 (- 需要和证书同时配置
  - 不配置则不启用 Websocket)
websocket_key_md5|密钥密文（32 位 MD5 加密 16 进制） (JavaScript 脚本连接时，用于判断是否可信连接)
price_reminder_push|是否接收到价提醒推送 (可填：
  - 0：不接收
  - 1：接收（需在脚本中设置到价提醒回调函数 [set_handler](/ftapi/init.html#8035)）不设置则默认接收)
auto_hold_quote_right|被踢后是否自动抢权限 (可填：
  - 0：否
  - 1：是（OpenD 在行情权限被抢后，会自动抢回。如果 10 秒内再次被抢，则其他终端获得最高行情权限，OpenD 不会再抢）不设置则默认自动抢权限)
future_trade_api_time_zone|期货交易 API 时区 (使用期货账户调用 **交易 API** 时，涉及的时间按照此时区规则)

:::

---



---

# 运维命令

通过命令行或者 Telnet 发送命令可以对 OpenD 做运维操作。

命令格式：`cmd -param_key1=param_value1 -param_key2=param_value2`

以 `help -cmd=exit` 为例，介绍Telnet的用法：
1. 在OpenD启动参数中，配置好 Telnet 地址和 Telnet 端口。
![telnet_GUI](../img/telnet_GUI.jpg)
![telnet_CMD](../img/telnet_CMD.jpg)
2. 启动 OpenD（会同时启动 Telnet）。
3. 通过 Telnet，向 OpenD 发送 `help -cmd=exit` 命令。
```python
from telnetlib import Telnet
with Telnet('127.0.0.1', 22222) as tn:  # Telnet 地址为：127.0.0.1，Telnet 端口为：22222
    tn.write(b'help -cmd=exit\r\n')
    reply = b''
    while True:
        msg = tn.read_until(b'\r\n', timeout=0.5)
        reply += msg
        if msg == b'':
            break
    print(reply.decode('gb2312'))
```


## 命令帮助
`help -cmd=exit`

查看指定命令详细信息，不指定参数则输出命令列表

* 参数:	
    - cmd: 命令

## 退出程序
`exit`

退出 OpenD 程序

## 请求手机验证码
`req_phone_verify_code `

请求手机验证码，当启用设备锁并初次在该设备登录，要求做安全验证。

* 频率限制:	
  - 每60秒内最多请求1次
  
## 输入手机验证码
`input_phone_verify_code -code=123456`

输入手机验证码，并继续登录流程。

* 参数:	
  - code: 手机验证码

* 频率限制:	
  - 每60秒内最多请求10次
 
## 请求图形验证码
`req_pic_verify_code`

请求图形验证码，当多次输入错登录密码时，需要输入图形验证码。

* 频率限制:	
  - 每60秒内最多请求10次
  
## 输入图形验证码
`input_pic_verify_code -code=1234`

输入图形验证码，并继续登录流程。

* 参数:	
  - code: 图形验证码

* 频率限制:	
  - 每60秒内最多请求10次
  
## 重登录
`relogin -login_pwd=123456`

当登录密码修改或中途打开设备锁等情况，要求用户重新登录时，可以使用该命令。只能重登当前帐号，不支持切换帐号。
密码参数主要用于登录密码修改的情况，不指定密码则使用启动时登录密码。

* 参数:	
  - login_pwd: 登录密码明文
  
  - login_pwd_md5: 登录密码密文（32 位 MD5 加密 16 进制）

* 频率限制:	
  - 每小时最多请求10次
  
## 检测与连接点之间的时延
`ping `

检测与连接点之前的时延

* 频率限制:	
  - 每60秒内最多请求10次
  
## 展示延迟统计报告
`show_delay_report -detail_report_path=D:/detail.txt -push_count_type=sr2cs`

展示延迟统计报告，包括推送延迟，请求延迟以及下单延迟。每日北京时间 6:00 清理数据。 

* 参数:	 
  - detail_report_path: 文件输出路径（MAC 系统仅支持绝对路径，不支持相对路径），可选参数，若不指定则输出到控制台
  
  - Paramters: push_count_type: 推送延迟的类型(sr2ss，ss2cr，cr2cs，ss2cs，sr2cs)，默认 sr2cs。
    + sr 指服务器接收时间(目前只有港股支持该时间)
    + ss 指服务器发出时间
    + cr 指 OpenD 接收时间 
    + cs 指 OpenD 发出时间

## 关闭 API 连接
`close_api_conn  -conn_id=123456`

关闭某条 API 连接，若不指定则关闭所有
  
  * 参数:
    - conn_id: API 连接 ID

## 展示订阅状态
`show_sub_info -conn_id=123456 -sub_info_path=D:/detail.txt`

展示某条连接的订阅状态，若不指定则展示所有
  
  * 参数:
    - conn_id: API 连接 ID
  
    - sub_info_path: 文件输出路径（MAC 系统仅支持绝对路径，不支持相对路径），可选参数，若不指定则输出到控制台
  
## 请求最高行情权限
`request_highest_quote_right`

当高级行情权限被其他设备（如：桌面端/手机端）占用时，可使用该命令重新请求最高行情权限（届时，其他处于登录状态的设备将无法使用高级行情）。

* 频率限制:	
  - 每60秒内最多请求10次

## 升级
`update`

运行该命令，可以一键更新 OpenD

---



---

# 行情接口总览

<table>
    <tr>
        <th colspan="2">模块</th>
        <th>协议 ID</th>
        <th>Protobuf 定义</th>
        <th>说明</th>
    </tr>
    <tr>
        <td rowspan="15">实时行情</td>
        <td rowspan="2">订阅</td>
        <td>3001</td>
	    <td><a href="../quote/sub.html">Qot_Sub</a></td>
	    <td>订阅或者反订阅</td>
    </tr>
    <tr>
        <td>3003</td>
	    <td><a href="../quote/query-subscription.html">Qot_GetSubInfo</a></td>
	    <td>获取订阅信息</td>
    </tr>
    <tr>
        <td rowspan="6">推送回调</td>
        <td>3005</td>
	    <td><a href="../quote/update-stock-quote.html">Qot_UpdateBasicQot</a></td>
	    <td>推送股票基本报价</td>
    </tr>
    <tr>
        <td>3013</td>
	    <td><a href="../quote/update-order-book.html">Qot_UpdateOrderBook</a></td>
	    <td>推送买卖盘</td>
    </tr>
    <tr>
        <td>3007</td>
	    <td><a href="../quote/update-kl.html">Qot_UpdateKL</a></td>
	    <td>推送 K 线</td>
    </tr>
    <tr>
        <td>3009</td>
	    <td><a href="../quote/update-rt.html">Qot_UpdateRT</a></td>
	    <td>推送分时</td>
    </tr>
    <tr>
        <td>3011</td>
	    <td><a href="../quote/update-ticker.html">Qot_UpdateTicker</a></td>
	    <td>推送逐笔</td>
    </tr>
    <tr>
        <td>3015</td>
	    <td><a href="../quote/update-broker.html">Qot_UpdateBroker</a></td>
	    <td>推送经纪队列</td>
    </tr>
    <tr>
        <td rowspan="7">拉取</td>
        <td>3203</td>
	    <td><a href="../quote/get-market-snapshot.html">Qot_GetSecuritySnapshot</a></td>
	    <td>获取股票快照</td>
    </tr>
    <tr>
        <td>3004</td>
	    <td><a href="../quote/get-stock-quote.html">Qot_GetBasicQot</a></td>
	    <td>获取股票基本报价</td>
    </tr>
    <tr>
        <td>3012</td>
        <td><a href="../quote/get-order-book.html">Qot_GetOrderBook</a></td>
	    <td>获取买卖盘</td>
    </tr>
    <tr>
        <td>3006</td>
	    <td><a href="../quote/get-kl.html">Qot_GetKL</a></td>
	    <td>获取 K 线</td>
    </tr>
    <tr>
        <td>3008</td>
        <td><a href="../quote/get-rt.html">Qot_GetRT</a></td>
	    <td>获取分时</td>
    </tr>
    <tr>
        <td>3010</td>
        <td><a href="../quote/get-ticker.html">Qot_GetTicker</a></td>
	    <td>获取逐笔</td>
    </tr>
    <tr>
        <td>3014</td>
        <td><a href="../quote/get-broker.html">Qot_GetBroker</a></td>
	    <td>获取经纪队列</td>
    </tr>
    <tr>
        <td rowspan="31" colspan="2">基本数据</td>
        <td>3223</td>
	    <td><a href="../quote/get-market-state.html">Qot_GetMarketState</a></td>
	    <td>获取指定品种的市场状态</td>
    </tr>
    <tr>
        <td>3211</td>
        <td><a href="../quote/get-capital-flow.html">Qot_GetCapitalFlow</a></td>
	    <td>获取资金流向</td>
    </tr>
    <tr>
        <td>3212</td>
        <td><a href="../quote/get-capital-distribution.html">Qot_GetCapitalDistribution</a></td>
	    <td>获取资金分布</td>
    </tr>
    <tr>
        <td>3207</td>
        <td><a href="../quote/get-owner-plate.html">Qot_GetOwnerPlate</a></td>
	    <td>获取股票所属板块</td>
    </tr>
    <tr>
        <td>3103</td>
        <td><a href="../quote/request-history-kline.html">Qot_RequestHistoryKL</a></td>
	    <td>在线获取单只股票一段历史 K 线</td>
    </tr>
    <tr>
        <td>3105</td>
	    <td><a href="../quote/get-rehab.html">Qot_RequestRehab</a></td>
	    <td>在线获取单只股票复权信息</td>
    </tr>
    <tr>
        <td>3225</td>
        <td><a href="../quote/get-financials-earnings-price-move.html">Qot_GetFinancialsEarningsPriceMove</a></td>
	    <td>获取财报日前后价格涨跌幅表现</td>
    </tr>
    <tr>
        <td>3226</td>
        <td><a href="../quote/get-financials-earnings-price-history.html">Qot_GetFinancialsEarningsPriceHistory</a></td>
	    <td>获取财报日前后股价历史</td>
    </tr>
    <tr>
        <td>3227</td>
        <td><a href="../quote/get-financials-statements.html">Qot_GetFinancialsStatements</a></td>
	    <td>获取财务报表</td>
    </tr>
    <tr>
        <td>3228</td>
        <td><a href="../quote/get-financials-revenue-breakdown.html">Qot_GetFinancialsRevenueBreakdown</a></td>
	    <td>获取主营构成</td>
    </tr>
    <tr>
        <td>3229</td>
        <td><a href="../quote/get-research-analyst-consensus.html">Qot_GetResearchAnalystConsensus</a></td>
	    <td>获取分析师评级概述</td>
    </tr>
    <tr>
        <td>3230</td>
        <td><a href="../quote/get-research-rating-summary.html">Qot_GetResearchRatingSummary</a></td>
	    <td>获取评级汇总</td>
    </tr>
    <tr>
        <td>3231</td>
        <td><a href="../quote/get-research-morningstar-report.html">Qot_GetResearchMorningstarReport</a></td>
	    <td>获取晨星研究报告</td>
    </tr>
    <tr>
        <td>3232</td>
        <td><a href="../quote/get-valuation-detail.html">Qot_GetValuationDetail</a></td>
	    <td>获取个股/指数估值详情</td>
    </tr>
    <tr>
        <td>3233</td>
        <td><a href="../quote/get-valuation-plate-stock-list.html">Qot_GetValuationPlateStockList</a></td>
	    <td>获取板块/指数成分股估值列表</td>
    </tr>
    <tr>
        <td>3234</td>
        <td><a href="../quote/get-corporate-actions-dividends.html">Qot_GetCorporateActionsDividends</a></td>
	    <td>获取分红派息</td>
    </tr>
    <tr>
        <td>3235</td>
        <td><a href="../quote/get-corporate-actions-buybacks.html">Qot_GetCorporateActionsBuybacks</a></td>
	    <td>获取回购</td>
    </tr>
    <tr>
        <td>3236</td>
        <td><a href="../quote/get-corporate-actions-stock-splits.html">Qot_GetCorporateActionsStockSplits</a></td>
	    <td>获取拆合股</td>
    </tr>
    <tr>
        <td>3237</td>
        <td><a href="../quote/get-shareholders-overview.html">Qot_GetShareholdersOverview</a></td>
	    <td>获取持股统计</td>
    </tr>
    <tr>
        <td>3238</td>
        <td><a href="../quote/get-shareholders-holding-changes.html">Qot_GetShareholdersHoldingChanges</a></td>
	    <td>获取持股变动</td>
    </tr>
    <tr>
        <td>3239</td>
        <td><a href="../quote/get-shareholders-holder-detail.html">Qot_GetShareholdersHolderDetail</a></td>
	    <td>获取持股明细</td>
    </tr>
    <tr>
        <td>3240</td>
        <td><a href="../quote/get-shareholders-institutional.html">Qot_GetShareholdersInstitutional</a></td>
	    <td>获取机构持股</td>
    </tr>
    <tr>
        <td>3241</td>
        <td><a href="../quote/get-insider-holder-list.html">Qot_GetInsiderHolderList</a></td>
	    <td>获取内部人持股列表</td>
    </tr>
    <tr>
        <td>3242</td>
        <td><a href="../quote/get-insider-trade-list.html">Qot_GetInsiderTradeList</a></td>
	    <td>获取内部人交易</td>
    </tr>
    <tr>
        <td>3243</td>
        <td><a href="../quote/get-company-profile.html">Qot_GetCompanyProfile</a></td>
	    <td>获取公司概况</td>
    </tr>
    <tr>
        <td>3244</td>
        <td><a href="../quote/get-company-executives.html">Qot_GetCompanyExecutives</a></td>
	    <td>获取高管信息</td>
    </tr>
    <tr>
        <td>3245</td>
        <td><a href="../quote/get-company-executive-background.html">Qot_GetCompanyExecutiveBackground</a></td>
	    <td>获取高管背景</td>
    </tr>
    <tr>
        <td>3246</td>
        <td><a href="../quote/get-company-operational-efficiency.html">Qot_GetCompanyOperationalEfficiency</a></td>
	    <td>获取经营效率</td>
    </tr>
    <tr>
        <td>3247</td>
        <td><a href="../quote/get-top-ten-buy-sell-brokers.html">Qot_GetTopTenBuySellBrokers</a></td>
	    <td>获取十大经纪商买卖数据</td>
    </tr>
    <tr>
        <td>3248</td>
        <td><a href="../quote/get-daily-short-volume.html">Qot_GetDailyShortVolume</a></td>
	    <td>获取每日卖空成交</td>
    </tr>
    <tr>
        <td>3249</td>
        <td><a href="../quote/get-short-interest.html">Qot_GetShortInterest</a></td>
	    <td>获取空头持仓</td>
    </tr>
    <tr>
        <td rowspan="7" colspan="2">相关衍生品</td>
        <td>3224</td>
        <td><a href="../quote/get-option-expiration-date.html">Qot_GetOptionExpirationDate</a></td>
	    <td>获取期权到期日</td>
    </tr>
    <tr>
        <td>3209</td>
        <td><a href="../quote/get-option-chain.html">Qot_GetOptionChain</a></td>
	    <td>获取期权链</td>
    </tr>
    <tr>
        <td>3210</td>
        <td><a href="../quote/get-warrant.html">Qot_GetWarrant</a></td>
	    <td>获取窝轮</td>
    </tr>
    <tr>
        <td>3206</td>
        <td><a href="../quote/get-referencestock-list.html">Qot_GetReference</a></td>
	    <td>获取正股相关股票</td>
    </tr>
    <tr>
        <td>3218</td>
        <td><a href="../quote/get-future-info.html">Qot_GetFutureInfo</a></td>
	    <td>获取期货合约资料</td>
    </tr>
    <tr>
        <td>3250</td>
        <td><a href="../quote/get-option-volatility.html">Qot_GetOptionVolatility</a></td>
	    <td>获取期权波动率分析</td>
    </tr>
    <tr>
        <td>3251</td>
        <td><a href="../quote/get-option-exercise-probability.html">Qot_GetOptionExerciseProbability</a></td>
	    <td>获取期权行权概率</td>
    </tr>
    <tr>
        <td rowspan="7" colspan="2">全市场筛选</td>
        <td>3215</td>
	    <td><a href="../quote/get-stock-filter.html">Qot_StockFilter</a></td>
	    <td>获取条件选股</td>
    </tr>
    <tr>
        <td>3205</td>
        <td><a href="../quote/get-plate-stock.html">Qot_GetPlateSecurity</a></td>
	    <td>获取板块下的股票</td>
    </tr>
    <tr>
        <td>3204</td>
        <td><a href="../quote/get-plate-list.html">Qot_GetPlateSet</a></td>
	    <td>获取板块集合下的板块</td>
    </tr>
    <tr>
        <td>3202</td>
        <td><a href="../quote/get-static-info.html">Qot_GetStaticInfo</a></td>
	    <td>获取股票静态信息</td>
    </tr>
    <tr>
        <td>3217</td>
        <td><a href="../quote/get-ipo-list.html">Qot_GetIpoList</a></td>
	    <td>获取新股</td>
    </tr>
    <tr>
        <td>1002</td>
        <td><a href="../quote/get-global-state.html">GetGlobalState</a></td>
	    <td>获取全局市场状态</td>
    </tr>
    <tr>
        <td>3219</td>
        <td><a href="../quote/request-trading-days.html">Qot_RequestTradeDate</a></td>
	    <td>获取市场交易日，在线拉取不在本地计算</td>
    </tr>
    <tr>
        <td rowspan="7" colspan="2">个性化</td>
        <td>3104</td>
        <td><a href="../quote/get-history-kl-quota.html">Qot_RequestHistoryKLQuota</a></td>
	    <td>获取历史 K 线额度</td>
    </tr>
    <tr>
        <td>3220</td>
        <td><a href="../quote/set-price-reminder.html">Qot_SetPriceReminder</a></td>
	    <td>设置到价提醒</td>
    </tr>
    <tr>
        <td>3221</td>
        <td><a href="../quote/get-price-reminder.html">Qot_GetPriceReminder</a></td>
	    <td>获取到价提醒</td>
    </tr>
    <tr>
        <td>3213</td>
        <td><a href="../quote/get-user-security.html">Qot_GetUserSecurity</a></td>
	    <td>获取自选股分组下的股票</td>
    </tr>
    <tr>
        <td>3222</td>
        <td><a href="../quote/get-user-security-group.html">Qot_GetUserSecurityGroup</a></td>
	    <td>获取自选股分组列表</td>
    </tr>
    <tr>
        <td>3214</td>
        <td><a href="../quote/modify-user-security.html">Qot_ModifyUserSecurity</a></td>
	    <td>修改自选股分组下的股票</td>
    </tr>
    <tr>
        <td>3019</td>
	    <td><a href="../quote/update-price-reminder.html">Qot_UpdatePriceReminder</a></td>
	    <td>到价提醒通知</td>
    </tr>
</table>

---



---

# 行情对象

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

## 创建连接

`OpenQuoteContext(host='127.0.0.1', port=11111, is_encrypt=None, security_firm=SecurityFirm.NONE)`  

* **介绍**

    创建并初始化行情连接

* **参数**

    参数|类型|说明
    :-|:-|:-
    host|str|OpenD 监听的 IP 地址
    port|int|OpenD 监听的端口
    is_encrypt|bool|是否启用加密  (- 默认为 None，表示使用 [enable_proto_encrypt](../ftapi/init.md#319) 的设置
  - True：强制加密False：强制不加密)
    security_firm|[SecurityFirm](../trade/trade.md#572)|行情券商  (- 仅适用于创建加密货币行情连接
  - 默认值 NONE
  - 仅在传入 FUTUSECURITIES、FUTUINC、FUTUSG 时生效
  - 传入其他券商（MY/AU/JP/CA）或无效值，接口报错)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111, is_encrypt=False)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```


## 关闭连接

`close()`  

* **介绍**

    关闭行情接口类对象。默认情况下，Futu API 内部创建的线程会阻止进程退出，只有当所有 Context 都 close 后，进程才能正常退出。但通过 [set_all_thread_daemon](../ftapi/init.md#4570) 可以设置所有内部线程为 daemon 线程，这时即使没有调用 Context 的 close，进程也可以正常退出。

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

## 启动

`start()` 

* **介绍**

    启动异步接收推送数据

## 停止

`stop()` 

* **介绍**

    停止异步接收推送数据

---



---

# 订阅反订阅

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

## **订阅**  

`subscribe(code_list, subtype_list, is_first_push=True, subscribe_push=True, is_detailed_orderbook=False, extended_time=False, session=Session.NONE)` 
* **介绍**

    订阅注册需要的实时信息，指定股票和订阅的数据类型即可。  
    香港市场（含正股、窝轮、牛熊、期权、期货）订阅，需要 LV1 及以上的权限，BMP 权限下不支持订阅。  
    美股市场（含正股、ETFs）夜盘行情订阅，需要 LV1 及以上的权限，BMP 权限下不支持订阅。  

* **参数**

    参数|类型|说明
    :-|:-|:-
    code_list|list|需要订阅的股票代码列表  (list 中元素类型是 str)
    subtype_list|list|需要订阅的数据类型列表  (list 中元素类型是 [SubType](./quote.md#5878))
    is_first_push|bool|订阅成功之后是否立即推送一次缓存数据  (- True：推送缓存当脚本和 OpenD 之间出现断线重连，重新订阅时若设置为 True，会再次推送断线前的最后一条数据
  - False：不推送缓存。等待服务器的最新推送)
    subscribe_push|bool|订阅后是否推送  (订阅后，OpenD 提供了[两种取数据的方式](../qa/quote.html#2692)，如果您仅使用 **获取实时数据** 的方式，选择 False 可以节省一部分性能消耗
  - True：推送。如果使用 **实时数据回调** 的方式，则必须设置为 True
  - False：不推送。如果**仅**使用 **获取实时数据** 的方式，则建议设置为 False)
    is_detailed_orderbook|bool|是否订阅详细的摆盘订单明细  (- 仅用于港股 SF 行情权限下订阅港股 ORDER_BOOK 类型 
  - 美股美期 LV2 权限下不提供详细摆盘订单明细)
    extended_time|bool|是否允许美股盘前盘后数据  (仅用于订阅美股实时 K 线、实时分时、实时逐笔)
    session|[Session](./quote.md#9152)|美股订阅时段  (- 仅用于订阅美股实时 K 线、实时分时、实时逐笔
  - 订阅美股行情不支持入参OVERNIGHT
  - 最低OpenD版本：9.2.4207)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">err_message</td>
            <td >NoneType</td>
            <td>当 ret == RET_OK 时，返回 None</td>
        </tr>
        <tr>
            <td >str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>


* **Example**

``` python
import time
from futu import *
class OrderBookTest(OrderBookHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, data = super(OrderBookTest,self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("OrderBookTest: error, msg: %s" % data)
            return RET_ERROR, data
        print("OrderBookTest ", data) # OrderBookTest 自己的处理逻辑
        return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = OrderBookTest()
quote_ctx.set_handler(handler)  # 设置实时摆盘回调
quote_ctx.subscribe(['US.AAPL'], [SubType.ORDER_BOOK])  # 订阅买卖摆盘类型，OpenD 开始持续收到服务器的推送
time.sleep(15)  #  设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()  # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

``` python
OrderBookTest  {'code': 'US.AAPL', 'name': '苹果', 'svr_recv_time_bid': '2025-04-07 05:00:52.266', 'svr_recv_time_ask': '2025-04-07 05:00:53.973', 'Bid': [(180.2, 15, 3, {}), (180.19, 1, 1, {}), (180.18, 11, 2, {}), (180.14, 200, 1, {}), (180.13, 3, 2, {}), (180.1, 99, 3, {}), (180.05, 3, 1, {}), (180.03, 400, 1, {}), (180.02, 10, 1, {}), (180.01, 100, 1, {}), (180.0, 441, 24, {})], 'Ask': [(180.3, 100, 1, {}), (180.38, 4, 2, {}), (180.4, 100, 1, {}), (180.42, 200, 1, {}), (180.46, 29, 1, {}), (180.5, 1019, 2, {}), (180.6, 1000, 1, {}), (180.8, 2001, 3, {}), (180.84, 15, 2, {}), (181.0, 2036, 4, {}), (181.2, 2000, 2, {}), (181.3, 3, 1, {}), (181.4, 2021, 3, {}), (181.5, 59, 2, {}), (181.79, 9, 1, {}), (181.8, 20, 1, {}), (181.9, 94, 4, {}), (181.98, 20, 1, {}), (182.0, 150, 7, {})]}

```

## **取消订阅**  

`unsubscribe(code_list, subtype_list, unsubscribe_all=False)`  
* **介绍**

    取消订阅   

* **参数**
    参数|类型|说明
    :-|:-|:-
    code_list|list|取消订阅的股票代码列表  (list 中元素类型是 str)
    subtype_list|list|需要订阅的数据类型列表  (list 中元素类型是 [SubType](./quote.md#5878))
    unsubscribe_all|bool|取消所有订阅  (为 True 时忽略其他参数)


* **Return**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">err_message</td>
            <td>NoneType</td>
            <td>当 ret == RET_OK, 返回 None</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK, 返回错误描述</td>
        </tr>
    </table>

* **Example**

``` python
from futu import *
import time
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

print('current subscription status :', quote_ctx.query_subscription())  # 查询初始订阅状态
ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.QUOTE, SubType.TICKER], subscribe_push=False, session=Session.ALL)
# 先订阅了AAPL全时段 QUOTE 和 TICKER 两个类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:   # 订阅成功
    print('subscribe successfully！current subscription status :', quote_ctx.query_subscription())  # 订阅成功后查询订阅状态
    time.sleep(60)  # 订阅之后至少1分钟才能取消订阅
    ret_unsub, err_message_unsub = quote_ctx.unsubscribe(['US.AAPL'], [SubType.QUOTE])
    if ret_unsub == RET_OK:
        print('unsubscribe successfully！current subscription status:', quote_ctx.query_subscription())  # 取消订阅后查询订阅状态
    else:
        print('unsubscription failed！', err_message_unsub)
else:
    print('subscription failed', err_message)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

``` python
current subscription status : (0, {'total_used': 0, 'remain': 1000, 'own_used': 0, 'sub_list': {}})
subscribe successfully！current subscription status : (0, {'total_used': 2, 'remain': 998, 'own_used': 2, 'sub_list': {'QUOTE': ['US.AAPL'], 'TICKER': ['US.AAPL']}})
unsubscribe successfully！current subscription status: (0, {'total_used': 1, 'remain': 999, 'own_used': 1, 'sub_list': {'TICKER': ['US.AAPL']}})
```

## **取消所有订阅**  

`unsubscribe_all()`  

* **介绍**

取消所有订阅   


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">err_message</td>
            <td>NoneType</td>
            <td>当 ret == RET_OK, 返回 None</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK, 返回错误描述</td>
        </tr>
    </table>

* **Example** 

``` python
from futu import *
import time
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

print('current subscription status :', quote_ctx.query_subscription())  # 查询初始订阅状态
ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.QUOTE, SubType.TICKER], subscribe_push=False, session=Session.None)
# 先订阅了AAPL全时段 QUOTE 和 TICKER 两个类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:  # 订阅成功
    print('subscribe successfully！current subscription status :', quote_ctx.query_subscription())  # 订阅成功后查询订阅状态
    time.sleep(60)  # 订阅之后至少1分钟才能取消订阅
    ret_unsub, err_message_unsub = quote_ctx.unsubscribe_all()  # 取消所有订阅
    if ret_unsub == RET_OK:
        print('unsubscribe all successfully！current subscription status:', quote_ctx.query_subscription())  # 取消订阅后查询订阅状态
    else:
        print('Failed to cancel all subscriptions！', err_message_unsub)
else:
    print('subscription failed', err_message)
quote_ctx.close()  # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

``` python
current subscription status : (0, {'total_used': 0, 'remain': 1000, 'own_used': 0, 'sub_list': {}})
subscribe successfully！current subscription status : (0, {'total_used': 2, 'remain': 998, 'own_used': 2, 'sub_list': {'QUOTE': ['US.AAPL'], 'TICKER': ['US.AAPL']}})
unsubscribe all successfully！current subscription status: (0, {'total_used': 0, 'remain': 1000, 'own_used': 0, 'sub_list': {}})
```

---



---

# 获取订阅状态

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`query_subscription(is_all_conn=True)`

* **介绍**

    获取订阅信息

* **参数**
    参数|类型|说明
    :-|:-|:-
    is_all_conn|bool|是否返回所有连接的订阅状态  (True：返回所有连接的订阅状态False：只返回当前连接的订阅状态)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回订阅信息数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 订阅信息数据字典格式如下：
    
            {
                'total_used': 4,    # 所有连接已使用的订阅额度
                'own_used': 0,       # 当前连接已使用的订阅额度
                'remain': 496,       #  剩余的订阅额度
                'own_security_firm': 'FUTUSECURITIES',  # 当前连接的券商标识
                'sub_list':          #  每种订阅类型对应的股票列表
                {
                    '订阅的类型': 该订阅类型下所有已订阅股票列表,
                    …
                }
            }
    
* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

quote_ctx.subscribe(['HK.00700'], [SubType.QUOTE])
ret, data = quote_ctx.query_subscription()
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
{'total_used': 1, 'remain': 999, 'own_used': 1, 'own_security_firm': 'N/A', 'sub_list': {'QUOTE': ['HK.00700']}}
```

---



---

# 实时报价回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    实时报价回调，异步处理已订阅股票的实时报价推送。  
    在收到实时报价数据推送后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  
	
* **参数**

    参数|类型|说明
    :-|:-|:-
    rsp_pb|Qot_UpdateBasicQot_pb2.Response|派生类中不需要直接处理该参数

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回报价数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 报价数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        data_date|str|日期
        data_time|str|当前价更新时间  (格式：yyyy-MM-dd HH:mm:ss
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        last_price|float|最新价格
        open_price|float|今日开盘价
        high_price|float|最高价格
        low_price|float|最低价格
        prev_close_price|float|昨收盘价格
        volume|float|成交数量
        turnover|float|成交金额
        turnover_rate|float|换手率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        amplitude|int|振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        suspension|bool|是否停牌  (True：停牌)
        listing_date|str|上市日期  (格式：yyyy-MM-dd)
        price_spread|float|当前向上的价差  (即摆盘数据的卖档的相邻档位的报价差)
        dark_status|[DarkStatus](./quote.md#1965)|暗盘交易状态
        sec_status|[SecurityStatus](./quote.md#9969)|股票状态
        strike_price|float|行权价
        contract_size|float|每份合约数
        open_interest|int|未平仓合约数
        implied_volatility|float|隐含波动率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        premium|float|溢价  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        delta|float|希腊值 Delta
        gamma|float|希腊值 Gamma
        vega|float|希腊值 Vega
        theta|float|希腊值 Theta
        rho|float|希腊值 Rho
        index_option_type|[IndexOptionType](./quote.md#5149)|指数期权类型
        net_open_interest|int|净未平仓合约数  (仅港股期权适用)
        expiry_date_distance|int|距离到期日天数  (负数表示已过期)
        contract_nominal_value|float|合约名义金额  (仅港股期权适用)
        owner_lot_multiplier|float|相等正股手数  (指数期权无该字段 ，仅港股期权适用)
        option_area_type|[OptionAreaType](./quote.md#7077)|期权类型（按行权时间）
        contract_multiplier|float|合约乘数
        pre_price|float|盘前价格
        pre_high_price|float|盘前最高价
        pre_low_price|float|盘前最低价
        pre_volume|int|盘前成交量
        pre_turnover|float|盘前成交额
        pre_change_val|float|盘前涨跌额
        pre_change_rate|float|盘前涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        pre_amplitude|float|盘前振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        after_price|float|盘后价格
        after_high_price|float|盘后最高价
        after_low_price|float|盘后最低价
        after_volume|int|盘后成交量  (科创板支持此数据)
        after_turnover|float|盘后成交额  (科创板支持此数据)
        after_change_val|float|盘后涨跌额
        after_change_rate|float|盘后涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        after_amplitude|float|盘后振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        overnight_price|float|夜盘价格
        overnight_high_price|float|夜盘最高价
        overnight_low_price|float|夜盘最低价
        overnight_volume|int|夜盘成交量
        overnight_turnover|float|夜盘成交额
        overnight_change_val|float|夜盘涨跌额
        overnight_change_rate|float|夜盘涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        overnight_amplitude|float|夜盘振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        last_settle_price|float|昨结  (期货特有字段)
        position|float|持仓量  (期货特有字段)
        position_change|float|日增仓  (期货特有字段)

* **Example**

```python
import time
from futu import *

class StockQuoteTest(StockQuoteHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, data = super(StockQuoteTest,self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("StockQuoteTest: error, msg: %s" % data)
            return RET_ERROR, data
        print("StockQuoteTest ", data) # StockQuoteTest 自己的处理逻辑
        return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = StockQuoteTest()
quote_ctx.set_handler(handler)  # 设置实时报价回调
ret, data = quote_ctx.subscribe(['US.AAPL'], [SubType.QUOTE])  # 订阅实时报价类型，OpenD 开始持续收到服务器的推送
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
time.sleep(15)  #  设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅    	
```

* **Output**

```python
StockQuoteTest        code name data_date data_time  last_price  open_price  high_price  low_price  prev_close_price  volume  turnover  turnover_rate  amplitude  suspension listing_date  price_spread dark_status sec_status strike_price contract_size open_interest implied_volatility premium delta gamma vega theta  rho net_open_interest expiry_date_distance contract_nominal_value owner_lot_multiplier option_area_type contract_multiplier last_settle_price position position_change index_option_type pre_price pre_high_price pre_low_price pre_volume pre_turnover pre_change_val pre_change_rate pre_amplitude after_price after_high_price after_low_price after_volume after_turnover after_change_val after_change_rate after_amplitude overnight_price overnight_high_price overnight_low_price overnight_volume overnight_turnover overnight_change_val overnight_change_rate overnight_amplitude
0  US.AAPL   苹果                             0.0         0.0         0.0        0.0               0.0       0       0.0            0.0        0.0       False                        0.0         N/A     NORMAL          N/A           N/A           N/A                N/A     N/A   N/A   N/A  N/A   N/A  N/A               N/A                  N/A                    N/A                  N/A              N/A                 N/A               N/A      N/A             N/A               N/A       N/A            N/A           N/A        N/A          N/A            N/A             N/A           N/A         N/A              N/A             N/A          N/A            N/A              N/A               N/A             N/A             N/A                  N/A                 N/A              N/A                N/A                  N/A                   N/A                 N/A
```

---



---

# 实时摆盘回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    实时摆盘回调，异步处理已订阅股票的实时摆盘推送。
    在收到实时摆盘数据推送后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  
	
* **参数**

    参数|类型|说明
    :-|:-|:-
    rsp_pb|Qot_UpdateOrderBook_pb2.Response|派生类中不需要直接处理该参数

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回摆盘数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 摆盘数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        svr_recv_time_bid|str|富途服务器从交易所收到买盘数据的时间  (部分数据的接收时间为零，例如服务器重启或第一次推送的缓存数据)
        svr_recv_time_ask|str|富途服务器从交易所收到卖盘数据的时间  (部分数据的接收时间为零，例如服务器重启或第一次推送的缓存数据)
        Bid|list|每个元祖包含如下信息：委托价格，委托数量，委托订单数，委托订单明细  (委托订单明细
  - 明细内容：交易所订单 ID，单笔委托数量
  - 港股 SF 权限下最多支持 1000 笔委托订单明细；其余行情权限不支持获取此类数据)
        Ask|list|每个元祖包含如下信息：委托价格，委托数量，委托订单数，委托订单明细  (委托订单明细
  - 明细内容：交易所订单 ID，单笔委托数量
  - 港股 SF 权限下最多支持 1000 笔委托订单明细；其余行情权限不支持获取此类数据)

        其中，Bid 和 Ask 字段的结构如下：  

          'Bid': [ (bid_price1, bid_volume1, order_num, {'orderid1': order_volume1, 'orderid2': order_volume2, …… }), (bid_price2, bid_volume2, order_num,  {'orderid1': order_volume1, 'orderid2': order_volume2, …… }),…]
          'Ask': [ (ask_price1, ask_volume1，order_num, {'orderid1': order_volume1, 'orderid2': order_volume2, …… }), (ask_price2, ask_volume2, order_num, {'orderid1': order_volume1, 'orderid2': order_volume2, …… }),…] 

* **Example**

```python
import time
from futu import *
class OrderBookTest(OrderBookHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, data = super(OrderBookTest,self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("OrderBookTest: error, msg: %s" % data)
            return RET_ERROR, data
        print("OrderBookTest ", data) # OrderBookTest 自己的处理逻辑
        return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = OrderBookTest()
quote_ctx.set_handler(handler)  # 设置实时摆盘回调
ret, data = quote_ctx.subscribe(['US.AAPL'], [SubType.ORDER_BOOK])  # 订阅买卖摆盘类型，OpenD 开始持续收到服务器的推送
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
time.sleep(15)  #  设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()  # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
OrderBookTest  {'code': 'US.AAPL', 'name': '苹果', 'svr_recv_time_bid': '', 'svr_recv_time_ask': '', 'Bid': [(179.77, 100, 1, {}), (179.68, 200, 1, {}), (179.65, 2, 2, {}), (179.64, 27, 1, {}), (179.6, 9, 2, {}), (179.58, 39, 2, {}), (179.5, 13, 4, {}), (179.48, 331, 2, {}), (179.4, 1002, 2, {}), (179.38, 330, 1, {}), (179.37, 2, 1, {}), (179.3, 47, 1, {}), (179.28, 330, 1, {}), (179.21, 2, 1, {}), (179.2, 1000, 1, {}), (179.18, 330, 1, {}), (179.17, 100, 1, {}), (179.16, 1, 1, {}), (179.13, 400, 1, {}), (179.1, 3000, 1, {}), (179.08, 330, 1, {}), (179.05, 125, 2, {}), (179.01, 17, 2, {}), (179.0, 81, 7, {})], 'Ask': [(179.95, 400, 2, {}), (180.0, 360, 2, {}), (180.05, 20, 1, {}), (180.1, 246, 4, {}), (180.18, 20, 1, {}), (180.2, 2030, 3, {}), (180.23, 20, 1, {}), (180.3, 23, 1, {}), (180.33, 15, 1, {}), (180.4, 2000, 2, {}), (180.49, 5, 1, {}), (180.59, 253, 1, {}), (180.6, 2000, 2, {}), (180.8, 2010, 3, {}), (181.0, 2018, 4, {}), (181.08, 1, 1, {}), (181.2, 1009, 2, {}), (181.3, 17, 3, {}), (181.4, 1, 1, {}), (181.5, 50, 1, {}), (181.79, 9, 1, {}), (181.9, 66, 2, {})]}
```

---



---

# 实时 K 线回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    实时 K 线回调，异步处理已订阅股票的实时 K 线推送。

    在收到实时 K 线数据推送后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  
	
* **参数**

    参数|类型|说明
    :-|:-|:-
    rsp_pb|Qot_UpdateKL_pb2.Response|派生类中不需要直接处理该参数

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回 K 线数据数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * K 线数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        time_key|str|时间  (格式：yyyy-MM-dd HH:mm:ss
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        open|float|开盘价
        close|float|收盘价
        high|float|最高价
        low|float|最低价
        volume|float|成交量
        turnover|float|成交额
        pe_ratio|float|市盈率
        turnover_rate|float|换手率  (该字段为百分比字段，默认返回小数，如 0.01 实际对应 1%)
        last_close|float|昨收价  (即前一个时间的收盘价出于效率原因，第一个数据的昨收价可能为 0)
        k_type|[KLType](./quote.md#4119)|K 线类型

* **Example**

```python
import time
from futu import *
class CurKlineTest(CurKlineHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, data = super(CurKlineTest,self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("CurKlineTest: error, msg: %s" % data)
            return RET_ERROR, data
        print("CurKlineTest ", data) # CurKlineTest 自己的处理逻辑
        return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = CurKlineTest()
quote_ctx.set_handler(handler)  # 设置实时K线回调
ret, data = quote_ctx.subscribe(['US.AAPL'], [SubType.K_1M], session=Session.ALL)   # 订阅 K 线数据类型，OpenD 开始持续收到服务器的推送
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
time.sleep(15)  # 设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅    
```

* **Output**

```python
CurKlineTest        code name             time_key    open   close    high    low  volume   turnover k_type  last_close
0  US.AAPL   苹果  2025-04-07 05:15:00  180.39  180.26  180.46  180.2  1322.0  238340.48   K_1M         0.0
```

---



---

# 实时分时回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    实时分时回调，异步处理已订阅股票的实时分时推送。  
    在收到实时分时数据推送后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  
	
* **参数**

    参数|类型|说明
    :-|:-|:-
    rsp_pb|Qot_UpdateRT_pb2.Response|派生类中不需要直接处理该参数

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回分时数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 分时数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        time|str|时间  (格式：yyyy-MM-dd HH:mm:ss 港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        is_blank|bool|数据状态  (False：正常数据True：伪造数据)
        opened_mins|int|零点到当前多少分钟
        cur_price|float|当前价格
        last_close|float|昨天收盘的价格
        avg_price|float|平均价格  (对于期权，该字段为 None)
        volume|float|成交量
        turnover|float|成交金额

* **Example**

```python
import time
from futu import *

class RTDataTest(RTDataHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, data = super(RTDataTest, self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("RTDataTest: error, msg: %s" % data)
            return RET_ERROR, data
        print("RTDataTest ", data) # RTDataTest 自己的处理逻辑
        return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = RTDataTest()
quote_ctx.set_handler(handler)  # 设置实时分时推送回调
ret, data = quote_ctx.subscribe(['US.AAPL'], [SubType.RT_DATA], session=Session.ALL) # 订阅分时类型，OpenD 开始持续收到服务器的推送
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
time.sleep(15)  # 设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅    
```

* **Output**

```python
RTDataTest        code name                 time  is_blank  opened_mins  cur_price  last_close   avg_price   turnover  volume
0  US.AAPL   苹果  2025-04-07 05:24:00     False          324     179.53      188.38  180.465762  651262.42    3624
```

---



---

# 实时逐笔回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">
<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    实时逐笔回调，异步处理已订阅股票的实时逐笔推送。  
    在收到实时逐笔数据推送后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  
	
* **参数**

    参数|类型|说明
    :-|:-|:-
    rsp_pb|Qot_UpdateTicker_pb2.Response|派生类中不需要直接处理该参数

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回逐笔数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 逐笔数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        sequence|int|逐笔序号
        time|str|成交时间  (格式：yyyy-MM-dd HH:mm:ss:xxx
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        price|float|成交价格
        volume|float|成交数量  (股数)
        turnover|float|成交金额
        ticker_direction|[TickerDirect](./quote.md#8723)|逐笔方向
        type|[TickerType](./quote.md#2358)|逐笔类型
        push_data_type|[PushDataType](./quote.md#7025)|数据来源

* **Example**

```python
import time
from futu import *

class TickerTest(TickerHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, data = super(TickerTest,self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("TickerTest: error, msg: %s" % data)
            return RET_ERROR, data
        print("TickerTest ", data) # TickerTest 自己的处理逻辑
        return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = TickerTest()
quote_ctx.set_handler(handler)  # 设置实时逐笔推送回调
ret, data = quote_ctx.subscribe(['US.AAPL'], [SubType.TICKER], session=Session.ALL) # 订阅逐笔类型，OpenD 开始持续收到服务器的推送
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
time.sleep(15)  # 设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅	
```

* **Output**

```python
TickerTest        code name                     time   price  volume  turnover ticker_direction             sequence     type push_data_type
0  US.AAPL   苹果  2025-04-07 05:25:44.116  179.81     9.0   1618.29          NEUTRAL  7490500033117159426  ODD_LOT          CACHE

```

---



---

# 实时经纪队列回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    实时经纪队列回调，异步处理已订阅股票的实时经纪队列推送。  
    在收到实时经纪队列数据推送后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  
	
* **参数**

    参数|类型|说明
    :-|:-|:-
    rsp_pb|Qot_UpdateBroker_pb2.Response|派生类中不需要直接处理该参数


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>tuple</td>
            <td>当 ret == RET_OK，返回经纪队列数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 经纪队列元组内容如下：
        字段|类型|说明
        :-|:-|:-
        stock_code|str|股票
        bid_frame_table|pd.DataFrame|买盘数据
        ask_frame_table|pd.DataFrame|卖盘数据

        * bid_frame_table 格式如下：
            字段|类型|说明
            :-|:-|:-
            code|str|股票代码
            name|str|股票名称
            bid_broker_id|int|经纪买盘 ID
            bid_broker_name|str|经纪买盘名称
            bid_broker_pos|int|经纪档位
            order_id|int|交易所订单 ID  (- 不是下单接口返回的订单 ID
  - 只有港股 SF 行情权限支持返回该字段)
            order_volume|int|单笔委托数量  (只有港股 SF 行情权限支持返回该字段)
        * ask_frame_table 格式如下：
            字段|类型|说明
            :-|:-|:-
            code|str|股票代码
            name|str|股票名称
            ask_broker_id|int|经纪卖盘 ID
            ask_broker_name|str|经纪卖盘名称
            ask_broker_pos|int|经纪档位
            order_id|int|交易所订单 ID  (- 不是下单接口返回的订单 ID
  - 只有港股 SF 行情权限支持返回该字段)
            order_volume|int|单笔委托数量  (只有港股 SF 行情权限支持返回该字段)

* **Example**

```python
import time
from futu import *
    
class BrokerTest(BrokerHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, err_or_stock_code, data = super(BrokerTest, self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("BrokerTest: error, msg: {}".format(err_or_stock_code))
            return RET_ERROR, data
        print("BrokerTest: stock: {} data: {} ".format(err_or_stock_code, data))  # BrokerTest 自己的处理逻辑
        return RET_OK, data
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = BrokerTest()
quote_ctx.set_handler(handler)  # 设置实时经纪推送回调
ret, data = quote_ctx.subscribe(['HK.00700'], [SubType.BROKER]) # 订阅经纪类型，OpenD 开始持续收到服务器的推送
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
time.sleep(15)  # 设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
BrokerTest: stock: HK.00700 data: [        code  name  bid_broker_id bid_broker_name  bid_broker_pos order_id order_volume
0   HK.00700  腾讯控股           5338          J.P.摩根               1      N/A          N/A
..       ...   ...            ...             ...             ...      ...          ...
36  HK.00700  腾讯控股           8305  富途证券国际(香港)有限公司               4      N/A          N/A

[37 rows x 7 columns],         code  name  ask_broker_id ask_broker_name  ask_broker_pos order_id order_volume
0   HK.00700  腾讯控股           1179  华泰金融控股(香港)有限公司               1      N/A          N/A
..       ...   ...            ...             ...             ...      ...          ...
39  HK.00700  腾讯控股           6996      中国投资信息有限公司               1      N/A          N/A

[40 rows x 7 columns]] 
```

---



---

# 获取快照

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_market_snapshot(code_list)`

* **介绍**

    获取快照数据

* **参数**
    参数|类型|说明
    :-|:-|:-
    code_list|list|股票代码列表  (每次最多可请求 400 个标的list 内元素类型为 str)


* **返回**
 
    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回股票快照数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 股票快照数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        update_time|str|当前价更新时间  (格式：yyyy-MM-dd HH:mm:ss 港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        last_price|float|最新价格
        open_price|float|今日开盘价
        high_price|float|最高价格
        low_price|float|最低价格
        prev_close_price|float|昨收盘价格
        volume|float|成交数量
        turnover|float|成交金额
        turnover_rate|float|换手率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        suspension|bool|是否停牌  (True：停牌)
        listing_date|str|上市日期  (格式：yyyy-MM-dd)
        equity_valid|bool|是否正股  (此字段返回为 True 时，以下正股相关字段才有合法数值)
        issued_shares|int|总股本
        total_market_val|float|总市值  (单位：元)
        net_asset|int|资产净值
        net_profit|int|净利润
        earning_per_share|float|每股盈利
        outstanding_shares|int|流通股本
        net_asset_per_share|float|每股净资产
        circular_market_val|float|流通市值  (单位：元)
        ey_ratio|float|收益率  (该字段为比例字段，默认不展示 %)
        pe_ratio|float|市盈率  (该字段为比例字段，默认不展示 %)
        pb_ratio|float|市净率  (该字段为比例字段，默认不展示 %)
        pe_ttm_ratio|float|市盈率 TTM  (该字段为比例字段，默认不展示 %)
        dividend_ttm|float|股息 TTM，派息
        dividend_ratio_ttm|float|股息率 TTM  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        dividend_lfy|float|股息 LFY，上一年度派息
        dividend_lfy_ratio|float|股息率 LFY  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        stock_owner|str|窝轮所属正股的代码或期权的标的股代码
        wrt_valid|bool|是否是窝轮  (此字段返回为 True 时，以下窝轮相关字段才有合法数值)
        wrt_conversion_ratio|float|换股比率
        wrt_type|[WrtType](./quote.md#926)|窝轮类型
        wrt_strike_price|float|行使价格
        wrt_maturity_date|str|格式化窝轮到期时间
        wrt_end_trade|str|格式化窝轮最后交易时间
        wrt_leverage|float|杠杆比率  (单位：倍)
        wrt_ipop|float|价内/价外  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        wrt_break_even_point|float|打和点
        wrt_conversion_price|float|换股价
        wrt_price_recovery_ratio|float|正股距收回价  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        wrt_score|float|窝轮综合评分
        wrt_code|str|窝轮对应的正股（此字段已废除，修改为 stock_owner）
        wrt_recovery_price|float|窝轮收回价
        wrt_street_vol|float|窝轮街货量
        wrt_issue_vol|float|窝轮发行量
        wrt_street_ratio|float|窝轮街货占比  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        wrt_delta|float|窝轮对冲值
        wrt_implied_volatility|float|窝轮引伸波幅
        wrt_premium|float|窝轮溢价  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        wrt_upper_strike_price|float|上限价  (仅界内证支持该字段)
        wrt_lower_strike_price|float|下限价  (仅界内证支持该字段)
        wrt_inline_price_status|[PriceType](./quote.md#6407)|界内界外  (仅界内证支持该字段)
        wrt_issuer_code|str|发行人代码
        option_valid|bool|是否是期权  (此字段返回为 True 时，以下期权相关字段才有合法数值)
        option_type|[OptionType](./quote.md#3713)|期权类型
        strike_time|str|期权行权日  (格式：yyyy-MM-dd
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        option_strike_price|float|行权价
        option_contract_size|float|每份合约数
        option_open_interest|int|总未平仓合约数
        option_implied_volatility|float|隐含波动率
        option_premium|float|溢价
        option_delta|float|希腊值 Delta
        option_gamma|float|希腊值 Gamma
        option_vega|float|希腊值 Vega
        option_theta|float|希腊值 Theta
        option_rho|float|希腊值 Rho
        index_option_type|[IndexOptionType](./quote.md#5149)|指数期权类型
        option_net_open_interest|int|净未平仓合约数  (仅港股期权适用)
        option_expiry_date_distance|int|距离到期日天数  (负数表示已过期)
        option_contract_nominal_value|float|合约名义金额  (仅港股期权适用)
        option_owner_lot_multiplier|float|相等正股手数  (指数期权无该字段，仅港股期权适用)
        option_area_type|[OptionAreaType](./quote.md#7077)|期权类型（按行权时间）
        option_contract_multiplier|float|合约乘数
        plate_valid|bool|是否为板块类型  (此字段返回为 True 时，以下板块相关字段才有合法数值)
        plate_raise_count|int|板块类型上涨支数
        plate_fall_count|int|板块类型下跌支数
        plate_equal_count|int|板块类型平盘支数
        index_valid|bool|是否有指数类型  (此字段返回为 True 时，以下指数相关字段才有合法数值)
        index_raise_count|int|指数类型上涨支数
        index_fall_count|int|指数类型下跌支数
        index_equal_count|int|指数类型平盘支数
        lot_size|int|每手股数，股票期权表示每份合约的股数  (指数期权无该字段)，期货表示合约乘数
        price_spread|float|当前向上的摆盘价差  (即摆盘数据的卖一价相邻档位的报价差)
        ask_price|float|卖价
        bid_price|float|买价
        ask_vol|float|卖量
        bid_vol|float|买量
        enable_margin|bool|是否可融资（已废弃）  (请使用 [获取融资融券数据](../trade/get-margin-ratio.html) 接口获取)
        mortgage_ratio|float|股票抵押率（已废弃）
        long_margin_initial_ratio|float|融资初始保证金率（已废弃）  (请使用 [获取融资融券数据](../trade/get-margin-ratio.html) 接口获取)
        enable_short_sell|bool|是否可卖空（已废弃）  (请使用 [获取融资融券数据](../trade/get-margin-ratio.html) 接口获取)
        short_sell_rate|float|卖空参考利率（已废弃）  (请使用 [获取融资融券数据](../trade/get-margin-ratio.html) 接口获取)
        short_available_volume|int|剩余可卖空数量（已废弃） (请使用 [获取融资融券数据](../trade/get-margin-ratio.html) 接口获取)
        short_margin_initial_ratio|float|卖空（融券）初始保证金率（已废弃）  (请使用 [获取融资融券数据](../trade/get-margin-ratio.html) 接口获取)
        sec_status|[SecurityStatus](./quote.md#9969)|股票状态
        amplitude|float|振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        avg_price|float|平均价
        bid_ask_ratio|float|委比  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        volume_ratio|float|量比
        highest52weeks_price|float|52 周最高价
        lowest52weeks_price|float|52 周最低价
        highest_history_price|float|历史最高价
        lowest_history_price|float|历史最低价
        pre_price|float|盘前价格
        pre_high_price|float|盘前最高价
        pre_low_price|float|盘前最低价
        pre_volume|int|盘前成交量
        pre_turnover|float|盘前成交额
        pre_change_val|float|盘前涨跌额
        pre_change_rate|float|盘前涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        pre_amplitude|float|盘前振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        after_price|float|盘后价格
        after_high_price|float|盘后最高价
        after_low_price|float|盘后最低价
        after_volume|int|盘后成交量  (科创板支持该数据)
        after_turnover|float|盘后成交额  (科创板支持该数据)
        after_change_val|float|盘后涨跌额
        after_change_rate|float|盘后涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        after_amplitude|float|盘后振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        overnight_price|float|夜盘价格
        overnight_high_price|float|夜盘最高价
        overnight_low_price|float|夜盘最低价
        overnight_volume|int|夜盘成交量
        overnight_turnover|float|夜盘成交额
        overnight_change_val|float|夜盘涨跌额
        overnight_change_rate|float|夜盘涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        overnight_amplitude|float|夜盘振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        future_valid|bool|是否期货
        future_last_settle_price|float|昨结
        future_position|float|持仓量
        future_position_change|float|日增仓
        future_main_contract|bool|是否主连合约
        future_last_trade_time|str|最后交易时间  (主连，当月，下月等期货没有该字段)
        trust_valid|bool|是否基金
        trust_dividend_yield|float|股息率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        trust_aum|float|资产规模  (单位：元)
        trust_outstanding_units|int|总发行量
        trust_netAssetValue|float|单位净值
        trust_premium|float|溢价  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        trust_assetClass|[AssetClass](./quote.md#4752)|资产类别

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_market_snapshot(['HK.00700', 'US.AAPL'])
if ret == RET_OK:
    print(data)
    print(data['code'][0])    # 取第一条的股票代码
    print(data['code'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
code  name              update_time  last_price  open_price  high_price  low_price  prev_close_price     volume      turnover  turnover_rate  suspension listing_date  lot_size  price_spread  stock_owner  ask_price  bid_price  ask_vol  bid_vol  enable_margin  mortgage_ratio  long_margin_initial_ratio  enable_short_sell  short_sell_rate  short_available_volume  short_margin_initial_ratio  amplitude  avg_price  bid_ask_ratio  volume_ratio  highest52weeks_price  lowest52weeks_price  highest_history_price  lowest_history_price  close_price_5min  after_volume  after_turnover sec_status  equity_valid  issued_shares  total_market_val     net_asset    net_profit  earning_per_share  outstanding_shares  circular_market_val  net_asset_per_share  ey_ratio  pe_ratio  pb_ratio  pe_ttm_ratio  dividend_ttm  dividend_ratio_ttm  dividend_lfy  dividend_lfy_ratio  wrt_valid  wrt_conversion_ratio wrt_type  wrt_strike_price  wrt_maturity_date  wrt_end_trade  wrt_recovery_price  wrt_street_vol  \
0  HK.00700  腾讯控股      2025-04-07 16:09:07      435.40      441.80      462.40     431.00            497.80  123364114.0  5.499476e+10          1.341       False   2004-06-16       100          0.20          NaN      435.4     435.20   281300    17300            NaN             NaN                        NaN                NaN              NaN                     NaN                         NaN      6.308    445.792        -68.499         5.627             547.00000           294.400000             706.100065            -13.202011            431.60             0    0.000000e+00     NORMAL          True     9202391012      4.006721e+12  1.051300e+12  2.095753e+11             22.774          9202391012         4.006721e+12              114.242     0.199    19.118     3.811        19.118          3.48                0.80          3.48               0.799      False                   NaN      N/A               NaN                NaN            NaN                 NaN             NaN   
1   US.AAPL    苹果  2025-04-07 05:30:43.301      188.38      193.89      199.88     187.34            203.19  125910913.0  2.424473e+10          0.838       False   1980-12-12         1          0.01          NaN      180.8     180.48       29      400            NaN             NaN                        NaN                NaN              NaN                     NaN                         NaN      6.172    192.554         86.480         2.226             259.81389           163.300566             259.813890              0.053580            188.93       3151311    5.930968e+08     NORMAL          True    15022073000      2.829858e+12  6.675809e+10  9.133420e+10              6.080         15016677308         2.828842e+12                4.444     1.417    30.983    42.389        29.901          0.99                0.53          0.98               0.520      False                   NaN      N/A               NaN                NaN            NaN                 NaN             NaN   

   wrt_issue_vol  wrt_street_ratio  wrt_delta  wrt_implied_volatility  wrt_premium  wrt_leverage  wrt_ipop  wrt_break_even_point  wrt_conversion_price  wrt_price_recovery_ratio  wrt_score  wrt_upper_strike_price  wrt_lower_strike_price wrt_inline_price_status  wrt_issuer_code  option_valid option_type  strike_time  option_strike_price  option_contract_size  option_open_interest  option_implied_volatility  option_premium  option_delta  option_gamma  option_vega  option_theta  option_rho  option_net_open_interest  option_expiry_date_distance  option_contract_nominal_value  option_owner_lot_multiplier option_area_type  option_contract_multiplier index_option_type  index_valid  index_raise_count  index_fall_count  index_equal_count  plate_valid  plate_raise_count  plate_fall_count  plate_equal_count  future_valid  future_last_settle_price  future_position  future_position_change  future_main_contract  future_last_trade_time  trust_valid  trust_dividend_yield  trust_aum  \
0            NaN               NaN        NaN                     NaN          NaN           NaN       NaN                   NaN                   NaN                       NaN        NaN                     NaN                     NaN                     N/A              NaN         False         N/A          NaN                  NaN                   NaN                   NaN                        NaN             NaN           NaN           NaN          NaN           NaN         NaN                       NaN                          NaN                            NaN                          NaN              N/A                         NaN               N/A        False                NaN               NaN                NaN        False                NaN               NaN                NaN         False                       NaN              NaN                     NaN                   NaN                     NaN        False                   NaN        NaN   
1            NaN               NaN        NaN                     NaN          NaN           NaN       NaN                   NaN                   NaN                       NaN        NaN                     NaN                     NaN                     N/A              NaN         False         N/A          NaN                  NaN                   NaN                   NaN                        NaN             NaN           NaN           NaN          NaN           NaN         NaN                       NaN                          NaN                            NaN                          NaN              N/A                         NaN               N/A        False                NaN               NaN                NaN        False                NaN               NaN                NaN         False                       NaN              NaN                     NaN                   NaN                     NaN        False                   NaN        NaN   

   trust_outstanding_units  trust_netAssetValue  trust_premium trust_assetClass pre_price pre_high_price pre_low_price pre_volume pre_turnover pre_change_val pre_change_rate pre_amplitude after_price after_high_price after_low_price after_change_val after_change_rate after_amplitude overnight_price overnight_high_price overnight_low_price overnight_volume overnight_turnover overnight_change_val overnight_change_rate overnight_amplitude  
0                      NaN                  NaN            NaN              N/A       N/A            N/A           N/A        N/A          N/A            N/A             N/A           N/A         N/A              N/A             N/A              N/A               N/A             N/A             N/A                  N/A                 N/A              N/A                N/A                  N/A                   N/A                 N/A  
1                      NaN                  NaN            NaN              N/A    180.68         181.98        177.47     276016  49809244.83           -7.7          -4.087         2.394       186.6          188.639          186.44            -1.78            -0.944          1.1673          176.94                186.5               174.4           533115        94944250.56               -11.44                -6.072              6.4231  
HK.00700
['HK.00700', 'US.AAPL']

```

---



---

# 获取实时报价

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_stock_quote(code_list)`

* **介绍**

    获取已订阅股票的实时报价，必须要先订阅。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code_list|list|股票代码列表  (list 中元素类型是 str)
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回报价数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 报价数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        data_date|str|日期
        data_time|str|当前价更新时间  (格式：yyyy-MM-dd HH:mm:ss
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        last_price|float|最新价格
        open_price|float|今日开盘价
        high_price|float|最高价格
        low_price|float|最低价格
        prev_close_price|float|昨收盘价格
        volume|float|成交数量
        turnover|float|成交金额
        turnover_rate|float|换手率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        amplitude|int|振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        suspension|bool|是否停牌  (True：停牌)
        listing_date|str|上市日期  (格式：yyyy-MM-dd)
        price_spread|float|当前向上的价差  (即摆盘数据的卖档的相邻档位的报价差)
        dark_status|[DarkStatus](./quote.md#1965)|暗盘交易状态
        sec_status|[SecurityStatus](./quote.md#9969)|股票状态
        strike_price|float|行权价
        contract_size|float|每份合约数
        open_interest|int|未平仓合约数
        implied_volatility|float|隐含波动率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        premium|float|溢价  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        delta|float|希腊值 Delta
        gamma|float|希腊值 Gamma
        vega|float|希腊值 Vega
        theta|float|希腊值 Theta
        rho|float|希腊值 Rho
        index_option_type|[IndexOptionType](./quote.md#5149)|指数期权类型
        net_open_interest|int|净未平仓合约数  (仅港股期权适用)
        expiry_date_distance|int|距离到期日天数  (负数表示已过期)
        contract_nominal_value|float|合约名义金额  (仅港股期权适用)
        owner_lot_multiplier|float|相等正股手数  (指数期权无该字段 ，仅港股期权适用)
        option_area_type|[OptionAreaType](./quote.md#7077)|期权类型（按行权时间）
        contract_multiplier|float|合约乘数
        pre_price|float|盘前价格
        pre_high_price|float|盘前最高价
        pre_low_price|float|盘前最低价
        pre_volume|int|盘前成交量
        pre_turnover|float|盘前成交额
        pre_change_val|float|盘前涨跌额
        pre_change_rate|float|盘前涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        pre_amplitude|float|盘前振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        after_price|float|盘后价格
        after_high_price|float|盘后最高价
        after_low_price|float|盘后最低价
        after_volume|int|盘后成交量  (科创板支持此数据)
        after_turnover|float|盘后成交额  (科创板支持此数据)
        after_change_val|float|盘后涨跌额
        after_change_rate|float|盘后涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        after_amplitude|float|盘后振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        overnight_price|float|夜盘价格
        overnight_high_price|float|夜盘最高价
        overnight_low_price|float|夜盘最低价
        overnight_volume|int|夜盘成交量
        overnight_turnover|float|夜盘成交额
        overnight_change_val|float|夜盘涨跌额
        overnight_change_rate|float|夜盘涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        overnight_amplitude|float|夜盘振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        last_settle_price|float|昨结  (期货特有字段)
        position|float|持仓量  (期货特有字段)
        position_change|float|日增仓  (期货特有字段)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.QUOTE], subscribe_push=False)
# 先订阅 K 线类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:  # 订阅成功
    ret, data = quote_ctx.get_stock_quote(['US.AAPL'])  # 获取订阅股票报价的实时数据
    if ret == RET_OK:
        print(data)
        print(data['code'][0])   # 取第一条的股票代码
        print(data['code'].values.tolist())   # 转为 list
    else:
        print('error:', data)
else:
    print('subscription failed', err_message)
quote_ctx.close()  # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
code name   data_date     data_time  last_price  open_price  high_price  low_price  prev_close_price     volume      turnover  turnover_rate  amplitude  suspension listing_date  price_spread dark_status sec_status strike_price contract_size open_interest implied_volatility premium delta gamma vega theta  rho net_open_interest expiry_date_distance contract_nominal_value owner_lot_multiplier option_area_type contract_multiplier last_settle_price position position_change index_option_type  pre_price  pre_high_price  pre_low_price  pre_volume  pre_turnover  pre_change_val  pre_change_rate  pre_amplitude  after_price  after_high_price  after_low_price  after_volume  after_turnover  after_change_val  after_change_rate  after_amplitude  overnight_price  overnight_high_price  overnight_low_price  overnight_volume  overnight_turnover  overnight_change_val  overnight_change_rate  overnight_amplitude
0  US.AAPL   苹果  2025-04-07  05:37:21.794      188.38      193.89      199.88     187.34            203.19  125910913.0  2.424473e+10          0.838      6.172       False   1980-12-12          0.01         N/A     NORMAL          N/A           N/A           N/A                N/A     N/A   N/A   N/A  N/A   N/A  N/A               N/A                  N/A                    N/A                  N/A              N/A                 N/A               N/A      N/A             N/A               N/A     181.43          181.98         177.47      288853   52132735.18           -6.95           -3.689          2.394        186.6           188.639           186.44       3151311    5.930968e+08             -1.78             -0.944           1.1673           176.94                 186.5                174.4            533115         94944250.56                -11.44                 -6.072               6.4231
US.AAPL
['US.AAPL']
```

---



---

# 获取实时摆盘

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_order_book(code, num=10)`

* **介绍**

    获取已订阅股票的实时摆盘，必须要先订阅。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    name|str|股票名称
    num|int|请求摆盘档数  (摆盘档数获取上限请参见 [摆盘档数明细](../qa/quote.md#5336)) 


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回摆盘数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

   * 摆盘数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        svr_recv_time_bid|str|富途服务器从交易所收到买盘数据的时间  (部分数据的接收时间为零，例如服务器重启或第一次推送的缓存数据)
        svr_recv_time_ask|str|富途服务器从交易所收到卖盘数据的时间  (部分数据的接收时间为零，例如服务器重启或第一次推送的缓存数据)
        Bid|list|每个元祖包含如下信息：委托价格，委托数量，委托订单数，委托订单明细  (委托订单明细
  - 明细内容：交易所订单 ID，单笔委托数量
  - 港股 SF 权限下最多支持 1000 笔委托订单明细；其余行情权限不支持获取此类数据)
        Ask|list|每个元祖包含如下信息：委托价格，委托数量，委托订单数，委托订单明细  (委托订单明细
  - 明细内容：交易所订单 ID，单笔委托数量
  - 港股 SF 权限下最多支持 1000 笔委托订单明细；其余行情权限不支持获取此类数据)

     其中，Bid 和 Ask 字段的结构如下：  

          'Bid': [ (bid_price1, bid_volume1, order_num, {'orderid1': order_volume1, 'orderid2': order_volume2, …… }), (bid_price2, bid_volume2, order_num,  {'orderid1': order_volume1, 'orderid2': order_volume2, …… }),…]
          'Ask': [ (ask_price1, ask_volume1，order_num, {'orderid1': order_volume1, 'orderid2': order_volume2, …… }), (ask_price2, ask_volume2, order_num, {'orderid1': order_volume1, 'orderid2': order_volume2, …… }),…] 

 
    
* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret_sub = quote_ctx.subscribe(['US.AAPL'], [SubType.ORDER_BOOK], subscribe_push=False)[0]
# 先订阅买卖摆盘类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:  # 订阅成功
    ret, data = quote_ctx.get_order_book('US.AAPL', num=3)  # 获取一次 3 档实时摆盘数据
    if ret == RET_OK:
        print(data)
    else:
        print('error:', data)
else:
    print('subscription failed')
quote_ctx.close()  # 关闭当条连接，OpenD 会在 1 分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
{'code': 'US.AAPL', 'name': '苹果', 'svr_recv_time_bid': '2025-04-07 05:39:20.352', 'svr_recv_time_ask': '2025-04-07 05:39:20.352', 'Bid': [(181.17, 227.0, 2, {}), (181.15, 2.0, 2, {}), (181.12, 100.0, 1, {})], 'Ask': [(181.71, 200.0, 1, {}), (181.79, 9.0, 1, {}), (181.9, 616.0, 3, {})]}
```

---



---

# 获取实时 K 线

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_cur_kline(code, num, ktype=KLType.K_DAY, autype=AuType.QFQ)`

* **介绍**

    获取已订阅股票的实时 K 线数据，必须要先订阅。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    name|str|股票名称
    num|int|K 线数据个数  (最多 1000 根)
    ktype|[KLType](./quote.md#4119)|K 线类型
    autype|[AuType](./quote.md#6907)|复权类型


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回 K 线数据数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * K 线数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        time_key|str|时间  (格式：yyyy-MM-dd HH:mm:ss
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        open|float|开盘价
        close|float|收盘价
        high|float|最高价
        low|float|最低价
        volume|float|成交量
        turnover|float|成交额
        pe_ratio|float|市盈率
        turnover_rate|float|换手率  (该字段为百分比字段，默认返回小数，如 0.01 实际对应 1%)
        last_close|float|昨收价  (即前一个时间的收盘价为了效率原因，第一个数据的昨收价可能为 0)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.K_DAY], subscribe_push=False, session=Session.ALL)
# 先订阅 K 线类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:  # 订阅成功
    ret, data = quote_ctx.get_cur_kline('US.AAPL', 2, KLType.K_DAY, AuType.QFQ)  # 获取美股AAPL最近2个 K 线数据
    if ret == RET_OK:
        print(data)
        print(data['turnover_rate'][0])   # 取第一条的换手率
        print(data['turnover_rate'].values.tolist())   # 转为 list
    else:
        print('error:', data)
else:
    print('subscription failed', err_message)
quote_ctx.close()  # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
code name             time_key    open   close    high     low       volume      turnover  pe_ratio  turnover_rate  last_close
0  US.AAPL   苹果  2025-04-03 00:00:00  205.54  203.19  207.49  201.25  103419006.0  2.111773e+10    33.419        0.00689      223.89
1  US.AAPL   苹果  2025-04-04 00:00:00  193.89  188.38  199.88  187.34  125910913.0  2.424473e+10    30.983        0.00838      203.19
0.00689
[0.00689, 0.00838]
```

---



---

# 获取实时分时

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_rt_data(code)`

* **介绍**

    获取已订阅股票的实时分时数据，必须要先订阅。

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回分时数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 分时数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        time|str|时间  (格式：yyyy-MM-dd HH:mm:ss 港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        is_blank|bool|数据状态  (False：正常数据True：伪造数据)
        opened_mins|int|零点到当前多少分钟
        cur_price|float|当前价格
        last_close|float|昨天收盘的价格
        avg_price|float|平均价格  (对于期权，该字段为 N/A)
        volume|float|成交量
        turnover|float|成交金额

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.RT_DATA], subscribe_push=False, session=Session.ALL)
# 先订阅分时数据类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:   # 订阅成功
    ret, data = quote_ctx.get_rt_data('US.AAPL')   # 获取一次分时数据
    if ret == RET_OK:
        print(data)
    else:
        print('error:', data)
else:
    print('subscription failed', err_message)
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
code  name                 time  is_blank  opened_mins  cur_price  last_close   avg_price   volume     turnover
0    US.AAPL   苹果  2025-04-06 20:01:00     False         1201     183.00      188.38  181.643916    9463  1718896.38
..      ...    ...                  ...       ...          ...        ...         ...         ...      ...          ...
586  US.AAPL   苹果  2025-04-07 05:47:00     False          347     181.26      188.38  180.555673     661   119859.75

[587 rows x 10 columns]
```

---



---

# 获取实时逐笔

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_rt_ticker(code, num=500)`

* **介绍**

    获取已订阅股票的实时逐笔数据，必须要先订阅。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    num|int|最近逐笔个数


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回逐笔数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 逐笔数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        sequence|int|逐笔序号
        time|str|成交时间  (格式：yyyy-MM-dd HH:mm:ss:xxx
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        price|float|成交价格
        volume|float|成交数量  (股数)
        turnover|float|成交金额
        ticker_direction|[TickerDirect](./quote.md#8723)|逐笔方向
        type|[TickerType](./quote.md#2358)|逐笔类型

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret_sub, err_message = quote_ctx.subscribe(['US.AAPL'], [SubType.TICKER], subscribe_push=False, session=Session.ALL)
# 先订阅逐笔类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:  # 订阅成功
    ret, data = quote_ctx.get_rt_ticker('US.AAPL', 2)  # 获取美股AAPL最近2个逐笔
    if ret == RET_OK:
        print(data)
        print(data['turnover'][0])   # 取第一条的成交金额
        print(data['turnover'].values.tolist())   # 转为 list
    else:
        print('error:', data)
else:
    print('subscription failed', err_message)
quote_ctx.close()  # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
code name                     time   price  volume  turnover ticker_direction             sequence     type
0  US.AAPL   苹果  2025-04-07 05:50:23.745  181.70     2.0    363.40          NEUTRAL  7490506385373790208  ODD_LOT
1  US.AAPL   苹果  2025-04-07 05:50:24.170  181.73     1.0    181.73          NEUTRAL  7490506389668757504  ODD_LOT
363.4
[363.4, 181.73]
```

---



---

# 获取实时经纪队列

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_broker_queue(code)`

* **介绍**

    获取已订阅股票的实时经纪队列数据，必须要先订阅。

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">bid_frame_table</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，bid_frame_table 返回买盘经纪队列数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，bid_frame_table 返回错误描述</td>
        </tr>
        <tr>
            <td rowspan="2">ask_frame_table</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，ask_frame_table 返回卖盘经纪队列数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，ask_frame_table 返回错误描述</td>
        </tr>
    </table>

    * 买盘经纪队列格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        bid_broker_id|int|经纪买盘 ID
        bid_broker_name|str|经纪买盘名称
        bid_broker_pos|int|经纪档位
        order_id|int|交易所订单 ID  (- 不是下单接口返回的订单 ID
  - 只有港股 SF 行情权限支持返回该字段)
        order_volume|int|单笔委托数量  (只有港股 SF 行情权限支持返回该字段)
    * 卖盘经纪队列格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        ask_broker_id|int|经纪卖盘 ID
        ask_broker_name|str|经纪卖盘名称
        ask_broker_pos|int|经纪档位
        order_id|int|交易所订单 ID  (- 不是下单接口返回的订单 ID
  - 只有港股 SF 行情权限支持返回该字段)
        order_volume|int|单笔委托数量  (只有港股 SF 行情权限支持返回该字段)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret_sub, err_message = quote_ctx.subscribe(['HK.00700'], [SubType.BROKER], subscribe_push=False)
# 先订阅经纪队列类型。订阅成功后 OpenD 将持续收到服务器的推送，False 代表暂时不需要推送给脚本
if ret_sub == RET_OK:   # 订阅成功
    ret, bid_frame_table, ask_frame_table = quote_ctx.get_broker_queue('HK.00700')   # 获取一次经纪队列数据
    if ret == RET_OK:
        print(bid_frame_table)
    else:
        print('error:', bid_frame_table)
else:
    print(err_message)
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
        code  name  bid_broker_id bid_broker_name  bid_broker_pos order_id order_volume
0   HK.00700  腾讯控股           5338          J.P.摩根               1      N/A          N/A
..       ...   ...            ...             ...             ...      ...          ...
36  HK.00700  腾讯控股           8305  富途证券国际(香港)有限公司               4      N/A          N/A

[37 rows x 7 columns]
```

---



---

# 获取标的市场状态

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_market_state(code_list)`

* **介绍**

    获取指定标的的市场状态

* **参数**
    参数|类型|说明
    :-|:-|:-
    code_list|list|需要查询市场状态的股票代码列表  (list 中元素类型是 str)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回市场状态数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 市场状态数据
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        stock_name|str|股票名称
        market_state|[MarketState](./quote.md#1252)|市场状态

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_market_state(['SZ.000001', 'HK.00700'])
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    code         stock_name   market_state
0  SZ.000001    平安银行     AFTERNOON
1  HK.00700     腾讯控股     AFTERNOON
```

---



---

# 获取资金流向

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_capital_flow(stock_code, period_type = PeriodType.INTRADAY, start=None, end=None)`

* **介绍**

    获取个股资金流向

* **参数**
    参数|类型|说明
    :-|:-|:-
    stock_code|str|股票代码
    period_type|[PeriodType](./quote.md#2644)|周期类型
    start|str|开始时间  (格式：yyyy-MM-dd 
 例如：“2017-06-20”)
    end|str|结束时间  (格式：yyyy-MM-dd 
 例如：“2017-06-20”)


    - start 和 end 的组合如下  
        |start 类型 |end 类型 |说明 |
        |:--|:--|:--|
        |str |str |start 和 end 分别为指定的日期|
        |None |str |start 为 end 往前 365 天  |
        |str |None |end 为 start 往后 365 天 |
        |None |None |end 为 当前日期，start 往前 365 天 |


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回资金流向数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 资金流向数据格式如下：
        字段|类型|说明
        :-|:-|:-
        in_flow|float|整体净流入
        main_in_flow|float|主力大单净流入  (仅历史周期（日、周、月）有效)
        super_in_flow|float|特大单净流入 
        big_in_flow|float|大单净流入 
        mid_in_flow|float|中单净流入 
        sml_in_flow|float|小单净流入 
        capital_flow_item_time|str|开始时间  (格式：yyyy-MM-dd HH:mm:ss
精确到分钟)
        last_valid_time|str|数据最后有效时间  (仅实时周期有效)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_capital_flow("HK.00700", period_type = PeriodType.INTRADAY)
if ret == RET_OK:
    print(data)
    print(data['in_flow'][0])    # 取第一条的净流入的资金额度
    print(data['in_flow'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    last_valid_time       in_flow  ...  main_in_flow  capital_flow_item_time
0               N/A -1.857915e+08  ... -1.066828e+08     2021-06-08 00:00:00
..              ...           ...  ...           ...                     ...
245             N/A  2.179240e+09  ...  2.143345e+09     2022-06-08 00:00:00

[246 rows x 8 columns]
-185791500.0
[-185791500.0, -18315000.0, -672100100.0, -714394350.0, -698391950.0, -818886750.0, 304827400.0, 73026200.0, -2078217500.0, 
..                   ...           ...                    ...
2031460.0, 638067040.0, 622466600.0, -351788160.0, -328529240.0, 715415020.0, 76749700.0, 2179240320.0]
```

---



---

# 获取资金分布

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_capital_distribution(stock_code)`

* **介绍**

    获取资金分布

* **参数**
    参数|类型|说明
    :-|:-|:-
    stock_code|str|股票代码


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回股票资金分布数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 资金分布数据格式如下：
        字段|类型|说明
        :-|:-|:-
        capital_in_super|float|流入资金额度，特大单
        capital_in_big|float|流入资金额度，大单
        capital_in_mid|float|流入资金额度，中单
        capital_in_small|float|流入资金额度，小单
        capital_out_super|float|流出资金额度，特大单
        capital_out_big|float|流出资金额度，大单
        capital_out_mid|float|流出资金额度，中单
        capital_out_small|float|流出资金额度，小单
        update_time|str|更新时间字符串  (格式：yyyy-MM-dd HH:mm:ss)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_capital_distribution("HK.00700")
if ret == RET_OK:
    print(data)
    print(data['capital_in_big'][0])    # 取第一条的流入资金额度，大单
    print(data['capital_in_big'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
   capital_in_super  capital_in_big  ...  capital_out_small          update_time
0      2.261085e+09    2.141964e+09  ...       2.887413e+09  2022-06-08 15:59:59

[1 rows x 9 columns]
2141963720.0
[2141963720.0]
```

---



---

# 获取股票所属板块

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_owner_plate(code_list)`

* **介绍**

    获取单支或多支股票的所属板块信息列表

* **参数**
    参数|类型|说明
    :-|:-|:-
    code_list|list|股票代码列表  (仅支持正股、指数list 中元素类型是 str)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回所属板块数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 所属板块数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|证券代码
        name|str|股票名称
        plate_code|str|板块代码
        plate_name|str|板块名字
        plate_type|[Plate](./quote.md#1362)|板块类型  (行业板块或概念板块)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

code_list = ['HK.00001']
ret, data = quote_ctx.get_owner_plate(code_list)
if ret == RET_OK:
    print(data)
    print(data['code'][0])    # 取第一条的股票代码
    print(data['plate_code'].values.tolist())   # 板块代码转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
        code name          plate_code plate_name plate_type
0   HK.00001   长和  HK.HSI Constituent      恒指成份股      OTHER
..       ...  ...                 ...        ...        ...
8   HK.00001   长和           HK.BK1983    香港股票ADR      OTHER

[9 rows x 5 columns]
HK.00001
['HK.HSI Constituent', 'HK.GangGuTong', 'HK.BK1000', 'HK.BK1061', 'HK.BK1107', 'HK.BK1331', 'HK.BK1600', 'HK.BK1922', 'HK.BK1983']
```

---



---

# 获取历史 K 线

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`request_history_kline(code, start=None, end=None, ktype=KLType.K_DAY, autype=AuType.QFQ, fields=[KL_FIELD.ALL], max_count=1000, page_req_key=None, extended_time=False, session=Session.NONE)`

* **介绍**

    获取历史 K 线

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    start|str|开始时间  (格式：yyyy-MM-dd
例如：“2017-06-20”)
    end|str|结束时间  (格式：yyyy-MM-dd
例如：“2017-07-20”)
    ktype|[KLType](./quote.md#4119)|K 线类型
    autype|[AuType](./quote.md#6907)|复权类型
    fields|[KLFields](./quote.md#481)|需返回的字段列表
    max_count|int|本次请求最大返回的 K 线根数  (- 传 None 表示返回 start 和 end 之间所有的数据 
  - 注意：OpenD 接收到所有数据后才会下发给脚本，如果您要获取的 K 线根数大于 1000 根，建议选择分页，防止出现超时)
    page_req_key|bytes|分页请求  (如果 start 和 end 之间的 K 线根数多于 max_count：1. 首页请求时应该传 None 2. 后续页请求时必须要传入上次调用返回的参数 page_req_key)
    extended_time|bool|是否允许美股盘前盘后数据  (False：不允许True：允许)
    session|[Session](./quote.md#9152)|获取美股分时段历史K线  (- 仅用于获取美股分时段历史K线
  - 获取美股历史K线不支持入参OVERNIGHT
  - 最低OpenD版本要求：9.2.4207)


    * start 和 end 的组合如下
        Start 类型|End 类型|说明
        :-|:-|:-
        str|str|start 和 end 分别为指定的日期
        None|str|start 为 end 往前 365 天
        str|None|end 为 start 往后 365 天
        None|None|end 为当前日期，start 往前 365 天


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回历史 K 线数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
        <tr>
            <td>page_req_key</td>
            <td>bytes</td>
            <td>下一页请求的 key</td>
        </tr>
    </table>

    * 历史 K 线数据格式如下:
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        time_key|str|K 线时间  (格式：yyyy-MM-dd HH:mm:ss
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        open|float|开盘价
        close|float|收盘价
        high|float|最高价
        low|float|最低价
        pe_ratio|float|市盈率  (该字段为比例字段，默认不展示 %)
        turnover_rate|float|换手率
        volume|float|成交量
        turnover|float|成交额
        change_rate|float|涨跌幅
        last_close|float|昨收价

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data, page_req_key = quote_ctx.request_history_kline('US.AAPL', start='2019-09-11', end='2019-09-18', max_count=5, session=Session.ALL)  # 每页5个，请求第一页
if ret == RET_OK:
    print(data)
    print(data['code'][0])    # 取第一条的股票代码
    print(data['close'].values.tolist())   # 第一页收盘价转为 list
else:
    print('error:', data)
while page_req_key != None:  # 请求后面的所有结果
    print('*************************************')
    ret, data, page_req_key = quote_ctx.request_history_kline('US.AAPL', start='2019-09-11', end='2019-09-18', max_count=5, page_req_key=page_req_key, session=Session.ALL) # 请求翻页后的数据
    if ret == RET_OK:
        print(data)
    else:
        print('error:', data)
print('All pages are finished!')
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
code  name             time_key       open      close       high        low  pe_ratio  turnover_rate    volume      turnover  change_rate  last_close
0  US.AAPL   苹果  2019-09-11 00:00:00  52.631194  53.963447  53.992409  52.549135    18.773        0.01039  177158584.0  9.808562e+09     3.179511   52.300545
..       ...   ...                  ...        ...        ...        ...        ...       ...            ...       ...           ...          ...         ...
4  US.AAPL   苹果  2019-09-17 00:00:00  53.087346  53.265945  53.294907  52.884612    18.530        0.00432   73545872.0  4.046314e+09     0.363802   53.072865

[5 rows x 13 columns]
US.AAPL
[53.9634465, 53.84156475, 52.7953125, 53.072865, 53.265945]
*************************************
       code  name             time_key       open      close       high        low  pe_ratio  turnover_rate   volume      turnover  change_rate  last_close
0  US.AAPL   苹果  2019-09-18 00:00:00  53.352831  53.76554  53.784847  52.961844    18.704        0.00602  102572372.0  5.682068e+09     0.937925   53.265945
All pages are finished!
```

---



---

# 获取复权因子

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_rehab(code)`

* **介绍**

    获取股票的复权因子

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|股票代码


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回复权数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 复权数据格式如下：
        字段|类型|说明
        :-|:-|:-
        ex_div_date|str|除权除息日
        split_base|float|拆股分子 (拆股比例=拆股分子/拆股分母)
        split_ert|float|拆股分母
        join_base|float|合股分子 (合股比例=合股分子/合股分母)
        join_ert|float|合股分母
        split_ratio|float|拆合股比例  (- 当公司出现合股，5股合1股时，合股分子=5，合股分母=1，拆合股比例=合股分子/合股分母=5/1- 当公司出现拆股，1股拆5股时，拆股分子=1，拆股分母=5，拆合股比例=拆股分子/拆股分母=1/5)
        per_cash_div|float|每股派现
        bonus_base|float|送股分子 (送股比例=送股分子/送股分母)
        bonus_ert|float|送股分母
        per_share_div_ratio|float|送股比例  (- 当公司出现送股，5股送1股时，送股分子=5，送股分母=1，送股比例=送股分子/送股分母=5/1)
        transfer_base|float|转增股分子 (转增股比例=转增股分子/转增股分母)
        transfer_ert|float|转增股分母
        per_share_trans_ratio|float|转增股比例  (- 当公司出现转增股，10股转增3股时，转增股分子=10，转增股分母=3，转增股比例=转增股分子/转增股分母=10/3)
        allot_base|float|配股分子 (配股比例=配股分子/配股分母)
        allot_ert|float|配股分母
        allotment_ratio|float|配股比例  (- 当公司出现配股，5股配1股时，配股分子=5，配股分母=1，配股比例=配股分子/配股分母=5/1)
        allotment_price|float|配股价
        add_base|float|增发股分子 (增发股比例=增发股分子/增发股分母)
        add_ert|float|增发股分母
        stk_spo_ratio|float|增发比例  (- 当公司出现增发股，1股增发5股时，增发股分子=1，增发股分母=5，增发股比例=增发股分子/增发股分母=1/5)
        stk_spo_price|float|增发价格
        spin_off_base|float|分立分子
        spin_off_ert|float|分立分母
        spin_off_ratio|float|分立比例
        forward_adj_factorA|float|前复权因子 A
        forward_adj_factorB|float|前复权因子 B
        backward_adj_factorA|float|后复权因子 A
        backward_adj_factorB|float|后复权因子 B

        前复权价格 = 不复权价格 × 前复权因子 A + 前复权因子 B  
        后复权价格 = 不复权价格 × 后复权因子 A + 后复权因子 B

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_rehab("HK.00700")
if ret == RET_OK:
    print(data)
    print(data['ex_div_date'][0])    # 取第一条的除权除息日
    print(data['ex_div_date'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    ex_div_date  split_ratio  per_cash_div  per_share_div_ratio  per_share_trans_ratio  allotment_ratio  allotment_price  stk_spo_ratio  stk_spo_price  spin_off_base   spin_off_ert   spin_off_ratio   forward_adj_factorA  forward_adj_factorB  backward_adj_factorA  backward_adj_factorB
0   2005-04-19          NaN          0.07                  NaN                    NaN              NaN              NaN            NaN            NaN         NaN         NaN          NaN         1.0                -0.07                   1.0                  0.07
..         ...          ...           ...                  ...                    ...              ...              ...            ...            ...                  ...                  ...                   ...                   ...
15  2019-05-17          NaN          1.00                  NaN                    NaN              NaN              NaN            NaN            NaN         NaN        NaN        NaN           1.0                -1.00                   1.0                  1.00

[16 rows x 16 columns]
2005-04-19
['2005-04-19', '2006-05-15', '2007-05-09', '2008-05-06', '2009-05-06', '2010-05-05', '2011-05-03', '2012-05-18', '2013-05-20', '2014-05-15', '2014-05-16', '2015-05-15', '2016-05-20', '2017-05-19', '2018-05-18', '2019-05-17']
```

---



---

# 获取财报日前后价格涨跌幅表现

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_financials_earnings_price_move(code, period_count=None)`

* **介绍**

    获取财报日前后价格涨跌幅表现

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    period_count|int|财报周期数量  (默认 10，取值范围 [1, 50])

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回按交易日展开的明细数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回数据按交易日平铺，每行同时包含财报元信息与当日行情：

        字段|类型|说明
        :-|:-|:-
        fiscal_year|int|财务年度  (如 2024)
        financial_type|[F10Type](./quote.md#7710)|财报类型  (0=未知，1=Q1，2=Q2，3=Q3，4=Q4，7=全年，9=季度等)
        period_text|str|财报周期  (如 "2024/Q3"、"2024/FY")
        pub_trading_day_str|str|财报发布对应交易日  (格式：yyyy-MM-dd；对应市场时区)
        pub_type|[EarningsPubTimeType](./quote.md#2586)|财报发布时间类型  (0=未知，1=盘前，2=盘后，3=盘中)
        price_info_index|int|财报发布当日在本期行情列表中的下标  (0-based；-1 表示无数据)
        day_offset|int|距财报发布日偏移天数  (负数=发布前，0=发布当天，正数=发布后)
        trading_day_str|str|交易日  (格式：yyyy-MM-dd；对应市场时区)
        close_price|float|收盘价
        open_price|float|开盘价
        highest_price|float|最高价
        lowest_price|float|最低价
        last_close_price|float|昨收价
        option_iv|float|期权隐含波动率  (百分号前的值，如 12.34 表示 12.34%)
        option_hv|float|期权历史波动率  (百分号前的值，如 12.34 表示 12.34%)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_financials_earnings_price_move("HK.00700", period_count=2)
if ret == RET_OK:
    print(data)
    print(data['period_text'][0])
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
fiscal_year  financial_type  ... option_iv  option_hv
0          2026               1  ...    31.829     32.220
1          2026               1  ...    33.173     33.720
2          2026               1  ...    32.963     30.355
3          2026               1  ...       NaN        NaN
4          2025               4  ...    35.804     37.891
5          2025               4  ...    35.845     37.478
6          2025               4  ...    38.504     37.580
7          2025               4  ...    35.518     38.175
8          2025               4  ...    34.739     37.446
9          2025               4  ...    34.248     37.558
10         2025               4  ...    31.682     44.855
11         2025               4  ...    30.907     43.536
12         2025               4  ...    34.614     43.426
13         2025               4  ...    33.617     44.177
14         2025               4  ...    34.503     42.810

[15 rows x 17 columns]
2026/Q1
```

---



---

# 获取财报日前后股价历史

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_financials_earnings_price_history(code)`

* **介绍**

    获取财报日前后股价历史

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回各财报期数据（按期×偏移交易日展开）</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回数据按财报期展开，每行包含财报元信息、发布日行情及相对偏移收盘价：

        字段|类型|说明
        :-|:-|:-
        fiscal_year|int|财务年度  (如 2024)
        financial_type|[F10Type](./quote.md#7710)|财报类型  (0=未知，1=Q1，2=Q2，3=Q3，4=Q4，7=全年，9=季度等)
        period_text|str|财报周期  (如 "2024/Q3"、"2024/FY")
        is_current|bool|当前时间是否在该财报窗口期
        pub_trading_day|int|财报发布对应交易日时间戳（秒）
        pub_trading_day_str|str|财报发布交易日  (格式：yyyy-MM-dd；对应市场时区)
        pub_time|int|财报实际发布时间戳（秒，含时分秒）
        pub_time_str|str|财报发布时间  (格式：yyyy-MM-dd HH:mm:ss；对应市场时区)
        pub_type|[EarningsPubTimeType](./quote.md#2586)|财报发布时间类型  (0=未知，1=盘前，2=盘后，3=盘中)
        predict_vola_ratio_newest|float|最新预期波动比例  (百分号前的值，如 12.34 表示 12.34%)
        predict_vola_ratio_highest|float|最高预期波动比例  (百分号前的值，如 12.34 表示 12.34%)
        predict_vola_val_newest|float|最新预期波动金额
        predict_vola_val_highest|float|最高预期波动金额
        option_iv_crush|float|期权隐含波动率压缩值  (百分号前的值，如 12.34 表示 12.34%)
        option_strike_date_iv_crush|float|行权日期权隐含波动率压缩值  (百分号前的值，如 12.34 表示 12.34%)
        trading_day|int|财报发布日当天交易日时间戳（秒）
        trading_day_str|str|财报发布日当天交易日  (格式：yyyy-MM-dd；对应市场时区)
        close_price|float|收盘价
        open_price|float|开盘价
        highest_price|float|最高价
        lowest_price|float|最低价
        last_close_price|float|昨收价
        volume|float|成交量（股）
        schedule_delta|int|相对财报发布日的交易日偏移量  (负数=发布前，0=发布当日，正数=发布后)
        schedule_close_price|float|该偏移交易日的收盘价

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_financials_earnings_price_history("HK.00700")
if ret == RET_OK:
    print(data)
    print(data['period_text'][0])
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
fiscal_year  financial_type  ... schedule_delta  schedule_close_price
0           2026               1  ...            -15            504.000000
1           2026               1  ...            -14            495.200000
2           2026               1  ...            -13            493.400000
3           2026               1  ...            -12            478.600000
4           2026               1  ...            -11            473.800000
..           ...             ...  ...            ...                   ...
579         2021               2  ...             10            445.420633
580         2021               2  ...             11            438.045790
581         2021               2  ...             12            453.717332
582         2021               2  ...             13            463.396813
583         2021               2  ...             14            471.693512

[584 rows x 25 columns]
2026/Q1
```

---



---

# 获取财务报表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_financials_statements(code, statement_type=None, financial_type=None, currency_code=None, next_key=None, num=None)`

* **介绍**

    获取指定股票的财务报表（利润表/资产负债表/现金流量表/关键指标），支持分页拉取

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    statement_type|[FinancialStatementsType](./quote.md#2910)|财务报表类型  (0=未知，1=利润表(Income)，2=资产负债表(BalanceSheet)，3=现金流量表(CashFlow)，4=关键指标(MainIndex)；默认 1=利润表)
    financial_type|[F10Type](./quote.md#7710)|财报类型  (0=不限，1=Q1，2=Q2，3=Q3，4=Q4，5=Q6累计(Q1+Q2)，6=Q9累计(Q1+Q2+Q3)，7=年报，9=单季报组合，10=单季报+年报，11=累计季报；默认 10=单季报+年报)
    currency_code|str|币种代码  (ISO 4217，如 CNY、USD、HKD、SGD、JPY、CAD、AUD；不填返回原始货币数据)
    next_key|str|分页标识  (首次不传，续拉填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页返回数量  (默认 10，范围 1~50)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回财务报表数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        structure_list|list|字段结构列表
        report_list|list|财报数据列表
        next_key|str|分页标识  ("-1" 表示无更多数据)

    * structure_list 每项包含的字段：

        字段|类型|说明
        :-|:-|:-
        field_id|int|财务字段 ID
        display_name|str|字段展示名  (如"营业收入"；当前语言)

    * report_list 每项包含的字段：

        字段|类型|说明
        :-|:-|:-
        date_time|int|财报截止日时间戳（秒）
        date_time_str|str|财报截止日字符串  (格式：YYYY-MM-DD；对应市场时区)
        fiscal_year|int|财务年度  (如 2024)
        financial_type|[F10Type](./quote.md#7710)|财报类型  (0=未知，下次请求可原样传入)
        period_text|str|财报周期  (如 "2024/Q3"、"2024/FY")
        item_list|list|财务数据项列表
        currency_info|str|货币单位  (展示型，如 "人民币"、"美元")
        accounting_standards|str|会计准则  (如 "国际会计准则")
        auditor_report|str|审计意见  (如 "无保留意见")
        currency_code|str|币种代码  (ISO 4217，如 "CNY"、"USD")

    * item_list 每项包含的字段：

        字段|类型|说明
        :-|:-|:-
        field_id|int|财务字段 ID
        data|float|财务数据
        yoy|float|同比  (百分号前的值，如 13.86 表示 13.86%；无同比数据时不含此字段)
        qoq|float|环比  (百分号前的值，如 1.23 表示 1.23%；无环比数据时不含此字段)
        display_name|str|字段展示名  (与 structure_list 中对应条目的 display_name 一致)

* **Example**

```python
import pandas as pd
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_financials_statements("HK.00700")
if ret == RET_OK:
    df = pd.DataFrame(data['report_list'][0]['item_list'])
    print(df)
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
field_id display_name          data         yoy
0       5001        营业总收入  7.517660e+11   13.859603
1       5002          营业额  7.517660e+11   13.859603
2       5005        营业总成本 -3.291730e+11   -5.839665
3       5008         销售成本 -3.291730e+11   -5.839665
4       5010           毛利  4.225930e+11   21.001529
5       5013         营业费用 -1.778540e+11  -19.245855
6       5015         销售费用 -4.172700e+10  -14.672419
7       5016         行政费用 -1.361270e+11  -20.721703
8       5032     经营利润特殊项目 -3.177000e+09 -139.702574
9       5034         营业利润  2.415620e+11   16.080327
10      5035         融资收入  1.690900e+10    5.654836
11      5036         融资成本 -1.513000e+10  -26.283282
12      5037     应占联营公司利润  2.374000e+10   -5.703845
13      5040         税前利润  2.772490e+11   14.810030
14      5041       利润特殊项目  1.016800e+10  142.846907
15      5043          所得税 -4.744800e+10   -5.397841
16      5045          净利润  2.298010e+11   16.966717
17      5046       持续经营利润  2.298010e+11   16.966717
18      5050       少数股东损益  4.959000e+09  107.142857
19      5051     归属母公司净利润  2.248420e+11   15.854343
20      5052   归属普通股股东净利润  2.248420e+11   15.854343
21      5054       基本每股收益  2.474900e+01   18.201356
22      5055       稀释每股收益  2.415300e+01   17.900029
```

---



---

# 获取主营构成

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_financials_revenue_breakdown(code, date=None, financial_type=None, currency_code=None)`

* **介绍**

    获取指定股票的主营构成数据，支持产品、行业、地区、业务等多维度拆解

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    date|int|筛选时间戳  (秒；从返回的 screen_date_list 中取 date 值可查历史；不填或填 0 返回最新一期)
    financial_type|[F10Type](./quote.md#7710)|财报类型  (0=不限，1=Q1单季报，2=Q2单季报，3=Q3单季报，4=Q4单季报，5=半年报，6=Q9累计报，7=年报，9=聚合季报；默认 0=不限)
    currency_code|str|币种代码  (ISO 4217，如 CNY、USD、HKD、SGD、JPY、CAD、AUD；不填返回原始货币数据)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回主营构成数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        period|str|财报周期  (如 "2025/FY"、"2024/H1")
        breakdown_list|list|各维度主营构成数据列表  (每项含 type 和 item_list)
        currency_code|str|货币代码  (ISO 4217)
        screen_date_list|list|可选历史日期列表  (仅 date 与 financial_type 均未填时返回)

    * breakdown_list 每项包含的字段：

        字段|类型|说明
        :-|:-|:-
        type|[RevenueBreakdownType](./quote.md#3621)|维度类型  (1=产品(Product)，2=行业(Industry)，4=地区(Region)，8=业务(Business))
        item_list|list|该维度主营构成列表  (每项含 name、main_oper_income、ratio)

    * item_list 每项包含的字段：

        字段|类型|说明
        :-|:-|:-
        name|str|名称
        main_oper_income|float|营业收入
        ratio|float|占比  (百分号前的值，如 12.34 表示 12.34%)

    * screen_date_list 每项包含的字段：

        字段|类型|说明
        :-|:-|:-
        date|int|筛选时间戳  (秒；回传型，须为此列表中某个 date 值)
        period_text|str|财报周期  (如 "2025/FY")
        financial_type|[F10Type](./quote.md#7710)|财报类型

* **Example**

```python
import pandas as pd
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_financials_revenue_breakdown("HK.00700")
if ret == RET_OK:
    df = pd.DataFrame(data['breakdown_list'][0]['item_list'])
    print(df)
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
name  main_oper_income    ratio
0       增值服务      3.692810e+11  49.1218
1  金融科技及企业服务      2.294350e+11  30.5194
2       营销服务      1.449730e+11  19.2843
3         其他      8.077000e+09   1.0744
```

---



---

# 获取分析师评级概述

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_research_analyst_consensus(code)`

* **介绍**

    获取指定股票近3个月的分析师综合评级、目标价区间及各档评级占比

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回分析师评级数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        highest|float|最高目标价
        average|float|平均目标价
        lowest|float|最低目标价
        rating|[ResearchRatingType](./quote.md#9592)|综合评级  (近3个月分析师综合评级
0=Unknown，1=Sell，2=Underperform，3=Hold，4=Buy，5=StrongBuy
美股仅返回 Sell(1)/Hold(3)/Buy(4)，非美市场另支持 Underperform(2)/StrongBuy(5))
        total|int|总分析师人数  (近3个月参与评级的分析师总人数)
        update_time|int|更新时间戳（秒，评级数据更新时间）
        update_time_str|str|更新日期  (格式 YYYY-MM-DD，对应市场时区)
        buy|float|Buy 评级占比  (百分号前的值，如 12.34 表示 12.34%)
        hold|float|Hold 评级占比  (百分号前的值，如 12.34 表示 12.34%)
        sell|float|Sell 评级占比  (百分号前的值，如 12.34 表示 12.34%)
        strong_buy|float|Strong Buy 占比  (百分号前的值，如 12.34 表示 12.34%；仅非美市场返回)
        underperform|float|Underperform 占比  (百分号前的值，如 12.34 表示 12.34%；仅非美市场返回)

* **Example**

```python
import json
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_research_analyst_consensus("HK.00700")
if ret == RET_OK:
    print(json.dumps(data, indent=2, ensure_ascii=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
{
  "highest": 820.0,
  "average": 716.0,
  "lowest": 579.51,
  "rating": 5,
  "total": 44,
  "update_time": 1778469178,
  "update_time_str": "2026-05-11",
  "buy": 22.727,
  "hold": 0.0,
  "sell": 0.0,
  "strong_buy": 77.273,
  "underperform": 0.0
}
```

---



---

# 获取评级汇总

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_research_rating_summary(code, rating_dimension_type=None, uid=None, num=None, next_key=None)`

* **介绍**

    获取指定股票的机构或分析师评级汇总列表，或指定机构/分析师的评级详情，支持分页拉取

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    rating_dimension_type|[ResearchRatingDimensionType](./quote.md#2247)|评级维度  (0=Unknown，1=Institution（机构维度），2=Analyst（分析师维度）；默认机构维度)
    uid|str|机构或分析师 UID  (空=取该股票的评级汇总列表
非空=取该 uid 对应的评级详情（分析师 uid 须搭配 rating_dimension_type=2）)
    num|int|每页返回数量  (默认 10，范围 1~20)
    next_key|str|分页标识  (首次不传，续拉时填上次返回的 next_key；"-1" 表示无更多数据)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回评级汇总数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        inst_rating_summary_list|list|机构评级汇总列表  (uid 为空且 rating_dimension_type=1 时填充
每项含 institution_info 和 rating_item_list)
        analyst_rating_summary_list|list|分析师评级汇总列表  (uid 为空且 rating_dimension_type=2 时填充
每项含 analyst_info 和 rating_item_list)
        inst_rating_detail|dict|机构评级详情  (uid 非空且 rating_dimension_type=1 时填充
含 institution_info、analyst_info_list 和 rating_item_list)
        analyst_rating_detail|dict|分析师评级详情  (uid 非空且 rating_dimension_type=2 时填充
含 analyst_info 和 rating_item_list)
        next_key|str|分页标识  ("-1" 表示无更多数据)

    * inst_rating_summary_list 每项字段（机构评级汇总行）：

        字段|类型|说明
        :-|:-|:-
        institution_info|dict|机构信息，见下表
        rating_item_list|list|评级记录列表，见下表

    * institution_info 字段（InstInfo）：

        字段|类型|说明
        :-|:-|:-
        institution_uid|str|机构唯一标识
        institution_picture_url|str|机构图片 URL
        institution_name|str|机构名称
        update_time|int|更新时间戳（秒，对应市场时区）
        update_time_str|str|更新日期  (格式 YYYY-MM-DD，对应市场时区)
        institution_source_name|str|机构来源名称
        institution_en_name|str|机构英文名称

    * analyst_info 字段（AnalystInfo）：

        字段|类型|说明
        :-|:-|:-
        analyst_uid|str|分析师唯一标识
        analyst_name|str|分析师姓名
        analyst_picture_url|str|分析师头像 URL
        num_of_stars|float|星级  (0.0~5.0，如 3.50 表示 3.5 星)
        success_rate|float|成功率  (百分号前的值，如 12.34 表示 12.34%)
        excess_return|float|超额收益  (百分号前的值，如 12.34 表示 12.34%)
        stock_success_rate|float|个股成功率  (百分号前的值，如 12.34 表示 12.34%)
        stock_avg_return|float|个股平均收益  (百分号前的值，如 12.34 表示 12.34%)
        institution_info|dict|所属机构信息，见 institution_info 字段表
        update_time|int|更新时间戳（秒，对应市场时区）
        update_time_str|str|更新日期  (格式 YYYY-MM-DD，对应市场时区)

    * rating_item_list 每项字段（RatingItem）：

        字段|类型|说明
        :-|:-|:-
        analyst_uid|str|分析师唯一标识
        institution_uid|str|机构唯一标识
        rating|[ResearchRatingType](./quote.md#9592)|评级  (0=Unknown，1=Sell，2=Underperform，3=Hold，4=Buy，5=StrongBuy
本接口仅返回 Sell(1)/Hold(3)/Buy(4)，数值越大评级越高)
        target_price|float|目标价
        recommendation_date|int|评级日期时间戳（秒，对应市场时区）
        recommendation_date_str|str|评级日期  (格式 YYYY-MM-DD，对应市场时区)
        rating_url|str|评级来源 URL
        update_time|int|更新时间戳（秒，对应市场时区）
        update_time_str|str|更新日期  (格式 YYYY-MM-DD，对应市场时区)

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_research_rating_summary("US.AAPL", rating_dimension_type=1)
if ret == RET_OK:
    rows = []
    for row in data.get('inst_rating_summary_list', []):
        info = row.get('institution_info', {})
        rows.append({
            'institution_name':        info.get('institution_name', ''),
            'institution_en_name':     info.get('institution_en_name', ''),
            'institution_uid':         info.get('institution_uid', ''),
            'institution_source_name': info.get('institution_source_name', ''),
            'update_time_str':         info.get('update_time_str', ''),
        })
    df = pd.DataFrame(rows)
    print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
institution_name institution_en_name                      institution_uid    institution_source_name update_time_str
            韦德布什             Wedbush 8c9ae25a-07e2-4d52-a511-b0dd115a5224                    Wedbush      2024-03-01
            艾弗考尔            Evercore a746f081-c12a-4d6d-8067-f4b6634de478               Evercore ISI      2024-03-21
            瑞士银行                 UBS 1d3bfc25-1dda-48fd-bd9f-d4de47e68def                        UBS      2024-03-01
            高盛集团       Goldman Sachs d0e296b4-c2e4-4fad-837c-cd79aaed2e8e              Goldman Sachs      2024-03-01
            联博集团           Bernstein 16358c98-ccc1-4d08-a875-2c727b7b8d70                  Bernstein      2024-03-01
            星展银行                 DBS 44dec2a6-aca9-4b52-9fed-4bbf78749783                        DBS      2024-03-01
            美银证券     BofA Securities 7890753d-5482-4311-a7af-8d5feed39f3e Bank of America Securities      2024-03-01
            辉立证券  Phillip Securities a294f0ca-10c0-4884-86a7-359995505e70         Phillip Securities      2024-09-09
            摩根大通         J.P. Morgan f5ec822c-d561-4db3-a09d-a1e71a9a832f                J.P. Morgan      2024-03-01
           摩根士丹利      Morgan Stanley 9a29ac93-221c-4c1a-ba1a-bbbbf57a5ca6             Morgan Stanley      2024-03-01
```

---



---

# 获取晨星研究报告

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_research_morningstar_report(code)`

* **介绍**

    获取指定股票的晨星研究报告，包含星级评分、公允价值、护城河、不确定性、财务健康、资本配置、多空观点、分析师观点等

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回晨星研究报告数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        rating_type|[MorningstarRatingType](./quote.md#9433)|评级类型  (0=Unknown，1=Quantitative（定量评级，系统模型给出），2=Qualitative（定性评级，分析师人工给出）)
        star_rating|int|晨星星级  (取值 1~5 星)
        star_update_time|int|星级更新时间戳（秒，对应市场时区）
        star_update_time_str|str|星级更新日期  (格式 YYYY-MM-DD，对应市场时区)
        fair_value|float|公允价值
        fair_value_content|dict|公允价值分析，见 StringWithUpdateTime 字段表
        economic_moat_label|str|护城河评级  (如 Wide、Narrow、None)
        economic_moat_content|dict|护城河分析，见 StringWithUpdateTime 字段表
        uncertainty_label|str|不确定性评级  (如 Low、Medium、High、Very High、Extreme)
        uncertainty_content|dict|不确定性分析，见 StringWithUpdateTime 字段表
        financial_health_label|str|财务健康评级
        financial_health_content|dict|财务健康分析，见 StringWithUpdateTime 字段表
        analyst_report_by_line|list|分析师署名列表  (如 ["William Kerwin, CFA"])
        analyst_report_update_time|int|分析师报告更新时间戳（秒，对应市场时区）
        analyst_report_update_time_str|str|分析师报告更新日期  (格式 YYYY-MM-DD，对应市场时区)
        bull_say|list|多方观点列表，每项见 StringWithUpdateTime 字段表
        bear_say|list|空方观点列表，每项见 StringWithUpdateTime 字段表
        capital_allocation_label|str|资本配置评级
        capital_allocation_content|dict|资本配置分析，见 StringWithUpdateTime 字段表
        analyst_note_title|dict|分析师观点标题，见 StringWithUpdateTime 字段表
        analyst_note_content|dict|分析师观点内容，见 StringWithUpdateTime 字段表
        investment_thesis_content|dict|投资论点，见 StringWithUpdateTime 字段表
        fundamentals_content|dict|基本面报告，见 StringWithUpdateTime 字段表
        valuation_content|dict|估值报告，见 StringWithUpdateTime 字段表
        pdf_url|str|PDF 报告下载链接

    * StringWithUpdateTime 字段（嵌套文本结构）：

        字段|类型|说明
        :-|:-|:-
        context|str|文本内容
        update_time|int|更新时间戳（秒，对应市场时区）
        update_time_str|str|更新日期  (格式 YYYY-MM-DD，对应市场时区)

* **Example**

```python
import json
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_research_morningstar_report("HK.00700")
if ret == RET_OK:
    print(json.dumps(data, indent=2, ensure_ascii=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
{
  "rating_type": 2,
  "star_rating": 4,
  "star_update_time": 1778257800,
  "star_update_time_str": "2026-05-09",
  "fair_value": 800.0,
  "fair_value_content": {
    "context": "我们对腾讯控股的每股公平价值估计为800港元。我们的估值中约85%来自于腾讯的核心业务，而...
    "update_time": 1755138060,
    "update_time_str": "2025-08-14"
  },
  "economic_moat_label": "宽",
  "economic_moat_content": {
    "context": "腾讯的宽护城河主要基于其庞大用户群的网络效应。此外，腾讯还拥有无形资产、成本优势和...
    "update_time": 1766457150,
    "update_time_str": "2025-12-23"
  },
  "uncertainty_label": "较高",
  "uncertainty_content": {
    "context": "由于监管风险及其核心业务的竞争强度，我们对腾讯的晨星不确定性评级为高。\n\n在支付领域，...
    "update_time": 1766457180,
    "update_time_str": "2025-12-23"
  },
  //...
 }
```

---



---

# 获取个股/指数估值详情

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_valuation_detail(code, valuation_type=None, interval_type=None)`

* **介绍**

    获取指定股票或指数的估值详情，包含估值走势、市场分布、行业分布（仅个股）、盈利/营收增速（仅个股，PB 无）

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    valuation_type|[ValuationType](./quote.md#5459)|估值类型  (0=Unknown（使用推荐类型），1=PE（市盈率），2=PB（市净率），3=PS（市销率）；默认 None（使用推荐类型）)
    interval_type|[ValuationIntervalType](./quote.md#971)|历史数据时间周期  (0=Unknown，1=Month3，2=Month6，3=Year1，4=Year3，5=Since2019，6=Year5，7=Year10，8=Year2，9=Year20，10=Year30；默认 None)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回估值详情数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        valuation_type|[ValuationType](./quote.md#5459)|实际估值类型  (0=Unknown，1=PE，2=PB，3=PS)
        last_update_time|int|最后更新时间戳（秒，对应市场时区）
        last_update_time_str|str|最后更新时间  (格式 YYYY-MM-DD HH:MM:SS，对应市场时区)
        trend|dict|走势数据，见 trend 字段表
        market_distribution|dict|市场分布数据，见 market_distribution 字段表
        plate_distribution|dict|行业分布数据，见 plate_distribution 字段表  (仅个股返回)
        profit_growth_rate|dict|盈利/营收增速数据，见 profit_growth_rate 字段表  (仅个股返回，PB 估值无此字段)

    * trend 字段（估值走势摘要）：

        字段|类型|说明
        :-|:-|:-
        current_value|float|当前估值
        average_value|float|历史平均估值
        avg_minus_1_stddev|float|历史平均 - 1σ
        avg_plus_1_stddev|float|历史平均 + 1σ
        valuation_percentile|float|历史分位  (百分号前的值，如 12.34 表示 12.34%)
        forward_value|float|预测估值  (仅 PE / PS 有)
        historical_items|list|历史估值列表，每项见 historical_items 字段表

    * historical_items 字段（历史估值条目）：

        字段|类型|说明
        :-|:-|:-
        value|float|估值
        time|int|时间戳（秒，对应市场时区）
        time_str|str|日期  (格式 YYYY-MM-DD，对应市场时区)
        plate_value|float|行业均值

    * market_distribution 字段（市场/成分股分布）：

        字段|类型|说明
        :-|:-|:-
        sections|list|区间分布列表（降序），每项见 sections 字段表
        total|int|市场总数/成分股总数
        ranking|int|该股票估值在市场中的排名  (指数无此字段)
        average_value|float|市场估值均值  (指数无此字段)
        median_value|float|市场估值中位数  (指数无此字段)

    * sections 字段（区间分布条目）：

        字段|类型|说明
        :-|:-|:-
        start|float|区间开始值
        end|float|区间结束值  (0 表示无上限)
        number|int|该区间个股数量

    * plate_distribution 字段（行业分布，仅个股）：

        字段|类型|说明
        :-|:-|:-
        plate|str|所属板块代码
        plate_name|str|所属板块名称
        plate_average_value|float|板块估值均值
        plate_ranking|int|该股票估值在板块中的排名
        plate_stock_item_count|int|板块个股总数
        stock_items|list|板块成分股估值明细，每项见 stock_items 字段表

    * stock_items 字段（板块成分股条目）：

        字段|类型|说明
        :-|:-|:-
        security|str|股票代码
        name|str|个股名称
        value|float|估值
        market_cap|float|市值

    * profit_growth_rate 字段（盈利/营收增速，仅个股非 PB）：

        字段|类型|说明
        :-|:-|:-
        financial_ttm_multiple|float|TTM 增长倍数
        market_cap_multiple|float|市值增长倍数
        year_count|int|计算增长倍数时实际用到的年份数量
        profit_data|list|各期数据列表，每项见 profit_data 字段表
        conclusion_detailed|str|估值结论描述

    * profit_data 字段（各期盈利/营收条目）：

        字段|类型|说明
        :-|:-|:-
        financial_year|int|财报年度
        financial_quarter|int|财报季度  (1=Q1，2=Q2，3=Q3，4=FY)
        period_str|str|财报周期  (如 "2024/Q3"、"2024/FY")
        report_date|int|报告日时间戳（秒，对应市场时区）
        report_date_str|str|报告日  (格式 YYYY-MM-DD，对应市场时区)
        market_cap_multiple|float|报告日市值倍数  (基准期 = 1)
        finance_data_multiple|float|盈利/营收倍数  (基准期 = 1，依 valuation_type 而定)

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_valuation_detail("HK.00700")
if ret == RET_OK:
    trend = data.get('trend', {})
    items = trend.get('historical_items', [])
    df = pd.DataFrame(items)
    print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
value       time   time_str  plate_value
22.690 1746979200 2025-05-12       22.678
22.186 1747065600 2025-05-13       22.179
22.843 1747152000 2025-05-14       22.817
22.046 1747238400 2025-05-15       22.050
21.538 1747324800 2025-05-16       21.577
21.792 1747584000 2025-05-19       21.821
//...
18.087 1776960000 2026-04-24       18.147
17.544 1777219200 2026-04-27       17.617
17.368 1777305600 2026-04-28       17.444
17.566 1777392000 2026-04-29       17.650
17.148 1777478400 2026-04-30       17.227
17.339 1777824000 2026-05-04       17.421
17.310 1777910400 2026-05-05       17.393
16.972 1777996800 2026-05-06       17.059
17.500 1778083200 2026-05-07       17.589
17.266 1778169600 2026-05-08       17.364
17.039 1778428800 2026-05-11       17.143
```

---



---

# 获取板块/指数成分股估值列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_valuation_plate_stock_list(code, valuation_type=None, next_key=None, num=None, sort_type=None, sort_id=None, filter_security=None)`

* **介绍**

    获取板块或指数成分股的估值列表，包含估值、预测估值、历史分位、市值；指数首次全量请求还返回所属板块列表

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|板块或指数代码  (如 HK.LIST23363（板块）或 HK.800000（指数）；不支持个股)
    valuation_type|[ValuationType](./quote.md#5459)|估值类型  (0=Unknown，1=PE（市盈率），2=PB（市净率），3=PS（市销率）；默认 None（1=PE）)
    next_key|str|分页标识  (首次不传，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (默认 10，范围 1~50)
    sort_type|[SortType](./quote.md#7169)|排序方向  (1=Desc（降序），2=Asc（升序）；默认 None（升序）)
    sort_id|[SortField](./quote.md#2930)|排序列  (51=市值（默认），52=估值，53=预测估值，54=历史分位)
    filter_security|str|板块筛选  (仅指数有效，按行业/板块筛选成分股，如 HK.LIST23363；不传则不筛选)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回成分股估值数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        count|int|成分股总数
        stock_list|list|成分股估值列表，每项见 stock_list 字段表
        next_key|str|分页标识  ("-1" 表示无更多数据)
        plate_list|list|所属板块列表  (仅指数全量首次请求时返回，每项见 plate_list 字段表)

    * stock_list 字段（成分股估值条目）：

        字段|类型|说明
        :-|:-|:-
        symbol|str|股票代码
        valuation_val|float|估值
        forward_value|float|预测估值  (当前仅支持 PE 和 PS)
        valuation_percentile|float|历史分位  (百分号前的值，如 12.34 表示 12.34%)
        market_cap|float|市值
        name|str|股票名称

    * plate_list 字段（指数所属板块条目）：

        字段|类型|说明
        :-|:-|:-
        symbol|str|板块代码
        name|str|板块名称

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_valuation_plate_stock_list("HK.LIST23363")
if ret == RET_OK:
    df = pd.DataFrame(data.get('stock_list', []))
    print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
symbol         name  valuation_val  valuation_percentile   market_cap
HK.08076         新利软件         -2.300             65.337673 3.029652e+07
HK.08092 ITE HOLDINGS         19.500             98.209927 3.609481e+07
HK.08036       电子交易集团        -12.000             35.313263 4.428000e+07
HK.01561       联洋智能控股        -23.500              1.057770 5.007634e+07
HK.08071       中彩网通控股        -12.000             39.951180 5.623258e+07
HK.00248     香港通讯国际控股         -2.056             19.446705 6.771489e+07
HK.01613         协同通信         -2.796             72.660700 8.841764e+07
HK.08062         俊盟国际        -93.333              0.244101 1.344000e+08
HK.01949       佰达国际控股         -5.147             36.523929 1.344000e+08
HK.01206         同方泰德         -0.314             41.171684 1.720823e+08
```

---



---

# 获取分红派息

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_corporate_actions_dividends(code)`

* **介绍**

    获取股票的分红派息历史记录

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持正股及基金)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回分红派息数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        dividend_list|list|分红派息列表  (按公告日倒序排列，每项见 dividend_list 字段表)

    * dividend_list 字段（分红派息条目）：

        字段|类型|说明
        :-|:-|:-
        pub_date|str|公告日  (格式 YYYY/MM/DD，对应市场时区)
        statement|str|分配方案  (如"末期息5.3港元")
        process|str|事件进展  (如"方案实施"/"预案"；仅港股和A股的正股与信托有值)
        record_date|str|股权登记日  (格式 YYYY/MM/DD，对应市场时区；ETF 无此数据)
        ex_date|str|除权除息日  (格式 YYYY/MM/DD，对应市场时区)
        dividend_payable_date|str|派息日  (格式 YYYY/MM/DD，对应市场时区)
        fiscal_year|str|财政年度  (如"2026"。仅ETF有值。)

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_corporate_actions_dividends("HK.00700")
if ret == RET_OK:
    df = pd.DataFrame(data.get('dividend_list', []))
    print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
pub_date                                           statement process record_date    ex_date dividend_payable_date
2026/03/18                                           末期息5.3港元;      预案  2026/05/18 2026/05/15            2026/06/01
2025/03/19                                           末期息4.5港元;    方案实施  2025/05/19 2025/05/16            2025/05/30
2024/03/20                                           末期息3.4港元;    方案实施  2024/05/20 2024/05/17            2024/05/31
2023/03/22                                           末期息2.4港元;    方案实施  2023/05/22 2023/05/19            2023/06/05
2022/11/16                      实物分派：按于记录日期持有每10股股份获发1股美团B类普通股    方案实施  2023/01/06 2023/01/05            2023/03/24
2022/03/23                                           末期息1.6港元;    方案实施  2022/05/23 2022/05/20            2022/06/06
2021/12/23                          实物分派:每持有21股股份获发1股京东集团A类普通股    方案实施  2022/01/21 2022/01/20            2022/03/25
2021/03/24                                           末期息1.6港元;    方案实施  2021/05/25 2021/05/24            2021/06/07
2020/03/18                                           末期息1.2港元;    方案实施  2020/05/18 2020/05/15            2020/05/29
2019/03/21                                             末期息1港元;    方案实施  2019/05/20 2019/05/17            2019/05/31
2018/12/03       实物分派:每持有3,900股股份获分派1股腾讯音乐娱乐集团美国预托股份(连同选择现金替代)    方案实施  2019/01/02 2018/12/28            2019/02/20
2018/03/21                                          末期息0.88港元;    方案实施  2018/05/21 2018/05/18            2018/06/01
2017/06/30 优先发售：合资格股东优先售股每持有1,256股可认购1股ChinaLiteratureLtd.预留股份    方案实施  2017/10/19 2017/10/18            2017/11/07
2017/03/22                                           末期息0.61港元    方案实施  2017/05/22 2017/05/19            2017/06/02
2016/03/17                                           末期息0.47港元    方案实施  2016/05/23 2016/05/20            2016/06/02
2015/03/18                                        末期股息每股0.36港元    方案实施  2015/05/18 2015/05/15            2015/05/29
2014/03/19                       末期息1.2港元(待股份拆细后每股拆细股份HKD0.24)    方案实施  2014/05/19 2014/05/16            2014/05/30
2013/03/20                                              末期息1港元    方案实施  2013/05/21 2013/05/20            2013/05/30
2012/03/14                                           末期息0.75港元    方案实施  2012/05/21 2012/05/18            2012/05/30
2011/03/16                                           末期息0.55港元    方案实施  2011/05/04 2011/05/03            2011/05/25
2010/03/17                                           末期股息0.4港元    方案实施  2010/05/06 2010/05/05            2010/05/26
2009/03/18                                末期息0.25港元,特别股息0.10港元    方案实施  2009/05/07 2009/05/06            2009/05/27
2008/03/19                                           末期息0.16港元    方案实施  2008/05/07 2008/05/06            2008/05/28
2007/03/21                                          末期息0.12港元;    方案实施  2007/05/10 2007/05/09            2007/05/30
2006/03/22                                          末期息0.08港元;    方案实施  2006/05/16 2006/05/15            2006/06/07
2005/03/17                                          末期息0.07港元;    方案实施  2005/04/20 2005/04/19            2005/05/17
```

---



---

# 获取回购

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_corporate_actions_buybacks(code, next_key=None, num=None)`

* **介绍**

    获取股票的回购记录（港股 / A 股，支持分页）

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持港股、A股正股及基金)
    next_key|str|分页标识  (首次不填，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (每页返回数量，默认 10，范围 1~50)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回回购数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        next_key|str|分页标识  ("-1" 表示无更多数据；续拉时将此值传入请求参数 next_key)
        hk_buy_back_list|pd.DataFrame|港股回购列表  (每项见 hk_buy_back_list 字段表；A股标的此列表为空)
        a_buy_back_list|pd.DataFrame|A股回购列表  (每项见 a_buy_back_list 字段表；港股标的此列表为空)

    * hk_buy_back_list 字段（港股回购条目）：

        字段|类型|说明
        :-|:-|:-
        publ_date|int|公告日时间戳  (Unix 时间戳（秒），对应市场时区)
        publ_date_str|str|公告日  (格式 YYYY-MM-DD，对应市场时区)
        end_date|int|回购截止日时间戳  (Unix 时间戳（秒），对应市场时区)
        end_date_str|str|回购截止日  (格式 YYYY-MM-DD，对应市场时区)
        buy_back_money|float|回购金额
        buy_back_sum|int|回购股数  (单位：股)
        percentage|float|占总股本比例  (百分号前的值，如 12.34 表示 12.34%)
        high_price|float|最高回购价
        low_price|float|最低回购价
        cumulative_sum|int|本轮累计回购股数  (单位：股)
        cumulative_percentage|float|本轮累计占总股本比例  (百分号前的值，如 12.34 表示 12.34%)
        share_type|str|股份类别

    * a_buy_back_list 字段（A股回购条目）：

        字段|类型|说明
        :-|:-|:-
        change_reg_date|int|工商变更登记日时间戳  (Unix 时间戳（秒），对应市场时区)
        change_reg_date_str|str|工商变更登记日  (格式 YYYY-MM-DD，对应市场时区)
        change_date|int|股份变动日时间戳  (Unix 时间戳（秒），对应市场时区)
        change_date_str|str|股份变动日  (格式 YYYY-MM-DD，对应市场时区)
        event_proce_desc|str|事件进程描述
        advance_date|int|预案公告日时间戳  (Unix 时间戳（秒），对应市场时区)
        advance_date_str|str|预案公告日  (格式 YYYY-MM-DD，对应市场时区)
        meet_pass_date|int|股东大会通过日时间戳  (Unix 时间戳（秒），对应市场时区)
        meet_pass_date_str|str|股东大会通过日  (格式 YYYY-MM-DD，对应市场时区)
        start_date|int|回购开始日时间戳  (Unix 时间戳（秒），对应市场时区)
        start_date_str|str|回购开始日  (格式 YYYY-MM-DD，对应市场时区)
        end_date|int|回购截止日时间戳  (Unix 时间戳（秒），对应市场时区)
        end_date_str|str|回购截止日  (格式 YYYY-MM-DD，对应市场时区)
        pay_date|int|支付日时间戳  (Unix 时间戳（秒），对应市场时区)
        pay_date_str|str|支付日  (格式 YYYY-MM-DD，对应市场时区)
        seller|str|出售方  (股份被回购方)
        buy_back_mode|str|回购方式
        share_type|str|股份类别
        buy_back_sum|int|回购股数  (单位：股)
        buy_back_money|float|回购金额
        percentage|float|占总股本比例  (百分号前的值，如 12.34 表示 12.34%)
        value_floor|float|拟回购资金总额下限
        value_ceiling|float|拟回购资金总额上限
        price_floor|float|回购价格下限
        price_ceiling|float|回购价格上限
        volume_floor|float|拟回购股数下限
        volume_ceiling|float|拟回购股数上限

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_corporate_actions_buybacks("HK.00700", num=3)
if ret == RET_OK:
    df = pd.DataFrame(data.get('hk_buy_back_list', []))
    print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
publ_date publ_date_str   end_date end_date_str  buy_back_money  buy_back_sum  percentage  high_price  low_price  cumulative_sum  cumulative_percentage share_type
1775664000    2026-04-09 1775664000   2026-04-09    1000880717.6       1964000    0.021373       514.5      503.0       119812000                1.30386        普通股
1775577600    2026-04-08 1775577600   2026-04-08    1000761103.7       1979000    0.021537       510.0      501.0       117848000                1.28249        普通股
1775059200    2026-04-02 1775059200   2026-04-02     300715258.5        615000    0.006693       496.0      485.2       115869000                1.26095        普通股
```

---



---

# 获取拆合股

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_corporate_actions_stock_splits(code, next_key=None, num=None)`

* **介绍**

    获取股票的拆合股历史记录（港股有额外字段），支持分页

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 US.AAPL；支持港股、美股正股及基金)
    next_key|str|分页标识  (首次不填，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (每页返回数量，默认 10，范围 1~50)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回拆合股数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        next_key|str|分页标识  ("-1" 表示无更多数据；续拉时将此值传入请求参数 next_key)
        split_list|list|拆合股列表  (每项见 split_list 字段表)

    * split_list 字段（拆合股条目）：

        字段|类型|说明
        :-|:-|:-
        dir_deci_pub_date|int|公告日时间戳  (Unix 时间戳（秒），对应市场时区)
        dir_deci_pub_date_str|str|公告日  (格式 YYYY-MM-DD，对应市场时区)
        reform_type|str|重组方式
        rate|str|比率
        ex_date|int|除权日时间戳  (仅港股的正股与信托有值；Unix 时间戳（秒），对应市场时区)
        ex_date_str|str|除权日  (仅港股的正股与信托有值；格式 YYYY-MM-DD，对应市场时区)
        sm_deci_date|int|决议日时间戳  (仅港股的正股与信托有值；Unix 时间戳（秒），对应市场时区)
        sm_deci_date_str|str|决议日  (仅港股的正股与信托有值；格式 YYYY-MM-DD，对应市场时区)
        temp_trade_begin_date|int|临时买卖日时间戳  (仅港股的正股与信托有值；Unix 时间戳（秒），对应市场时区)
        temp_trade_begin_date_str|str|临时买卖日  (仅港股的正股与信托有值；格式 YYYY-MM-DD，对应市场时区)
        simul_trade_begin_date|int|并行买卖开始日时间戳  (仅港股的正股与信托有值；Unix 时间戳（秒），对应市场时区)
        simul_trade_begin_date_str|str|并行买卖开始日  (仅港股的正股与信托有值；格式 YYYY-MM-DD，对应市场时区)
        simul_trade_end_date|int|并行买卖结束日时间戳  (仅港股的正股与信托有值；Unix 时间戳（秒），对应市场时区)
        simul_trade_end_date_str|str|并行买卖结束日  (仅港股的正股与信托有值；格式 YYYY-MM-DD，对应市场时区)
        event_status|str|事件进程  (仅港股的正股与信托有值；如：方案实施)
        new_par_value|float|新面值  (仅港股的正股与信托有值)
        temp_share_code|str|临时证券代码  (仅港股的正股与信托有值；如：02988)
        temp_share_abbr_name|str|临时证券简称  (仅港股的正股与信托有值；如：腾讯控股)
        new_trade_unit|int|新买卖单位  (仅港股的正股与信托有值；如：100)
        shares_after_effect|float|生效后股数  (仅港股的正股与信托有值；单位：股)

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_corporate_actions_stock_splits("HK.00700", num=3)
if ret == RET_OK:
    df = pd.DataFrame(data.get('split_list', []))
    print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
dir_deci_pub_date  dir_deci_pub_date_str reform_type   rate    ...  temp_share_abbr_name  new_trade_unit  shares_after_effect
        1395158400             2014-03-19        拆股    1->5   ...               腾讯控股             100         9319999970.0
```

---



---

# 获取持股统计

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_shareholders_overview(code, period_id=None)`

* **介绍**

    获取指定股票的持股统计，同时返回主要股东和持股类型两组数据

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持港股、美股正股及基金)
    period_id|int|报告期 ID  (传 0 或不传则返回最新数据，并额外返回可用报告期列表；报告期 ID 可从 holding_period 列表中获取)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回持股统计数据字典</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回字典包含以下字段：

        字段|类型|说明
        :-|:-|:-
        main_holder|pd.DataFrame|主要股东列表  (每项见 main_holder 字段表)
        holder_type|pd.DataFrame|持股类型列表  (每项见 holder_type 字段表；结构与 main_holder 相同，holder_id 固定为 0)
        holding_period|pd.DataFrame|可用报告期列表  (仅当请求 period_id 为 0 或不传时返回；每项见 holding_period 字段表)

    * main_holder / holder_type 字段（持股统计条目）：

        字段|类型|说明
        :-|:-|:-
        static_date|int|统计日期时间戳  (Unix 时间戳（秒），对应市场时区)
        static_date_str|str|统计日期  (格式 YYYY-MM-DD，对应市场时区)
        name|str|持股人名称  (持股人或分组名称)
        holder_pct|float|持股占比  (百分号前的值，如 23.05 表示 23.05%)
        holder_id|int|股东 ID  (main_holder 中有值；holder_type 中固定为 0)

    * holding_period 字段（可用报告期条目）：

        字段|类型|说明
        :-|:-|:-
        period_text|str|报告期  (如 "2025/Q3")
        period_id|int|报告期 ID  (下次请求时原样传入 period_id 参数)

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_shareholders_overview("HK.00700")
if ret == RET_OK:
    df = data.get('main_holder')
    if df is not None:
        print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
static_date static_date_str                 name  holder_pct   holder_id
  1778469438      2026-05-11 Prosus Ventures N.V.    23.05351 337488017.0
  1778469438      2026-05-11           Huateng Ma     7.86952  10253703.0
  1778469438      2026-05-11                 先锋领航     2.97766    417222.0
  1778469438      2026-05-11                  贝莱德     2.66990    403413.0
  1778469438      2026-05-11             挪威银行投资管理     1.36075  27081864.0
  1778469438      2026-05-11                   其他    62.06866         NaN
```

---



---

# 获取持股变动

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_shareholders_holding_changes(code, next_key=None, num=None, sort_type=None, sort_column=None, filter_type=None)`

* **介绍**

    获取指定股票的持股变动记录，支持分页拉取

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持港股、美股正股及基金)
    next_key|str|分页标识  (首次不传，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (默认 10，范围 1~50)
    sort_type|SortType|排序方向  (1=降序（默认），2=升序)
    sort_column|SortField|排序字段  (62=持股变动数（默认），63=持股日期，64=变动比例，65=变动金额，66=持股比例)
    filter_type|HoldingChangesFilterType|筛选类型  (0=全部（默认），1=增持，2=减持，3=建仓，4=清仓)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回持股变动记录 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        period_text|str|报告期  (如 "2026/Q1")
        name|str|股东名称
        holder_id|int|股东 ID  (用于请求历史变动明细)
        share_change_num|int|持股变动数  (单位：股)
        shares_change_price|int|参考变动金额  (单位：港元或美元（依市场而定）)
        share_ratio|float|持股比例  (百分号前的值，如 12.34 表示 12.34%)
        holder_type|str|持股性质  (文本描述，如"传统投资经理")
        holder_type_id|int|持股性质 ID  (用于请求历史变动明细)
        holding_date_str|str|报告日期  (格式 YYYY-MM-DD，香港时区)
        share_ratio_change|float|变动比例  (百分号前的值，如 12.34 表示变动 12.34%)
        share_num|int|持股数  (单位：股)
        next_key|str|分页标识  ("-1" 表示无更多数据；续拉时原样传入 next_key 参数)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_shareholders_holding_changes("HK.00700")
if ret == RET_OK:
    print(data[['period_text', 'name', 'share_change_num', 'share_ratio', 'share_ratio_change']].to_string(index=False))
    print('next_key:', data['next_key'][0])
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
period_text                                name  share_change_num  share_ratio  share_ratio_change
    2026/Q1                                 贝莱德           7971983        2.669               0.088
    2026/Q1       CSOP Asset Management Limited           6691695        0.192               0.074
    2026/Q1                              恒生投资管理           4870059        0.395               0.053
    2026/Q1                        GQG Partners           3289800        0.146               0.036
    2026/Q1                                先锋领航           2837500        2.977               0.031
    2026/Q1 Pinebridge Investments Asia Limited           2316700        0.073               0.025
    2026/Q1                                资本集团           2214900        0.948               0.024
    2026/Q1                              澳洲养老基金           2214046        0.116               0.024
    2026/Q1                            未来资产环球投资           1852929        0.096               0.020
    2026/Q1                                柏基投资           1831832        0.395               0.020
next_key: 10
```

---



---

﻿# 获取持股明细

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_shareholders_holder_detail(code, request_type=None, next_key=None, num=None, sort_column=None, sort_type=None, period_id=None, holder_id=None)`

* **介绍**

    获取股票某一持股类型下的持有人明细列表，支持分页拉取

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 US.AAPL；支持港股、美股正股及基金)
    request_type|[HolderDetailType](./quote.md#8148)|持股类型  (0=Default，1000=All，1=其他机构，2=传统投资经理，3=对冲基金，4=风险资本/私募，5=企业年金，6=基金会基金，7=保险公司，8=银行/投资银行，9=家族办公室/信托，10=主权财富基金，11=REIT，12=结构化融资经理，13=联合养老金，14=政府养老金，15=捐赠基金，100=个人，200=ADS，300=上市公司，400=未公开上市公司，500=国有股；默认按服务端默认逻辑返回)
    next_key|str|分页标识  (首次不传，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (默认 10，范围 1~50)
    sort_column|[SortField](./quote.md#2930)|排序字段  (61=持股股数（默认），62=持股变动数)
    sort_type|[SortType](./quote.md#7169)|排序方向  (1=降序（默认），2=升序)
    period_id|int|报告期 ID  (与 Qot_GetShareholdersOverview（3237）返回的 holdingPeriodList 中 periodId 一致；默认 0 表示最新周期)
    holder_id|int|持有人 ID 过滤  (默认 0 表示不过滤；可取自 GetShareholdersOverview（3237）、GetShareholdersHoldingChanges（3238）、本协议（3239）、GetInsiderHolderList（3241）、GetInsiderTradeList（3242）返回的 holder_id)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回持股明细 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        update_time_str|str|数据更新时间  (格式 YYYY-MM-DD HH:MM:SS，对应市场时区)
        next_key|str|分页标识  ("-1" 表示无更多数据；续拉时原样传入 next_key 参数)
        period_text|str|报告期  (如 "2026/Q1")
        holder_id|int|持股人 ID  (可用于其他持股相关协议的 holder_id 过滤)
        name|str|股东名称
        holder_quantity|int|总持股数  (单位：股)
        holder_quantity_change|int|持股变动数  (单位：股；正为增持，负为减持)
        holder_pct|float|持股比例  (百分号前的值，如 12.34 表示 12.34%)
        holder_pct_change|float|持股变动比例  (百分号前的值，如 12.34 表示变动 12.34%；负值为减少)
        holding_date_str|str|持股日期  (格式 YYYY-MM-DD，香港时区)
        close_price|float|持股日期收盘价  (对应持股日期的收盘价（真实价格）)
        price_change_pct|float|价格涨跌幅  (百分号前的值，如 -0.4467 表示 -0.4467%)
        source_group_name|str|数据来源  (持股明细披露信息来源，如 "13F"、"13F数据汇总" 等)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_shareholders_holder_detail("HK.00700", request_type=1000)
if ret == RET_OK:
    print(data[['period_text', 'name', 'holder_quantity', 'holder_pct', 'holder_pct_change']].to_string(index=False))
    print('next_key:', data.attrs.get('next_key', '-1'))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
period_text                        name  holder_quantity  holder_pct  holder_pct_change
    2026/Q1        Prosus Ventures N.V.       2079512000      23.053             -0.285
    2026/Q1                  Huateng Ma        709859700       7.869              0.000
    2026/Q1                        先锋领航        268596433       2.977              0.031
    2026/Q1                         贝莱德        240834898       2.669              0.088
    2026/Q1                    挪威银行投资管理        122744699       1.360             -0.083
    2026/Q1                     富达管理与研究         86765121       0.961             -0.232
    2026/Q1                        资本集团         85568118       0.948              0.024
    2026/Q1                        摩根大通         62437911       0.692             -0.025
    2026/Q1 E Fund Management Co., Ltd.         52722677       0.584              0.000
    2026/Q1                        柏基投资         35674108       0.395              0.020
next_key: 10
```

---



---

# 获取机构持股

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_shareholders_institutional(code, next_key=None, num=None)`

* **介绍**

    获取股票的机构持股人数及持股量历史，支持分页拉取

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 US.AAPL；支持港股、美股正股及基金)
    next_key|str|分页标识  (首次不传，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (默认 10，范围 1~50)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回机构持股 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        period_text|str|报告期  (如 "2026/Q1")
        institution_quantity|int|机构持股家数  (单位：家)
        institution_quantity_change|int|机构家数变动  (单位：家；正为增加，负为减少)
        holder_quantity|int|机构持股总股数  (单位：股)
        holder_quantity_change|int|持股股数变动  (单位：股；正为增持，负为减持)
        holder_pct|float|持股比例  (百分号前的值，如 12.34 表示 12.34%)
        holder_pct_change|float|持股比例变动  (百分号前的值，如 12.34 表示变动 12.34%；负值为减少)
        update_time_str|str|数据更新时间  (格式 YYYY-MM-DD HH:MM:SS，对应市场时区)
        next_key|str|分页标识  ("-1" 表示无更多数据；续拉时原样传入 next_key 参数)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_shareholders_institutional("HK.00700")
if ret == RET_OK:
    print(data[['period_text', 'institution_quantity', 'holder_quantity', 'holder_pct']].to_string(index=False))
    print('next_key:', data.attrs.get('next_key', '-1'))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
period_text  institution_quantity  holder_quantity  holder_pct
    2026/Q1                   863       4192178205      46.474
    2025/Q4                   873       4195284653      46.444
    2025/Q3                   854       4219387239      46.614
    2025/Q2                   839       4254708217      46.881
    2025/Q1                   809       4236696253      46.491
    2024/Q4                   808       4331865949      47.431
    2024/Q3                   803       4404605110      47.919
    2024/Q2                   846       4438538978      47.926
    2024/Q1                   824       4484844061      48.055
    2023/Q4                   857       4472729401      47.717
next_key: -1
```

---



---

# 获取内部人持股列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_insider_holder_list(code, next_key=None, num=None)`

* **介绍**

    获取美股股票内部人（高管/董事/大股东）的持股列表，支持分页拉取；首页额外返回内部人统计摘要

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 US.AAPL；支持美股正股及基金)
    next_key|str|分页标识  (首次不传，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (默认 10，范围 1~20)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回内部人持股 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        holder_id|int|股东 ID  (可作为 get_insider_trade_list 和 get_shareholders_holder_detail 的入参)
        holder_quantity|int|总持股数  (单位：股)
        holder_pct|float|持股比例  (百分号前的值，如 12.34 表示 12.34%)
        name|str|股东名称
        title|str|股东职位
        all_count|int|总条数
        next_key|str|分页标识  ("-1" 表示无更多数据；续拉时原样传入 next_key 参数)
        insider_total_count|int|内部人总人数  (仅首页（next_key 为空时）返回)
        insider_bought_count|int|买入人数  (内部人买入总人数；仅首页返回)
        insider_sold_count|int|卖出人数  (内部人卖出总人数；仅首页返回)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_insider_holder_list("US.AAPL")
if ret == RET_OK:
    print(data[['holder_id', 'name', 'title', 'holder_quantity', 'holder_pct']].to_string(index=False))
    print('insider_total:', data['insider_total_count'].iloc[0])
    print('next_key:', data['next_key'].iloc[0])
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
holder_id             name                           title  holder_quantity  holder_pct
    234085  Arthur Levinson                         独立非执行主席          4125576       0.028
    169600     Timothy Cook                           首席执行官          3280418       0.022
 626415138       Sabih Khan                              高管          1105527       0.007
  34123508 Katherine  Adams                           高级副总裁           175408       0.001
 531640091  Deirdre O’Brien Senior Vice President of Retail           136810       0.000
    285767     Ronald Sugar                            独立董事           110566       0.000
  50035778     Luca Maestri                           首席财务官            91304       0.000
    253136      Andrea Jung                            独立董事            77664       0.000
  22072913     Susan Wagner                            独立董事            69788       0.000
1976351584      Ben Borders    Principal Accounting Officer            39987       0.000
insider_total: 17
next_key: 10
```

---



---

# 获取内部人交易

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_insider_trade_list(code, holder_id=None, num=None, next_key=None)`

* **介绍**

    获取美股股票内部人（高管/董事/大股东）的交易记录列表，支持按持有人过滤和分页续拉

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 US.AAPL；支持美股正股及基金)
    holder_id|int|持有人 ID  (不传则查询全部内部人；可取自 get_insider_holder_list（3241）或本接口返回的 holder_id)
    num|int|每页数量  (默认 10，范围 1~50)
    next_key|str|分页标识  (首次不传，续拉时填上次返回的 next_key；"-1" 表示无更多数据)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回内部人交易 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        trade_shares|int|交易股数  (正数为买入/获得，负数为卖出)
        min_trade_date|int|最小交易日期时间戳  (Unix 时间戳（秒），对应市场时区)
        min_trade_date_str|str|最小交易日期字符串  (格式 YYYY-MM-DD，对应市场时区)
        max_trade_date|int|最大交易日期时间戳  (Unix 时间戳（秒），对应市场时区)
        max_trade_date_str|str|最大交易日期字符串  (格式 YYYY-MM-DD，对应市场时区)
        min_price|float|最小交易价格
        max_price|float|最大交易价格
        security_holder_quantity|int|证券类型持股数  (交易后的证券持股总数；意向出售等情形下可能为空)
        is_proposed_sale_of_securities|bool|计划出售  (是否为计划出售证券（Form 144 申报）)
        holder_id|int|股东 ID
        name|str|股东名称
        title|str|股东职位
        security_description|str|证券类型描述  (如"普通股")
        transaction_type|str|交易类型  (如"卖出"、"行权获得"、"行权卖出"、"意向出售"等)
        source_group_name|str|数据来源  (如"Form 4"、"Form 144")
        all_count|int|总条数
        next_key|str|分页标识  ("-1" 表示无更多数据；续拉时原样传入 next_key 参数)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_insider_trade_list("US.AAPL")
if ret == RET_OK:
    print(data[['holder_id', 'name', 'title', 'transaction_type', 'trade_shares']].to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
holder_id             name                           title transaction_type  trade_shares
    234085  Arthur Levinson                         独立非执行主席               卖出       -250000
    234085  Arthur Levinson                         独立非执行主席             其他处置         -5000
  34123508 Katherine  Adams                           高级副总裁             意向出售        -43000
1892533533     Kevan Parekh                           首席财务官               卖出         -1534
1892533533     Kevan Parekh                           首席财务官             行权获得          6135
1892533533     Kevan Parekh                           首席财务官             行权卖出         -4793
1976351584      Ben Borders    Principal Accounting Officer             行权获得           825
1976351584      Ben Borders    Principal Accounting Officer             行权卖出          -892
    169600     Timothy Cook                           首席执行官             意向出售        -64949
 531640091  Deirdre O’Brien Senior Vice President of Retail             意向出售        -30002
```

---



---

# 获取公司概况

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_company_profile(code)`

* **介绍**

    获取指定股票的公司概况标签列表，包含文本、链接和章节标题等信息

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持正股及基金)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回公司概况 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        name|str|标签名
        value|str|标签内容
        field_type|[CompanyProfileFieldType](./quote.md#2227)|标签类型  (0=SourceText（普通文本），1=LinkType（链接），2=IndependentTitle（独立章节标题）)

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_company_profile("HK.00700")
if ret == RET_OK:
    print(data.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
field_type  name                    value
0           公司代码                00700
0           公司名称                腾讯控股有限公司
0           ISIN代码                KYG875721634
0           上市日期                2004/06/16
0           发行价格                3.70
0           发行数量                4.20亿股
0           成立日期                1999/11/23
0           公司注册地址            开曼群岛
0           董事长                  马化腾
0           审计机构                罗兵咸永道会计师事务所
0           公司类别                境外注册内地个人控制
0           注册办事处              Cricket Square Hutchins Drive, P.O.Box 2681 Grand...
0           总办事处及主要营业地点  香港湾仔皇后大道东1号太古广场三座29楼
0           年结日                  12-31
0           员工数量                115849
0           所属市场                香港主板
0           电话                    (852) 2179-5122
0           传真                    (852) 2520-1148
0           邮箱                    ir@tencent.com
1           网址                    http://www.tencent.com
2           公司业务                Tencent Holdings Ltd是一家主要提供增值(VAS)服务、网络 ...
2           公司简介                腾讯以技术丰富互联网用户的生活。公司旗下社交网络及通讯平台...
```

---



---

# 获取高管信息

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_company_executives(code)`

* **介绍**

    获取指定股票的董事及高管列表，包含展示名称、姓名、职位、任职起始日、发布日期、性别、年龄、学历、年薪等信息

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持正股及基金)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回高管信息 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        display_leader_name|str|展示名称  (仅用于展示，不用于查询高管背景接口)
        leader_name|str|高管姓名  (可传入 get_company_executive_background 查询背景)
        position_name|str|职位名称
        begin_date|int|任职起始日时间戳（秒）
        begin_date_str|str|任职起始日  (格式 YYYY-MM-DD，对应市场时区)
        leader_gender|str|性别  (如 "Male" / "Female")
        leader_age|str|年龄
        highest_education|str|最高学历
        annual_salary|int|年薪
        issue_date|int|发布日期时间戳（秒）
        issue_date_str|str|发布日期  (格式 YYYY-MM-DD，对应市场时区)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_company_executives("US.AAPL")
if ret == RET_OK:
    print(data[['display_leader_name', 'position_name', 'begin_date_str', 'annual_salary']].to_string(index=False))
    print('count:', len(data))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
display_leader_name                                                          position_name  begin_date_str  annual_salary
            Timothy D. Cook                                   Director and Chief Executive Officer             NaN     74294811.0
                 Sabih Khan                                                Chief Operating Officer             NaN     27031671.0
               Kevan Parekh                      Chief Financial Officer and Senior Vice President             NaN     22467309.0
                Ben Borders Principal Accounting Officer and Senior Director, Corporate Accounting             NaN            NaN
         Katherine L. Adams                                                  Senior Vice President             NaN     27032248.0
            Deirdre O'Brien                               Senior Vice President, Retail and People             NaN     27047633.0
       Jennifer G. Newstead                   Senior Vice President, General Counsel and Secretary             NaN            NaN
                John Ternus                            Senior Vice President, Hardware Engineering             NaN            NaN
Dr. Arthur D. Levinson, PhD                                                  Chairman of the Board             NaN       557231.0
            Susan L. Wagner                                                   Independent Director             NaN       445373.0
           Monica C. Lozano                                                   Independent Director             NaN       412956.0
                Andrea Jung                                                   Independent Director             NaN       458020.0
                Alex Gorsky                                                   Independent Director             NaN       416492.0
   Dr. Wanda M. Austin, PhD                                                   Independent Director             NaN       412850.0
        Dr. Ronald D. Sugar                                                   Independent Director             NaN       471283.0
count: 15
```

---



---

# 获取高管背景

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_company_executive_background(code, leader_name=None)`

* **介绍**

    获取指定股票某位高管的背景介绍

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持正股及基金)
    leader_name|str|高管姓名  (使用 get_company_executives 返回的 leader_name 字段值)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回高管背景信息 dict</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 dict 字段说明：

        字段|类型|说明
        :-|:-|:-
        brief_background|str|高管背景简介

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_company_executive_background("US.AAPL", leader_name="Mr. Timothy D. Cook")
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
{'brief_background': '2026年4月20日，苹果公司宣布，蒂姆·库克将从首席执行官职位转任苹果董事会执行主席，自2026年9月1日起生效。现年65岁的库克自2011年起担任苹果首席执行官，此前曾于2005年10月至2011年担任苹果首席运营官。库克于1998年3月加入苹果，并于2002年2月至2005年10月担任全球销售与运营执行副总裁。2000年10月至2002年2月，库克担任全球运营、销售、服务与支持高级副总裁。1998年3月至2000年10月，库克担任全球运营高级副总裁。此外，库克还担任美国国家橄榄球基金会暨大学名人堂公司董事会成员、杜克大学校董会成员，以及马拉拉基金领导委员会成员；马拉拉基金是一家倡导女童教育的国际非营利组织。其他上市公司董事会：现任：耐克公司。'}
```

---



---

# 获取经营效率

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_company_operational_efficiency(code, num=None, next_key=None, currency_code=None)`

* **介绍**

    获取指定股票的公司经营效率数据，包括员工人数、人均营收、人均营业利润、人均净利润等指标

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (如 HK.00700；支持正股及基金)
    num|int|每页返回数量  (默认 10，范围 1~50)
    next_key|str|分页标识  (首次不传，续拉填上次返回的 next_key；"-1" 表示无更多数据)
    currency_code|str|货币代码  (ISO 4217，如 CNY、USD、HKD、SGD、JPY、CAD、AUD；不传返回默认货币)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回经营效率数据 dict</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 dict 字段说明：

        字段|类型|说明
        :-|:-|:-
        item_list|list|经营效率列表，每项为 dict，字段见下表
        next_key|str|分页标识  ("-1" 表示无更多数据)
        currency_code|str|货币代码  (ISO 4217)

    * item_list 子项字段：

        字段|类型|说明
        :-|:-|:-
        fiscal_year|int|财务年度  (如 2024)
        financial_type|[F10Type](./quote.md#7710)|财报类型
        period_text|str|财报周期  (如 "2024/Q3"、"2024/FY")
        end_date|int|截止日时间戳（秒级 Unix 时间戳）
        end_date_str|str|截止日字符串  (格式 YYYY-MM-DD，对应市场时区)
        employee_num|int|员工人数
        employee_num_yoy|float|员工人数同比增长率  (百分号前的值，如 12.34 表示 12.34%)
        income_per_capita|float|人均营收
        income_per_capita_yoy|float|人均营收同比增长率  (百分号前的值，如 12.34 表示 12.34%)
        profit_per_capita|float|人均营业利润
        profit_per_capita_yoy|float|人均营业利润同比增长率  (百分号前的值，如 12.34 表示 12.34%)
        net_profit_per_capita|float|人均净利润
        net_profit_per_capita_yoy|float|人均净利润同比增长率  (百分号前的值，如 12.34 表示 12.34%)

* **Example**

```python
from futu import *
import pandas as pd
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_company_operational_efficiency("HK.00700")
if ret == RET_OK:
    df = pd.DataFrame(data.get('item_list', []))
    print(df.to_string(index=False))
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
fiscal_year period_text   end_date end_date_str  employee_num  employee_num_yoy  income_per_capita  income_per_capita_yoy  profit_per_capita  profit_per_capita_yoy  net_profit_per_capita  net_profit_per_capita_yoy
        2025     2025/FY 1767110400   2025-12-31        115849            4.7857       6489188.5126                 8.6594       2085145.3184                10.7787           1983625.2362                    11.6246
        2024     2024/FY 1735574400   2024-12-31        110558            4.8768       5972041.8242                 3.3726       1882260.8947                23.9566           1777049.1506                    58.6906
        2023     2023/FY 1703952000   2023-12-31        105417           -2.7841       5777199.1234                12.9662       1518483.7360                48.5723           1119819.3839                   -35.6529
        2022     2022/FY 1672416000   2022-12-31        108436           -3.8440       5114094.9500                 2.9643       1022049.8727               -57.5666           1740279.9808                   -13.8522
        2021     2021/FY 1640880000   2021-12-31        112771           31.3459       4966862.0478               -11.5377       2408597.9551                12.2453           2020111.5535                     8.3170
        2020     2020/FY 1609344000   2020-12-31         85858           36.5317       5614666.0765                -6.4170       2145833.8186                13.6879           1864998.0199                    22.3097
        2019     2019/FY 1577721600   2019-12-31         62885           15.7911       5999666.0570                 4.2027       1887477.1408                 4.9760           1524815.1387                     3.5346
        2018     2018/FY 1546185600   2018-12-31         54309           21.2362       5757682.8886                 8.4796       1798007.6966               -10.8064           1472757.7381                    -8.9654
        2017     2017/FY 1514649600   2017-12-31         44796           15.5280       5307616.7514                35.4518       2015849.6294                39.2885           1617800.6964                    51.3504
        2016     2016/FY 1483113600   2016-12-31         38775           26.5461       3918452.6112                16.7235       1447246.9374                 9.1517           1068910.3803                    12.5205
```

---



---

# 获取十大经纪商买卖数据

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_top_ten_buy_sell_brokers(code, days_before=None)`

* **介绍**

    获取指定港股的十大净买入和净卖出经纪商列表（实时或历史）

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (仅支持港股正股及基金，如 HK.00700)
    days_before|int|历史天数  (不填或 0=实时数据（含均价/总量/总额），>0=取前第 N 个交易日的历史数据（仅含净量和经纪商名称）)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回经纪商数据 DataFrame</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        is_real_time|bool|是否实时数据  (true=实时，false=历史)
        data_time|int|数据更新时间戳（秒级 Unix 时间戳）
        data_time_str|str|数据更新时间字符串  (格式 YYYY-MM-DD HH:MM:SS，对应市场时区)
        net_vol|int|净买卖量  (净买入为正，净卖出为负)
        broker_name|str|经纪商名称  (实时按券商资料填充，历史取回包名称)
        buy_sell_type|[BuySellType](./quote.md#324)|买卖类型
        avg_price|float|成交均价  (仅实时数据有效)
        total_vol|float|总成交量  (仅实时数据有效)
        total_turnover|float|总成交额  (仅实时数据有效)

* **BuySellType 枚举**

    枚举名|值|说明
    :-|:-|:-
    Unknown|0|未知
    NetBuy|1|净买入
    NetSell|2|净卖出

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_top_ten_buy_sell_brokers("HK.00700")
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
quote_ctx.close()
```

* **Output**

```python
net_vol  is_real_time  buy_sell_type  ...   avg_price total_vol total_turnover
0    114300          True              1  ...  466.766498  414900.0    193661420.0
1    104900          True              1  ...  464.678360  104900.0     48744760.0
2     48000          True              1  ...  466.477707   62800.0     29294800.0
3     45500          True              1  ...  466.222815   67500.0     31470040.0
4     38600          True              1  ...  466.795320  162400.0     75807560.0
5     32500          True              1  ...  467.303485  243900.0    113975320.0
6     30900          True              1  ...  465.537217   30900.0     14385100.0
7     15200          True              1  ...  466.788158   15200.0      7095180.0
8     14300          True              1  ...  466.792870   56100.0     26187080.0
9     12300          True              1  ...  466.557724   12300.0      5738660.0
10  -374700          True              2  ...  467.059158  415500.0    194063080.0
11  -236800          True              2  ...  466.795995  509400.0    237785880.0
12  -177900          True              2  ...  466.206225  324500.0    151283920.0
13  -129700          True              2  ...  467.378842  557700.0    260657180.0
14   -90600          True              2  ...  466.713997  267200.0    124705980.0
15   -81800          True              2  ...  466.368293   82000.0     38242200.0
16   -70400          True              2  ...  466.931092   95200.0     44451840.0
17   -47900          True              2  ...  466.453905   65300.0     30459440.0
18   -25300          True              2  ...  466.652174   25300.0     11806300.0
19   -19500          True              2  ...  466.124484   33900.0     15801620.0

[20 rows x 9 columns]
```

---



---

# 获取每日卖空成交

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_daily_short_volume(code, next_key=None, num=None)`

* **介绍**

    获取指定港股或美股的每日卖空成交数据，支持分页续拉

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (支持港股、美股正股及基金，如 US.AAPL、HK.00700)
    next_key|str|分页标识  (首次不填，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (默认 10，范围 1~50)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td>us_df</td>
            <td>pd.DataFrame</td>
            <td>美股每日卖空数据；当 ret != RET_OK 时为错误描述字符串</td>
        </tr>
        <tr>
            <td>hk_df</td>
            <td>pd.DataFrame</td>
            <td>港股每日卖空数据；当 ret != RET_OK 时为 None</td>
        </tr>
    </table>

    * 美股 DataFrame（us_df）字段说明：

        字段|类型|说明
        :-|:-|:-
        timestamp|int|交易日时间戳（秒级 Unix 时间戳，当日零点）
        timestamp_str|str|交易日字符串  (格式 YYYY-MM-DD，对应市场时区)
        total_shares_short|int|卖空总股数
        nasdaq_shares_short|int|纳斯达克卖空股数
        nyse_shares_short|int|纽交所卖空股数
        short_percent|float|卖空比例  (百分号前的值，如 12.34 表示 12.34%)
        volume|int|成交量（股）
        close_price|float|收盘价
        last_close_price|float|上次收盘价
        daily_trade_avg_ratio|float|日均成交比例  (百分号前的值，如 12.34 表示 12.34%；当前交易日往前 20 个交易日的日均)

    * 美股 us_df.attrs 附加属性：

        属性|类型|说明
        :-|:-|:-
        next_key|str|分页标识  ("-1" 表示无更多数据)

    * 港股 DataFrame（hk_df）字段说明：

        字段|类型|说明
        :-|:-|:-
        timestamp|int|交易日时间戳（秒级 Unix 时间戳，当日零点）
        timestamp_str|str|交易日字符串  (格式 YYYY-MM-DD，对应市场时区)
        shares_traded|int|成交量（股）
        turnover|float|成交额
        short_sell_shares_traded|int|做空成交量（股）
        short_sell_turnover|float|做空成交额
        open_price|float|开盘价
        close_price|float|收盘价
        last_close_price|float|上次收盘价
        daily_trade_avg_ratio|float|日均成交比例  (百分号前的值，如 12.34 表示 12.34%；当前交易日往前 20 个交易日的日均)

    * 港股 hk_df.attrs 附加属性：

        属性|类型|说明
        :-|:-|:-
        next_key|str|分页标识  ("-1" 表示无更多数据)
        aggregated_short|int|未平仓股数  (仅港股)
        aggregated_short_ratio|float|占流通股比例  (百分号前的值，如 12.34 表示 12.34%；仅港股)
        new_time_str|str|最新数据时间  (格式 YYYY-MM-DD，对应市场时区；仅港股)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, us_df, hk_df = quote_ctx.get_daily_short_volume("HK.00700")
if ret == RET_OK:
    print(hk_df)
else:
    print('error:', hk_df)
quote_ctx.close()
```

* **Output**

```python
timestamp timestamp_str  ...  last_close_price  daily_trade_avg_ratio
0  1778169600    2026-05-08  ...             477.4                  11.36
1  1778083200    2026-05-07  ...             463.0                  11.80
2  1777996800    2026-05-06  ...             472.2                  12.22
3  1777910400    2026-05-05  ...             473.0                  12.76
4  1777824000    2026-05-04  ...             467.8                  13.02
5  1777478400    2026-04-30  ...             479.2                  13.09
6  1777392000    2026-04-29  ...             473.8                  14.02
7  1777305600    2026-04-28  ...             478.6                  14.13
8  1777219200    2026-04-27  ...             493.4                  14.14
9  1776960000    2026-04-24  ...             495.2                  14.18

[10 rows x 10 columns]
```

---



---

# 获取空头持仓

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_short_interest(code, next_key=None, num=None)`

* **介绍**

    获取指定港股或美股的空头持仓历史记录，支持分页续拉

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|股票代码  (支持港股、美股正股及基金，如 US.AAPL、HK.00700)
    next_key|str|分页标识  (首次不填，续拉时填上次返回的 next_key；"-1" 表示无更多数据)
    num|int|每页数量  (默认 10，范围 1~50)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td>us_df</td>
            <td>pd.DataFrame</td>
            <td>美股空头持仓数据；当 ret != RET_OK 时为错误描述字符串</td>
        </tr>
        <tr>
            <td>hk_df</td>
            <td>pd.DataFrame</td>
            <td>港股空头持仓数据；当 ret != RET_OK 时为 None</td>
        </tr>
    </table>

    * 美股 DataFrame（us_df）字段说明：

        字段|类型|说明
        :-|:-|:-
        timestamp|int|交易日时间戳（秒级 Unix 时间戳，当日零点）
        timestamp_str|str|交易日字符串  (格式 YYYY-MM-DD，对应市场时区)
        shares_short|int|卖空股数
        short_percent|float|卖空比例  (百分号前的值，如 12.34 表示 12.34%)
        avg_daily_share_volume|int|平均日成交量
        days_to_cover|float|回补天数
        close_price|float|收盘价
        last_close_price|float|上次收盘价

    * 美股 us_df.attrs 附加属性：

        属性|类型|说明
        :-|:-|:-
        next_key|str|分页标识  ("-1" 表示无更多数据)

    * 港股 DataFrame（hk_df）字段说明：

        字段|类型|说明
        :-|:-|:-
        timestamp|int|交易日时间戳（秒级 Unix 时间戳，当日零点）
        timestamp_str|str|交易日字符串  (格式 YYYY-MM-DD，对应市场时区)
        close_price|float|收盘价
        last_close_price|float|上次收盘价
        aggregated_short|int|未平仓股数
        aggregated_short_ratio|float|占流通股比例  (百分号前的值，如 12.34 表示 12.34%)

    * 港股 hk_df.attrs 附加属性：

        属性|类型|说明
        :-|:-|:-
        next_key|str|分页标识  ("-1" 表示无更多数据)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, us_df, hk_df = quote_ctx.get_short_interest("HK.00700")
if ret == RET_OK:
    print(hk_df)
else:
    print('error:', hk_df)
quote_ctx.close()
```

* **Output**

```python
   timestamp timestamp_str  aggregated_short  aggregated_short_ratio  close_price  last_close_price
0  1777478400    2026-04-30          51480638                    0.56        467.8             479.2
1  1776960000    2026-04-24          51888755                    0.56        493.4             495.2
2  1776355200    2026-04-17          47974208                    0.52        510.5             517.0
3  1775750400    2026-04-10          48424833                    0.53        504.5             508.5
4  1775059200    2026-04-02          49982828                    0.54        489.2             496.6
5  1774540800    2026-03-27          52744147                    0.57        493.4             495.6
6  1773936000    2026-03-20          51710854                    0.56        508.0             513.0
7  1773331200    2026-03-13          48105325                    0.52        547.5             546.5
8  1772726400    2026-03-06          42404275                    0.46        519.0             502.0
9  1772121600    2026-02-27          36037870                    0.39        518.0             512.0
```

---



---

# 获取期权链到期日

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_option_expiration_date(code, index_option_type=IndexOptionType.NORMAL)`

* **介绍**

    通过标的股票，查询期权链的所有到期日。如需获取完整期权链，请配合 [获取期权链](../quote/get-option-chain.md) 接口使用。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|标的股票代码
    index_option_type|[IndexOptionType](../quote/quote.md#5149)|指数期权类型  (仅对港股指数期权筛选有效，正股、ETFs、美股指数期权可忽略此参数)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回期权链到期日相关数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 期权链到期日数据格式如下：
        字段|类型|说明
        :-|:-|:-
        strike_time|str|期权链行权日  (格式：yyyy-MM-dd
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        option_expiry_date_distance|int|距离到期日天数  (负数表示已过期)
        expiration_cycle|[ExpirationCycle](./quote.md#2235)|交割周期  (支持香港指数期权、美股指数期权)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data = quote_ctx.get_option_expiration_date(code='HK.00700')
if ret == RET_OK:
    print(data)
    print(data['strike_time'].values.tolist())  # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
  strike_time  option_expiry_date_distance expiration_cycle
0  2021-04-29                            4              N/A
1  2021-05-28                           33              N/A
2  2021-06-29                           65              N/A
3  2021-07-29                           95              N/A
4  2021-09-29                          157              N/A
5  2021-12-30                          249              N/A
6  2022-03-30                          339              N/A
['2021-04-29', '2021-05-28', '2021-06-29', '2021-07-29', '2021-09-29', '2021-12-30', '2022-03-30']
```

---



---

# 获取期权链

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_option_chain(code, index_option_type=IndexOptionType.NORMAL, start=None, end=None, option_type=OptionType.ALL, option_cond_type=OptionCondType.ALL, data_filter=None)`

* **介绍**

    通过标的股票查询期权链。此接口仅返回期权链的静态信息，如需获取报价或摆盘等动态信息，请用此接口返回的股票代码，自行 [订阅](../quote/sub.md) 所需要的类型。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|标的股票代码
    index_option_type|[IndexOptionType](./quote.md#5149)|指数期权类型  (仅对港股指数期权筛选有效，正股、ETFs、美股指数期权可忽略此参数)
    start|str|开始日期，该日期指到期日  (例如：“2017-08-01”)
    end|str|结束日期（包括这一天），该日期指到期日  (例如：“2017-08-30”)
    option_type|[OptionType](./quote.md#3713)|期权看涨看跌类型  (默认为全部)
    option_cond_type|[OptionCondType](./quote.md#3227)|期权价内外类型  (默认为全部)
    data_filter|OptionDataFilter|数据筛选条件  (默认为不筛选)
    * start 和 end 的组合如下：  
        Start 类型|End 类型|说明
        :-|:-|:-
        str|str|start 和 end 分别为指定的日期
        None|str|start 为 end 往前 30 天
        str|None|end 为 start 往后30天
        None|None|start 为当前日期，end 往后 30 天

    * OptionDataFilter 字段如下
        字段|类型|说明
        :-|:-|:-
        implied_volatility_min|float|隐含波动率过滤起点  (精确到小数点后 0 位，超出部分会被舍弃该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        implied_volatility_max|float|隐含波动率过滤终点  (精确到小数点后 0 位，超出部分会被舍弃该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        delta_min|float|希腊值 Delta 过滤起点  (精确到小数点后 3 位，超出部分会被舍弃)
        delta_max|float|希腊值 Delta 过滤终点  (精确到小数点后 3 位，超出部分会被舍弃)
        gamma_min|float|希腊值 Gamma 过滤起点  (精确到小数点后 3 位，超出部分会被舍弃)
        gamma_max|float|希腊值 Gamma 过滤终点  (精确到小数点后 3 位，超出部分会被舍弃)
        vega_min|float|希腊值 Vega 过滤起点  (精确到小数点后 3 位，超出部分会被舍弃)
        vega_max|float|希腊值 Vega 过滤终点  (精确到小数点后 3 位，超出部分会被舍弃)
        theta_min|float|希腊值 Theta 过滤起点  (精确到小数点后 3 位，超出部分会被舍弃)
        theta_max|float|希腊值 Theta 过滤终点  (精确到小数点后 3 位，超出部分会被舍弃)
        rho_min|float|希腊值 Rho 过滤起点  (精确到小数点后 3 位，超出部分会被舍弃)
        rho_max|float|希腊值 Rho 过滤终点  (精确到小数点后 3 位，超出部分会被舍弃)
        net_open_interest_min|float|净未平仓合约数过滤起点  (精确到小数点后 0 位，超出部分会被舍弃)
        net_open_interest_max|float|净未平仓合约数过滤终点  (精确到小数点后 0 位，超出部分会被舍弃)
        open_interest_min|float|未平仓合约数过滤起点  (精确到小数点后 0 位，超出部分会被舍弃)
        open_interest_max|float|未平仓合约数过滤终点  (精确到小数点后 0 位，超出部分会被舍弃)
        vol_min|float|成交量过滤起点  (精确到小数点后 0 位，超出部分会被舍弃)
        vol_max|float|成交量过滤终点  (精确到小数点后 0 位，超出部分会被舍弃)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回期权链数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 期权链数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|名字
        lot_size|int|每手股数，期权表示每份合约股数  (指数期权无该字段)
        stock_type|[SecurityType](./quote.md#3325)|股票类型
        option_type|[OptionType](./quote.md#3713)|期权类型
        stock_owner|str|标的股
        strike_time|str|行权日  (格式：yyyy-MM-dd
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        strike_price|float|行权价
        suspension|bool|是否停牌  (True：停牌False：未停牌)
        stock_id|int|股票 ID
        index_option_type|[IndexOptionType](./quote.md#5149)|指数期权类型
        expiration_cycle|[ExpirationCycle](./quote.md#2235)|交割周期
        option_standard_type|[OptionStandardType](./quote.md#8952)|期权标准类型
        option_settlement_mode|[OptionSettlementMode](./quote.md#1550)|期权结算方式

* **Example**

```python
from futu import *
import time
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret1, data1 = quote_ctx.get_option_expiration_date(code='HK.00700')

filter1 = OptionDataFilter()
filter1.delta_min = 0
filter1.delta_max = 0.1

if ret1 == RET_OK:
    expiration_date_list = data1['strike_time'].values.tolist()
    for date in expiration_date_list:
        ret2, data2 = quote_ctx.get_option_chain(code='HK.00700', start=date, end=date, data_filter=filter1)
        if ret2 == RET_OK:
            print(data2)
            print(data2['code'][0])  # 取第一条的股票代码
            print(data2['code'].values.tolist())  # 转为 list
        else:
            print('error:', data2)
        time.sleep(3)
else:
    print('error:', data1)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
                     code                 name  lot_size stock_type option_type stock_owner strike_time  strike_price  suspension  stock_id index_option_type expiration_cycle option_standard_type option_settlement_mode
0     HK.TCH210429C350000   腾讯 210429 350.00 购       100       DRVT        CALL    HK.00700  2021-04-29         350.0       False  80235167               N/A        WEEK        STANDARD			N/A        
1     HK.TCH210429P350000   腾讯 210429 350.00 沽       100       DRVT         PUT    HK.00700  2021-04-29         350.0       False  80235247               N/A        WEEK        STANDARD			N/A        
2     HK.TCH210429C360000   腾讯 210429 360.00 购       100       DRVT        CALL    HK.00700  2021-04-29         360.0       False  80235163               N/A        WEEK        STANDARD			N/A        
3     HK.TCH210429P360000   腾讯 210429 360.00 沽       100       DRVT         PUT    HK.00700  2021-04-29         360.0       False  80235246               N/A        WEEK        STANDARD			N/A        
4     HK.TCH210429C370000   腾讯 210429 370.00 购       100       DRVT        CALL    HK.00700  2021-04-29         370.0       False  80235165               N/A        WEEK        STANDARD			N/A        
5     HK.TCH210429P370000   腾讯 210429 370.00 沽       100       DRVT         PUT    HK.00700  2021-04-29         370.0       False  80235248               N/A        WEEK        STANDARD			N/A        
HK.TCH210429C350000
['HK.TCH210429C350000', 'HK.TCH210429P350000', 'HK.TCH210429C360000', 'HK.TCH210429P360000', 'HK.TCH210429C370000', 'HK.TCH210429P370000']
...
                   code                name  lot_size stock_type option_type stock_owner strike_time  strike_price  suspension  stock_id index_option_type expiration_cycle option_standard_type option_settlement_mode
0   HK.TCH220330C490000  腾讯 220330 490.00 购       100       DRVT        CALL    HK.00700  2022-03-30         490.0       False  80235143               N/A        WEEK        STANDARD			N/A            
1   HK.TCH220330P490000  腾讯 220330 490.00 沽       100       DRVT         PUT    HK.00700  2022-03-30         490.0       False  80235193               N/A        WEEK        STANDARD			N/A            
2   HK.TCH220330C500000  腾讯 220330 500.00 购       100       DRVT        CALL    HK.00700  2022-03-30         500.0       False  80233887               N/A        WEEK        STANDARD			N/A            
3   HK.TCH220330P500000  腾讯 220330 500.00 沽       100       DRVT         PUT    HK.00700  2022-03-30         500.0       False  80233912               N/A        WEEK        STANDARD			N/A            
4   HK.TCH220330C510000  腾讯 220330 510.00 购       100       DRVT        CALL    HK.00700  2022-03-30         510.0       False  80233747               N/A        WEEK        STANDARD 			N/A           
5   HK.TCH220330P510000  腾讯 220330 510.00 沽       100       DRVT         PUT    HK.00700  2022-03-30         510.0       False  80233766               N/A        WEEK        STANDARD 			N/A           
HK.TCH220330C490000
['HK.TCH220330C490000', 'HK.TCH220330P490000', 'HK.TCH220330C500000', 'HK.TCH220330P500000', 'HK.TCH220330C510000', 'HK.TCH220330P510000']
```

---



---

# 获取期权波动率分析

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_option_volatility(code, query_time_period=None, hv_time_period=None)`

* **介绍**

    获取指定期权合约的隐含波动率、历史波动率及波动率溢价分析

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|期权代码  (仅支持期权合约代码，如 US.AAPL260427C270000)
    query_time_period|[OptionVolatilityTimePeriodType](./quote.md#8366)|查询时间周期  (不填默认 Month（月）)
    hv_time_period|int|历史波动率计算周期（日）  (范围 5~250，默认 30)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时为期权波动率数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        timestamp|int|交易日时间戳（秒级 Unix 时间戳，当日零点）
        timestamp_str|str|交易日字符串  (格式 YYYY-MM-DD，对应市场时区)
        implied_volatility|float|隐含波动率  (百分号前的值，如 25.0 表示 25%)
        history_volatility|float|历史波动率  (标的物历史波动率，百分号前的值，如 25.0 表示 25%)
        volatility_premium|float|波动率溢价  (隐含波动率与历史波动率之差，正值表示隐含高于历史)
        average_impvol|float|隐含波动率均值  (查询周期内隐含波动率均值，百分号前的值)
        impvol_status|[OptionImpvolStatusType](./quote.md#5480)|波动率状态
        analysis|str|分析文案

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, df = quote_ctx.get_option_volatility("US.AAPL281215C320000", query_time_period=2, hv_time_period=30)
if ret == RET_OK:
    cols = ['timestamp_str', 'implied_volatility', 'history_volatility', 'volatility_premium']
    print(df[cols].to_string(index=False))
else:
    print('error:', df)
quote_ctx.close()
```

* **Output**

```
timestamp_str  implied_volatility  history_volatility  volatility_premium
   2026-04-13              27.813              18.977               8.836
   2026-04-14              27.656              18.962               8.694
   2026-04-15              27.726              20.782               6.944
   2026-04-16              28.069              21.013               7.056
   2026-04-17              27.796              22.088               5.708
   2026-04-20              28.054              21.931               6.123
   2026-04-21              27.897              23.194               4.703
   2026-04-22              28.276              24.300               3.976
   2026-04-23              27.951              24.296               3.655
   2026-04-24              28.056              23.676               4.380
   2026-04-27              27.917              22.985               4.932
   2026-04-28              27.942              23.011               4.931
   2026-04-29              28.269              23.022               5.247
   2026-04-30              27.630              22.312               5.318
   2026-05-01              27.576              23.741               3.835
   2026-05-04              27.919              24.078               3.841
   2026-05-05              27.308              24.778               2.530
   2026-05-06              27.746              24.850               2.896
   2026-05-07              28.198              24.886               3.312
   2026-05-08              27.719              25.285               2.434
```

---



---

# 获取期权行权概率

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>

`get_option_exercise_probability(code)`

* **介绍**

    获取指定期权合约的历史行权概率数据，按时间从大到小排序

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|期权代码  (仅支持期权合约代码，如 US.AAPL260427C270000)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时为行权概率数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * DataFrame 字段说明：

        字段|类型|说明
        :-|:-|:-
        timestamp|int|时间戳（秒级 Unix 时间戳）
        timestamp_str|str|日期字符串  (格式 YYYY-MM-DD，对应市场时区)
        security_price|float|正股价格
        strike_probability|float|行权概率  (百分号前的值，如 12.34 表示 12.34%)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, df = quote_ctx.get_option_exercise_probability("US.AAPL281215C320000")
if ret == RET_OK:
    print(df)
else:
    print('error:', df)
quote_ctx.close()
```

* **Output**

```python
timestamp timestamp_str  security_price  strike_probability
0   1778469447    2026-05-10          293.32              41.869
1   1778212800    2026-05-08          293.05              41.887
2   1778126400    2026-05-07          287.17              40.011
3   1778040000    2026-05-06          287.24              40.122
4   1777953600    2026-05-05          283.91              38.956
5   1777867200    2026-05-04          276.56              36.861
6   1777608000    2026-05-01          279.87              37.939
7   1777521600    2026-04-30          271.08              35.189
8   1777435200    2026-04-29          269.90              34.851
9   1777348800    2026-04-28          270.44              35.040
10  1777262400    2026-04-27          267.34              34.094
11  1777003200    2026-04-24          270.79              35.170
12  1776916800    2026-04-23          273.16              35.885
13  1776830400    2026-04-22          272.90              35.805
14  1776744000    2026-04-21          265.90              33.691
15  1776657600    2026-04-20          272.78              35.799
16  1776398400    2026-04-17          269.96              34.964
17  1776312000    2026-04-16          263.13              32.901
18  1776225600    2026-04-15          266.16              33.834
19  1776139200    2026-04-14          258.56              31.536
20  1776052800    2026-04-13          258.93              31.663
21  1775793600    2026-04-10          260.21              32.069
22  1775707200    2026-04-09          260.22              32.086
```

---



---

# 筛选窝轮

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_warrant(stock_owner='', req=None)`

* **介绍**

    筛选窝轮（仅用于筛选香港市场的窝轮、牛熊证、界内证）

* **参数**
    参数|类型|说明
    :-|:-|:-
    stock_owner|str|所属正股的股票代码
    req|WarrantRequest|筛选参数组合
    * WarrantRequest 类型字段说明如下： 
        字段|类型|说明
        :-|:-|:-
        begin|int|数据起始点
        num|int|请求数据个数  (最大 200)
        sort_field|[SortField](./quote.md#2930)|根据哪个字段排序
        ascend|bool|排序方向  (True：升序False：降序)
        type_list|list|窝轮类型过滤列表  (list 中元素类型是 [WrtType](./quote.md#926))
        issuer_list|list|发行人过滤列表  (list 中元素类型是 [Issuer](./quote.md#8363))
        maturity_time_min|str|到期日过滤范围的开始时间
        maturity_time_max|str|到期日过滤范围的结束时间
        ipo_period|[IpoPeriod](./quote.md#9546)|上市时段
        price_type|[PriceType](./quote.md#6407)|价内/价外  (暂不支持界内证的界内外筛选)
        status|[WarrantStatus](./quote.md#6556)|窝轮状态
        cur_price_min|float|最新价的过滤下限  (闭区间不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        cur_price_max|float|最新价的过滤上限  (闭区间不传代表上限为 +∞精确到小数点后 3 位，超出部分会被舍弃)
        strike_price_min|float|行使价的过滤下限  (闭区间不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        strike_price_max|float|行使价的过滤上限  (闭区间不传代表上限为 +∞精确到小数点后 3 位，超出部分会被舍弃)
        street_min|float|街货占比的过滤下限  (闭区间不传代表下限为 -∞该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。精确到小数点后 3 位，超出部分会被舍弃)
        street_max|float|街货占比的过滤上限  (闭区间不传代表上限为 +∞该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。精确到小数点后 3 位，超出部分会被舍弃)
        conversion_min|float|换股比率的过滤下限  (闭区间不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        conversion_max|float|换股比率的过滤上限  (闭区间不传代表上限为 +∞精确到小数点后 3 位，超出部分会被舍弃)
        vol_min|int|成交量的过滤下限  (闭区间不传代表下限为 -∞)
        vol_max|int|成交量的过滤上限  (闭区间不传代表上限为 +∞)
        premium_min|float|溢价的过滤下限  (闭区间不传代表下限为 -∞该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。精确到小数点后 3 位，超出部分会被舍弃)
        premium_max|float|溢价的过滤上限  (闭区间不传代表上限为 +∞该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。精确到小数点后 3 位，超出部分会被舍弃)
        leverage_ratio_min|float|杠杆比率的过滤下限  (闭区间不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        leverage_ratio_max|float|杠杆比率的过滤上限  (闭区间不传代表上限为 +∞)
        delta_min|float|对冲值的过滤下限  (闭区间仅认购认沽支持此字段过滤不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        delta_max|float|对冲值的过滤上限  (闭区间仅认购认沽支持此字段过滤不传代表上限为 +∞精确到小数点后 3 位，超出部分会被舍弃)
        implied_min|float|引伸波幅的过滤下限  (闭区间仅认购认沽支持此字段过滤不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        implied_max|float|引伸波幅的过滤上限  (闭区间仅认购认沽支持此字段过滤不传代表上限为 +∞精确到小数点后 3 位，超出部分会被舍弃)
        recovery_price_min|float|收回价的过滤下限  (闭区间仅牛熊证支持此字段过滤不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        recovery_price_max|float|收回价的过滤上限  (闭区间仅牛熊证支持此字段过滤不传代表上限为 +∞精确到小数点后 3 位，超出部分会被舍弃)
        price_recovery_ratio_min|float|正股距收回价的过滤下限  (闭区间仅牛熊证支持此字段过滤该字段为百分比字段，默认不展示 %，如 20 实际对应 20%不传代表下限为 -∞精确到小数点后 3 位，超出部分会被舍弃)
        price_recovery_ratio_max|float|正股距收回价的过滤上限  (闭区间仅牛熊证支持此字段过滤该字段为百分比字段，默认不展示 %，如 20 实际对应 20%不传代表上限为 +∞精确到小数点后 3 位，超出部分会被舍弃)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>tuple</td>
            <td>当 ret == RET_OK，返回窝轮数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 窝轮数据组成如下：
        字段|类型|说明
        :-|:-|:-
        warrant_data_list|pd.DataFrame|筛选后的窝轮数据
        last_page|bool|是否是最后一页  (True：是最后一页False：不是最后一页)
        all_count|int|筛选结果中的窝轮总数量

        - warrant_data_list 返回的 pd dataframe 数据格式：
            字段|类型|说明
            :-|:-|:-
            stock|str|窝轮代码
            stock_owner|str|所属正股
            type|[WrtType](./quote.md#926)|窝轮类型
            issuer|[Issuer](./quote.md#8363)|发行人
            maturity_time|str|到期日  (格式：yyyy-MM-dd)
            list_time|str|上市时间  (格式：yyyy-MM-dd)
            last_trade_time|str|最后交易日  (格式：yyyy-MM-dd)
            recovery_price|float|收回价  (仅牛熊证支持此字段)
            conversion_ratio|float|换股比率
            lot_size|int|每手数量
            strike_price|float|行使价
            last_close_price|float|昨收价
            name|str|名称
            cur_price|float|当前价
            price_change_val|float|涨跌额
            status|[WarrantStatus](./quote.md#6556)|窝轮状态
            bid_price|float|买入价
            ask_price|float|卖出价
            bid_vol|int|买量
            ask_vol|int|卖量
            volume|int|成交量
            turnover|float|成交额
            score|float|综合评分
            premium|float|溢价  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            break_even_point|float|打和点
            leverage|float|杠杆比率  (单位：倍)
            ipop|float|价内/价外  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            price_recovery_ratio|float|正股距收回价  (仅牛熊证支持此字段该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            conversion_price|float|换股价
            street_rate|float|街货占比  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            street_vol|int|街货量
            amplitude|float|振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            issue_size|int|发行量
            high_price|float|最高价
            low_price|float|最低价
            implied_volatility|float|引伸波幅  (仅认购认沽支持此字段)
            delta|float|对冲值  (仅认购认沽支持此字段)
            effective_leverage|float|有效杠杆 (仅认购认沽支持此字段)
            upper_strike_price|float|上限价  (仅界内证支持此字段)
            lower_strike_price|float|下限价  (仅界内证支持此字段)
            inline_price_status|[PriceType](./quote.md#6407)|界内界外  (仅界内证支持此字段)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

req = WarrantRequest()
req.sort_field = SortField.TURNOVER
req.type_list = WrtType.CALL
req.cur_price_min = 0.1
req.cur_price_max = 0.2
ret, ls = quote_ctx.get_warrant("HK.00700", req)
if ret == RET_OK:  # 先判断接口返回是否正常，再取数据
    warrant_data_list, last_page, all_count = ls
    print(len(warrant_data_list), all_count, warrant_data_list)
    print(warrant_data_list['stock'][0])    # 取第一条的窝轮代码
    print(warrant_data_list['stock'].values.tolist())   # 转为 list
else:
    print('error: ', ls)
    
req = WarrantRequest()
req.sort_field = SortField.TURNOVER
req.issuer_list = ['UB','CS','BI']
ret, ls = quote_ctx.get_warrant(Market.HK, req)
if ret == RET_OK: 
    warrant_data_list, last_page, all_count = ls
    print(len(warrant_data_list), all_count, warrant_data_list)
else:
    print('error: ', ls)

quote_ctx.close()  # 所有接口结尾加上这条 close，防止连接条数用尽
```

* **Output**

```python
2 2 
    stock        name stock_owner  type issuer maturity_time   list_time last_trade_time  recovery_price  conversion_ratio  lot_size  strike_price  last_close_price  cur_price  price_change_val  change_rate  status  bid_price  ask_price   bid_vol  ask_vol    volume   turnover   score  premium  break_even_point  leverage    ipop  price_recovery_ratio  conversion_price  street_rate  street_vol  amplitude  issue_size  high_price  low_price  implied_volatility  delta  effective_leverage  list_timestamp  last_trade_timestamp  maturity_timestamp  upper_strike_price  lower_strike_price  inline_price_status
0   HK.20306  腾讯麦银零乙购A.C    HK.00700  CALL     MB    2020-12-01  2019-06-27      2020-11-25             NaN              50.0      5000        588.88             0.188      0.188             0.000     0.000000  NORMAL      0.000      0.188         0     10000           0          0.0   0.198    2.008            598.28    62.393  -0.404                   NaN              9.40        4.400     1584000      0.000    36000000       0.000      0.000              31.751  0.479              29.886    1.561565e+09          1.606234e+09        1.606752e+09                 NaN                 NaN                  NaN
1   HK.16545  腾讯法兴一二购B.C    HK.00700  CALL     SG    2021-02-26  2020-07-14      2021-02-22             NaN             100.0     10000        700.00             0.147      0.144            -0.003    -2.040816  NORMAL      0.141      0.144  28000000  28000000           0          0.0  81.506   21.807            714.40    40.729 -16.214                   NaN             14.40        1.420     2130000      0.000   150000000       0.000      0.000              40.643  0.226               9.204    1.594656e+09          1.613923e+09        1.614269e+09                 NaN                 NaN                  NaN
HK.20306
['HK.20306', 'HK.16545']

200 358
    stock        name stock_owner    type issuer maturity_time   list_time last_trade_time  recovery_price  conversion_ratio  lot_size  strike_price  last_close_price  cur_price  price_change_val  change_rate      status  bid_price  ask_price   bid_vol   ask_vol  volume  turnover   score  premium  break_even_point  leverage     ipop  price_recovery_ratio  conversion_price  street_rate  street_vol  amplitude  issue_size  high_price  low_price  implied_volatility  delta  effective_leverage  list_timestamp  last_trade_timestamp  maturity_timestamp  upper_strike_price  lower_strike_price inline_price_status
0    HK.19839  平安瑞银零乙购A.C    HK.02318    CALL     UB    2020-12-31  2017-12-11      2020-12-24             NaN             100.0     50000         83.88             0.057      0.046            -0.011   -19.298246      NORMAL      0.043      0.046  30000000  30000000       0       0.0  39.641    1.642            88.480    18.923    3.779                   NaN             4.600         1.25     6250000        0.0   500000000         0.0        0.0              25.129  0.692              13.094    1.512922e+09          1.608739e+09        1.609344e+09                 NaN                 NaN                 NaN
1    HK.20084  平安中银零乙购A.C    HK.02318    CALL     BI    2020-12-31  2017-12-19      2020-12-24             NaN             100.0     50000         83.88             0.059      0.050            -0.009   -15.254237      NORMAL      0.044      0.050  10000000  10000000       0       0.0   0.064    2.102            88.880    17.410    3.779                   NaN             5.000         0.07      350000        0.0   500000000         0.0        0.0              29.174  0.672              11.699    1.513613e+09          1.608739e+09        1.609344e+09                 NaN                 NaN                 NaN
......
198  HK.56886  恒指瑞银三一牛F.C   HK.800000    BULL     UB    2023-01-30  2020-03-24      2023-01-27         21200.0           20000.0     10000      21100.00             0.230      0.232             0.002     0.869565      NORMAL      0.232      0.233  30000000  30000000       0       0.0  46.627   -2.884         25740.000     5.712   25.613             25.021179          4640.000         0.01       40000        0.0   400000000         0.0        0.0                 NaN    NaN               5.712    1.584979e+09          1.674749e+09        1.675008e+09                 NaN                 NaN                 NaN
199  HK.56895  小米瑞银零乙牛D.C    HK.01810    BULL     UB    2020-12-30  2020-03-24      2020-12-29             8.0              10.0      2000          7.60             2.010      1.930            -0.080    -3.980100      NORMAL      1.910      1.930   6000000   6000000       0       0.0   0.040    0.938            26.900     1.380  250.657            233.125000            19.300         0.10       60000        0.0    60000000         0.0        0.0                 NaN    NaN               1.380    1.584979e+09          1.609171e+09        1.609258e+09                 NaN                 NaN                 NaN

```

---



---

# 筛选窝轮 V2

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_warrant_screen(request)`

* **介绍**

    窝轮筛选 V2。相比旧接口 [get_warrant](./get-warrant.md)，返回 43 列窝轮属性，支持港股 / 新加坡 / 马来西亚市场，且支持仅返回总数（only_count）。所有数值字段直接传原始值，OpenD 内部完成倍率转换。

* **参数**

    参数|类型|说明
    :-|:-|:-
    request|WarrantScreenRequest|窝轮筛选请求对象，构造时必传 warrant_market

    * WarrantScreenRequest 字段：

        字段|类型|说明
        :-|:-|:-
        warrant_market|[WarrantMarket](./quote.md#1724)|市场  (HK=1、SG=4、MY=15)
        is_delay|bool|是否使用延时行情  (不传默认为 False)
        only_count|bool|是否仅返回总数（不返回明细）  (不传默认为 False；True 时仅填充 all_count，DataFrame 为空)
        page_from|int|分页起始位置  (不传默认为 0)
        page_count|int|单页最大返回数  (不传默认为 200)

    * 筛选条件 builder 方法（每次调用追加一条筛选条件）：

        方法|说明
        :-|:-
        add_interval_filter(field_id, min_val=None, max_val=None, min_included=True, max_included=True)|区间筛选  (field_id 取自 [WarrantField](./quote.md#9880)；min_val / max_val 直接传原始值（OpenD 自动倍率转换，如现价 5 元传 5.0、街货占比 50% 传 50.0、有效杠杆 > 3 传 3.0）；min_val / max_val 均为可选，全部不传时该条件不会生效（等同于不筛选）)
        add_choice_filter(field_id, choices)|多选筛选  (choices 元素可为 int 枚举或 str 代码，例如 STOCK_OWNER 字段可直接传 ["HK.00700"]，WARRANT_TYPE 可传 [WarrantType.CALL, WarrantType.PUT])
        add_sort(field_id, desc=False)|排序  (desc=True 为降序，默认升序)

    * 常用 WarrantField field_id（完整列表见 [WarrantField](./quote.md#9880)）：

        field_id|含义|筛选方式
        :-|:-|:-
        4|ISSUER_ID 发行商 ID|choice
        5|STOCK_OWNER 正股|choice  (可传 ["HK.00700"] 这样的 code 字符串)
        6|WARRANT_TYPE 窝轮类型|choice  (1=认购、2=认沽、3=牛证、4=熊证、5=界内证；详见 [WarrantType](./quote.md#1724))
        8|CURRENT_PRICE 当前价|interval
        9|STREET_RATIO 街货占比|interval
        10|VOLUME 成交量|interval
        16|LEVERAGE_RATIO 杠杆比率|interval
        19|STATUS 状态|choice  (0=正常、1=终止交易、2=待上市；详见 [WarrantStatus](./quote.md#1724))
        23|EFFECTIVE_LEVERAGE 有效杠杆|interval

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>tuple</td>
            <td>当 ret == RET_OK，返回 (last_page, all_count, DataFrame)</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段（共 43 列）：

        字段|类型|说明
        :-|:-|:-
        stock_id|int|窝轮股票 ID
        stock_owner|int|所属正股 ID
        issuer_id|int|发行商 ID
        warrant_type|int|窝轮类型  (1=认购，2=认沽，3=牛证，4=熊证，5=界内证)
        strike_price|float|行权价
        maturity_date|str|到期日
        last_trade_date|str|最后交易日
        conversion_ratio|float|换股比率
        last_close_price|float|昨收价
        recovery_price|float|收回价（仅牛熊证）
        stock_owner_price|float|正股价
        current_price|float|现价
        volume|int|成交量
        turnover|float|成交额
        sell_vol|int|卖量
        buy_vol|int|买量
        sell_price|float|卖价
        buy_price|float|买价
        street_rate|float|街货比
        high_price|float|最高价
        low_price|float|最低价
        implied_volatility|float|引伸波幅（仅认购认沽）
        delta|float|对冲值（仅认购认沽）
        status|int|窝轮状态  (0=正常，1=终止交易，2=待上市)
        street_rate_new|float|街货比（新）
        score|float|综合评分
        premium|float|溢价
        leverage|float|杠杆
        effective_leverage|float|有效杠杆
        break_even_point|float|打和点
        ipop|float|价内/价外
        amplitude|float|振幅
        fx_score|float|法兴评分
        ipo_time|str|上市时间
        street_vol|int|街货量
        lot_size|int|每手数量
        issue_size|int|发行量
        ipo_price|float|发行价
        upper_strike_price|float|上限价（仅界内证）
        lower_strike_price|float|下限价（仅界内证）
        iw_price_status|int|界内/界外
        sensitivity|float|敏感度
        price_recovery_ratio|float|正股距收回价（仅牛熊证）

* **Example**

```python
from futu import (
    OpenQuoteContext, RET_OK, WarrantScreenRequest,
    WarrantMarket, WarrantField, WarrantType,
)

quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

# 示例 1：港股低价高杠杆认购证 / 认沽证
req = WarrantScreenRequest(warrant_market=WarrantMarket.HK)
req.add_choice_filter(field_id=WarrantField.WARRANT_TYPE,
                      choices=[WarrantType.CALL, WarrantType.PUT])           # 认购 + 认沽
req.add_interval_filter(field_id=WarrantField.CURRENT_PRICE,
                        min_val=0.1, max_val=5.0)                            # 现价 0.1~5
req.add_interval_filter(field_id=WarrantField.EFFECTIVE_LEVERAGE,
                        min_val=3.0)                                         # 有效杠杆 > 3
req.add_interval_filter(field_id=WarrantField.STREET_RATIO, max_val=50.0)    # 街货占比 < 50%
req.add_sort(field_id=WarrantField.VOLUME, desc=True)                        # 成交量降序
req.page_count = 20

ret, data = quote_ctx.get_warrant_screen(req)
if ret == RET_OK:
    last_page, all_count, df = data
    print(df[['stock_id', 'warrant_type', 'current_price', 'effective_leverage']].head())
else:
    print('error: ', data)

# 示例 2：仅查满足条件的总数
req = WarrantScreenRequest(warrant_market=WarrantMarket.HK)
req.only_count = True
req.add_choice_filter(field_id=WarrantField.WARRANT_TYPE, choices=[WarrantType.CALL])
req.add_interval_filter(field_id=WarrantField.CURRENT_PRICE, min_val=1.0)
ret, data = quote_ctx.get_warrant_screen(req)
if ret == RET_OK:
    _, all_count, _ = data
    print(f"满足条件的认购证总数：{all_count}")

# 示例 3：按正股代码筛选（choice 直接传 code 字符串）
req = WarrantScreenRequest(warrant_market=WarrantMarket.HK)
req.add_choice_filter(field_id=WarrantField.STOCK_OWNER, choices=["HK.00700"])
req.add_choice_filter(field_id=WarrantField.WARRANT_TYPE,
                      choices=[WarrantType.BULL, WarrantType.BEAR])          # 牛证 + 熊证
req.add_sort(field_id=WarrantField.TURNOVER, desc=True)
req.page_count = 50
ret, data = quote_ctx.get_warrant_screen(req)

quote_ctx.close()
```

* **Output**

```python
         stock_id  warrant_type  current_price  effective_leverage
0  87930865475960             1          0.107               4.337
1  87939455410698             1          0.108               4.307
2  88231513189723             1          0.120               4.996
3  87969520182112             1          0.110               3.604
4  88356067241952             1          0.127               6.827
满足条件的认购证总数：98
```

---



---

# 筛选期权

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_option_screen(request)`

* **介绍**

    期权选股。混合使用标的属性（underlying）与期权属性（option）进行筛选。后端禁止"同组混用 underlying + option"，SDK 自动按需开新筛选组：默认每条筛选条件 AND 拼接（开新组），同 indicator_type 显式 `or_with_previous=True` 时与上一条件 OR（同组）。

* **参数**

    参数|类型|说明
    :-|:-|:-
    request|OptionScreenRequest|期权选股请求对象，构造时必传 market_categories

    * OptionScreenRequest 字段：

        字段|类型|说明
        :-|:-|:-
        market_categories|list[int]|期权市场品类列表  (元素取自 OptMarketCategory：US_STOCK=0、US_INDEX=1、US_FUTURE=2、HK_STOCK=3、HK_INDEX=4、JP_STOCK=5、JP_INDEX=6。其中 US_FUTURE / JP_STOCK / JP_INDEX 后续支持，目前结果为空)
        page_from|int|分页起始位置  (不传默认为 0)
        page_count|int|单页最大返回数  (不传默认为 200)

    * 筛选条件 builder 方法（默认每次调用自动开新筛选组与之前条件 AND；同 indicator_type 显式 `or_with_previous=True` 时与上一条件 OR 同组。后端禁止同组同时含 underlying 与 option 条件）：

        方法|说明
        :-|:-
        add_underlying_filter(indicator_type, values=None, lower=None, upper=None, plate_list=None, parent_plate_id=None, or_with_previous=False)|标的属性筛选  (indicator_type 取自 [OptUnderlyingIndicator](./quote.md#6584)。STOCK_LIST 接受标的 stock_id（int，取自快照/订阅返回），不能直接传证券代码。IV / HV / IV_RANK / IV_PERCENTILE 等百分数指标传**小数**（30% 传 0.3）。PLATE(103) 类型传入会有报错，暂不要使用)
        add_option_filter(indicator_type, values=None, lower=None, upper=None, or_with_previous=False)|期权属性筛选  (indicator_type 取自 [OptIndicator](./quote.md#6840)。DELTA / GAMMA / VEGA / THETA / RHO / 各类概率（如 ITM_PROBABILITY）传 0~1 小数。PREMIUM(2021) 仅支持 sort / retrieve，作为 filter 会有报错；BUY_BREAK_EVEN_POINT(3023) 已废弃，新代码请用 BUY_TO_BEP(3011))
        new_filter_group()|手动开始新的筛选组  (组间 AND，组内 OR)
        add_sort(indicator_type, desc=False)|排序  (desc=True 为降序，默认升序)
        add_option_retrieve(indicator_type)|声明额外要返回的期权字段  (不调用则返回默认基础字段)
        add_underlying_retrieve(indicator_type)|声明要返回的标的字段  (调用后返回结果中的 underlying dict 字段才会被填充)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>tuple</td>
            <td>当 ret == RET_OK，返回 (last_page, all_count, DataFrame)</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 DataFrame 字段：

        字段|类型|说明
        :-|:-|:-
        code|str|期权代码
        option_name|str|期权名称
        strike_price|float|行权价
        strike_date|str|行权日
        option_type|int|认购/认沽  (1=CALL，2=PUT)
        exercise_type|int|行权方式  (1=美式，2=欧式)
        expiration_type|int|到期类型  (1=周，2=月，3=季)
        in_the_money|bool|是否价内
        left_day|int|剩余天数
        price|float|期权价格
        mid_price|float|中间价
        bid_price|float|买价
        ask_price|float|卖价
        bid_ask_spread|float|买卖价差
        bid_volume|int|买量
        ask_volume|int|卖量
        bid_ask_volume_ratio|float|买卖量比
        change_ratio|float|涨跌幅
        volume|int|成交量
        turnover|float|成交额
        open_interest|int|未平仓合约数（持仓量）
        open_interest_market_cap|float|持仓市值
        vol_oi_ratio|float|成交量/持仓量
        premium|float|权利金
        implied_volatility|float|隐含波动率
        history_volatility|float|历史波动率
        iv_hv_ratio|float|IV/HV
        delta|float|希腊字母 Delta
        gamma|float|希腊字母 Gamma
        vega|float|希腊字母 Vega
        theta|float|希腊字母 Theta
        rho|float|希腊字母 Rho
        leverage_ratio|float|杠杆比率
        effective_gearing|float|有效杠杆
        itm_probability|float|价内概率
        buy_to_bep|float|买入到盈亏平衡点比率
        sell_to_bep|float|卖出到盈亏平衡点比率
        buy_profit_probability|float|买入盈利概率
        sell_profit_probability|float|卖出盈利概率
        intrinsic_value_per|float|内在价值百分比
        time_value_per|float|时间价值百分比
        itm_degree|float|价内程度
        otm_degree|float|价外程度
        otm_probability|float|价外概率
        sell_annualized_return|float|卖出年化收益率
        interval_return|float|卖出区间收益率
        underlying|dict|标的信息（仅当调用 add_underlying_retrieve 后返回）  (dict 含 stock_id / iv / hv / iv_rank / iv_percentile / market_cap / price / change_ratio)

* **Example**

```python
from futu import (
    OpenQuoteContext, RET_OK, OptionScreenRequest,
    OptMarketCategory, OptIndicator, OptUnderlyingIndicator,
)

quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

# 示例 1：美股标的 IV>30% + 平值附近 CALL
req = OptionScreenRequest(market_categories=[OptMarketCategory.US_STOCK])
req.add_underlying_filter(OptUnderlyingIndicator.IV, lower=0.3)              # 标的 IV ≥ 30%（小数）
req.add_option_filter(OptIndicator.OPTION_TYPE, values=[1])                  # CALL
req.add_option_filter(OptIndicator.DELTA, lower=0.3, upper=0.7)              # Delta 0.3~0.7
req.add_option_filter(OptIndicator.LEFT_DAY, lower=7, upper=60)              # 剩余 7~60 天
req.add_sort(OptIndicator.VOLUME, desc=True)                                 # 成交量降序
req.add_option_retrieve(OptIndicator.DELTA)
req.add_option_retrieve(OptIndicator.VOLUME)
req.page_count = 30

ret, data = quote_ctx.get_option_screen(req)
if ret == RET_OK:
    last_page, all_count, df = data
    print(df[['code', 'option_name', 'delta', 'volume']].head(10))
else:
    print('error: ', data)

# 示例 2：港股按指定标的筛选 + 同时取标的信息
# 注意：STOCK_LIST 接收的是内部 stock_id，需通过 get_market_snapshot/get_static_info 等接口
# 提前取得；下面 54047868453564 即为港股腾讯（00700）的 stock_id
req = OptionScreenRequest(market_categories=[OptMarketCategory.HK_STOCK])
req.add_underlying_filter(OptUnderlyingIndicator.STOCK_LIST,
                          values=[54047868453564])                            # 标的=腾讯
req.add_option_filter(OptIndicator.OPTION_TYPE, values=[1])                   # CALL
req.add_option_filter(OptIndicator.OPTION_TYPE, values=[2],
                      or_with_previous=True)                                  # 与上一条 OR：CALL + PUT
req.add_underlying_retrieve(OptUnderlyingIndicator.IV)
req.add_underlying_retrieve(OptUnderlyingIndicator.MARKET_CAP)
req.add_sort(OptIndicator.OPEN_INTEREST, desc=True)                           # 持仓量降序
req.page_count = 50

ret, data = quote_ctx.get_option_screen(req)

quote_ctx.close()
```

* **Output**

```python
                 code        option_name    delta  volume
0  US.SLV260529C70000  SLV 260529 70.00C  0.52937   45838
1   US.TZA260612C5500   TZA 260612 5.50C  0.37815   40777
2  US.HIVE260717C5000  HIVE 260717 5.00C  0.36626   31104
3  US.NKE260618C45000  NKE 260618 45.00C  0.32579   24046
4    US.SG260618C9500    SG 260618 9.50C  0.39444   19020
```

---



---

# 获取窝轮和期货列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_referencestock_list(code, reference_type)`

* **介绍**

    获取证券的关联数据，如：获取正股相关窝轮、获取期货相关合约

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|证券代码
    reference_type|[SecurityReferenceType](./quote.md#2911)|要获得的相关数据


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回证券的关联数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 证券的关联数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|证券代码
        lot_size|int|每手股数，期货表示合约乘数
        stock_type|[SecurityType](./quote.md#3325)|证券类型
        stock_name|str|证券名字
        list_time|str|上市时间  (格式：yyyy-MM-dd
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        wrt_valid|bool|是否是窝轮  (若为 True，下面 wrt 开头的字段有效)
        wrt_type|[WrtType](./quote.md#926)|窝轮类型
        wrt_code|str|所属正股
        future_valid|bool|是否是期货  (若为 True，以下 future 开头的字段有效)
        future_main_contract|bool|是否主连合约  (期货特有字段)
        future_last_trade_time|str|最后交易时间  (期货特有字段主连，当月，下月等无该字段)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

# 获取正股相关的窝轮
ret, data = quote_ctx.get_referencestock_list('HK.00700', SecurityReferenceType.WARRANT)
if ret == RET_OK:
    print(data)
    print(data['code'][0])    # 取第一条的股票代码
    print(data['code'].values.tolist())   # 转为 list
else:
    print('error:', data)
print('******************************************')
# 港期相关合约
ret, data = quote_ctx.get_referencestock_list('HK.A50main', SecurityReferenceType.FUTURE)
if ret == RET_OK:
    print(data)
    print(data['code'][0])    # 取第一条的股票代码
    print(data['code'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
        code  lot_size stock_type stock_name   list_time  wrt_valid wrt_type  wrt_code  future_valid  future_main_contract  future_last_trade_time
0     HK.24719      1000    WARRANT    腾讯东亚九四沽A  2018-07-20       True      PUT  HK.00700         False                   NaN                     NaN
..         ...       ...        ...                ...       ...        ...       ...       ...           ...                   ...                    ...
1617  HK.63402     10000    WARRANT    腾讯高盛一八牛Y  2020-11-26       True     BULL  HK.00700         False                   NaN                     NaN

[1618 rows x 11 columns]
HK.24719
['HK.24719', 'HK.27886', 'HK.28621', 'HK.14339', 'HK.27952', 'HK.18693', 'HK.20306', 'HK.53635', 'HK.47269', 'HK.27227', 
...        ...       ...        ...        ...         ...        ...      ...       ... 
'HK.63402']
******************************************
        code  lot_size stock_type         stock_name list_time  wrt_valid  wrt_type  wrt_code  future_valid  future_main_contract future_last_trade_time
0  HK.A50main      5000     FUTURE      安硕富时 A50 ETF主连(2012)                False       NaN       NaN          True                  True                       
..         ...       ...        ...                ...       ...        ...       ...       ...           ...                   ...                    ...
5  HK.A502106      5000     FUTURE      安硕富时 A50 ETF2106                False       NaN       NaN          True                 False             2021-06-29

[6 rows x 11 columns]
HK.A50main
['HK.A50main', 'HK.A502011', 'HK.A502012', 'HK.A502101', 'HK.A502103', 'HK.A502106']
```

---



---

# 获取期货合约资料

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_future_info(code_list)`

* **介绍**

    获取期货合约资料

* **参数**
    参数|类型|说明
    :-|:-|:-
    code_list|list|股票代码列表  (list 中元素类型是 str)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回期货合约资料数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 期货合约资料数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        owner|str|标的
        exchange|str|交易所
        type|str|合约类型
        size|float|合约规模
        size_unit|str|合约规模单位
        price_currency|str|报价货币
        price_unit|str|报价单位
        min_change|float|最小变动
        min_change_unit|str|最小变动的单位 (该字段已废弃)
        trade_time|str|交易时间
        time_zone|str|时区
        last_trade_time|str|最后交易时间  (主连，当月，下月等期货没有该字段)
        exchange_format_url|str|交易所规格链接 url
        origin_code|str|实际合约代码

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_future_info(["HK.MPImain", "HK.HAImain"])
if ret == RET_OK:
    print(data)
    print(data['code'][0])    # 取第一条的股票代码
    print(data['code'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    code      name       owner exchange  type     size size_unit price_currency price_unit  min_change min_change_unit                        trade_time time_zone last_trade_time                                exchange_format_url           origin_code
0  HK.MPImain   內房期货主连  恒生中国内地地产指数      港交所  股指期货     50.0    指数点×港元             港元        指数点        0.50                (09:15 - 12:00), (13:00 - 16:30)       CCT                  https://sc.hkex.com.hk/TuniS/www.hkex.com.hk/P...           HK.MPI2112
1  HK.HAImain   海通证券期货主连    HK.06837      港交所  股票期货  10000.0         股             港元      每股/港元        0.01                   (09:30 - 12:00), (13:00 - 16:00)       CCT                  https://sc.hkex.com.hk/TuniS/www.hkex.com.hk/P...           HK.HAI2112
HK.MPImain
['HK.MPImain', 'HK.HAImain']
```

---



---

# 条件选股

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_stock_filter(market, filter_list, plate_code=None, begin=0, num=200)`

* **介绍**

    条件选股

* **参数**
    参数|类型|说明
    :-|:-|:-
    market|[Market](./quote.md#427)|市场标识  (不区分沪股和深股，传入沪股或者深股都会返回沪深市场的股票)
    filter_list|list|筛选条件的列表  (参考下面的表格，列表中元素类型为 SimpleFilter 或 AccumulateFilter 或 FinancialFilter)
    plate_code|str|板块代码
    begin|int|数据起始点
    num|int|请求数据个数
    * SimpleFilter 对象相关参数如下：  

        字段|类型|说明
        :-|:-|:-
        stock_field|[StockField](./quote.md#860)|简单属性
        filter_min|float|区间下限  (闭区间不传默认为 -∞)
        filter_max|float|区间上限  (闭区间不传默认为 +∞)
        is_no_filter|bool|该字段是否不需要筛选  (True：不筛选False：筛选不传默认不筛选)
        sort|[SortDir](./quote.md#5471)|排序方向  (不传默认为不排序)

    * AccumulateFilter 对象相关参数如下：

        字段|类型|说明
        :-|:-|:-
        stock_field|[StockField](./quote.md#4370)|累积属性
        filter_min|float|区间下限  (闭区间不传默认为 -∞)
        filter_max|float|区间上限  (闭区间不传默认为 +∞)
        is_no_filter|bool|该字段是否不需要筛选  (True：不筛选False：筛选不传默认不筛选)
        sort|[SortDir](./quote.md#5471)|排序方向  (不传默认为不排序)
        days|int|所筛选的数据的累计天数

    * FinancialFilter 对象相关参数如下：

        字段|类型|说明
        :-|:-|:-
        stock_field|[StockField](./quote.md#8542)|财务属性
        filter_min|float|区间下限  (闭区间不传默认为 -∞)
        filter_max|float|区间上限  (闭区间不传默认为 +∞)
        is_no_filter|bool|该字段是否不需要筛选  (True：不筛选False：筛选不传默认不筛选)
        sort|[SortDir](./quote.md#5471)|排序方向  (不传默认为不排序)
        quarter|[FinancialQuarter](./quote.md#2253)|财报累积时间

    * CustomIndicatorFilter 对象相关参数如下：

        字段|类型|说明
        :-|:-|:-
        stock_field1|[StockField](./quote.md#2057)|自定义技术指标属性
        stock_field1_para|list|自定义技术指标属性参数  (根据指标类型进行传参：1. MA：[平均移动周期] 2.EMA：[指数移动平均周期] 3.RSI：[RSI 指标周期] 4.MACD：[快速平均线值, 慢速平均线值, DIF值] 5.BOLL：[均线周期, 偏移值] 6.KDJ：[RSV 周期, K 值计算周期, D 值计算周期]) 
        relative_position|[RelativePosition](./quote.md#2453)|相对位置
        stock_field2|[StockField](./quote.md#2057)|自定义技术指标属性
        stock_field2_para|list|自定义技术指标属性参数  (根据指标类型进行传参：1. MA：[平均移动周期] 2.EMA：[指数移动平均周期] 3.RSI：[RSI 指标周期] 4.MACD：[快速平均线值, 慢速平均线值, DIF值] 5.BOLL：[均线周期, 偏移值] 6.KDJ：[RSV 周期, K 值计算周期, D 值计算周期]) 
        value|float|自定义数值  (当 stock_field2 在 [StockField](./quote.md#2057) 中选择自定义数值时，value 为必传参数) 
        ktype|[KLType](./quote.md#4119)|K线类型 KLType   (仅支持K_60M，K_DAY，K_WEEK，K_MON 四种时间周期)
        consecutive_period|int|筛选连续周期（consecutive_period）都符合条件的数据  (填写范围为[1,12]) 
        is_no_filter|bool|该字段是否不需要筛选  (True：不筛选False：筛选不传默认不筛选)
 
    * PatternFilter 对象相关参数如下：

        字段|类型|说明
        :-|:-|:-
        stock_field|[StockField](./quote.md#159)|形态技术指标属性
        ktype|[KLType](./quote.md#4119)|K线类型 KLType （仅支持K_60M，K_DAY，K_WEEK，K_MON 四种时间周期）
        consecutive_period|int|筛选连续周期（consecutive_period）都符合条件的数据  (填写范围为[1,12]) 
        is_no_filter|bool|该字段是否不需要筛选  (True：不筛选False：筛选不传默认不筛选)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>tuple</td>
            <td>当 ret == RET_OK，返回选股数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 选股数据元组组成如下：
        字段|类型|说明
        :-|:-|:-
        last_page|bool|是否是最后一页
        all_count|int|列表总数量
        stock_list|list|选股数据  (list 中元素类型是 FilterStockData)
        
        - FilterStockData 类型的字段格式：

            字段|类型|说明
            :-|:-|:-
            stock_code|str|股票代码
            stock_name|str|股票名字
            cur_price|float|最新价
            cur_price_to_highest_52weeks_ratio|float|(现价 - 52周最高)/52周最高  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            cur_price_to_lowest_52weeks_ratio|float|(现价 - 52周最低)/52周最低  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            high_price_to_highest_52weeks_ratio|float|(今日最高 - 52周最高)/52周最高  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            low_price_to_lowest_52weeks_ratio|float|(今日最低 - 52周最低)/52周最低  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            volume_ratio|float|量比
            bid_ask_ratio|float|委比  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            lot_price|float|每手价格
            market_val|float|市值
            pe_annual|float|市盈率
            pe_ttm|float|市盈率 TTM
            pb_rate|float|市净率
            change_rate_5min|float|五分钟价格涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            change_rate_begin_year|float|年初至今价格涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            ps_ttm|float|市销率 TTM  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            pcf_ttm|float|市现率 TTM  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            total_share|float|总股数  (单位：股)
            float_share|float|流通股数  (单位：股)
            float_market_val|float|流通市值  (单位：元)
            change_rate|float|涨跌幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            amplitude|float|振幅  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            volume|float|日均成交量
            turnover|float|日均成交额
            turnover_rate|float|换手率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            net_profit|float|净利润
            net_profix_growth|float|净利润增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            sum_of_business|float|营业收入
            sum_of_business_growth|float|营业同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            net_profit_rate|float|净利率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            gross_profit_rate|float|毛利率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            debt_asset_rate|float|资产负债率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            return_on_equity_rate|float|净资产收益率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            roic|float|投入资本回报率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            roa_ttm|float|资产回报率 TTM  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。仅适用于年报)
            ebit_ttm|float|息税前利润 TTM  (单位：元。仅适用于年报)
            ebitda|float|税息折旧及摊销前利润  (单位：元)
            operating_margin_ttm|float|营业利润率 TTM  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。仅适用于年报)
            ebit_margin|float|EBIT 利润率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            ebitda_margin|float|EBITDA 利润率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            financial_cost_rate|float|财务成本率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            operating_profit_ttm|float|营业利润 TTM  (单位：元。仅适用于年报)
            shareholder_net_profit_ttm|float|归属于母公司的净利润  (单位：元。仅适用于年报)
            net_profit_cash_cover_ttm|float|盈利中的现金收入比例  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。仅适用于年报)
            current_ratio|float|流动比率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            quick_ratio|float|速动比率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            current_asset_ratio|float|流动资产率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            current_debt_ratio|float|流动负债率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            equity_multiplier|float|权益乘数 
            property_ratio|float|产权比率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            cash_and_cash_equivalents|float|现金和现金等价  (单位：元)
            total_asset_turnover|float|总资产周转率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            fixed_asset_turnover|float|固定资产周转率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            inventory_turnover|float|存货周转率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            operating_cash_flow_ttm|float|经营活动现金流 TTM   (单位：元。仅适用于年报)
            accounts_receivable|float|应收账款净额  (单位：元)
            ebit_growth_rate|float|EBIT 同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            operating_profit_growth_rate|float|营业利润同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            total_assets_growth_rate|float|总资产同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            profit_to_shareholders_growth_rate|float|归母净利润同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            profit_before_tax_growth_rate|float|总利润同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            eps_growth_rate|float|EPS 同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            roe_growth_rate|float|ROE 同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            roic_growth_rate|float|ROIC 同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            nocf_growth_rate|float|经营现金流同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            nocf_per_share_growth_rate|float|每股经营现金流同比增长率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            operating_revenue_cash_cover|float|经营现金收入比  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            operating_profit_to_total_profit|float|营业利润占比  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
            basic_eps|float|基本每股收益  (单位：元)
            diluted_eps|float|稀释每股收益  (单位：元)
            nocf_per_share|float|每股经营现金净流量  (单位：元)
            price|float|最新价格
            ma|float|简单均线  (根据 MA 参数返回具体的数值)
            ma5|float|5日简单均线
            ma10|float|10日简单均线
            ma20|float|20日简单均线
            ma30|float|30日简单均线
            ma60|float|60日简单均线
            ma120|float|120日简单均线
            ma250|float|250日简单均线
            rsi|float|RSI的值  (根据 RSI 参数返回具体的数值，RSI 默认参数为12)
            ema|float|指数移动均线  (根据 EMA 参数返回具体的数值) 
            ema5|float|5日指数移动均线 
            ema10|float|10日指数移动均线
            ema20|float|20日指数移动均线
            ema30|float|30日指数移动均线
            ema60|float|60日指数移动均线
            ema120|float|120日指数移动均线
            ema250|float|250日指数移动均线
            kdj_k|float|KDJ 指标的 K 值  (根据 KDJ 参数返回具体的数值，KDJ 默认参数为[9,3,3]) 
            kdj_d|float|KDJ 指标的 D 值  (根据 KDJ 参数返回具体的数值，KDJ 默认参数为[9,3,3]) 
            kdj_j|float|KDJ 指标的 J 值  (根据 KDJ 参数返回具体的数值，KDJ 默认参数为[9,3,3]) 
            macd_diff|float|MACD 指标的 DIFF 值  (根据 MACD 参数返回具体的数值，MACD 默认参数为[12,26,9]) 
            macd_dea|float|MACD 指标的 DEA 值  (根据 MACD 参数返回具体的数值，MACD 默认参数为[12,26,9]) 
            macd|float|MACD 指标的 MACD 值  (根据 MACD 参数返回具体的数值，MACD 默认参数为[12,26,9]) 
            boll_upper|float|BOLL 指标的 UPPER 值  (根据 BOLL 参数返回具体的数值，BOLL 默认参数为[20.2]) 
            boll_middler|float|BOLL 指标的 MIDDLER 值  (根据 BOLL 参数返回具体的数值，BOLL 默认参数为[20.2])
            boll_lower|float|BOLL 指标的 LOWER 值  (根据 BOLL 参数返回具体的数值，BOLL 默认参数为[20.2])


* **Example**

```python
from futu import *
import time

quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
simple_filter = SimpleFilter()
simple_filter.filter_min = 2
simple_filter.filter_max = 1000
simple_filter.stock_field = StockField.CUR_PRICE
simple_filter.is_no_filter = False
# simple_filter.sort = SortDir.ASCEND

financial_filter = FinancialFilter()
financial_filter.filter_min = 0.5
financial_filter.filter_max = 50
financial_filter.stock_field = StockField.CURRENT_RATIO
financial_filter.is_no_filter = False
financial_filter.sort = SortDir.ASCEND
financial_filter.quarter = FinancialQuarter.ANNUAL

custom_filter = CustomIndicatorFilter()
custom_filter.ktype = KLType.K_DAY
custom_filter.stock_field1 = StockField.KDJ_K
custom_filter.stock_field1_para = [10,4,4]
custom_filter.stock_field2 = StockField.KDJ_K
custom_filter.stock_field2_para = [9,3,3]
custom_filter.relative_position = RelativePosition.MORE
custom_filter.is_no_filter = False

nBegin = 0
last_page = False
ret_list = list()
while not last_page:
    nBegin += len(ret_list)
    ret, ls = quote_ctx.get_stock_filter(market=Market.HK, filter_list=[simple_filter, financial_filter, custom_filter], begin=nBegin)  # 对香港市场的股票做简单、财务和指标筛选
    if ret == RET_OK:
        last_page, all_count, ret_list = ls
        print('all count = ', all_count)
        for item in ret_list:
            print(item.stock_code)  # 取股票代码
            print(item.stock_name)  # 取股票名称
            print(item[simple_filter])   # 取 simple_filter 对应的变量值
            print(item[financial_filter])   # 取 financial_filter 对应的变量值
            print(item[custom_filter])  # 获取 custom_filter 的数值
    else:
        print('error: ', ls)
    time.sleep(3)  # 加入时间间隔，避免触发限频

quote_ctx.close()  # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
39 39 [ stock_code:HK.08103  stock_name:HMVOD视频  cur_price:2.69  current_ratio(annual):4.413 ,  stock_code:HK.00376  stock_name:云锋金融  cur_price:2.96  current_ratio(annual):12.585 ,  stock_code:HK.09995  stock_name:荣昌生物-B  cur_price:92.65  current_ratio(annual):16.054 ,  stock_code:HK.80737  stock_name:湾区发展-R  cur_price:2.8  current_ratio(annual):17.249 ,  stock_code:HK.00737  stock_name:湾区发展  cur_price:3.25  current_ratio(annual):17.249 ,  stock_code:HK.03939  stock_name:万国国际矿业  cur_price:2.22  current_ratio(annual):17.323 ,  stock_code:HK.01055  stock_name:中国南方航空股份  cur_price:5.17  current_ratio(annual):17.529 ,  stock_code:HK.02638  stock_name:港灯-SS  cur_price:7.68  current_ratio(annual):21.255 ,  stock_code:HK.00670  stock_name:中国东方航空股份  cur_price:3.53  current_ratio(annual):25.194 ,  stock_code:HK.01952  stock_name:云顶新耀-B  cur_price:69.5  current_ratio(annual):26.029 ,  stock_code:HK.00089  stock_name:大生地产  cur_price:4.22  current_ratio(annual):26.914 ,  stock_code:HK.00728  stock_name:中国电信  cur_price:2.81  current_ratio(annual):27.651 ,  stock_code:HK.01372  stock_name:比速科技  cur_price:5.1  current_ratio(annual):28.303 ,  stock_code:HK.00753  stock_name:中国国航  cur_price:6.38  current_ratio(annual):31.828 ,  stock_code:HK.01997  stock_name:九龙仓置业  cur_price:43.75  current_ratio(annual):33.239 ,  stock_code:HK.02158  stock_name:医渡科技  cur_price:39.0  current_ratio(annual):34.046 ,  stock_code:HK.02588  stock_name:中银航空租赁  cur_price:77.0  current_ratio(annual):34.531 ,  stock_code:HK.01330  stock_name:绿色动力环保  cur_price:3.36  current_ratio(annual):35.028 ,  stock_code:HK.01525  stock_name:建桥教育  cur_price:6.28  current_ratio(annual):36.989 ,  stock_code:HK.09908  stock_name:嘉兴燃气  cur_price:10.02  current_ratio(annual):37.848 ,  stock_code:HK.06078  stock_name:海吉亚医疗  cur_price:49.8  current_ratio(annual):39.0 ,  stock_code:HK.01071  stock_name:华电国际电力股份  cur_price:2.16  current_ratio(annual):39.507 ,  stock_code:HK.00357  stock_name:美兰空港  cur_price:34.15  current_ratio(annual):39.514 ,  stock_code:HK.00762  stock_name:中国联通  cur_price:5.15  current_ratio(annual):40.74 ,  stock_code:HK.01787  stock_name:山东黄金  cur_price:15.56  current_ratio(annual):41.604 ,  stock_code:HK.00902  stock_name:华能国际电力股份  cur_price:2.66  current_ratio(annual):42.919 ,  stock_code:HK.00934  stock_name:中石化冠德  cur_price:2.96  current_ratio(annual):43.361 ,  stock_code:HK.01117  stock_name:现代牧业  cur_price:2.3  current_ratio(annual):45.037 ,  stock_code:HK.00177  stock_name:江苏宁沪高速公路  cur_price:8.78  current_ratio(annual):45.93 ,  stock_code:HK.01379  stock_name:温岭工量刃具  cur_price:5.71  current_ratio(annual):46.774 ,  stock_code:HK.01876  stock_name:百威亚太  cur_price:22.5  current_ratio(annual):46.917 ,  stock_code:HK.01907  stock_name:中国旭阳集团  cur_price:4.38  current_ratio(annual):47.129 ,  stock_code:HK.02160  stock_name:心通医疗-B  cur_price:15.54  current_ratio(annual):47.384 ,  stock_code:HK.00293  stock_name:国泰航空  cur_price:7.1  current_ratio(annual):47.983 ,  stock_code:HK.00694  stock_name:北京首都机场股份  cur_price:6.34  current_ratio(annual):47.985 ,  stock_code:HK.09922  stock_name:九毛九  cur_price:26.65  current_ratio(annual):48.278 ,  stock_code:HK.01083  stock_name:港华燃气  cur_price:3.39  current_ratio(annual):49.2 ,  stock_code:HK.00291  stock_name:华润啤酒  cur_price:58.0  current_ratio(annual):49.229 ,  stock_code:HK.00306  stock_name:冠忠巴士集团  cur_price:2.29  current_ratio(annual):49.769 ]
HK.08103
HMVOD视频
2.69
2.69
4.413
...
HK.00306
冠忠巴士集团
2.29
2.29
49.769
```

---



---

# 筛选正股

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_stock_screen(request)`

* **介绍**

    条件选股 V2。相比旧接口 [get_stock_filter](./get-stock-filter.md)，因子覆盖更广（11 类共 244+ 个因子），数值统一传原始值（OpenD 自动倍率转换），支持单字段或多字段排序、显式声明取回属性，结果按 `value_type` 分别填入 `sval` / `ival` / `aval` / `dval`。

* **参数**

    参数|类型|说明
    :-|:-|:-
    request|StockScreenRequest|条件选股请求对象，通过 builder 方式构建

    * StockScreenRequest 字段：

        字段|类型|说明
        :-|:-|:-
        page_from|int|分页起始位置  (不传默认为 0)
        page_count|int|单页最大返回数  (不传默认为 200)

    * 筛选条件 builder 方法（每次调用追加一条筛选条件，所有数值字段直接传原始值，OpenD 自动倍率转换）：

        方法|说明
        :-|:-
        add_simple_field(field, values)|市场 / 交易所 / 指数 / 自选股等枚举字段筛选  (field 取自 [SimpleField](./quote.md#1036)；values 为枚举值列表（OR 关系）。ScrMarket.MY / JP / SG 后续支持，目前结果为空)
        add_plate(plate_ids, parent_plate_id=None)|板块筛选  (plate_ids 形如 ["BK1001"])
        add_simple_property(name, lower=None, upper=None)|简单行情属性区间筛选  (name 取自 [SimpleProperty](./quote.md#3458)（最新价、市值、PE、量比等）；lower / upper 直接传原始值，如最新价 10 元传 10、市值 ≥ 100 亿传 10_000_000_000)
        add_cumulative_property(name, days=1, lower=None, upper=None)|累计行情属性  (name 取自 [CumulativeProperty](./quote.md#7431)；days 用于 N 日累计。涨跌幅类（如 PRICE_CHANGE_PCT）传值为**小数**（5% 传 0.05，非 5.0）)
        add_financial_property(name, term=None, year=None, lower=None, upper=None, ...)|财务属性  (name 取自 [FinancialProperty](./quote.md#9745)；term 取自 Term 枚举（Q1=1、年报=100、最新单季=10 等）。Term.SURPRISE_LATEST 系列（200~204）实测 HK/US 均会返回数值，但当前数据通常与 ANNUAL 相同，慎用)
        add_indicator_positional(first_indicator_name, period_type, position, second_indicator=None, ...)|技术指标位置关系  (如 MA5 上穿 MA20。指标名/周期/位置取自 [Indicator / Period / Position](./quote.md#823))
        add_indicator_pattern(name, period_type, ...)|技术指标形态（金叉、死叉、背离等）  (name 取自 [Pattern](./quote.md#823))
        add_featured_property(name, intervals=None, value_set=None, period=None, range_period=None, first_custom_param=None)|特色指标（筹码、热度、分析师评级、资金流等）
        add_broker_holdings(name, days=None, param=None, intervals=None)|经纪商持股因子  (仅港股。经纪商因子 6101 / 6102 / 6105 / 6106 / 6107 倍率 1000，按百分数传值（如 20% 传 20）；`days` 参数不生效)
        add_kline_shape(name, period=None, value_set=None)|K 线形态（双底、头肩底等）  (period 必传，目前仅支持日 K(11) 与 1 小时 K(21))
        add_option(name, intervals=None, param=None, period=None)|期权指标（正股 IV、HV 等）

    * 取回属性 builder 方法（声明返回哪些字段值；不声明则只返回 stock_id）：

        方法|说明
        :-|:-
        add_retrieve_basic(name)|代码 / 名称 / 行业  (name 取自 [BasicProperty](./quote.md#55)：CODE=1101、NAME=1102、INDUSTRY=1103)
        add_retrieve_simple(name)|简单行情属性  (name 取自 [SimpleProperty](./quote.md#3458))
        add_retrieve_cumulative(name, days=1, period_average=None)|累计属性  (name 取自 [CumulativeProperty](./quote.md#7431))
        add_retrieve_financial(name, term=None, year=None, ...)|财务属性  (name 取自 [FinancialProperty](./quote.md#9745))
        add_retrieve_indicator(name, period=None, indicator_params=None)|技术指标
        add_retrieve_featured(name, period=None, range_period=None, first_custom_param=None)|特色属性
        add_retrieve_broker(name, days=None, param=None)|经纪商
        add_retrieve_option(name, param=None, period=None)|期权属性
        add_retrieve_kline_shape(name, period=None)|K 线形态  (period 必传，否则不返回结果；目前仅支持日 K(11) 与 1 小时 K(21))

    * 排序 builder 方法：

        方法|说明
        :-|:-
        set_sort(direction, property_type, property_params)|单字段排序  (direction 取自 ScrSortDir：ASC=1、DESC=2、ABS_ASC=3、ABS_DESC=4。property_type 取 'basic' / 'simple' / 'cumulative' / 'financial' / 'indicator' / 'featured' / 'broker' / 'option' / 'kline_shape')
        add_sort(direction, property_type, property_params)|多字段排序  (按调用顺序生效；与 set_sort 二选一，sortList 非空时优先)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467">RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>tuple</td>
            <td>当 ret == RET_OK，返回 (last_page, all_count, items)</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 返回 tuple 字段：

        字段|类型|说明
        :-|:-|:-
        last_page|bool|是否最后一页
        all_count|int|满足条件的总条数
        items|list[dict]|当前页结果列表，元素结构为 `{'stock_id': int, 'results': [result, ...]}`

    * 单条 result 结构：

        字段|类型|说明
        :-|:-|:-
        type|str|属性类型  ('basic' / 'simple' / 'cumulative' / 'financial' / 'indicator' / 'featured' / 'broker' / 'option' / 'kline_shape')
        property|dict|对应 property 描述（含 name / days / term 等）
        value_type|int|值类型  (1=string(sval)、2=int64(ival)、3=int64数组(aval)、4=double(dval)。当 OpenD 无数据时仅下发 value_type（多为 2），sval/ival/aval/dval 均缺失，如港股 Q2/Q3/Q4 财务数据)
        sval|str|字符串值（value_type=1 时存在）
        ival|int|整型值（value_type=2 时存在）
        aval|list[int]|整型数组值（value_type=3 时存在）
        dval|float|浮点值（value_type=4 时存在）
        enum_type_name|str|当 ival 为枚举码时，对应的枚举类型名（如 'KlineShapeType'）
        enum_name|str|当 ival 为枚举码时，OpenD/SDK 解码出的枚举名（如 'DOUBLE_BOTTOMS'、'NONE'）
        end_time|int|财报结束时间戳  (仅 financial 类型，且当前 OpenD 版本暂未下发，实际返回结果中通常没有该字段)

* **Example**

```python
from futu import OpenQuoteContext, RET_OK, StockScreenRequest
from futu.quote.stock_screen_const import (
    ScrMarket, ScrSortDir, SimpleField, SimpleProperty,
    CumulativeProperty, FinancialProperty, Term,
    Indicator, Period, Position, Pattern,
    BasicProperty, KlineShapeProperty, KlineShapeType,
)

quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

# 示例 1：港股大市值股 + MACD 金叉
req = StockScreenRequest()
req.add_simple_field(field=SimpleField.MARKET, values=[ScrMarket.HK])
req.add_simple_property(name=SimpleProperty.PRICE, lower=10.0)                   # 最新价 ≥ 10
req.add_simple_property(name=SimpleProperty.MARKET_CAP, lower=10_000_000_000.0)  # 市值 ≥ 100 亿
req.add_simple_property(name=SimpleProperty.PE_TTM, lower=10.0, upper=50.0)      # PE(TTM) 10~50
req.add_indicator_pattern(name=Pattern.MACD_GOLD_CROSS, period_type=Period.DAY)  # MACD 金叉
# 取回字段
req.add_retrieve_basic(name=BasicProperty.CODE)
req.add_retrieve_basic(name=BasicProperty.NAME)
req.add_retrieve_simple(name=SimpleProperty.PRICE)
req.add_retrieve_simple(name=SimpleProperty.MARKET_CAP)
req.add_retrieve_simple(name=SimpleProperty.PE_TTM)
# 排序
req.set_sort(direction=ScrSortDir.DESC, property_type='simple',
             property_params={'name': int(SimpleProperty.MARKET_CAP)})
req.page_count = 50

ret, data = quote_ctx.get_stock_screen(req)
if ret == RET_OK:
    last_page, all_count, items = data
    print(f"总数 {all_count}, 当前返回 {len(items)} 条")
    for it in items[:3]:
        print(it['stock_id'], it['results'])
else:
    print('error: ', data)

# 示例 2：财务因子 + 累计涨跌幅
req = StockScreenRequest()
req.add_simple_field(field=SimpleField.MARKET, values=[ScrMarket.HK])
req.add_cumulative_property(name=CumulativeProperty.PRICE_CHANGE_PCT,
                            days=5, lower=-0.05, upper=0.05)                     # 5 日涨跌幅 -5%~5%（百分数传小数）
req.add_financial_property(name=FinancialProperty.NET_PROFIT,
                           term=Term.ANNUAL, lower=0.0)                          # 年报净利润 > 0
req.add_retrieve_basic(name=BasicProperty.CODE)
req.add_retrieve_simple(name=SimpleProperty.PRICE)
req.page_count = 200
ret, data = quote_ctx.get_stock_screen(req)

# 示例 3：K 线形态（W 型底 + 头肩底）
req = StockScreenRequest()
req.add_simple_field(field=SimpleField.MARKET, values=[ScrMarket.HK])
req.add_kline_shape(name=KlineShapeProperty.SHAPE_TYPE, period=Period.DAY,
                    value_set=[KlineShapeType.DOUBLE_BOTTOMS,
                               KlineShapeType.HEAD_SHOULDERS_BOTTOM])
req.add_retrieve_basic(name=BasicProperty.CODE)
req.add_retrieve_kline_shape(name=KlineShapeProperty.SHAPE_TYPE, period=Period.DAY)
ret, data = quote_ctx.get_stock_screen(req)

quote_ctx.close()
```

* **Output**

```python
总数 1, 当前返回 1 条
54047868453564 [{'type': 'basic', 'property': {'name': 1101}, 'value_type': 1, 'sval': '00700'},
                {'type': 'basic', 'property': {'name': 1102}, 'value_type': 1, 'sval': '腾讯控股'},
                {'type': 'simple', 'property': {'name': 2201}, 'value_type': 4, 'dval': 460.0},
                {'type': 'simple', 'property': {'name': 2301}, 'value_type': 4, 'dval': 4194280264040.0},
                {'type': 'simple', 'property': {'name': 2303}, 'value_type': 4, 'dval': 15.75126}]
```

---



---

# 获取板块内股票列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_plate_stock(plate_code, sort_field=SortField.CODE, ascend=True)`

* **介绍**

    获取指定板块内的股票列表，获取股指的成分股

* **参数**
    参数|类型|说明
    :-|:-|:-
    plate_code|str|板块代码  (先利用 [获取板块列表](../quote/get-plate-list.md) 获取板块代码例如：“SH.BK0001”，“SH.BK0002”)
    sort_field|[SortField](./quote.md#2930)|排序字段
    ascend|bool|排序方向  (True：升序False：降序)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回板块股票数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 板块股票数据
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        lot_size|int|每手股数，期货表示合约乘数
        stock_name|str|股票名称
        stock_type|[SecurityType](./quote.md#3325)|股票类型
        list_time|str|上市时间  (格式：yyyy-MM-dd
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        stock_id|int|股票 ID
        main_contract|bool|是否主连合约  (期货特有字段)
        last_trade_time|str|最后交易时间  (期货特有字段主连，当月，下月等期货没有该字段)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_plate_stock('HK.BK1001')
if ret == RET_OK:
    print(data)
    print(data['stock_name'][0])    # 取第一条的股票名称
    print(data['stock_name'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    code  lot_size stock_name  stock_owner  stock_child_type stock_type   list_time        stock_id  main_contract last_trade_time
0   HK.00462      4000       天然乳品          NaN               NaN      STOCK  2005-06-10  55589761712590          False                
..       ...       ...        ...          ...               ...        ...         ...             ...            ...             ...
9   HK.06186      1000       中国飞鹤          NaN               NaN      STOCK  2019-11-13  78159814858794          False               

[10 rows x 10 columns]
天然乳品
['天然乳品', '现代牧业', '雅士利国际', '原生态牧业', '中国圣牧', '中地乳业', '庄园牧场', '澳优', '蒙牛乳业', '中国飞鹤']
```

---



---

# 获取板块列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_plate_list(market, plate_class)`

* **介绍**

    获取板块列表

* **参数**
    参数|类型|说明
    :-|:-|:-
    market|[Market](./quote.md#427)|市场标识  (注意：这里不区分沪和深，输入沪或者深都会返回沪深市场的子板块)
    plate_class|[Plate](./quote.md#1362)|板块分类


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回板块列表数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 板块列表数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|板块代码
        plate_name|str|板块名字
        plate_id|str|板块 ID

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_plate_list(Market.HK, Plate.CONCEPT)
if ret == RET_OK:
    print(data)
    print(data['plate_name'][0])    # 取第一条的板块名称
    print(data['plate_name'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    code plate_name plate_id
0   HK.BK1000      做空集合股   BK1000
..        ...        ...      ...
77  HK.BK1999       殡葬概念   BK1999

[78 rows x 3 columns]
做空集合股
['做空集合股', '阿里概念股', '雄安概念股', '苹果概念', '一带一路', '5G概念', '夜店股', '粤港澳大湾区', '特斯拉概念股', '啤酒', '疑似财技股', '体育用品', '稀土概念', '人民币升值概念', '抗疫概念', '新股与次新股', '腾讯概念', '云办公', 'SaaS概念', '在线教育', '汽车经销商', '挪威政府全球养老基金持仓', '武汉本地概念股', '核电', '内地医药股', '化妆美容股', '科网股', '公用股', '石油股', '电讯设备', '电力股', '手游股', '婴儿及小童用品股', '百货业股', '收租股', '港口运输股', '电信股', '环保', '煤炭股', '汽车股', '电池', '物流', '内地物业管理股', '农业股', '黄金股', '奢侈品股', '电力设备股', '连锁快餐店', '重型机械股', '食品股', '内险股', '纸业股', '水务股', '奶制品股', '光伏太阳能股', '内房股', '内地教育股', '家电股', '风电股', '蓝筹地产股', '内银股', '航空股', '石化股', '建材水泥股', '中资券商股', '高铁基建股', '燃气股', '公路及铁路股', '钢铁金属股', '华为概念', 'OLED概念', '工业大麻', '香港本地股', '香港零售股', '区块链', '猪肉概念', '节假日概念', '殡葬概念']
```

---



---

# 获取静态数据

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_stock_basicinfo(market, stock_type=SecurityType.STOCK, code_list=None)`

* **介绍**

    获取静态数据

* **参数**
    参数|类型|说明
    :-|:-|:-
    market|[Market](./quote.md#427)|市场类型
    stock_type|[SecurityType](./quote.md#3325)|股票类型，但不支持传入 SecurityType.DRVT
    code_list|list|股票列表  (- 默认为 None，代表获取全市场股票的静态信息
  - 若传入股票列表，只返回指定股票的信息
  - 支持传入期权
  - list 中元素类型是 str)
    注：当 market 和 code_list 同时存在时，会忽略 market，仅对 code_list 进行查询。


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回股票静态数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 股票静态数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        lot_size|int|每手股数，期权表示每份合约股数  (指数期权无该字段)，期货表示合约乘数
        stock_type|[SecurityType](./quote.md#3325)|股票类型
        stock_child_type|[WrtType](./quote.md#926)|窝轮子类型
        stock_owner|str|窝轮所属正股的代码，或期权标的股的代码
        option_type|[OptionType](./quote.md#3713)|期权类型
        strike_time|str|期权行权日  (格式：yyyy-MM-dd
港股和 A 股市场默认是北京时间，美股市场默认是美东时间)
        strike_price|float|期权行权价
        suspension|bool|期权是否停牌  (True：停牌False：未停牌)
        listing_date|str|上市时间  (此字段停止维护，不建议使用
格式：yyyy-MM-dd)
        stock_id|int|股票 ID
        delisting|bool|是否退市
        index_option_type|str|指数期权类型
        main_contract|bool|是否主连合约
        last_trade_time|str|最后交易时间  (主连，当月，下月等期货没有该字段)
        exchange_type|[ExchType](./quote.html#6898)|所属交易所

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data = quote_ctx.get_stock_basicinfo(Market.HK, SecurityType.STOCK)
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
print('******************************************')
ret, data = quote_ctx.get_stock_basicinfo(Market.HK, SecurityType.STOCK, ['HK.06998', 'HK.00700'])
if ret == RET_OK:
    print(data)
    print(data['name'][0])  # 取第一条的股票名称
    print(data['name'].values.tolist())  # 转为 list
else:
    print('error:', data)
quote_ctx.close()  # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
        code             name  lot_size stock_type stock_child_type stock_owner option_type strike_time strike_price suspension listing_date        stock_id  delisting index_option_type  main_contract last_trade_time exchange_type
0      HK.00001               长和       500      STOCK              N/A                     N/A                      N/A        N/A   2015-03-18   4440996184065      False               N/A          False                  HK_MAINBOARD  
...         ...              ...       ...        ...              ...         ...         ...         ...          ...        ...          ...             ...        ...               ...            ...             ...
2592   HK.09979     绿城管理控股      1000      STOCK              N/A                                              N/A        N/A   2020-07-10  79203491915515      False               N/A          False                  HK_MAINBOARD                

[2593 rows x 16 columns]
******************************************
        code            name  lot_size stock_type stock_child_type stock_owner option_type strike_time strike_price suspension listing_date        stock_id  delisting index_option_type  main_contract last_trade_time exchange_type
0  HK.06998     嘉和生物-B       500      STOCK              N/A                                              N/A        N/A   2020-10-07  79572859099990      False               N/A          False                  HK_MAINBOARD                
1  HK.00700     腾讯控股         100      STOCK              N/A                                              N/A        N/A   2004-06-16  54047868453564      False               N/A          False                  HK_MAINBOARD               
嘉和生物-B
['嘉和生物-B', '腾讯控股']
```

---



---

# 获取 IPO 信息

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">
<template v-slot:py>


`get_ipo_list(market)`

* **介绍**

    获取指定市场的 IPO 信息

* **参数**
    参数|类型|说明
    :-|:-|:-
    market|[Market](./quote.md#427)|市场标识  (注意：这里不区分沪和深，输入沪或者深都会返回沪深市场的股票)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回 IPO 数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * IPO 数据
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        list_time|str|上市日期，美股是预计上市日期 (格式：yyyy-MM-dd)
        list_timestamp|float|上市日期时间戳，美股是预计上市日期时间戳
        apply_code|str|申购代码（A 股适用）
        issue_size|int|发行总数（A 股适用）；发行量（美股适用）
        online_issue_size|int|网上发行量（A 股适用）
        apply_upper_limit|int|申购上限（A 股适用）
        apply_limit_market_value|int|顶格申购需配市值（A 股适用）
        is_estimate_ipo_price|bool|是否预估发行价（A 股适用）
        ipo_price|float|发行价  (预估值会因为募集资金、发行数量、发行费用等数据变动而变动，仅供参考。实际数据公布后会第一时间更新)（A 股适用）
        industry_pe_rate|float|行业市盈率（A 股适用）
        is_estimate_winning_ratio|bool|是否预估中签率（A 股适用）
        winning_ratio|float|中签率  (- 预估值会因为募集资金、发行数量、发行费用等数据变动而变动，仅供参考。实际数据公布后会第一时间更新
  - 该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)（A 股适用）
        issue_pe_rate|float|发行市盈率（A 股适用）
        apply_time|str|申购日期字符串 (格式：yyyy-MM-dd)（A 股适用）
        apply_timestamp|float|申购日期时间戳（A 股适用）
        winning_time|str|公布中签日期字符串 (格式：yyyy-MM-dd)（A 股适用）
        winning_timestamp|float|公布中签日期时间戳（A 股适用）
        is_has_won|bool|是否已经公布中签号（A 股适用）
        winning_num_data|str|中签号（A 股适用）  (格式类似：末"五"位数：12345，12346末"六"位数：123456)
        ipo_price_min|float|最低发售价（港股适用）；最低发行价（美股适用）
        ipo_price_max|float|最高发售价（港股适用）；最高发行价（美股适用）
        list_price|float|上市价（港股适用）
        lot_size|int|每手股数
        entrance_price|float|入场费（港股适用）
        is_subscribe_status|bool|是否为认购状态  (True：认购中False：待上市)
        apply_end_time|str|截止认购日期字符串 (格式：yyyy-MM-dd)（港股适用）
        apply_end_timestamp|float|截止认购日期时间戳|因需处理认购手续，富途认购截止时间会早于交易所公布的日期（港股适用）

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_ipo_list(Market.HK)
if ret == RET_OK:
    print(data)
    print(data['code'][0])    # 取第一条的股票代码
    print(data['code'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    code      name   list_time  list_timestamp apply_code issue_size online_issue_size apply_upper_limit apply_limit_market_value is_estimate_ipo_price ipo_price industry_pe_rate is_estimate_winning_ratio winning_ratio issue_pe_rate apply_time apply_timestamp winning_time winning_timestamp is_has_won winning_num_data  ipo_price_min  ipo_price_max  list_price  lot_size  entrance_price  is_subscribe_status apply_end_time  apply_end_timestamp
0  HK.06666  恒大物业  2020-12-02    1.606838e+09        N/A        N/A               N/A               N/A                      N/A                   N/A       N/A              N/A                       N/A           N/A           N/A        N/A             N/A          N/A               N/A        N/A              N/A          8.500           9.75         0.0       500         4924.12                 True     2020-11-26         1.606352e+09
1  HK.02110  裕勤控股  2020-12-07    1.607270e+09        N/A        N/A               N/A               N/A                      N/A                   N/A       N/A              N/A                       N/A           N/A           N/A        N/A             N/A          N/A               N/A        N/A              N/A          0.225           0.27         0.0     10000         2727.21                 True     2020-11-27         1.606439e+09
HK.06666
['HK.06666', 'HK.02110']
```

---



---

# 获取全局市场状态

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">
<template v-slot:py>


`get_global_state()`  

* **介绍**

    获取全局状态


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK 时，返回全局状态</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 全局状态字典格式如下：
        字段|类型|说明
        :-|:-|:-
        market_sz|[MarketState](./quote.md#1252)|深圳市场状态
        market_sh|[MarketState](./quote.md#1252)|上海市场状态
        market_hk|[MarketState](./quote.md#1252)|香港市场状态
        market_hkfuture|[MarketState](./quote.md#1252)|香港期货市场状态  (不同品种的交易时间存在差异，建议使用 [get_market_state](../quote/get-market-state.md) 接口获取指定品种的市场状态)
        market_usfuture|[MarketState](./quote.md#1252)|美国期货市场状态  (不同品种的交易时间存在差异，建议使用 [get_market_state](../quote/get-market-state.md) 接口获取指定品种的市场状态)
        market_us|[MarketState](./quote.md#1252)|美国市场状态  (不同品种的交易时间存在差异，建议使用 [get_market_state](../quote/get-market-state.md) 接口获取指定品种的市场状态)
        market_sgfuture|[MarketState](./quote.md#1252)|新加坡期货市场状态  (不同品种的交易时间存在差异，建议使用 [get_market_state](../quote/get-market-state.md) 接口获取指定品种的市场状态)
        market_jpfuture|[MarketState](./quote.md#1252)|日本期货市场状态
        server_ver|str|OpenD 版本号
        trd_logined|bool|True：已登录交易服务器，False：未登录交易服务器
        qot_logined|bool|True：已登录行情服务器，False：未登录行情服务器
        timestamp|str|当前格林威治时间戳  (单位：秒)
        local_timestamp|float|OpenD 运行机器的当前时间戳  (单位：秒)
        program_status_type|[ProgramStatusType](../ftapi/common.md#6427)|当前状态
        program_status_desc|str|额外描述
    

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
print(quote_ctx.get_global_state())
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
(0, {'market_sz': 'MORNING', 'market_us': 'AFTER_HOURS_END', 'market_sh': 'MORNING', 'market_hk': 'MORNING', 'market_hkfuture': 'FUTURE_DAY_OPEN', 'market_usfuture': 'FUTURE_OPEN', 'market_sgfuture': 'FUTURE_DAY_OPEN', 'market_jpfuture': 'FUTURE_DAY_OPEN', 'server_ver': '504', 'trd_logined': True, 'timestamp': '1620962951', 'qot_logined': True, 'local_timestamp': 1620962951.047128, 'program_status_type': 'READY', 'program_status_desc': ''})
```

---



---

# 获取交易日历

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`request_trading_days(market=None, start=None, end=None, code=None)`

* **介绍**

    请求指定市场 / 指定标的的交易日历。  
    注意：该交易日是通过自然日剔除周末和节假日得到，未剔除临时休市数据。  

* **参数**
    参数|类型|说明
    :-|:-|:-
    market|[TradeDateMarket](./quote.md#940)|市场类型
    start|str|起始日期  (格式：yyyy-MM-dd
例如：“2018-01-01”)
    end|str|结束日期  (格式：yyyy-MM-dd
例如：“2018-01-01”)
    code| str | 股票代码
    注：当 market 和 code 同时存在时，会忽略 market，仅对 code 进行查询。

    * start 和 end 的组合如下
        Start 类型|End 类型|说明
        :-|:-|:-
        str|str|start 和 end 分别为指定的日期
        None|str|start 为 end 往前 365 天
        str|None|end 为 start 往后 365 天
        None|None|start 为往前 365 天，end 当前日期


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>list</td>
            <td>当 ret == RET_OK 时，返回交易日数据。list 中元素类型为 dict</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 交易日数据格式如下：
        字段|类型|说明
        :-|:-|:-
        time|str|时间 (格式：yyyy-MM-dd)
        trade_date_type|[TradeDateType](./quote.md#6676)|交易日类型

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.request_trading_days(market=TradeDateMarket.HK, start='2020-04-01', end='2020-04-10')
if ret == RET_OK:
    print('HK market calendar:', data)
else:
    print('error:', data)
print('******************************************')
ret, data = quote_ctx.request_trading_days(start='2020-04-01', end='2020-04-10', code='HK.00700')
if ret == RET_OK:
    print('HK.00700 calendar:', data)
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
HK market calendar: [{'time': '2020-04-01', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-02', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-03', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-06', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-07', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-08', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-09', 'trade_date_type': 'WHOLE'}]
******************************************
HK.00700 calendar: [{'time': '2020-04-01', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-02', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-03', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-06', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-07', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-08', 'trade_date_type': 'WHOLE'}, {'time': '2020-04-09', 'trade_date_type': 'WHOLE'}]
```

---



---

# 获取历史 K 线额度使用明细

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_history_kl_quota(get_detail=False)`

* **介绍**

    获取历史 K 线额度使用明细

* **参数**
    参数|类型|说明
    :-|:-|:-
    get_detail|bool|是否返回拉取历史 K 线的详细纪录  (True：返回False：不返回)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>tuple</td>
            <td>当 ret == RET_OK，返回历史 K 线额度数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 历史 K 线额度数据格式如下：
        字段|类型|说明
        :-|:-|:-
        used_quota|int|已用额度  (即当前周期内已经下载过多少只股票)
        remain_quota|int|剩余额度
        detail_list|list|拉取历史 K 线的详细纪录，含股票代码和拉取时间  (list 中元素类型是 dict)

        - detail_list 数据列格式如下
            字段|类型|说明
            :-|:-|:-
            code|str|股票代码
            name|str|股票名称
            request_time|str|最后一次拉取的时间字符串  (格式：yyyy-MM-dd HH:mm:ss)

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_history_kl_quota(get_detail=True)  # 设置 true 代表需要返回详细的拉取历史 K 线的记录
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
(2, 98, {'code': 'HK.00123', 'name': '越秀地产', 'request_time': '2023-06-20 19:59:00'}, {'code': 'HK.00700', 'name': '腾讯控股', 'request_time': '2023-07-19 17:48:16'}])
```

---



---

# 设置到价提醒

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`set_price_reminder(code, op, key=None, reminder_type=None, reminder_freq=None, value=None, note=None, reminder_session_list=NONE)`

* **介绍**

    新增、删除、修改、启用、禁用指定股票的到价提醒

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    op|[SetPriceReminderOp](./quote.md#433)|操作类型
    key|int|标识，新增和删除全部的情况不需要填
    reminder_type|[PriceReminderType](./quote.md#5160)|到价提醒的类型，删除、启用、禁用的情况下会忽略该入参
    reminder_freq|[PriceReminderFreq](./quote.md#1059)|到价提醒的频率，删除、启用、禁用的情况下会忽略该入参
    value|float|提醒值，删除、启用、禁用的情况下会忽略该入参  (精确到小数点后 3 位，超出部分会被舍弃)
    note|str|用户设置的备注，仅支持 20 个以内的中文字符，删除、启用、禁用的情况下会忽略该入参
    reminder_session_list|list|美股到价提醒的时段列表，删除、启用、禁用的情况下会忽略该入参  (- list中元素类型是[PriceReminderMarketStatus](./quote.md#482)
  - 美股默认到价提醒时段：盘中+盘前盘后)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">key</td>
            <td>int</td>
            <td>当 ret == RET_OK 时，返回操作的到价提醒 key</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>


* **Example**

```python
from futu import *
import time
class PriceReminderTest(PriceReminderHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, content = super(PriceReminderTest,self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("PriceReminderTest: error, msg: %s" % content)
            return RET_ERROR, content
        print("PriceReminderTest ", content) # PriceReminderTest 自己的处理逻辑
        return RET_OK, content
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = PriceReminderTest()
quote_ctx.set_handler(handler)
ret, data = quote_ctx.get_market_snapshot(['US.AAPL'])
if ret == RET_OK:
    bid_price = data['bid_price'][0]  # 获取实时买一价
    ask_price = data['ask_price'][0]  # 获取实时卖一价
    # 设置当AAPL全时段卖一价低于（ask_price-1）时提醒
    ret_ask, ask_data = quote_ctx.set_price_reminder(code='US.AAPL', op=SetPriceReminderOp.ADD, key=None, reminder_type=PriceReminderType.ASK_PRICE_DOWN, reminder_freq=PriceReminderFreq.ALWAYS, value=(ask_price-1), note='123', reminder_session_list=[PriceReminderMarketStatus.US_PRE, PriceReminderMarketStatus.OPEN, PriceReminderMarketStatus.US_AFTER, PriceReminderMarketStatus.US_OVERNIGHT])
    if ret_ask == RET_OK:
        print('卖一价低于（ask_price-1）时提醒设置成功：', ask_data)
    else:
        print('error:', ask_data)
    # 设置当AAPL全时段买一价高于（bid_price+1）时提醒
    ret_bid, bid_data = quote_ctx.set_price_reminder(code='US.AAPL', op=SetPriceReminderOp.ADD, key=None, reminder_type=PriceReminderType.BID_PRICE_UP, reminder_freq=PriceReminderFreq.ALWAYS, value=(bid_price+1), note='456', reminder_session_list=[PriceReminderMarketStatus.US_PRE, PriceReminderMarketStatus.OPEN, PriceReminderMarketStatus.US_AFTER, PriceReminderMarketStatus.US_OVERNIGHT])
    if ret_bid == RET_OK:
        print('买一价高于（bid_price+1）时提醒设置成功：', bid_data)
    else:
        print('error:', bid_data)
time.sleep(15)
quote_ctx.close()
```

* **Output**

```python
卖一价低于（ask_price-1）时提醒设置成功： 1744022257023211123
买一价高于（bid_price+1）时提醒设置成功： 1744022257052794489
```

---



---

# 获取到价提醒列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_price_reminder(code=None, market=None)`

* **介绍**

    获取对指定股票 / 指定市场设置的到价提醒列表

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|股票代码
    market|[Market](./quote.md#427)|市场类型  (输入沪股市场和深股市场，都会认为是 A 股市场) 
    注：code 和 market 都存在的情况下，code 优先。


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回到价提醒数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 到价提醒数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        key|int|标识，用于修改到价提醒
        reminder_type|[PriceReminderType](./quote.md#5160)|到价提醒的类型
        reminder_freq|[PriceReminderFreq](./quote.md#1059)|到价提醒的频率
        value|float|提醒值
        enable|bool|是否启用
        note|str|备注  (仅支持 20 个以内的中文字符) 
        reminder_session_list|list|美股到价提醒时段列表  (list中元素类型是[PriceReminderMarketStatus](./quote.md#482))

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_price_reminder(code='US.AAPL')
if ret == RET_OK:
    print(data)
    print(data['key'].values.tolist())   # 转为 list
else:
    print('error:', data)
print('******************************************')
ret, data = quote_ctx.get_price_reminder(code=None, market=Market.US)
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果到价提醒列表不为空
        print(data['code'][0])    # 取第一条的股票代码
        print(data['code'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
code name                  key   reminder_type reminder_freq   value  enable note                   reminder_session_list
0  US.AAPL   苹果  1744021708234288125    BID_PRICE_UP        ALWAYS  184.37    True  456                              [US_AFTER]
1  US.AAPL   苹果  1744022257052794489    BID_PRICE_UP        ALWAYS  185.50    True  456  [OPEN, US_PRE, US_AFTER, US_OVERNIGHT]
2  US.AAPL   苹果  1744021708211891867  ASK_PRICE_DOWN        ALWAYS  182.54    True  123                              [US_AFTER]
3  US.AAPL   苹果  1744022257023211123  ASK_PRICE_DOWN        ALWAYS  183.70    True  123  [OPEN, US_PRE, US_AFTER, US_OVERNIGHT]
[1744021708234288125, 1744022257052794489, 1744021708211891867, 1744022257023211123]
******************************************
      code name                  key   reminder_type reminder_freq   value  enable note                   reminder_session_list
0  US.AAPL   苹果  1744021708234288125    BID_PRICE_UP        ALWAYS  184.37    True  456                              [US_AFTER]
1  US.AAPL   苹果  1744022257052794489    BID_PRICE_UP        ALWAYS  185.50    True  456  [OPEN, US_PRE, US_AFTER, US_OVERNIGHT]
2  US.AAPL   苹果  1744021708211891867  ASK_PRICE_DOWN        ALWAYS  182.54    True  123                              [US_AFTER]
3  US.AAPL   苹果  1744022257023211123  ASK_PRICE_DOWN        ALWAYS  183.70    True  123  [OPEN, US_PRE, US_AFTER, US_OVERNIGHT]
4  US.NVDA  英伟达  1739697581665326308      PRICE_DOWN        ALWAYS  102.00    True       [OPEN, US_PRE, US_AFTER, US_OVERNIGHT]
US.AAPL
['US.AAPL', 'US.AAPL', 'US.AAPL', 'US.AAPL', 'US.NVDA']
```

---



---

# 获取自选股列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_user_security(group_name)`

* **介绍**

    获取指定分组的自选股列表

* **参数**

    参数|类型|说明
    :-|:-|:-
    group_name|str|需要查询的自选股分组名称


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回自选股数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 自选股数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|名字
        lot_size|int|每手股数，期权表示每份合约股数，期货表示合约乘数
        stock_type|[SecurityType](./quote.md#3325)|股票类型
        stock_child_type|[WrtType](./quote.md#926)|窝轮子类型
        stock_owner|str|窝轮所属正股的代码，或期权标的股的代码
        option_type|[OptionType](./quote.md#3713)|期权类型
        strike_time|str|期权行权日  (格式：yyyy-MM-dd
港股和 A 股市场默认是北京时间，美股市场默认是美东时间) 
        strike_price|float|期权行权价
        suspension|bool|期权是否停牌  (True：停牌) 
        listing_date|str|上市时间  (格式：yyyy-MM-dd)
        stock_id|int|股票 ID
        delisting|bool|是否退市
        main_contract|bool|是否主连合约
        last_trade_time|str|最后交易时间  (主连，当月，下月等期货没有此字段) 

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_user_security("A")
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果自选股列表不为空
        print(data['code'][0])    # 取第一条的股票代码
        print(data['code'].values.tolist())   # 转为 list
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
    code    name  lot_size stock_type stock_child_type stock_owner option_type strike_time strike_price suspension listing_date        stock_id  delisting  main_contract last_trade_time
0  HK.HSImain  恒指期货主连        50     FUTURE              N/A                                              N/A        N/A                     71000662      False           True                
1  HK.00700    腾讯控股       100      STOCK              N/A                                              N/A        N/A   2004-06-16  54047868453564      False          False                
HK.HSImain
['HK.HSImain', 'HK.00700']
```

---



---

# 获取自选股分组

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_user_security_group(group_type = UserSecurityGroupType.ALL)`

* **介绍**

    获取自选股分组列表

* **参数**
    参数|类型|说明
    :-|:-|:-
    group_type|[UserSecurityGroupType](./quote.md#4977)|分组类型


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK，返回自选股分组数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 自选股分组数据格式如下：
        字段|类型|说明
        :-|:-|:-
        group_name|str|分组名
        group_type|[UserSecurityGroupType](./quote.md#4977)|分组类型

* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.get_user_security_group(group_type = UserSecurityGroupType.ALL)
if ret == RET_OK:
    print(data)
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
        group_name group_type
0          期权     SYSTEM
..         ...        ...
12          C     CUSTOM

[13 rows x 2 columns]
```

---



---

# 修改自选股列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`modify_user_security(group_name, op, code_list)`

* **介绍**

    修改指定分组的自选股列表（系统分组不支持修改）

* **参数**
    参数|类型|说明
    :-|:-|:-
    group_name|str|需要修改的自选股分组名称
    op|[ModifyUserSecurityOp](./quote.md#3838)|操作类型
    code_list|list|股票列表  (list 中元素类型是 str) 


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">msg</td>
            <td rowspan="2">str</td>
            <td>当 ret == RET_OK，返回“success”</td>
        </tr>
        <tr>
            <td>当 ret != RET_OK，msg 返回错误描述</td>
        </tr>
    </table>


* **Example**

```python
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)

ret, data = quote_ctx.modify_user_security("A", ModifyUserSecurityOp.ADD, ['HK.00700'])
if ret == RET_OK:
    print(data) # 返回 success
else:
    print('error:', data)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
success
```

---



---

# 到价提醒回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    到价提醒通知回调，异步处理已设置到价提醒的通知推送。  
    在收到实时到价提醒通知推送后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  


* **参数**

    参数|类型|说明
    :-|:-|:-
    rsp_pb|Qot_UpdatePriceReminder_pb2.Response|派生类中不需要直接处理该参数


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>dict</td>
            <td>当 ret == RET_OK，返回到价提醒</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 到价提醒
        字段|类型|说明
        :-|:-|:-
        code|str|股票代码
        name|str|股票名称
        price|float|当前价格
        change_rate|str|当前涨跌幅
        market_status|[PriceReminderMarketStatus](./quote.md#482)|触发的时间段
        content|str|到价提醒文字内容
        note|str|备注  (仅支持 20 个以内的中文字符) 
        key|int|到价提醒标识
        reminder_type|[PriceReminderType](./quote.md#5160)|到价提醒的类型
        set_value|float|用户设置的提醒值
        cur_value|float|提醒触发时的值

* **Example**

```python
import time
from futu import *

class PriceReminderTest(PriceReminderHandlerBase):
    def on_recv_rsp(self, rsp_pb):
        ret_code, content = super(PriceReminderTest,self).on_recv_rsp(rsp_pb)
        if ret_code != RET_OK:
            print("PriceReminderTest: error, msg: %s" % content)
            return RET_ERROR, content
        print("PriceReminderTest ", content) # PriceReminderTest 自己的处理逻辑
        return RET_OK, content
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
handler = PriceReminderTest()
quote_ctx.set_handler(handler)  # 设置到价提醒通知回调
time.sleep(15)  # 设置脚本接收 OpenD 的推送持续时间为15秒
quote_ctx.close()   # 关闭当条连接，OpenD 会在1分钟后自动取消相应股票相应类型的订阅
```

* **Output**

```python
PriceReminderTest  {'code': 'US.AAPL', 'name': '苹果', 'price': 185.750, 'change_rate': 0.11, 'market_status': 'US_PRE', 'content': '买一价高于185.500', 'note': '', 'key': 1744022257052794489, 'reminder_type': 'BID_PRICE_UP', 'set_value': 185.500, 'cur_value': 185.750}
```

---



---

# 行情定义

## 累积过滤属性

**AccumulateField**

```protobuf
enum AccumulateField
{
    AccumulateField_Unknown = 0; // 未知
    AccumulateField_ChangeRate = 1; // 涨跌幅（精确到小数点后 3 位，超出部分会被舍弃）例如填写[-10.2,20.4]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    AccumulateField_Amplitude = 2; // 振幅（精确到小数点后 3 位，超出部分会被舍弃）例如填写[0.5,20.6]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    AccumulateField_Volume = 3; // 日均成交量（精确到小数点后 0 位，超出部分会被舍弃）例如填写[2000,70000]值区间
    AccumulateField_Turnover = 4; // 日均成交额（精确到小数点后 3 位，超出部分会被舍弃）例如填写[1400,890000]值区间
    AccumulateField_TurnoverRate = 5; // 换手率（精确到小数点后 3 位，超出部分会被舍弃）例如填写[2,30]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
}
```

## 资产类别

**AssetClass**

```protobuf
enum AssetClass
{
    AssetClass_Unknow = 0; //未知
    AssetClass_Stock = 1; //股票
    AssetClass_Bond = 2; //债券
    AssetClass_Commodity = 3; //商品
    AssetClass_CurrencyMarket = 4; //货币市场
    AssetClass_Future = 5; //期货
    AssetClass_Swap = 6; //掉期（互换）
}
```

## 公司行动

**CompanyAct**

```protobuf
enum CompanyAct
{
    CompanyAct_None = 0; //无
    CompanyAct_Split = 1; //拆股
    CompanyAct_Join = 2; //合股
    CompanyAct_Bonus = 4; //送股
    CompanyAct_Transfer = 8; //转赠股
    CompanyAct_Allot = 16; //配股    
    CompanyAct_Add = 32; //增发股
    CompanyAct_Dividend = 64; //现金分红
    CompanyAct_SPDividend = 128; //特别股息    
}
```

## 暗盘状态

**DarkStatus**

```protobuf
enum DarkStatus
{
    DarkStatus_None = 0; //无暗盘交易
    DarkStatus_Trading = 1; //暗盘交易中
    DarkStatus_End = 2; //暗盘交易结束
}
```

## 财务过滤属性

**FinancialField**

```protobuf
enum FinancialField
{
    // 基础财务属性
    FinancialField_Unknown = 0; // 未知
    FinancialField_NetProfit = 1; // 净利润 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[100000000,2500000000]值区间
    FinancialField_NetProfitGrowth = 2; // 净利润增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[-10,300]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_SumOfBusiness = 3; // 营业收入 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[100000000,6400000000]值区间
    FinancialField_SumOfBusinessGrowth = 4; // 营收同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[-5,200]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_NetProfitRate = 5; // 净利率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[10,113]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_GrossProfitRate = 6; // 毛利率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[4,65]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_DebtAssetsRate = 7; // 资产负债率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[5,470]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_ReturnOnEquityRate = 8; // 净资产收益率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写[20,230]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    
    // 盈利能力属性
    FinancialField_ROIC = 9; // 投入资本回报率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_ROATTM = 10; // 资产回报率(TTM) （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。仅适用于年报。）
    FinancialField_EBITTTM = 11; // 息税前利润(TTM) （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间（单位：元。仅适用于年报。）
    FinancialField_EBITDA = 12; // 税息折旧及摊销前利润 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间（单位：元）
    FinancialField_OperatingMarginTTM = 13; // 营业利润率(TTM) （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。仅适用于年报。）
    FinancialField_EBITMargin = 14; // EBIT 利润率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_EBITDAMargin  = 15; // EBITDA 利润率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_FinancialCostRate = 16; // 财务成本率（精确到小数点后 3 位，超出部分会被舍弃） 例如填写 [1.0,10.0] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_OperatingProfitTTM  = 17; // 营业利润(TTM) （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间 （单位：元。仅适用于年报。）
    FinancialField_ShareholderNetProfitTTM = 18; // 归属于母公司的净利润 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间 （单位：元。仅适用于年报。）
    FinancialField_NetProfitCashCoverTTM = 19; // 盈利中的现金收入比例 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,60.0] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%。仅适用于年报。）
    
    // 偿债能力属性
    FinancialField_CurrentRatio = 20; // 流动比率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [100,250] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_QuickRatio = 21; // 速动比率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [100,250] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）    
    
    // 清债能力属性
    FinancialField_CurrentAssetRatio = 22; // 流动资产率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [10,100] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_CurrentDebtRatio = 23; // 流动负债率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [10,100] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_EquityMultiplier = 24; // 权益乘数 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [100,180] 值区间
    FinancialField_PropertyRatio = 25; // 产权比率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [50,100] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%） 
    FinancialField_CashAndCashEquivalents = 26; // 现金和现金等价 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间（单位：元）    
    
    // 运营能力属性
    FinancialField_TotalAssetTurnover = 27; // 总资产周转率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [50,100] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_FixedAssetTurnover = 28; // 固定资产周转率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [50,100] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_InventoryTurnover = 29; // 存货周转率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [50,100] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_OperatingCashFlowTTM = 30; // 经营活动现金流(TTM) （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间（单位：元。仅适用于年报。）
    FinancialField_AccountsReceivable = 31; // 应收账款净额 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间 例如填写 [1000000000,1000000000] 值区间 （单位：元）    
    
    // 成长能力属性
    FinancialField_EBITGrowthRate = 32 ; // EBIT 同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_OperatingProfitGrowthRate = 33; // 营业利润同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_TotalAssetsGrowthRate = 34; // 总资产同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_ProfitToShareholdersGrowthRate = 35; // 归母净利润同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_ProfitBeforeTaxGrowthRate = 36; // 总利润同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_EPSGrowthRate = 37; // EPS 同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_ROEGrowthRate = 38; // ROE 同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_ROICGrowthRate = 39; // ROIC 同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_NOCFGrowthRate = 40; // 经营现金流同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_NOCFPerShareGrowthRate = 41; // 每股经营现金流同比增长率 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1.0,10.0] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）

    // 现金流属性
    FinancialField_OperatingRevenueCashCover = 42; // 经营现金收入比 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [10,100] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    FinancialField_OperatingProfitToTotalProfit = 43; // 营业利润占比 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [10,100] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）     

    // 市场表现属性
    FinancialField_BasicEPS = 44; // 基本每股收益 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [0.1,10] 值区间（单位：元）
    FinancialField_DilutedEPS = 45; // 稀释每股收益 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [0.1,10] 值区间（单位：元）
    FinancialField_NOCFPerShare = 46; // 每股经营现金净流量 （精确到小数点后 3 位，超出部分会被舍弃）例如填写 [0.1,10] 值区间（单位：元）    
}
```

## 财务过滤属性周期

**FinancialQuarter**

```protobuf
enum FinancialQuarter
{
    FinancialQuarter_Unknown = 0; // 未知
    FinancialQuarter_Annual = 1; // 年报
    FinancialQuarter_FirstQuarter = 2; // 一季报
    FinancialQuarter_Interim = 3; // 中报
    FinancialQuarter_ThirdQuarter = 4; // 三季报
    FinancialQuarter_MostRecentQuarter = 5; // 最近季报
}
```

## 自定义技术指标属性

**CustomIndicatorField**

```protobuf
enum CustomIndicatorField
{
    CustomIndicatorField_Unknown = 0; // 未知
    CustomIndicatorField_Price = 1; // 最新价格 
    CustomIndicatorField_MA5 = 2; // 5日简单均线（不建议使用）
    CustomIndicatorField_MA10 = 3; // 10日简单均线（不建议使用）
    CustomIndicatorField_MA20 = 4; // 20日简单均线（不建议使用） 
    CustomIndicatorField_MA30 = 5; // 30日简单均线（不建议使用） 
    CustomIndicatorField_MA60 = 6; // 60日简单均线（不建议使用） 
    CustomIndicatorField_MA120 = 7; // 120日简单均线（不建议使用）
    CustomIndicatorField_MA250 = 8; // 250日简单均线（不建议使用）
    CustomIndicatorField_RSI = 9; // RSI 指标参数的默认值为[12]
    CustomIndicatorField_EMA5 = 10; // 5日指数移动均线（不建议使用） 
    CustomIndicatorField_EMA10 = 11; // 10日指数移动均线（不建议使用） 
    CustomIndicatorField_EMA20 = 12; // 20日指数移动均线（不建议使用） 
    CustomIndicatorField_EMA30 = 13; // 30日指数移动均线（不建议使用） 
    CustomIndicatorField_EMA60 = 14; // 60日指数移动均线（不建议使用） 
    CustomIndicatorField_EMA120 = 15; // 120日指数移动均线（不建议使用）
    CustomIndicatorField_EMA250 = 16; // 250日指数移动均线（不建议使用）
    CustomIndicatorField_Value = 17; // 自定义数值（stock_field1不支持此字段）
    CustomIndicatorField_MA = 30; // 简单均线
	CustomIndicatorField_EMA = 40; // 指数移动均线
	CustomIndicatorField_KDJ_K = 50; // KDJ 指标的 K 值。指标参数需要根据 KDJ 进行传参。不传则默认为 [9,3,3]
	CustomIndicatorField_KDJ_D = 51; // KDJ 指标的 D 值。指标参数需要根据 KDJ 进行传参。不传则默认为 [9,3,3]
	CustomIndicatorField_KDJ_J = 52; // KDJ 指标的 J 值。指标参数需要根据 KDJ 进行传参。不传则默认为 [9,3,3]	
	CustomIndicatorField_MACD_DIFF = 60; // MACD 指标的 DIFF 值。指标参数需要根据 MACD 进行传参。不传则默认为 [12,26,9]
	CustomIndicatorField_MACD_DEA = 61; // MACD 指标的 DEA 值。指标参数需要根据 MACD 进行传参。不传则默认为 [12,26,9]
	CustomIndicatorField_MACD = 62; // MACD 指标的 MACD 值。指标参数需要根据 MACD 进行传参。不传则默认为 [12,26,9]
	CustomIndicatorField_BOLL_UPPER = 70; // BOLL 指标的 UPPER 值。指标参数需要根据 BOLL 进行传参。不传则默认为 [20,2]
	CustomIndicatorField_BOLL_MIDDLER = 71; // BOLL 指标的 MIDDLER 值。指标参数需要根据 BOLL 进行传参。不传则默认为 [20,2]
	CustomIndicatorField_BOLL_LOWER = 72; // BOLL 指标的 LOWER 值。指标参数需要根据 BOLL 进行传参。不传则默认为 [20,2]
}
```

## 相对位置

**RelativePosition**

```protobuf
enum RelativePosition
{
    RelativePosition_Unknown = 0; // 未知
    RelativePosition_More = 1; // 大于，first位于second的上方
    RelativePosition_Less = 2; // 小于，first位于second的下方
    RelativePosition_CrossUp = 3; // 升穿，first从下往上穿second
    RelativePosition_CrossDown = 4; // 跌穿，first从上往下穿second
}
```

## 形态技术指标属性

**PatternField**

```protobuf
enum PatternField
{
    PatternField_Unknown = 0 ; // 未知
    PatternField_MAAlignmentLong = 1 ; // MA多头排列（连续两天MA5>MA10>MA20>MA30>MA60，且当日收盘价大于前一天收盘价）
    PatternField_MAAlignmentShort = 2 ; // MA空头排列（连续两天MA5 <MA10 <MA20 <MA30 <MA60，且当日收盘价小于前一天收盘价）
    PatternField_EMAAlignmentLong = 3 ; // EMA多头排列（连续两天EMA5>EMA10>EMA20>EMA30>EMA60，且当日收盘价大于前一天收盘价）
    PatternField_EMAAlignmentShort = 4 ; // EMA空头排列（连续两天EMA5 <EMA10 <EMA20 <EMA30 <EMA60，且当日收盘价小于前一天收盘价）
    PatternField_RSIGoldCrossLow = 5 ; // RSI低位金叉（50以下，短线RSI上穿长线RSI（前一日短线RSI小于长线RSI，当日短线RSI大于长线RSI）） 
    PatternField_RSIDeathCrossHigh = 6 ; // RSI高位死叉（50以上，短线RSI下穿长线RSI（前一日短线RSI大于长线RSI，当日短线RSI小于长线RSI）） 
    PatternField_RSITopDivergence = 7 ; // RSI顶背离（相邻的两个K线波峰，后面的波峰对应的CLOSE>前面的波峰对应的CLOSE，后面波峰的RSI12值 <前面波峰的RSI12值）
    PatternField_RSIBottomDivergence = 8 ; // RSI底背离（相邻的两个K线波谷，后面的波谷对应的CLOSE <前面的波谷对应的CLOSE，后面波谷的RSI12值>前面波谷的RSI12值） 
    PatternField_KDJGoldCrossLow = 9 ; // KDJ低位金叉（KDJ的值都小于或等于30，且前一日K,J值分别小于D值，当日K,J值分别大于D值）
    PatternField_KDJDeathCrossHigh = 10 ; // KDJ高位死叉（KDJ的值都大于或等于70，且前一日K,J值分别大于D值，当日K,J值分别小于D值）
    PatternField_KDJTopDivergence = 11 ; // KDJ顶背离（相邻的两个K线波峰，后面的波峰对应的CLOSE>前面的波峰对应的CLOSE，后面波峰的J值 <前面波峰的J值）
    PatternField_KDJBottomDivergence = 12 ; // KDJ底背离（相邻的两个K线波谷，后面的波谷对应的CLOSE <前面的波谷对应的CLOSE，后面波谷的J值>前面波谷的J值）
    PatternField_MACDGoldCrossLow = 13 ; // MACD低位金叉（DIFF上穿DEA（前一日DIFF小于DEA，当日DIFF大于DEA））
    PatternField_MACDDeathCrossHigh = 14 ; // MACD高位死叉（DIFF下穿DEA（前一日DIFF大于DEA，当日DIFF小于DEA））
    PatternField_MACDTopDivergence = 15 ; // MACD顶背离（相邻的两个K线波峰，后面的波峰对应的CLOSE>前面的波峰对应的CLOSE，后面波峰的macd值 <前面波峰的macd值）
    PatternField_MACDBottomDivergence = 16 ; // MACD底背离（相邻的两个K线波谷，后面的波谷对应的CLOSE <前面的波谷对应的CLOSE，后面波谷的macd值>前面波谷的macd值）
    PatternField_BOLLBreakUpper = 17 ; // BOLL突破上轨（前一日股价低于上轨值，当日股价大于上轨值） 
    PatternField_BOLLLower = 18 ; // BOLL突破下轨（前一日股价高于下轨值，当日股价小于下轨值）
    PatternField_BOLLCrossMiddleUp = 19 ; // BOLL向上破中轨（前一日股价低于中轨值，当日股价大于中轨值）
    PatternField_BOLLCrossMiddleDown = 20 ; // BOLL向下破中轨（前一日股价大于中轨值，当日股价小于中轨值）
}
```

## 自选股分组类型

**GroupType**

```protobuf
enum GroupType
{
    GroupType_Unknown = 0; // 未知
    GroupType_Custom = 1; // 自定义分组
    GroupType_System = 2; // 系统分组
    GroupType_All = 3; // 全部分组
}
```

## 指数期权类别

**IndexOptionType**

```protobuf
enum IndexOptionType
{
    IndexOptionType_Unknown = 0; //未知
    IndexOptionType_Normal = 1; //普通的指数期权
    IndexOptionType_Small = 2; //小型指数期权
}
```

## 上市时段

**IpoPeriod**

```protobuf
enum IpoPeriod
{
    IpoPeriod_Unknow = 0; //未知
    IpoPeriod_Today = 1; //今日上市
    IpoPeriod_Tomorrow = 2; //明日上市
    IpoPeriod_Nextweek = 3; //未来一周上市
    IpoPeriod_Lastweek = 4; //过去一周上市
    IpoPeriod_Lastmonth = 5; //过去一月上市
}
```

## 窝轮发行商

**Issuer**

```protobuf
enum Issuer
{
    Issuer_Unknow = 0; //未知
    Issuer_SG = 1; //法兴
    Issuer_BP = 2; //法巴
    Issuer_CS = 3; //瑞信
    Issuer_CT = 4; //花旗    
    Issuer_EA = 5; //东亚
    Issuer_GS = 6; //高盛
    Issuer_HS = 7; //汇丰
    Issuer_JP = 8; //摩通    
    Issuer_MB = 9; //麦银    
    Issuer_SC = 10; //渣打
    Issuer_UB = 11; //瑞银
    Issuer_BI = 12; //中银
    Issuer_DB = 13; //德银
    Issuer_DC = 14; //大和
    Issuer_ML = 15; //美林
    Issuer_NM = 16; //野村
    Issuer_RB = 17; //荷合
    Issuer_RS = 18; //苏皇    
    Issuer_BC = 19; //巴克莱
    Issuer_HT = 20; //海通
    Issuer_VT = 21; //瑞通
    Issuer_KC = 22; //比联
    Issuer_MS = 23; //摩利
    Issuer_GJ = 24; //国君
    Issuer_XZ = 25; //星展
    Issuer_HU = 26; //华泰
    Issuer_KS = 27; //韩投
    Issuer_CI = 28; //信证
}
```

## K 线字段

**KLFields**

```protobuf
enum KLFields
{
    KLFields_None = 0; //
    KLFields_High = 1; //最高价
    KLFields_Open = 2; //开盘价
    KLFields_Low = 4; //最低价
    KLFields_Close = 8; //收盘价
    KLFields_LastClose = 16; //昨收价
    KLFields_Volume = 32; //成交量
    KLFields_Turnover = 64; //成交额
    KLFields_TurnoverRate = 128; //换手率
    KLFields_PE = 256; //市盈率
    KLFields_ChangeRate = 512; //涨跌幅
}
```

## K 线类型

**KLType**

```protobuf
enum KLType
{
    KLType_Unknown = 0; //未知
    KLType_1Min = 1; //1分 K
    KLType_Day = 2; //日 K
    KLType_Week = 3; //周 K (期权暂不支持)
    KLType_Month = 4; //月 K (期权暂不支持)    
    KLType_Year = 5; //年 K (期权暂不支持)
    KLType_5Min = 6; //5分 K
    KLType_15Min = 7; //15分 K
    KLType_30Min = 8; //30分 K (期权暂不支持)
    KLType_60Min = 9; //60分 K        
    KLType_3Min = 10; //3分 K (期权暂不支持)
    KLType_Quarter = 11; //季 K (期权暂不支持)
    KLType_10Min = 12; //10分 K (期权暂不支持)
    KLType_120Min = 13; //120分 K（2小时）(期权暂不支持)
    KLType_180Min = 14; //180分 K（3小时）(期权暂不支持)
    KLType_240Min = 15; //240分 K（4小时）(期权暂不支持)
}
```

## 周期类型

**PeriodType**

```protobuf
enum PeriodType
{
    PeriodType_INTRADAY = 0; //实时
    PeriodType_DAY = 1; //日
    PeriodType_WEEK = 2; //周
    PeriodType_MONTH = 3; //月
}
```


## 到价提醒市场状态

**MarketStatus**

```protobuf
enum MarketStatus
{
    MarketStatus_Unknow = 0;
    MarketStatus_Open = 1; // 盘中
    MarketStatus_USPre = 2;  // 美股盘前
    MarketStatus_USAfter = 3; // 美股盘后
}
```

## 自选股操作

**ModifyUserSecurityOp**

```protobuf
enum ModifyUserSecurityOp
{
    ModifyUserSecurityOp_Unknown = 0;
    ModifyUserSecurityOp_Add = 1; //新增
    ModifyUserSecurityOp_Del = 2; //删除自选
    ModifyUserSecurityOp_MoveOut = 3; //移出分组
}
```

## 期权类型（按行权时间）

**OptionAreaType**

```protobuf
enum OptionAreaType
{
    OptionAreaType_Unknown = 0; //未知
    OptionAreaType_American = 1; //美式
    OptionAreaType_European = 2; //欧式
    OptionAreaType_Bermuda = 3; //百慕大
}
```

## 期权价内/外

**OptionCondType**

```protobuf
enum OptionCondType
{
    OptionCondType_Unknow = 0;
    OptionCondType_WithIn = 1; //价内
    OptionCondType_Outside = 2; //价外
}
```

## 期权类型（按方向）

**OptionType**

```protobuf
enum OptionType
{
    OptionType_Unknown = 0; //未知
    OptionType_Call = 1; //看涨期权
    OptionType_Put = 2; //看跌期权
};
```

## 板块集合类型

**PlateSetType**

```protobuf
enum PlateSetType
{
    PlateSetType_All = 0; //所有板块
    PlateSetType_Industry = 1; //行业板块
    PlateSetType_Region = 2; //地域板块,港美股市场的地域分类数据暂为空
    PlateSetType_Concept = 3; //概念板块
    PlateSetType_Other = 4; //其他板块, 仅用于3207（获取股票所属板块）协议返回,不可作为其他协议的请求参数
}
```

## 到价提醒频率

**PriceReminderFreq**

```protobuf
enum PriceReminderFreq
{
    PriceReminderFreq_Unknown = 0; // 未知
    PriceReminderFreq_Always = 1; // 持续提醒
    PriceReminderFreq_OnceADay = 2; // 每日一次
    PriceReminderFreq_OnlyOnce = 3; // 仅提醒一次
}
```

## 到价提醒类型

**PriceReminderType**

```protobuf
enum PriceReminderType
{
    PriceReminderType_Unknown = 0; // 未知
    PriceReminderType_PriceUp = 1; // 价格涨到
    PriceReminderType_PriceDown = 2; // 价格跌到
    PriceReminderType_ChangeRateUp = 3; // 日涨幅超（该字段为百分比字段，设置时填 20 表示 20%）
    PriceReminderType_ChangeRateDown = 4; // 日跌幅超（该字段为百分比字段，设置时填 20 表示 20%）
    PriceReminderType_5MinChangeRateUp = 5; // 5 分钟涨幅超（该字段为百分比字段，设置时填 20 表示 20%）
    PriceReminderType_5MinChangeRateDown = 6; // 5 分钟跌幅超（该字段为百分比字段，设置时填 20 表示 20%）
    PriceReminderType_VolumeUp = 7; // 成交量超过
    PriceReminderType_TurnoverUp = 8; // 成交额超过
    PriceReminderType_TurnoverRateUp = 9; // 换手率超过（该字段为百分比字段，设置时填 20 表示 20%）
    PriceReminderType_BidPriceUp = 10; // 买一价高于
    PriceReminderType_AskPriceDown = 11; // 卖一价低于
    PriceReminderType_BidVolUp = 12; // 买一量高于    
    PriceReminderType_AskVolUp = 13; // 卖一量高于
    PriceReminderType_3MinChangeRateUp = 14; // 3 分钟涨幅超（该字段为百分比字段，设置时填 20 表示 20%）
    PriceReminderType_3MinChangeRateDown = 15; // 3 分钟跌幅超（该字段为百分比字段，设置时填 20 表示 20%）
}
```

## 窝轮价内/外

**PriceType**

```protobuf
enum PriceType
{
    PriceType_Unknow = 0;
    PriceType_Outside = 1; //价外，界内证表示界外
    PriceType_WithIn = 2; //价内，界内证表示界内
}
```

## 逐笔推送类型

**PushDataType**

```protobuf
enum PushDataType
{
    PushDataType_Unknow = 0;
    PushDataType_Realtime = 1; //实时推送的数据
    PushDataType_ByDisConn = 2; //对后台行情连接断开期间拉取补充的数据（最多50个）
    PushDataType_Cache = 3; //非实时非连接断开补充数据
}
```

## 行情市场

**QotMarket**

```protobuf
enum QotMarket
{
    QotMarket_Unknown = 0; //未知市场
    QotMarket_HK_Security = 1; //香港市场
    QotMarket_HK_Future = 2; //港期货（已废弃，使用 QotMarket_HK_Security 即可）
    QotMarket_US_Security = 11; //美国市场
    QotMarket_CNSH_Security = 21; //沪股市场
    QotMarket_CNSZ_Security = 22; //深股市场
    QotMarket_SG_Security = 31; //新加坡市场
    QotMarket_JP_Security = 41; //日本市场
    QotMarket_AU_Security = 51; //澳大利亚市场
    QotMarket_MY_Security = 61; //马来西亚市场
    QotMarket_CA_Security = 71; //加拿大市场
    QotMarket_FX_Security = 81; //外汇市场
    QotMarket_CC_Security = 91; //加密货币市场
}
```

## 市场状态

**QotMarketState**

各市场状态的对应时段：[点击这里](../qa/quote.md#2090)了解更多

```protobuf
enum QotMarketState
{
    QotMarketState_None = 0; // 无交易
    QotMarketState_Auction = 1; // 盘前竞价 
    QotMarketState_WaitingOpen = 2; // 等待开盘
    QotMarketState_Morning = 3; // 早盘 
    QotMarketState_Rest = 4; // 午间休市 
    QotMarketState_Afternoon = 5; // 午盘 / 美股持续交易时段
    QotMarketState_Closed = 6; // 收盘
    QotMarketState_PreMarketBegin = 8; // 美股盘前交易时段
    QotMarketState_PreMarketEnd = 9; // 美股盘前交易结束 
    QotMarketState_AfterHoursBegin = 10; // 美股盘后交易时段
    QotMarketState_AfterHoursEnd = 11; // 美股收盘 
    QotMarketState_NightOpen = 13; // 夜市交易时段
    QotMarketState_NightEnd = 14; // 夜市收盘 
    QotMarketState_FutureDayOpen = 15; // 日市交易时段
    QotMarketState_FutureDayBreak = 16; // 日市休市 
    QotMarketState_FutureDayClose = 17; // 日市收盘 
    QotMarketState_FutureDayWaitForOpen = 18; // 期货待开盘 
    QotMarketState_HkCas = 19; // 盘后竞价,港股市场增加 CAS 机制对应的市场状态    
    QotMarketState_FutureNightWait = 20; // 夜市等待开盘（已废弃）
    QotMarketState_FutureAfternoon = 21; // 期货下午开盘（已废弃）
    //美国期货新增加状态
    QotMarketState_FutureSwitchDate = 22; // 美期待开盘
    QotMarketState_FutureOpen = 23; // 美期交易时段
    QotMarketState_FutureBreak = 24; // 美期中盘休息
    QotMarketState_FutureBreakOver = 25; // 美期休息后交易时段
    QotMarketState_FutureClose = 26; // 美期收盘
    //科创板新增状态
    QotMarketState_StibAfterHoursWait = 27; // 科创板的盘后撮合时段（已废弃）
    QotMarketState_StibAfterHoursBegin = 28; // 科创板的盘后交易开始（已废弃）
    QotMarketState_StibAfterHoursEnd = 29; // 科创板的盘后交易结束（已废弃）
    //美指期权新增加状态
    QotMarketState_NIGHT = 32; // 美指期权夜市交易时段
    QotMarketState_TRADE_AT_LAST = 35; // 美指期权盘尾交易时段
    QotMarketState_OVERNIGHT = 37;  // 美股夜盘交易时段
}
```

## 美股时段

> **Session**

```protobuf
enum Session
{
	Session_NONE = 0; // 未知
	Session_RTH = 1; // 盘中
	Session_ETH = 2; // 盘中+盘前盘后
	Session_ALL = 3; // 全时段
	Session_OVERNIGHT = 4; // 夜盘
}
```

## 行情权限

**QotRight**

```protobuf
enum QotRight
{
    QotRight_Unknow = 0; //未知
    QotRight_Bmp = 1; //BMP（此权限不支持订阅）
    QotRight_Level1 = 2; //Level1
    QotRight_Level2 = 3; //Level2
    QotRight_SF = 4; //SF 高级行情
    QotRight_No = 5; //无权限
}
```

## 关联数据类型

**ReferenceType**

```protobuf
enum ReferenceType
{
    ReferenceType_Unknow = 0; 
    ReferenceType_Warrant = 1; //正股相关的窝轮
    ReferenceType_Future = 2; //期货主连的相关合约
}
```

## K 线复权类型

**RehabType**

```protobuf
enum RehabType
{
    RehabType_None = 0; //不复权
    RehabType_Forward = 1; //前复权
    RehabType_Backward = 2; //后复权
}
```

## 股票状态

**SecurityStatus**

```protobuf
enum SecurityStatus
{
    SecurityStatus_Unknown = 0; //未知
    SecurityStatus_Normal = 1; //正常状态
    SecurityStatus_Listing = 2; //待上市
    SecurityStatus_Purchasing = 3; //申购中
    SecurityStatus_Subscribing = 4; //认购中
    SecurityStatus_BeforeDrakTradeOpening = 5; //暗盘开盘前
    SecurityStatus_DrakTrading = 6; //暗盘交易中
    SecurityStatus_DrakTradeEnd = 7; //暗盘已收盘
    SecurityStatus_ToBeOpen = 8; //待开盘
    SecurityStatus_Suspended = 9; //停牌
    SecurityStatus_Called = 10; //已收回
    SecurityStatus_ExpiredLastTradingDate = 11; //已过最后交易日
    SecurityStatus_Expired = 12; //已过期
    SecurityStatus_Delisted = 13; //已退市
    SecurityStatus_ChangeToTemporaryCode = 14; //公司行动中，交易关闭，转至临时代码交易
    SecurityStatus_TemporaryCodeTradeEnd = 15; //临时买卖结束，交易关闭
    SecurityStatus_ChangedPlateTradeEnd = 16; //已转板，旧代码交易关闭
    SecurityStatus_ChangedCodeTradeEnd = 17; //已换代码，旧代码交易关闭
    SecurityStatus_RecoverableCircuitBreaker = 18; //可恢复性熔断
    SecurityStatus_UnRecoverableCircuitBreaker = 19; //不可恢复性熔断
    SecurityStatus_AfterCombination = 20; //盘后撮合
    SecurityStatus_AfterTransation = 21; //盘后交易
}
```

## 股票类型

**SecurityType**

```protobuf
enum SecurityType
{
    SecurityType_Unknown = 0; //未知
    SecurityType_Bond = 1; //债券
    SecurityType_Bwrt = 2; //一揽子权证
    SecurityType_Eqty = 3; //正股
    SecurityType_Trust = 4; //信托,基金
    SecurityType_Warrant = 5; //窝轮
    SecurityType_Index = 6; //指数
    SecurityType_Plate = 7; //板块
    SecurityType_Drvt = 8; //期权
    SecurityType_PlateSet = 9; //板块集
    SecurityType_Future = 10; //期货
    SecurityType_Crypto = 12; //加密货币
}
```

## 设置到价提醒操作类型

**SetPriceReminderOp**

```protobuf
enum SetPriceReminderOp
{
    SetPriceReminderOp_Unknown = 0;
    SetPriceReminderOp_Add = 1; //新增
    SetPriceReminderOp_Del = 2; //删除
    SetPriceReminderOp_Enable = 3; //启用
    SetPriceReminderOp_Disable = 4; //禁用
    SetPriceReminderOp_Modify = 5; //修改
    SetPriceReminderOp_DelAll = 6; //删除全部（删除指定股票下的所有到价提醒）
}
```

## 排序方向

**SortDir**

```protobuf
enum SortDir
{
    SortDir_No = 0; // 不排序
    SortDir_Ascend = 1; // 升序
    SortDir_Descend = 2; // 降序
}
```

## 排序字段

**SortField**

```protobuf
enum SortField
{
    SortField_Unknow = 0;
    SortField_Code = 1; //代码
    SortField_CurPrice = 2; //最新价
    SortField_PriceChangeVal = 3; //涨跌额
    SortField_ChangeRate = 4; //涨跌幅%
    SortField_Status = 5; //状态
    SortField_BidPrice = 6; //买入价
    SortField_AskPrice = 7; //卖出价
    SortField_BidVol = 8; //买量
    SortField_AskVol = 9; //卖量
    SortField_Volume = 10; //成交量
    SortField_Turnover = 11; //成交额
    SortField_Amplitude = 30; //振幅%

    //以下排序字段只支持用于 Qot_GetWarrant 协议
    SortField_Score = 12; //综合评分
    SortField_Premium = 13; //溢价%
    SortField_EffectiveLeverage = 14; //有效杠杆
    SortField_Delta = 15; //对冲值,仅认购认沽支持该字段
    SortField_ImpliedVolatility = 16; //引伸波幅,仅认购认沽支持该字段
    SortField_Type = 17; //类型
    SortField_StrikePrice = 18; //行权价
    SortField_BreakEvenPoint = 19; //打和点
    SortField_MaturityTime = 20; //到期日
    SortField_ListTime = 21; //上市日期
    SortField_LastTradeTime = 22; //最后交易日
    SortField_Leverage = 23; //杠杆比率
    SortField_InOutMoney = 24; //价内/价外%
    SortField_RecoveryPrice = 25; //收回价,仅牛熊证支持该字段
    SortField_ChangePrice = 26; // 换股价
    SortField_Change = 27; //换股比率
    SortField_StreetRate = 28; //街货比%
    SortField_StreetVol = 29; //街货量
    SortField_WarrantName = 31; // 窝轮名称
    SortField_Issuer = 32; //发行人
    SortField_LotSize = 33; // 每手
    SortField_IssueSize = 34; //发行量
    SortField_UpperStrikePrice = 45; //上限价，仅用于界内证
    SortField_LowerStrikePrice = 46; //下限价，仅用于界内证
    SortField_InLinePriceStatus = 47; //界内界外，仅用于界内证

    //以下排序字段只支持用于 Qot_GetPlateSecurity 协议，并仅支持美股
    SortField_PreCurPrice = 35; //盘前最新价
    SortField_AfterCurPrice = 36; //盘后最新价
    SortField_PrePriceChangeVal = 37; //盘前涨跌额
    SortField_AfterPriceChangeVal = 38; //盘后涨跌额
    SortField_PreChangeRate = 39; //盘前涨跌幅%
    SortField_AfterChangeRate = 40; //盘后涨跌幅%
    SortField_PreAmplitude = 41; //盘前振幅%
    SortField_AfterAmplitude = 42; //盘后振幅%
    SortField_PreTurnover = 43; //盘前成交额
    SortField_AfterTurnover = 44; //盘后成交额

    //以下排序字段只支持用于 Qot_GetPlateSecurity 协议，并仅支持期货
    SortField_LastSettlePrice = 48; //昨结
    SortField_Position = 49; //持仓量
    SortField_PositionChange = 50; //日增仓

    //以下排序字段只支持用于 Qot_GetValuationPlateStockList 协议
    SortField_MarketCap = 51; //市值
    SortField_Valuation = 52; //估值
    SortField_ForwardValuation = 53; //预测估值
    SortField_HistoricalPercentile = 54; //历史分位

    //以下排序字段只支持用于股东协议（Qot_GetShareholdersHoldingChanges, Qot_GetShareholdersHolderDetail）
    SortField_HolderQuantity = 61; //持股股数
    SortField_ShareChangeNum = 62; //持股变动数
    SortField_HoldingDate = 63; //持股日期
    SortField_HolderPctChange = 64; //变动比例
    SortField_HolderChangeAmount = 65; //变动金额
    SortField_HolderPct = 66; //持股比例
}
```

## 排序方式

**SortType**

```protobuf
enum SortType
{
    SortType_Unknown = 0; // 未知
    SortType_Desc    = 1; // 降序
    SortType_Asc     = 2; // 升序
}
```

## 财报类型

**F10Type**

```protobuf
enum F10Type
{
    F10Type_Unknown         = 0;
    F10Type_Q1              = 1;   // 单季报，Q1
    F10Type_Q2              = 2;   // 单季报，Q2
    F10Type_Q3              = 3;   // 单季报，Q3
    F10Type_Q4              = 4;   // 单季报，Q4
    F10Type_Q6              = 5;   // 累计季报，Q6（Q1+Q2）
    F10Type_Q9              = 6;   // 累计季报，Q9（Q1+Q2+Q3）
    F10Type_Annual          = 7;   // 年报
    F10Type_Quarterly       = 9;   // 单季报组合（Q1, Q2, Q3, Q4）
    F10Type_QuarterlyAnnual = 10;  // 单季报 + 年报
    F10Type_MulQuarterly    = 11;  // 累计季报（Q1, Q6, Q9, Annual）
}
```

## 财报发布时间类型

**EarningsPubTimeType**

```protobuf
enum EarningsPubTimeType
{
    EarningsPubTimeType_Unknown      = 0; // 未知
    EarningsPubTimeType_PreMarket    = 1; // 盘前发布
    EarningsPubTimeType_AfterMarket  = 2; // 盘后发布
    EarningsPubTimeType_DuringMarket = 3; // 盘中发布
}
```

## 估值类型

**ValuationType**

```protobuf
enum ValuationType
{
    ValuationType_Unknown = 0; // 未知
    ValuationType_PE      = 1; // 市盈率
    ValuationType_PB      = 2; // 市净率
    ValuationType_PS      = 3; // 市销率
}
```

## 财务报表类型

**FinancialStatementsType**

```protobuf
enum FinancialStatementsType
{
    FinancialStatementsType_Unknown      = 0;
    FinancialStatementsType_Income       = 1; // 利润表
    FinancialStatementsType_BalanceSheet = 2; // 资产负债表
    FinancialStatementsType_CashFlow     = 3; // 现金流量表
    FinancialStatementsType_MainIndex    = 4; // 关键指标
}
```

## 主营构成维度类型

**RevenueBreakdownType**

```protobuf
enum RevenueBreakdownType
{
    RevenueBreakdownType_Unknown  = 0;
    RevenueBreakdownType_Product  = 1; // 产品
    RevenueBreakdownType_Industry = 2; // 行业
    RevenueBreakdownType_Region   = 4; // 地区
    RevenueBreakdownType_Business = 8; // 业务
}
```

## 分析师评级

**ResearchRatingType**

```protobuf
enum ResearchRatingType
{
    ResearchRatingType_Unknown      = 0; // 未知
    ResearchRatingType_Sell         = 1; // Sell（卖出）
    ResearchRatingType_Underperform = 2; // Underperform（跑输大盘）
    ResearchRatingType_Hold         = 3; // Hold（持有）
    ResearchRatingType_Buy          = 4; // Buy（买入）
    ResearchRatingType_StrongBuy    = 5; // Strong Buy（强力推荐）
}
```

## 研报评级维度类型

**ResearchRatingDimensionType**

```protobuf
enum ResearchRatingDimensionType
{
    ResearchRatingDimensionType_Unknown     = 0;
    ResearchRatingDimensionType_Institution = 1; // 机构维度（默认）
    ResearchRatingDimensionType_Analyst     = 2; // 分析师维度
}
```

## 晨星评级类型

**MorningstarRatingType**

```protobuf
enum MorningstarRatingType
{
    MorningstarRatingType_Unknown      = 0; // 未知
    MorningstarRatingType_Quantitative = 1; // 定量评级（系统模型给出）
    MorningstarRatingType_Qualitative  = 2; // 定性评级（分析师人工给出）
}
```

## 估值历史区间类型

**ValuationIntervalType**

```protobuf
enum ValuationIntervalType
{
    ValuationIntervalType_Unknown   = 0;  // 未知
    ValuationIntervalType_Month3    = 1;  // 3个月
    ValuationIntervalType_Month6    = 2;  // 6个月
    ValuationIntervalType_Year1     = 3;  // 1年
    ValuationIntervalType_Year3     = 4;  // 3年
    ValuationIntervalType_Since2019 = 5;  // 从2019年起
    ValuationIntervalType_Year5     = 6;  // 5年
    ValuationIntervalType_Year10    = 7;  // 10年
    ValuationIntervalType_Year2     = 8;  // 2年
    ValuationIntervalType_Year20    = 9;  // 20年
    ValuationIntervalType_Year30    = 10; // 30年
}
```

## 公司行动重组方式

**ReformType**

```protobuf
enum ReformType
{
    ReformType_Unknown                  = 0;   // 未知
    ReformType_StockSplit               = 1;   // 拆股
    ReformType_StockMerge               = 2;   // 合股
    ReformType_BonusShare               = 4;   // 送股
    ReformType_CapitalizationOfReserves = 8;   // 转增股
    ReformType_RightsIssue              = 16;  // 配股
    ReformType_NewShareIssuance         = 32;  // 增发
    ReformType_CashDividend             = 64;  // 现金分红
    ReformType_SpecialDividend          = 128; // 特别股息
    ReformType_Spinoff                  = 256; // 公司分立
}
```

## 持股变动筛选类型

**HoldingChangesFilterType**

```protobuf
enum HoldingChangesFilterType
{
    HoldingChangesFilterType_Unknown  = 0; // 全部（默认）
    HoldingChangesFilterType_Increase = 1; // 增持
    HoldingChangesFilterType_Decrease = 2; // 减持
    HoldingChangesFilterType_NewIn    = 3; // 建仓
    HoldingChangesFilterType_CloseOut = 4; // 清仓
}
```

## 股东持仓明细机构类型

**HolderDetailType**

```protobuf
enum HolderDetailType
{
    HolderDetailType_Default                      = 0;    // 默认不过滤，按服务端默认逻辑返回
    HolderDetailType_All                          = 1000; // 全部
    HolderDetailType_Unclassified                 = 1;    // 其他机构
    HolderDetailType_TraditionalInvestmentManager = 2;    // 传统投资经理
    HolderDetailType_HedgeFundManager             = 3;    // 对冲基金
    HolderDetailType_VCOrPE                       = 4;    // 风险资本/私募股权投资
    HolderDetailType_CorporatePensionPlanSponsor  = 5;    // 企业年金
    HolderDetailType_FoundationFundSponsor        = 6;    // 基金会基金
    HolderDetailType_InsuranceCompany             = 7;    // 保险公司
    HolderDetailType_BankOrInvestmentBank         = 8;    // 银行/投资银行
    HolderDetailType_FamilyOfficesOrTrust         = 9;    // 家族办公室/信托
    HolderDetailType_SovereignWealthFund          = 10;   // 主权财富基金
    HolderDetailType_REIT                         = 11;   // REIT
    HolderDetailType_StructuredFinancePoolManager = 12;   // 结构化融资经理
    HolderDetailType_UnionPensionPlanSponsor      = 13;   // 联合养老金
    HolderDetailType_GovernmentPensionPlanSponsor = 14;   // 政府养老金
    HolderDetailType_EndowmentFundSponsor         = 15;   // 捐赠基金
    HolderDetailType_IndividualInsiders           = 100;  // 个人
    HolderDetailType_IssueSponsoredADR            = 200;  // ADS
    HolderDetailType_CorporationsPublic           = 300;  // 上市公司
    HolderDetailType_CorporationsPrivate          = 400;  // 未公开上市公司
    HolderDetailType_StateOwnedShares             = 500;  // 国有股
}
```

## 公司资料字段类型

**CompanyProfileFieldType**

```protobuf
enum CompanyProfileFieldType
{
    CompanyProfileFieldType_SourceText       = 0; // 文本
    CompanyProfileFieldType_LinkType         = 1; // 链接
    CompanyProfileFieldType_IndependentTitle = 2; // 独立标题
}
```

## 券商净买卖方向

**BuySellType**

```protobuf
enum BuySellType
{
    BuySellType_Unknown = 0;
    BuySellType_NetBuy  = 1; // 净买入
    BuySellType_NetSell = 2; // 净卖出
}
```

## 期权波动率查询时间周期

**OptionVolatilityTimePeriodType**

```protobuf
enum OptionVolatilityTimePeriodType
{
    OptionVolatilityTimePeriodType_Unknown  = 0; // 未知
    OptionVolatilityTimePeriodType_Week     = 1; // 周
    OptionVolatilityTimePeriodType_Month    = 2; // 月（默认）
    OptionVolatilityTimePeriodType_Quarter  = 3; // 季度
    OptionVolatilityTimePeriodType_HalfYear = 4; // 半年
    OptionVolatilityTimePeriodType_Year     = 5; // 年
}
```

## 期权隐含波动率状态

**OptionImpvolStatusType**

```protobuf
enum OptionImpvolStatusType
{
    ImpvolFluctuating = 0; // 期权波动率处于震荡中
    ImpvolOvervalued  = 1; // 期权波动率处于高估
    ImpvolUndervalued = 2; // 期权波动率处于低估
}
```

## 简单过滤属性

**StockField**

```protobuf
enum StockField  
{
    StockField_Unknown = 0; // 未知
    StockField_StockCode = 1; // 股票代码，不能填区间上下限值。
    StockField_StockName = 2; // 股票名称，不能填区间上下限值。
    StockField_CurPrice = 3; // 最新价（精确到小数点后 3 位，超出部分会被舍弃）例如填写[10,20]值区间
    StockField_CurPriceToHighest52WeeksRatio = 4; // (现价 - 52周最高)/52周最高，对应 PC 端离52周高点百分比（精确到小数点后 3 位，超出部分会被舍弃）例如填写[-30,-10]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    StockField_CurPriceToLowest52WeeksRatio = 5; // (现价 - 52周最低)/52周最低，对应 PC 端离52周低点百分比（精确到小数点后 3 位，超出部分会被舍弃）例如填写[20,40]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    StockField_HighPriceToHighest52WeeksRatio = 6; // (今日最高 - 52周最高)/52周最高（精确到小数点后 3 位，超出部分会被舍弃）例如填写[-3,-1]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    StockField_LowPriceToLowest52WeeksRatio = 7; // (今日最低 - 52周最低)/52周最低（精确到小数点后 3 位，超出部分会被舍弃）例如填写[10,70]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    StockField_VolumeRatio = 8; // 量比（精确到小数点后 3 位，超出部分会被舍弃）例如填写[0.5,30]值区间
    StockField_BidAskRatio = 9; // 委比（精确到小数点后 3 位，超出部分会被舍弃）例如填写[-20,80.5]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    StockField_LotPrice = 10; // 每手价格（精确到小数点后 3 位，超出部分会被舍弃）例如填写[40,100]值区间
    StockField_MarketVal = 11; // 市值（精确到小数点后 3 位，超出部分会被舍弃）例如填写[50000000,3000000000]值区间
    StockField_PeAnnual = 12; // 市盈率(静态)（精确到小数点后 3 位，超出部分会被舍弃）例如填写[-8,65.3]值区间
    StockField_PeTTM = 13; // 市盈率 TTM （精确到小数点后 3 位，超出部分会被舍弃）例如填写[-10,20.5]值区间
    StockField_PbRate = 14; // 市净率（精确到小数点后 3 位，超出部分会被舍弃）例如填写[0.5,20]值区间
    StockField_ChangeRate5min = 15; // 五分钟价格涨跌幅（精确到小数点后 3 位，超出部分会被舍弃）例如填写[-5,6.3]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    StockField_ChangeRateBeginYear = 16; // 年初至今价格涨跌幅（精确到小数点后 3 位，超出部分会被舍弃）例如填写[-50.1,400.7]值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）    
        
    // 基础量价属性
    StockField_PSTTM = 17; // 市销率(TTM)（精确到小数点后 3 位，超出部分会被舍弃）例如填写 [100, 500] 值区间（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%） 
    StockField_PCFTTM = 18; // 市现率(TTM)（精确到小数点后 3 位，超出部分会被舍弃）例如填写 [100, 1000] 值区间 （该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    StockField_TotalShare = 19; // 总股数（精确到小数点后 0 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间 (单位：股)
    StockField_FloatShare = 20; // 流通股数（精确到小数点后 0 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间 (单位：股)
    StockField_FloatMarketVal = 21; // 流通市值（精确到小数点后 3 位，超出部分会被舍弃）例如填写 [1000000000,1000000000] 值区间（单位：元）
}
```

## 订阅类型

**SubType**

```protobuf
enum SubType
{
    SubType_None = 0;
    SubType_Basic = 1; //基础报价
    SubType_OrderBook = 2; //摆盘
    SubType_Ticker = 4; //逐笔
    SubType_RT = 5; //分时
    SubType_KL_Day = 6; //日 K
    SubType_KL_5Min = 7; //5分 K
    SubType_KL_15Min = 8; //15分 K
    SubType_KL_30Min = 9; //30分 K
    SubType_KL_60Min = 10; //60分 K
    SubType_KL_1Min = 11; //1分 K
    SubType_KL_Week = 12; //周 K
    SubType_KL_Month = 13; //月 K
    SubType_Broker = 14; //经纪队列
    SubType_KL_Qurater = 15; //季 K
    SubType_KL_Year = 16; //年 K
    SubType_KL_3Min = 17; //3分 K
    SubType_KL_10Min = 18; //10分 K
    SubType_KL_120Min = 19; //120分 K（2小时）
    SubType_KL_180Min = 20; //180分 K（3小时）
    SubType_KL_240Min = 21; //240分 K（4小时）
}
```

## 逐笔成交方向

**TickerDirection**

```protobuf
enum TickerDirection
{
    TickerDirection_Unknown = 0; //未知
    TickerDirection_Bid = 1; //外盘（主动买入），即以卖一价或更高的价格成交股票
    TickerDirection_Ask = 2; //内盘（主动卖出），即以买一价或更低的价格成交股票
    TickerDirection_Neutral = 3; //中性盘，即以买一价与卖一价之间的价格撮合成交
}
```

## 逐笔成交类型

**TickerType**

```protobuf
enum TickerType
{
    TickerType_Unknown = 0; //未知
    TickerType_Automatch = 1; //自动对盘
    TickerType_Late = 2; //开市前成交盘
    TickerType_NoneAutomatch = 3; //非自动对盘
    TickerType_InterAutomatch = 4; //同一证券商自动对盘
    TickerType_InterNoneAutomatch = 5; //同一证券商非自动对盘
    TickerType_OddLot = 6; //碎股交易
    TickerType_Auction = 7; //竞价交易    
    TickerType_Bulk = 8; //批量交易
    TickerType_Crash = 9; //现金交易
    TickerType_CrossMarket = 10; //跨市场交易
    TickerType_BulkSold = 11; //批量卖出
    TickerType_FreeOnBoard = 12; //离价交易
    TickerType_Rule127Or155 = 13; //第127条交易（纽交所规则）或第155条交易
    TickerType_Delay = 14; //延迟交易
    TickerType_MarketCenterClosePrice = 15; //中央收市价
    TickerType_NextDay = 16; //隔日交易
    TickerType_MarketCenterOpening = 17; //中央开盘价交易
    TickerType_PriorReferencePrice = 18; //前参考价
    TickerType_MarketCenterOpenPrice = 19; //中央开盘价
    TickerType_Seller = 20; //卖方
    TickerType_T = 21; //T 类交易(盘前和盘后交易)
    TickerType_ExtendedTradingHours = 22; //延长交易时段
    TickerType_Contingent = 23; //合单交易
    TickerType_AvgPrice = 24; //平均价成交
    TickerType_OTCSold = 25; //场外售出
    TickerType_OddLotCrossMarket = 26; //碎股跨市场交易
    TickerType_DerivativelyPriced = 27; //衍生工具定价
    TickerType_ReOpeningPriced = 28; //再开盘定价
    TickerType_ClosingPriced = 29; //收盘定价
    TickerType_ComprehensiveDelayPrice = 30; //综合延迟价格
    TickerType_Overseas = 31; //交易的一方不是香港交易所的成员，属于场外交易
}
```

## 交易日查询市场

**TradeDateMarket**

```protobuf
enum TradeDateMarket
{
    TradeDateMarket_Unknown = 0; //未知
    TradeDateMarket_HK = 1; //香港市场（含股票、ETFs、窝轮、牛熊、期权、非假期交易期货；不含假期交易期货）
    TradeDateMarket_US = 2; //美国市场（含股票、ETFs、期权；不含期货）
    TradeDateMarket_CN = 3; //A 股市场
    TradeDateMarket_NT = 4; //深（沪）股通
    TradeDateMarket_ST = 5; //港股通（深、沪）
    TradeDateMarket_JP_Future = 6; //日本期货
    TradeDateMarket_SG_Future = 7; //新加坡期货
}
```

## 交易日类型

**TradeDateType**

```protobuf
enum TradeDateType
{
    TradeDateType_Whole = 0; //全天交易
    TradeDateType_Morning = 1; //上午交易，下午休市
    TradeDateType_Afternoon = 2; //下午交易，上午休市
}            
```

## 窝轮状态

**WarrantStatus**

```protobuf
enum WarrantStatus
{
    WarrantStatus_Unknow = 0; //未知
    WarrantStatus_Normal = 1; //正常状态
    WarrantStatus_Suspend = 2; //停牌
    WarrantStatus_StopTrade = 3; //终止交易
    WarrantStatus_PendingListing = 4; //等待上市
}
```

## 窝轮类型

**WarrantType**

```protobuf
enum WarrantType
{
    WarrantType_Unknown = 0; //未知
    WarrantType_Buy = 1; //认购窝轮
    WarrantType_Sell = 2; //认沽窝轮
    WarrantType_Bull = 3; //牛证
    WarrantType_Bear = 4; //熊证
    WarrantType_InLine = 5; //界内证
};
```

## 所属交易所

**ExchType**

```protobuf
enum ExchType
{
    ExchType_Unknown = 0; //未知
    ExchType_HK_MainBoard = 1; // 港交所·主板
    ExchType_HK_GEMBoard = 2; //港交所·创业板
    ExchType_HK_HKEX = 3; //港交所
    ExchType_US_NYSE = 4; //纽交所
    ExchType_US_Nasdaq = 5; //纳斯达克
    ExchType_US_Pink = 6; //OTC 市场
    ExchType_US_AMEX = 7; //美交所 
    ExchType_US_Option = 8; //美国（仅美股期权适用）
    ExchType_US_NYMEX = 9; //NYMEX 
    ExchType_US_COMEX = 10; //COMEX
    ExchType_US_CBOT = 11; //CBOT
    ExchType_US_CME = 12; //CME
    ExchType_US_CBOE = 13; //CBOE
    ExchType_CN_SH = 14; //上交所  
    ExchType_CN_SZ = 15; //深交所
    ExchType_CN_STIB = 16; //科创板
    ExchType_SG_SGX = 17; //新交所
    ExchType_JP_OSE = 18; //大阪交易所
    ExchType_CC_CRYPTO = 19; //加密货币交易所
};
```

## 行情公共参数头

**QotHeader**

```protobuf
message QotHeader
{
    optional int32 securityFirm = 1; //券商标识，取值见 Trd_Common.SecurityFirm
}
```

## 证券标识

**Security**

```protobuf
message Security
{
    required int32 market = 1; //QotMarket，行情市场
    required string code = 2; //代码
}
```

## K 线数据

**KLine**

```protobuf
message KLine
{
    required string time = 1; //时间戳字符串（格式：yyyy-MM-dd HH:mm:ss）
    required bool isBlank = 2; //是否是空内容的点,若为 true 则只有时间信息
    optional double highPrice = 3; //最高价
    optional double openPrice = 4; //开盘价
    optional double lowPrice = 5; //最低价
    optional double closePrice = 6; //收盘价
    optional double lastClosePrice = 7; //昨收价
    optional int64 volume = 8; //成交量
    optional double turnover = 9; //成交额
    optional double turnoverRate = 10; //换手率（该字段为百分比字段，展示为小数表示）
    optional double pe = 11; //市盈率
    optional double changeRate = 12; //涨跌幅（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    optional double timestamp = 13; //时间戳
    optional double hpVolume = 14; //高精度成交量
}
```

## 基础报价的期权特有字段

**OptionBasicQotExData**

```protobuf
message OptionBasicQotExData
{
    required double strikePrice = 1; //行权价
    required int32 contractSize = 2; //每份合约数(整型数据)
    optional double contractSizeFloat = 17; //每份合约数（浮点型数据）
    required int32 openInterest = 3; //未平仓合约数
    required double impliedVolatility = 4; //隐含波动率（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    required double premium = 5; //溢价（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    required double delta = 6; //希腊值 Delta
    required double gamma = 7; //希腊值 Gamma
    required double vega = 8; //希腊值 Vega
    required double theta = 9; //希腊值 Theta
    required double rho = 10; //希腊值 Rho
    optional int32 netOpenInterest = 11; //净未平仓合约数，仅港股期权适用
    optional int32 expiryDateDistance = 12; //距离到期日天数，负数表示已过期
    optional double contractNominalValue = 13; //合约名义金额，仅港股期权适用
    optional double ownerLotMultiplier = 14; //相等正股手数，指数期权无该字段，仅港股期权适用
    optional int32 optionAreaType = 15; //OptionAreaType，期权类型（按行权时间）
    optional double contractMultiplier = 16; //合约乘数
    optional int32 indexOptionType = 18; //IndexOptionType，指数期权类型
}    
```

## 基础报价的期货特有字段

**FutureBasicQotExData**

```protobuf
message FutureBasicQotExData
{
    required double lastSettlePrice = 1; //昨结
    required int32 position = 2; //持仓量
    required int32 positionChange = 3; //日增仓
    optional int32 expiryDateDistance = 4; //距离到期日天数
}    
```

## 基础报价

**BasicQot**

```protobuf
message BasicQot
{
    required Security security = 1; //股票
    optional string name = 24; // 股票名称
    required bool isSuspended = 2; //是否停牌
    required string listTime = 3; //上市日期字符串（此字段停止维护，不建议使用，格式：yyyy-MM-dd）
    required double priceSpread = 4; //价差
    required string updateTime = 5; //最新价的更新时间字符串（格式：yyyy-MM-dd HH:mm:ss），对其他字段不适用
    required double highPrice = 6; //最高价
    required double openPrice = 7; //开盘价
    required double lowPrice = 8; //最低价
    required double curPrice = 9; //最新价
    required double lastClosePrice = 10; //昨收价
    required int64 volume = 11; //成交量
    required double turnover = 12; //成交额
    required double turnoverRate = 13; //换手率（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    required double amplitude = 14; //振幅（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    optional int32 darkStatus = 15; //DarkStatus, 暗盘交易状态	
    optional OptionBasicQotExData optionExData = 16; //期权特有字段
    optional double listTimestamp = 17; //上市日期时间戳（此字段停止维护，不建议使用）
    optional double updateTimestamp = 18; //最新价的更新时间戳，对其他字段不适用
    optional PreAfterMarketData preMarket = 19; //盘前数据
    optional PreAfterMarketData afterMarket = 20; //盘后数据
    optional int32 secStatus = 21; //SecurityStatus, 股票状态
    optional FutureBasicQotExData futureExData = 22; //期货特有字段
    optional double hpVolume = 26; //高精度成交量
}
```

## 盘前盘后数据

**PreAfterMarketData**
 
```protobuf
//美股支持盘前盘后数据
//科创板仅支持盘后数据：成交量，成交额
message PreAfterMarketData
{
    optional double price = 1;  // 盘前或盘后## 价格
    optional double highPrice = 2;  // 盘前或盘后## 最高价
    optional double lowPrice = 3;  // 盘前或盘后## 最低价
    optional int64 volume = 4;  // 盘前或盘后## 成交量
    optional double turnover = 5;  // 盘前或盘后## 成交额
    optional double changeVal = 6;  // 盘前或盘后## 涨跌额
    optional double changeRate = 7;  // 盘前或盘后## 涨跌幅（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    optional double amplitude = 8;  // 盘前或盘后## 振幅（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
}
```

## 分时数据

**TimeShare**

```protobuf
message TimeShare
{
    required string time = 1; //时间字符串（格式：yyyy-MM-dd HH:mm:ss）
    required int32 minute = 2; //距离0点过了多少分钟
    required bool isBlank = 3; //是否是空内容的点,若为 true 则只有时间信息
    optional double price = 4; //当前价
    optional double lastClosePrice = 5; //昨收价
    optional double avgPrice = 6; //均价
    optional int64 volume = 7; //成交量
    optional double turnover = 8; //成交额
    optional double timestamp = 9; //时间戳
    optional double hpVolume = 10; //高精度成交量
}
```

## 证券基本静态信息

**SecurityStaticBasic**

```protobuf

message SecurityStaticBasic
{
    required Qot_Common.Security security = 1; //股票
    required int64 id = 2; //股票 ID
    required int32 lotSize = 3; //每手数量,期权类型表示一份合约的股数
    required int32 secType = 4; //Qot_Common.SecurityType,股票类型
    required string name = 5; //股票名字
    required string listTime = 6; //上市时间字符串（此字段停止维护，不建议使用，格式：yyyy-MM-dd）
    optional bool delisting = 7; //是否退市
    optional double listTimestamp = 8; //上市时间戳（此字段停止维护，不建议使用）
    optional int32 exchType = 9; //Qot_Common.ExchType,所属交易所
}
```

## 窝轮额外静态信息
**WarrantStaticExData**

```protobuf
message WarrantStaticExData
{
    required int32 type = 1; //Qot_Common.WarrantType,窝轮类型
    required Qot_Common.Security owner = 2; //所属正股
}    
```
## 期权额外静态信息

**OptionStaticExData**

```protobuf
message OptionStaticExData
{
    required int32 type = 1; //Qot_Common.OptionType,期权
    required Qot_Common.Security owner = 2; //标的股
    required string strikeTime = 3; //行权日（格式：yyyy-MM-dd）
    required double strikePrice = 4; //行权价
    required bool suspend = 5; //是否停牌
    required string market = 6; //发行市场名字
    optional double strikeTimestamp = 7; //行权日时间戳
    optional int32 indexOptionType = 8; //Qot_Common.IndexOptionType, 指数期权的类型，仅在指数期权有效
	optional int32 expirationCycle = 9; // ExpirationCycle，交割周期
    optional int32 optionStandardType = 10; // OptionStandardType，标准期权
    optional int32 optionSettlementMode = 11; // OptionSettlementMode，结算方式
}
```

## 期货额外静态信息

**FutureStaticExData**

```protobuf
message FutureStaticExData
{
    required string lastTradeTime = 1; //最后交易日，只有非主连期货合约才有该字段
    optional double lastTradeTimestamp = 2; //最后交易日时间戳，只有非主连期货合约才有该字段
    required bool isMainContract = 3; //是否主连合约
}    
```

## 证券静态信息

**SecurityStaticInfo**

```protobuf
message SecurityStaticInfo
{
    required SecurityStaticBasic basic = 1; //证券基本静态信息
    optional WarrantStaticExData warrantExData = 2; //窝轮额外静态信息
    optional OptionStaticExData optionExData = 3; //期权额外静态信息
    optional FutureStaticExData futureExData = 4; //期货额外静态信息
}
```

## 买卖经纪

**Broker**

```protobuf
message Broker
{
    required int64 id = 1; //经纪 ID
    required string name = 2; //经纪名称
    required int32 pos = 3; //经纪档位
    
    //以下为港股 SF 行情特有字段
    optional int64 orderID = 4; //交易所订单 ID，与交易接口返回的订单 ID 并不一样
    optional int64 volume = 5; //订单股数
}
```

## 逐笔成交

**Ticker**

```protobuf
message Ticker
{
    required string time = 1; //时间字符串（格式：yyyy-MM-dd HH:mm:ss）
    required int64 sequence = 2; // 唯一标识
    required int32 dir = 3; //TickerDirection, 买卖方向
    required double price = 4; //价格
    required int64 volume = 5; //成交量
    required double turnover = 6; //成交额
    optional double recvTime = 7; //收到推送数据的本地时间戳，用于定位延迟
    optional int32 type = 8; //TickerType, 逐笔类型
    optional int32 typeSign = 9; //逐笔类型符号
    optional int32 pushDataType = 10; //用于区分推送情况，仅推送时有该字段
    optional double timestamp = 11; //时间戳
    optional double hpVolume = 12; //高精度成交量
}	
```
## 买卖档明细

**OrderBookDetail**

```protobuf
message OrderBookDetail
{
    required int64 orderID = 1; //交易所订单 ID，与交易接口返回的订单 ID 并不一样
    required int64 volume = 2; //订单股数
}
```

## 买卖档

**OrderBook**

```protobuf
message OrderBook
{
    required double price = 1; //委托价格
    required int64 volume = 2; //委托数量
    required int32 orederCount = 3; //委托订单个数
    repeated OrderBookDetail detailList = 4; //订单信息，港股 SF，美股深度摆盘特有
    optional double hpVolume = 5; //高精度委托数量
}
```

## 持股变动

**ShareHoldingChange**

```protobuf
message ShareHoldingChange
{
    required string holderName = 1; //持有者名称（机构名称 或 基金名称 或 高管姓名）
    required double holdingQty = 2; //当前持股数量
    required double holdingRatio = 3; //当前持股百分比（该字段为百分比字段，默认不展示 %，如 20 实际对应 20%）
    required double changeQty = 4; //较上一次变动数量
    required double changeRatio = 5; //较上一次变动百分比（该字段为百分比字段，默认不展示 %，如20实际对应20%。是相对于自身的比例，而不是总的。如总股本1万股，持有100股，持股百分比是1%，卖掉50股，变动比例是50%，而不是0.5%）
    required string time = 6; //发布时间（格式：yyyy-MM-dd HH:mm:ss）
    optional double timestamp = 7; //时间戳
}
```

## 单个订阅类型信息

**SubInfo**

```protobuf
message SubInfo
{
    required int32 subType = 1;  //Qot_Common.SubType,订阅类型
    repeated Qot_Common.Security securityList = 2; 	//订阅该类型行情的证券
}	
```

## 单条连接订阅信息

**ConnSubInfo**

```protobuf
message ConnSubInfo
{
    repeated SubInfo subInfoList = 1; //该连接订阅信息
    required int32 usedQuota = 2; //该连接已经使用的订阅额度
    required bool isOwnConnData = 3; //用于区分是否是自己连接的数据
    optional int32 securityFirm = 4; //券商标识，取值见 Trd_Common.SecurityFirm
}
```

## 板块信息

**PlateInfo**

```protobuf
message PlateInfo
{
    required Qot_Common.Security plate = 1; //板块
    required string name = 2; //板块名字
    optional int32 plateType = 3; //PlateSetType 板块类型, 仅3207（获取股票所属板块）协议返回该字段
}
```

## 复权信息

**Rehab**

```protobuf
message Rehab
{
    required string time = 1; //时间字符串（格式：yyyy-MM-dd）
    required int64 companyActFlag = 2; //公司行动(CompanyAct)组合标志位,指定某些字段值是否有效
    required double fwdFactorA = 3; //前复权因子 A
    required double fwdFactorB = 4; //前复权因子 B
    required double bwdFactorA = 5; //后复权因子 A
    required double bwdFactorB = 6; //后复权因子 B
    optional int32 splitBase = 7; //拆股(例如，1拆5，Base 为1，Ert 为5)
    optional int32 splitErt = 8;	
    optional int32 joinBase = 9; //合股(例如，50合1，Base 为50，Ert 为1)
    optional int32 joinErt = 10;	
    optional int32 bonusBase = 11; //送股(例如，10送3, Base 为10,Ert 为3)
    optional int32 bonusErt = 12;	
    optional int32 transferBase = 13; //转赠股(例如，10转3, Base 为10,Ert 为3)
    optional int32 transferErt = 14;	
    optional int32 allotBase = 15; //配股(例如，10送2, 配股价为6.3元, Base 为10, Ert 为2, Price 为6.3)
    optional int32 allotErt = 16;	
    optional double allotPrice = 17;	
    optional int32 addBase = 18; //增发股(例如，10送2, 增发股价为6.3元, Base 为10, Ert 为2, Price 为6.3)
    optional int32 addErt = 19;	
    optional double addPrice = 20;	
    optional double dividend = 21; //现金分红(例如，每10股派现0.5元,则该字段值为0.05)
    optional double spDividend = 22; //特别股息(例如，每10股派特别股息0.5元,则该字段值为0.05)
    optional double timestamp = 23; //时间戳
}
```

> - 公司行动组合标志位参见 [CompanyAct](./quote.html#1239)

## 交割周期
**ExpirationCycle**

```protobuf
enum ExpirationCycle
{
    ExperationCycle_Unknow = 0; //未知
    ExperationCycle_Week = 1; //周期权
    ExperationCycle_Month = 2; //月期权
}
```


## 期权标准类型
**OptionStandardType**

```protobuf
enum OptionStandardType
{
    OptionStandardType_Unknown = 0; //未知
    OptionStandardType_Standard = 1; // 标准
    OptionStandardType_NonStandard = 2; // 非标准
}
```


## 期权结算方式
**OptionSettlementMode**

```protobuf
enum OptionSettlementMode
{
    OptionSettlementMode_Unknown = 0; //未知
    OptionSettlementMode_AM = 1; // AM
    OptionSettlementMode_PM = 2; // PM
}
```

## 股票持有者（已废弃）

**HolderCategory**

```protobuf
enum HolderCategory
{
    HolderCategory_Unknow = 0; //未知
    HolderCategory_Agency = 1; //机构
    HolderCategory_Fund = 2; //基金
    HolderCategory_SeniorManager = 3; //高管
}
```

## 筛选 V2 - SimpleField

> 用于 [get_stock_screen](./get-stock-screen.md) 的 `add_simple_field(field, values)` 方法。所有数值字段直接传原始值，OpenD 自动完成倍率转换。

field|含义|values 取值
:-|:-|:-
1|MARKET 市场|ScrMarket：HK=1、US=2、CN=3、SG=4、CA=5、AU=6、JA=7、MY=8
2|EXCHANGE 交易所/上市地|参考 [QotMarket](#427)
3|INDEX_ID 指数 ID|指数成分股 ID
4|USE_WATCHLIST 使用自选股|0=否，1=是
5|HAS_ADR 是否有关联 ADR|0/1
6|HAS_OPTION 是否有期权|0/1
7|HAS_WARRANT 是否有窝轮|0/1
8|HAS_FUTURE 是否有期货|0/1
9|HAS_AH_STOCK 是否有 AH 股|0/1
10|IS_ISLAMIC 回教股|0/1
11|NORTH_BOUND_ID 北向板块|沪/深股通 ID
12|MM_EXCLUSIVE_ID Moomoo 独家板块|板块 ID

> 完整枚举见 SDK 中 `stock_screen_const.py` 的 `SimpleField` / `ScrMarket` 类。

## 筛选 V2 - SimpleProperty

> 用于 `add_simple_property(name, lower, upper)` 与 `add_retrieve_simple(name)`。常用因子如下，所有数值传原始值。

name|含义
:-|:-
2101|LONG_MARGIN_ALLOWED 是否允许融资 (0/1)
2103|SHORT_MARGIN_ALLOWED 是否允许融券 (0/1)
2201|PRICE 最新价
2202|OPEN_PRICE 今开价
2203|LAST_CLOSE 昨收价
2204|HIGH 今高
2205|LOW 今低
2217|VOLUME_RATIO 量比
2218|BID_ASK_RATIO 委比
2301|MARKET_CAP 市值
2302|PE_ANNUAL 静态 PE
2303|PE_TTM TTM 市盈率
2304|PB 市净率
2305|DIVIDEND_RATIO 股息率
2306|LISTED_DATE 上市时间（时间戳）
2307|LISTED_DAYS 上市天数

> 完整枚举见 `SimpleProperty` 类（含融资融券、盘前盘后、夜盘、高精度报价等共 60+ 项）。

## 筛选 V2 - CumulativeProperty

> 用于 `add_cumulative_property(name, days, lower, upper)` 与 `add_retrieve_cumulative(name, days)`。需配合 `days` 参数。

name|含义
:-|:-
3101|PRICE_CHANGE 价格涨跌额
3102|PRICE_CHANGE_PCT 价格涨跌幅 (%)
3103|AMPLITUDE 价格振幅 (%)
3104|AVG_VOLUME 平均成交量
3105|AVG_TURNOVER 平均成交额
3106|TURNOVER_RATIO 换手率 (%)
3107|HIGH_TO_N_DAY_HIGH (今高-N日最高)/N日最高
3108|LOW_TO_N_DAY_LOW (今低-N日最低)/N日最低
3109|PRICE_CHANGE_HP 高精度涨跌额

## 筛选 V2 - FinancialProperty

> 用于 `add_financial_property(name, term, year, lower, upper)` 与 `add_retrieve_financial(name, term, year)`。需配合 `term`（报告期）。

* **常用因子（完整枚举见 `FinancialProperty` 类，含盈利能力 / 偿债 / 运营 / 成长 / 现金流 / 财务超预期等共 100+ 项）**

    name|含义
    :-|:-
    4101|NET_PROFIT 净利润
    4102|NET_PROFIT_GROWTH 净利润增长率
    4105|REVENUE 营业额
    4106|REVENUE_GROWTH 营业额增长率
    4107|NET_PROFIT_RATIO 净利率
    4108|GROSS_PROFIT_RATIO 毛利率
    4109|DEBT_TO_ASSETS 资产负债率
    4110|ROE 净资产收益率
    4202|ROIC 投入资本回报率
    4801|BASIC_EPS 基本每股收益
    4901|TOTAL_SHARE 总股数
    4903|FLOAT_MARKET_CAP 流通市值
    4904|PS_TTM 市销率 TTM
    4905|PCF_TTM 市现率 TTM

* **Term 报告期**（`Term` 枚举）

    term|含义
    :-|:-
    1 / 2 / 3 / 4|Q1 / Q2 / Q3 / Q4 单季报
    6|Q6 中报（累积）
    9|Q9 三季报（累积）
    10|LATEST 最新单季
    100|ANNUAL 年报 FY
    200~204|SURPRISE_LATEST 系列（财报预测）

## 筛选 V2 - Indicator / Pattern / Period / Position

> 用于 `add_indicator_positional` / `add_indicator_pattern` / `add_retrieve_indicator`。

* **`Indicator` 技术指标**（`add_indicator_positional` 的 `first_indicator_name` / `second_indicator`）

    name|含义
    :-|:-
    1|PRICE 最新价
    11~17|MA5 / MA10 / MA20 / MA30 / MA60 / MA120 / MA250
    18|MA 动态简单均线（需设 indicator_params）
    21~27|EMA5 / EMA10 / EMA20 / EMA30 / EMA60 / EMA120 / EMA250
    28|EMA 动态指数均线
    31~33|KDJ_K / KDJ_D / KDJ_J（KDJ(9,3,3)）
    41~43|MACD_DIF / MACD_DEA / MACD_MACD（MACD(12,26,9)）
    51|RSI_12
    52|RSI 动态
    61~63|BOLL_UPPER / BOLL_MIDDLE / BOLL_LOWER（BOLL(20,2)）
    71|RVOL 动态相对成交量

* **`Pattern` 形态**（`add_indicator_pattern` 的 `name`）

    name|含义
    :-|:-
    1 / 2|MA 多头 / 空头排列
    3 / 4|EMA 多头 / 空头排列
    11 / 12|KDJ 低位金叉 / 高位死叉
    13 / 14|KDJ 顶背离 / 底背离
    21 / 22|MACD 低位金叉 / 高位死叉
    23 / 24|MACD 顶背离 / 底背离
    31 / 32|RSI 低位金叉 / 高位死叉
    33 / 34|RSI 顶背离 / 底背离

* **`Period` 周期**

    period|含义
    :-|:-
    1 / 2 / 3 / 4|1 / 3 / 5 / 15 分钟
    5|HOUR_1 1 小时
    6|MINUTE_30 30 分钟
    11 / 21 / 31|DAY 日 / WEEK 周 / MONTH 月

* **`Position` 位置关系**

    position|含义
    :-|:-
    1|OVER first 位于 second 上方
    2|BELOW first 位于 second 下方
    3|CROSS_UP first 上穿 second
    4|CROSS_DOWN first 下穿 second

* **`ScrSortDir` 排序方向**（`set_sort` / `add_sort` 的 `direction`）

    direction|含义
    :-|:-
    1|ASC 升序
    2|DESC 降序
    3|ABS_ASC 绝对值升序
    4|ABS_DESC 绝对值降序

## 筛选 V2 - BasicProperty / 取回字段

> 用于 `add_retrieve_basic(name)` 等取回方法。`add_retrieve_simple` / `add_retrieve_cumulative` / `add_retrieve_financial` 等其余取回字段共用上文 SimpleProperty / CumulativeProperty / FinancialProperty 等 ID。

* **`BasicProperty` 基础属性**

    name|含义|备注
    :-|:-|:-
    1101|CODE 股票代码|sval
    1102|NAME 股票名称|sval
    1103|INDUSTRY 所属行业|sval

> 单条返回结果按 `value_type` 字段分别填入 `sval(1)` / `ival(2)` / `aval(3)` / `dval(4)`。`enum_name` 在 ival 为枚举码时由 SDK 解码（如 K 线形态返回 `'DOUBLE_BOTTOMS'`）。

## 期权筛选 - OptUnderlyingIndicator

> 用于 [get_option_screen](./get-option-screen.md) 的 `add_underlying_filter(indicator_type, ...)` 与 `add_underlying_retrieve(indicator_type)`。

indicator_type|含义|备注
:-|:-|:-
101|STOCK_LIST 指定标的范围|values 传 stock_id 列表
103|PLATE 指定板块|**后台暂不支持，传入会报错**
106|INDEX_LIST 指定指数类型|
201|VOLUME 总成交量|
202|OPEN_INTEREST 总持仓量|
203|IV 标的隐含波动率|
204|HV 标的历史波动率|
205|IV_RANK|
206|IV_PERCENTILE|
207 / 208|IV_CHANGE / IV_CHANGE_RATIO|
209 / 210|IV_HV_RATIO / IV_HV_SPREAD|
401|MARKET_CAP 标的市值|
402|STOCK_PRICE 标的最新价|
403|CHANGE_RATIO 涨跌幅|

## 期权筛选 - OptIndicator

> 用于 `add_option_filter(indicator_type, ...)` 与 `add_option_retrieve(indicator_type)`。

indicator_type|含义|备注
:-|:-|:-
1001|STRIKE_PRICE 行权价|
1002|LEFT_DAY 距到期日天数|
1003|OPTION_TYPE 期权类型|1=CALL，2=PUT
1004|EXERCISE_TYPE 行权方式|1=美式，2=欧式
1005|EXPIRATION_TYPE 到期类型|1=周，2=月，3=季
1007|STRIKE_DATE_TIMESTAMP 到期日时间戳（秒）|
2001|IN_THE_MONEY|0=价外，1=价内
2002~2005|PRICE / MID_PRICE / BID_PRICE / ASK_PRICE|
2006~2009|BID_ASK_SPREAD / BID_VOLUME / ASK_VOLUME / BID_ASK_VOLUME_RATIO|
2010|CHANGE_RATIO 涨跌幅|
2011 / 2012|VOLUME / TURNOVER|
2013 / 2014|OPEN_INTEREST / OPEN_INTEREST_MARKET_CAP|
2018|VOL_OI_RATIO|
2021|PREMIUM 权利金|**仅 sort/retrieve，filter 不支持**
3001 / 3002 / 3003|IMPLIED_VOLATILITY / HISTORY_VOLATILITY / IV_HV_RATIO|
3004~3008|DELTA / GAMMA / VEGA / THETA / RHO|
3009 / 3010|LEVERAGE_RATIO / EFFECTIVE_GEARING|
3011 / 3012|BUY_TO_BEP / SELL_TO_BEP|
3013 / 3014|BUY_PROFIT_PROBABILITY / SELL_PROFIT_PROBABILITY|
3015~3018|INTRINSIC_VALUE_PER / TIME_VALUE_PER / ITM_DEGREE / OTM_DEGREE|
3019 / 3020|ITM_PROBABILITY / OTM_PROBABILITY|

## 窝轮筛选 V2 - WarrantField

> 用于 [get_warrant_screen](./get-warrant-screen.md) 的 `add_interval_filter(field_id, ...)` / `add_choice_filter(field_id, choices)` / `add_sort(field_id, desc)`。所有数值字段直接传原始值。

field_id|含义|筛选方式
:-|:-|:-
1|CODE 证券代码|choice（文本）
2|NAME 股票名称|choice（文本）
4|ISSUER_ID 发行商 ID|choice
5|STOCK_OWNER 正股 ID|choice（可传 "HK.00700"）
6|WARRANT_TYPE 窝轮类型|choice：1=认购，2=认沽，3=牛证，4=熊证，5=界内证
7|CONVERSION_RATIO 换股比率|interval
8|CURRENT_PRICE 当前价|interval
9|STREET_RATIO 街货占比|interval
10|VOLUME 成交量|interval
11|MATURITY_DATE 到期日（时间戳秒）|interval
12|STRIKE_PRICE 行使价|interval
13|PREMIUM 溢价|interval（可为负）
14|RECOVERY_PRICE 收回价|interval
15|IMPLIED_VOLATILITY 引伸波幅|interval
16|LEVERAGE_RATIO 杠杆比率|interval
17|PRICE_RECOVERY_RATIO 正股距收回价 %|interval
18|DELTA 对冲值|interval
19|STATUS 轮证状态|choice：0=正常，1=终止，2=待上市
20|IPO_TIME 上市时间（时间戳秒）|interval
21 / 22|BUY_VOL / SELL_VOL 买/卖量|interval
23|EFFECTIVE_LEVERAGE 有效杠杆|interval
24|LAST_CLOSE_PRICE 昨收价|interval
25|TURNOVER 成交额|interval
26 / 27|SELL_PRICE / BUY_PRICE|interval
28 / 29|HIGH_PRICE / LOW_PRICE|interval
30|RATIO_ITM_OTM 价内/价外|interval（可为负）
31|BREAK_EVEN_POINT 打和点|interval
32|AMPLITUDE 振幅|interval
33|SCORE_FAXING 法兴评分|interval
34|LAST_TRADE_DATE 最后交易日（时间戳秒）|interval
35|STREET_VOLUME 街货量|interval
36|LOT_SIZE 每手股数|interval
37|ISSUE_SIZE 发行量|interval
38|IPO_PRICE 发行价|interval
39 / 40|LOWER_STRIKE_PRICE / UPPER_STRIKE_PRICE|interval（界内证）
41|IW_PRICE_STATUS 界内/界外|choice
42|SENSITIVITY 敏感度|interval
43|CONVERSION_PRICE 换股价|interval
44 / 45|CHANGE_RATE / CHANGE_VALUE 涨跌幅/额|interval
51|SCORE 综合评分|interval
52|FILTER_NO_TRADE 过滤无成交窝轮|choice：0=否，1=是
53|CURRENCY_CODE 币种|choice
54|STOCK_OWNER_PRICE 正股价格|interval

## 窝轮筛选 V2 - WarrantMarket / WarrantType / WarrantStatus

> `WarrantScreenRequest(warrant_market=...)` 与 `add_choice_filter` 常用枚举。

* **`WarrantMarket` 市场**

    market|含义
    :-|:-
    1|HK 港股
    4|SG 新加坡
    15|MY 马来西亚

* **`WarrantType` 窝轮类型**（field_id=6 的 choice 取值）

    value|含义
    :-|:-
    1|CALL 认购
    2|PUT 认沽
    3|BULL 牛证
    4|BEAR 熊证
    5|INLINE 界内证

* **`WarrantStatus` 窝轮状态**（field_id=19 的 choice 取值）

    value|含义
    :-|:-
    0|NORMAL 正常
    1|SUSPEND 终止交易
    2|PRE_IPO 待上市

---



---

# 交易接口总览

<table>
    <tr>
        <th>模块</th>
        <th>协议 ID</th>
        <th>Protobuf 文件</th>
        <th>说明</th>
    </tr>
    <tr>
        <td rowspan="2">账户</td>
        <td>2001</td>
	    <td><a href="../trade/get-acc-list.html">Trd_GetAccList</a></td>
	    <td>获取交易业务账户列表</td>
    </tr>
    <tr>
        <td>2005</td>
	    <td><a href="../trade/unlock.html">Trd_UnlockTrade</a></td>
	    <td>解锁或锁定交易</td>
    </tr>
    <tr>
        <td rowspan="5">资产持仓</td>
        <td>2101</td>
	    <td><a href="../trade/get-funds.html">Trd_GetFunds</a></td>
	    <td>获取账户资金</td>
    </tr>
    <tr>
        <td>2111</td>
	    <td><a href="../trade/get-max-trd-qtys.html">Trd_GetMaxTrdQtys</a></td>
	    <td>获取最大交易数量</td>
    </tr>
    <tr>
        <td>2102</td>
	    <td><a href="../trade/get-position-list.html">Trd_GetPositionList</a></td>
	    <td>获取账户持仓</td>
    </tr>
    <tr>
	    <td>2223</td>
	    <td><a href="../trade/get-margin-ratio.html">Trd_GetMarginRatio</a></td>
	    <td>获取融资融券数据</td>
    </tr>
    <tr>
	    <td>2226</td>
        <td><a href="../trade/get-acc-cash-flow.html">Trd_FlowSummary</a></td>
	    <td>查询账户资金流水 (最低版本要求：9.1.5108)</td>
    </tr>
    <tr>
        <td rowspan="7">订单</td>
        <td>2202</td>
	    <td><a href="../trade/place-order.html">Trd_PlaceOrder</a></td>
	    <td>下单</td>
    </tr>
    <tr>
        <td>2205</td>
	    <td><a href="../trade/modify-order.html">Trd_ModifyOrder</a></td>
	    <td>修改订单</td>
    </tr>
    <tr>
        <td>2201</td>
	    <td><a href="../trade/get-order-list.html">Trd_GetOrderList</a></td>
	    <td>获取订单列表</td>
    </tr>
	<tr>
        <td>2225</td>
	    <td><a href="../trade/order-fee-query.html">Trd_GetOrderFee</a></td>
	    <td>获取订单费用 (最低版本要求：8.2.4218)</td>
    </tr>
    <tr>
        <td>2221</td>
	    <td><a href="../trade/get-history-order-list.html">Trd_GetHistoryOrderList</a></td>
	    <td>获取历史订单列表</td>
    </tr>
    <tr>
        <td>2208</td>
	    <td><a href="../trade/update-order.html">Trd_UpdateOrder</a></td>
	    <td>推送订单状态变动通知</td>
    </tr>
    <tr>
        <td>2008</td>
	    <td><a href="../trade/sub-acc-push.html">Trd_SubAccPush</a></td>
	    <td>订阅业务账户的交易推送数据</td>
    </tr>
    <tr>
        <td rowspan="3">成交</td>
        <td>2211</td>
	    <td><a href="../trade/get-order-fill-list.html">Trd_GetOrderFillList</a></td>
	    <td>获取成交列表</td>
    </tr>
    <tr>
        <td>2222</td>
	    <td><a href="../trade/get-history-order-fill-list.html">Trd_GetHistoryOrderFillList</a></td>
	    <td>获取历史成交列表</td>
    </tr>
    <tr>
        <td>2218</td>
	    <td><a href="../trade/update-order-fill.html">Trd_UpdateOrderFill</a></td>
	    <td>推送成交通知</td>
    </tr>
</table>

---



---

# 交易对象

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">
<template v-slot:py>

## 创建连接

`OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, is_encrypt=None, security_firm=SecurityFirm.NONE)`  
  
`OpenFutureTradeContext(host='127.0.0.1', port=11111, is_encrypt=None, security_firm=SecurityFirm.NONE)` 

`OpenCryptoTradeContext(host='127.0.0.1', port=11111, is_encrypt=None, security_firm=SecurityFirm.NONE)` 


* **介绍**

    根据交易品类，选择账户，并创建对应的交易对象。
    实例|账户
    :-|:-
    OpenSecTradeContext|证券账户  (股票、ETFs、窝轮牛熊、股票及指数的期权使用此账户)
    OpenFutureTradeContext|期货账户   (期货、期货期权使用此账户)
    OpenCryptoTradeContext|加密货币账户  (- 加密货币现货交易使用此账户
  - 仅支持 FUTUSECURITIES、FUTUINC、FUTUSG 三家券商
  - 不支持模拟交易)

* **参数**
    参数|类型|说明
    :-|:-|:-
    filter_trdmarket|[TrdMarket](./trade.html#719)|筛选对应交易市场权限的账户  (- 此参数仅对 OpenSecTradeContext 适用
  - 此参数仅用于筛选账户，不影响交易连接)
    host|str|OpenD 监听的 IP 地址
    port|int|OpenD 监听的 IP 端口
    is_encrypt|bool|是否启用加密  (默认 None 表示：使用 [enable_proto_encrypt](../ftapi/init.md#319) 的设置)
    security_firm|[SecurityFirm](./trade.md#572)|所属券商  (OpenCryptoTradeContext 仅支持 FUTUSECURITIES、FUTUINC、FUTUSG)

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, is_encrypt=None, security_firm=SecurityFirm.NONE)
trd_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

```python
from futu import *
future_ctx = OpenFutureTradeContext(host='127.0.0.1', port=11111, security_firm=SecurityFirm.NONE)
future_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

```python
from futu import *
crypto_ctx = OpenCryptoTradeContext(host='127.0.0.1', port=11111, security_firm=SecurityFirm.NONE)
crypto_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```


## 关闭连接

`close()`  

* **介绍**

    关闭交易对象。默认情况下，Futu API 内部创建的线程会阻止进程退出，只有当所有 Context 都 close 后，进程才能正常退出。但通过 [set_all_thread_daemon](../ftapi/init.md#4570) 可以设置所有内部线程为 daemon 线程，这时即使没有调用 Context 的 close，进程也可以正常退出。

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111)
trd_ctx.close()  # 结束后记得关闭当条连接，防止连接条数用尽
```

---



---

# 获取交易业务账户列表

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_acc_list()`

* **介绍**

    获取交易业务账户列表。  
    要调用其他交易接口前，请先获取此列表，确认要操作的交易业务账户无误。

* **参数**
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回交易业务账户列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 交易业务账户列表格式如下：
        字段|类型|说明
        :-|:-|:-
        acc_id|int|交易业务账户
        trd_env|[TrdEnv](./trade.md#6374)|交易环境
        acc_type|[TrdAccType](./trade.md#3974)|账户类型
        uni_card_num|str|综合账户卡号，同移动端内的展示
        card_num|str|业务账户卡号  (综合账户下包含一个或多个业务账户（综合证券账户、综合期货账户等等），与交易品种有关)
        security_firm|[SecurityFirm](./trade.md#572)|所属券商
        sim_acc_type|[SimAccType](./trade.md#6449)|模拟账户类型  (仅模拟账户适用) 
        trdmarket_auth|list|交易市场权限  (list 中元素类型是 [TrdMarket](./trade.html#719)) 
        acc_status|[TrdAccStatus](./trade.md#121)|账户状态
        acc_role|[TrdAccRole](./trade.md#6395)|账户结构  (用于区分主子账户结构
  - MASTER: 主账户
  - NORMAL: 普通账户
  - IPO: 马来西亚 IPO 账户)
        jp_acc_type|list|日本账户类型  (list 中元素类型是[SubAccType](./trade.md#6112)，仅对日本券商生效)


* **说明**

    获取港股模拟交易账户，需要指定 filter_trdmarket 为 TrdMarket.HK，此时会返回2个模拟交易账号。其中 sim_acc_type = STOCK 为港股模拟账户，sim_acc_type = OPTION 为港股期权模拟账户，sim_acc_type = FUTURES 为港股期货模拟账户。   
    获取美股模拟交易账户，需要指定 filter_trdmarket 为 TrdMarket.US，sim_acc_type = STOCK_AND_OPTION 代表美股融资融券模拟账户，可以模拟交易股票和期权。sim_acc_type = FUTURES 为美国期货模拟账户。  

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.get_acc_list()
if ret == RET_OK:
    print(data)
    print(data['acc_id'][0])  # 取第一个账号
    print(data['acc_id'].values.tolist())  # 转为 list
else:
    print('get_acc_list error: ', data)
trd_ctx.close()
```

* **Output**

```python
               acc_id   trd_env acc_type       uni_card_num           card_num    security_firm   sim_acc_type                           trdmarket_auth    acc_status    acc_role    jp_acc_type
0  281756479345015383      REAL   MARGIN   1001289516908051   1001329805025007   FUTUSECURITIES            N/A    [HK, US, HKCC, SG, HKFUND, USFUND, JP]       ACTIVE      NORMAL             []
1             8377516  SIMULATE     CASH                N/A                N/A              N/A          STOCK                                      [HK]       ACTIVE         N/A             []
2            10741586  SIMULATE   MARGIN                N/A                N/A              N/A         OPTION                                      [HK]       ACTIVE         N/A             []
3  281756455983234027      REAL   MARGIN                N/A   1001100321720699   FUTUSECURITIES            N/A                                      [HK]     DISABLED      NORMAL             []
281756479345015383
[281756479345015383, 8377516, 10741586, 281756455983234027]
```

---



---

# 解锁交易

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`unlock_trade(password=None, password_md5=None, is_unlock=True)`

* **介绍**

    解锁或锁定交易

* **参数**
    
    参数|类型|说明
    :-|:-|:-
    password|str|交易密码  (如果 password_md5 不为空，就使用传入的 password_md5 解锁；否则使用 password 转 MD5 得到 password_md5 再解锁)
    password_md5|str|交易密码的 32 位 MD5 加密（全小写） (解锁交易必须要填密码，锁定交易忽略)
    is_unlock|bool|解锁或锁定  (True：解锁False：锁定)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">msg</td>
            <td>NoneType</td>
            <td>当 ret == RET_OK 时，返回 None</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

        

* **Example**

```python
from futu import *
pwd_unlock = '123456'
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.unlock_trade(pwd_unlock)
if ret == RET_OK:
    print('unlock success!')
else:
    print('unlock_trade failed: ', data)
trd_ctx.close()
```

* **Output**

```python
unlock success!
```

---



---

# 查询账户资金

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`accinfo_query(trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, refresh_cache=False, currency=Currency.HKD, asset_category=AssetCategory.NONE)`

* **介绍**

    查询交易业务账户的资产净值、证券市值、现金、购买力等资金数据。

* **参数**
    参数|类型|说明
    :-|:-|:-
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    refresh_cache|bool|是否刷新缓存  (- True：立即向富途服务器重新请求数据，不使用 OpenD 的缓存，此时会受到接口限频的限制
  - False：使用 OpenD 的缓存（特殊情况导致缓存没有及时更新才需要刷新）)
    currency|[Currency](./trade.md#8019)|计价货币  (- 仅期货账户、综合证券账户适用，其它账户类型会忽略此参数
  - 返回的 DataFrame 中，除了明确指明了货币的字段，其它资金相关字段都以此参数换算)
    asset_category|[AssetCategory](./trade.md#4752)|资产类别  (仅对日本券商生效)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回资金数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 资金数据格式如下：
        字段|类型|说明
        :-|:-|:-
        power|float|最大购买力  (- 此字段是按照 50% 的融资初始保证金率计算得到的 **近似值**。但事实上，每个标的的融资初始保证金率并不相同。我们建议您使用 [查询最大可买可卖](./get-max-trd-qtys.md) 接口返回的 **最大可买** 字段，来判断实际可买入的最大数量。)
        max_power_short|float|卖空购买力  (- 此字段是按照 60% 的融券保证金率计算得到的 **近似值**。但事实上，每个标的的融券保证金率并不相同。我们建议您使用 [查询最大可买可卖](./get-max-trd-qtys.md) 接口返回的 **可卖空** 字段，来判断实际可卖空的最大数量。)
        net_cash_power|float|现金购买力 (已废弃，请使用usd_net_cash_power等字段获取分币种的现金购买力)
        total_assets|float|总资产净值 (总资产净值 = 证券资产净值 + 基金资产净值 + 债券资产净值) 
        securities_assets|float|证券资产净值 (最低 OpenD 版本要求：8.2.4218) 
        fund_assets|float|基金资产净值 (- 综合账户返回结果为总基金资产净值，暂时不支持查询港元基金资产和美元基金资产
  - 最低 OpenD 版本要求：8.2.4218)
        bond_assets|float|债券资产净值 (最低 OpenD 版本要求：8.2.4218) 
        cash|float|现金 (已废弃，请使用us_cash等字段获取分币种的现金)
        market_val|float|证券市值  (仅证券账户适用)
        long_mv|float|多头市值  
        short_mv|float|空头市值  
        pending_asset|float|在途资产  
        interest_charged_amount|float|计息金额 
        frozen_cash|float|冻结资金
        avl_withdrawal_cash|float|现金可提  (仅证券账户适用)
        max_withdrawal|float|最大可提  (仅富途证券（香港）的证券账户适用) 
        currency|[Currency](./trade.md#8019)|计价货币  (仅综合证券账户、期货账户适用)
        available_funds|float|可用资金  (仅期货账户适用)
        unrealized_pl|float|未实现盈亏  (仅期货账户适用)
        realized_pl|float|已实现盈亏  (仅期货账户适用)
        risk_level|[CltRiskLevel](./trade.md#9239)|风控状态  (仅期货账户适用。建议统一使用 exposure_level 字段获取证券、期货账户的风险状态)
        risk_status|[CltRiskStatus](./trade.md#3989)|风险状态  (- 证券账户和期货账户均适用
  - 共分 9 个等级， `LEVEL1`是最安全，`LEVEL9`是最危险)
        initial_margin|float|初始保证金 
        margin_call_margin|float|Margin Call 保证金 
        maintenance_margin|float|维持保证金 
        hk_cash|float|港元现金  (此字段表示该币种实际的值，而不是以该币种计价的值)
        hk_avl_withdrawal_cash|float|港元可提  (此字段表示该币种实际的值，而不是以该币种计价的值)
        hkd_net_cash_power|float|港元现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：8.7)
        hkd_assets|float|港股资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：9.0.5008)
        us_cash|float|美元现金  (此字段表示该币种实际的值，而不是以该币种计价的值)
        us_avl_withdrawal_cash|float|美元可提  (此字段表示该币种实际的值，而不是以该币种计价的值)
        usd_net_cash_power|float|美元现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：8.7)
        usd_assets|float|美股资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：9.0.5008)
        cn_cash|float|人民币现金  (此字段表示该币种实际的值，而不是以该币种计价的值)
        cn_avl_withdrawal_cash|float|人民币可提  (此字段表示该币种实际的值，而不是以该币种计价的值)
        cnh_net_cash_power|float|人民币现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：8.7)
        cnh_assets|float|A股资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：9.0.5008)
        jp_cash|float|日元现金  (- 仅期货账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低 Futu API 版本要求：5.8.2008)
        jp_avl_withdrawal_cash|float|日元可提  (- 仅期货账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低 Futu API 版本要求：5.8.2008)
        jpy_net_cash_power|float|日元现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：8.7)
        jpy_assets|float|日股资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：9.0.5008)
        sg_cash|float|新元现金  (- 仅期货账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值)
        sg_avl_withdrawal_cash|float|新元可提  (- 仅期货账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值)
        sgd_net_cash_power|float|新元现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：8.7)
        sgd_assets|float|新股资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：9.0.5008)
        au_cash|float|澳元现金  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低 Futu API 版本要求：5.8.2008)
        au_avl_withdrawal_cash|float|澳元可提  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低 Futu API 版本要求：5.8.2008)
        aud_net_cash_power|float|澳元现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：8.7)
        aud_assets|float|澳股资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：9.0.5008)
        ca_cash|float|加元现金  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        ca_avl_withdrawal_cash|float|加元可提  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        cad_net_cash_power|float|加元现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        cad_assets|float|加元资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        my_cash|float|令吉现金  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        my_avl_withdrawal_cash|float|令吉可提  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        myr_net_cash_power|float|令吉现金购买力  (- 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        myr_assets|float|令吉资产净值  (- 仅综合证券账户适用
  - 此字段表示该币种实际的值，而不是以该币种计价的值
  - 最低版本要求：10.0.6008)
        is_pdt|bool|是否为 PDT 账户  (True：是 PDT 账户，False：不是 PDT 账户仅moomoo证券(美国)账户适用最低 OpenD 版本要求：5.8.2008)
        pdt_seq|string|剩余日内交易次数  (仅moomoo证券(美国)账户适用最低 OpenD 版本要求：5.8.2008)   
        beginning_dtbp|float|初始日内交易购买力  (仅被标记为 PDT 的moomoo证券(美国)账户适用最低 OpenD 版本要求：5.8.2008)
        remaining_dtbp|float|剩余日内交易购买力  (仅被标记为 PDT 的moomoo证券(美国)账户适用最低 OpenD 版本要求：5.8.2008)
        dt_call_amount|float|日内交易待缴金额  (仅被标记为 PDT 的moomoo证券(美国)账户适用最低 OpenD 版本要求：5.8.2008)
        dt_status|[DtStatus](./trade.html#1860)|日内交易限制情况  (仅被标记为 PDT 的moomoo证券(美国)账户适用最低 OpenD 版本要求：5.8.2008)
        crypto_mv|float|加密货币市值
        exposure_level|[ExposureLevel](./trade.md#7809)|持仓限额状态  (加密货币账户返回持仓限额状态证券/期货账户返回风控状态)
        exposure_limit|float|持仓限额（单位 USD）  (仅加密货币账户返回)
        used_limit|float|已用持仓限额（单位 USD）  (仅加密货币账户返回)
        remaining_limit|float|剩余持仓限额（单位 USD）  (仅加密货币账户返回)

        
* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.accinfo_query()
if ret == RET_OK:
    print(data)
    print(data['power'][0])  # 取第一行的购买力
    print(data['power'].values.tolist())  # 转为 list
else:
    print('accinfo_query error: ', data)
trd_ctx.close()  # 关闭当条连接
```

* **Output**

 ```python
power  max_power_short  net_cash_power  total_assets  securities_assets  fund_assets  bond_assets   cash   market_val      long_mv   short_mv  pending_asset  interest_charged_amount  frozen_cash  avl_withdrawal_cash  max_withdrawal currency available_funds unrealized_pl realized_pl risk_level risk_status  initial_margin  margin_call_margin  maintenance_margin  hk_cash  hk_avl_withdrawal_cash  hkd_net_cash_power  hkd_assets  us_cash  us_avl_withdrawal_cash  usd_net_cash_power  usd_assets  cn_cash  cn_avl_withdrawal_cash  cnh_net_cash_power  cnh_assets  jp_cash  jp_avl_withdrawal_cash  jpy_net_cash_power jpy_assets  sg_cash sg_avl_withdrawal_cash sgd_net_cash_power sgd_assets  au_cash au_avl_withdrawal_cash aud_net_cash_power aud_assets  ca_cash ca_avl_withdrawal_cash cad_net_cash_power cad_assets  my_cash my_avl_withdrawal_cash myr_net_cash_power myr_assets  is_pdt pdt_seq beginning_dtbp remaining_dtbp dt_call_amount dt_status
0  465453.903307    465453.903307             0.0   289932.0404        197028.2204     92903.82          0.0  25.18  197003.0448  211960.7568 -14957.712            0.0                      0.0    25.930845                  0.0             0.0      HKD             N/A           N/A         N/A        N/A      LEVEL3   219346.648525       288656.787955       181250.967601      0.0                     0.0          13225.7955     0.0   3.24                     0.0           9656.4365      0.0    0.0                     0.0                 0.0    0.0      0.0                     0.0                 0.0     0.0    N/A                    N/A                N/A     0.0    N/A                    N/A                N/A    0.0    N/A                    N/A                N/A    0.0    N/A                    N/A                N/A    0.0        N/A     N/A            N/A            N/A            N/A       N/A
465453.903307
[465453.903307]
```

---



---

# 查询最大可买可卖

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`acctradinginfo_query(order_type, code, price, order_id=None, adjust_limit=0, trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, session=Session.NONE, jp_acc_type=SubAccType.JP_GENERAL, position_id=NONE)`

* **介绍**

    查询指定交易业务账户下的最大可买卖数量，亦可查询指定交易业务账户下指定订单的最大可改成的数量。

    现金账户请求期权不适用。

* **参数**
    参数|类型|说明
    :-|:-|:-
    order_type|[OrderType](./trade.md#4181)|订单类型
    code|str|证券代码  (如果是期货交易，且 code 为期货主连代码，则会自动转为对应的实际合约代码)
    price|float|报价  (证券账户精确到小数点后 3 位，超出部分会被舍弃期货账户精确到小数点后 9 位，超出部分会被舍弃)
    order_id|str|订单号  (- 默认传 None，查询的是新下单的最大可买可卖数量
  - 如果是改单则要传订单号，此时计算最大可买可卖时，会返回此订单可改成的最大数量
  - 如果通过此参数，查询某笔订单最大可改成的数量，需要在下单之后，间隔 0.5 秒以上再调用此接口)
    adjust_limit|float|价格微调幅度  (OpenD 会对传入价格自动调整到合法价位上（期货会忽略此参数）
  - 正数代表向上调整，负数代表向下调整
  - 例如：0.015 代表向上调整且幅度不超过 1.5%；-0.01 代表向下调整且幅度不超过 1%。默认 0 表示不调整)
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    session|[Session](../quote/quote.md#9152)|美股交易时段  (仅对美股生效，支持传入RTH、ETH、OVERNIGHT、ALL)
    jp_acc_type|[SubAccType](./trade.md#6112)|日本账户类型  (仅日本券商适用)
    position_id|int|持仓ID  (- 适用于日本衍生品账户查询持仓可卖和平仓需买回
  - 可通过[查询持仓](./get-position-list.md)接口获取)
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回账号列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 账号列表格式如下：
        字段|类型|说明
        :-|:-|:-
        max_cash_buy|float|现金可买  (-  期权的单位是“张”
  - 期货账户不适用)
        max_cash_and_margin_buy|float|最大可买  (-  期权的单位是“张”
  - 期货账户不适用)
        max_position_sell|float|持仓可卖  (期权的单位是"张")
        max_sell_short|float|可卖空  (-  期权的单位是“张”
  - 期货账户不适用)
        max_buy_back|float|平仓需买入  (- 当持有净空仓时，必须先买回空头持仓的股数，才能再继续买多
  -  期货、期权的单位是“张”)
        long_required_im|float|买 1 张合约所带来的初始保证金变动  (-  当前仅期货和期权适用。
  - 无持仓时，返回 **买入** 1 张的初始保证金占用（正数）。 
  - 有多仓时，返回 **买入** 1 张的初始保证金占用（正数）。
  - 有空仓时，返回 **买回** 1 张的初始保证金释放（负数）。)
        short_required_im|float|卖 1 张合约所带来的初始保证金变动  (-  当前仅期货和期权适用。
  - 无持仓时，返回 **卖空** 1 张的初始保证金占用（正数）。 
  - 有多仓时，返回 **卖出** 1 张的初始保证金释放（负数）。
  -  有空仓时，返回 **卖空** 1 张的初始保证金释放（正数）。)
        session|[Session](../quote/quote.md#9152)|交易订单时段（仅用于美股）

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.acctradinginfo_query(order_type=OrderType.NORMAL, code='HK.00700', price=400)
if ret == RET_OK:
    print(data)
    print(data['max_cash_and_margin_buy'][0])  # 最大融资可买数量
else:
    print('acctradinginfo_query error: ', data)
trd_ctx.close()  # 关闭当条连接
```

* **Output**

```python
    max_cash_buy  max_cash_and_margin_buy  max_position_sell  max_sell_short  max_buy_back long_required_im short_required_im    session
0           0.0                   1500.0                0.0             0.0           0.0              N/A               N/A             N/A
1500.0
```

---



---

# 查询持仓

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`position_list_query(code='', position_market=TrdMarket.NONE, pl_ratio_min=None, pl_ratio_max=None, trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, refresh_cache=False, asset_category=AssetCategory.NONE, currency=Currency.USD)`

* **介绍**

    查询交易业务账户的持仓列表

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|代码过滤  (- 只返回此代码对应的持仓数据。不传则返回所有
  - 注意：期货持仓的代码过滤，需要传入含具体月份的合约代码，无法通过主连合约代码进行过滤)
    position_market| [TrdMarket](./trade.md#719)|持仓所属市场过滤 (- 返回指定市场的持仓数据
  - 默认状态时，返回所有市场持仓数据)
    pl_ratio_min|float|当前盈亏比例下限过滤，仅返回高于此比例的持仓  (证券账户使用摊薄成本价的盈亏比例，期货账户使用平均成本价的盈亏比例例如：传入 10，则返回盈亏比例大于 +10% 的持仓)
    pl_ratio_max|float|当前盈亏比例上限过滤，低于此比例的会返回  (证券账户使用摊薄成本价的盈亏比例，期货账户使用平均成本价的盈亏比例例如：传入 10，返回盈亏比例小于 +10% 的持仓)
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    refresh_cache|bool|是否刷新缓存  (- True：立即向富途服务器重新请求数据，不使用 OpenD 的缓存，此时会受到接口限频的限制
  - False：使用 OpenD 的缓存（特殊情况导致缓存没有及时更新才需要刷新）)
    asset_category|[AssetCategory](./trade.md#4752)|资产类别  (仅对日本券商生效)
    currency|[Currency](./trade.md#8019)|返回持仓的货币单位  (仅加密货币账户使用)
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回持仓列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 持仓列表
        字段|类型|说明
        :-|:-|:-
        position_side|[PositionSide](./trade.md#2972)|持仓方向
        code|str|股票代码
        stock_name|str|股票名称
        position_market|[TrdMarket](./trade.md#719)|持仓所属市场
        qty|float|持有数量  (期权和期货的单位是“张”)
        can_sell_qty|float|可用数量  (可用数量，是指持有的可平仓的数量。可用数量=持有数量-冻结数量期权和期货的单位是“张”。)
        currency|[Currency](./trade.md#8019)|交易货币
        nominal_price|float|市价  (精确到小数点后 3 位，超出部分四舍五入)
        cost_price|float|摊薄成本价（证券账户），平均开仓价（期货账户）  (建议使用 average_cost，diluted_cost 字段获取持仓成本价)
        cost_price_valid|bool|成本价是否有效  (True：有效False：无效)
        average_cost|float|平均成本价  (模拟证券账户不适用最低OpenD版本要求：9.2.5208)
        diluted_cost|float|摊薄成本价  (期货账户不适用最低OpenD版本要求：9.2.5208)
        market_val|float|市值  (精度：3 位小数（A 股 2 位小数，期货 0 位小数）)
        pl_ratio|float|盈亏比例（摊薄成本价模式）  (期货不适用该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        pl_ratio_valid|bool|盈亏比例是否有效  (True：有效False：无效)
        pl_ratio_avg_cost|float|盈亏比例（平均成本价模式）  (模拟证券账户不适用该字段为百分比字段，默认不展示 %，如 20 实际对应 20%最低OpenD版本要求：9.2.5208)
        pl_val|float|盈亏金额  (精度：3 位小数（A 股 2 位小数）)
        pl_val_valid|bool|盈亏金额是否有效  (True：有效False：无效)
        today_pl_val|float|今日盈亏金额  (只在真实交易环境下有效精度：3 位小数（A 股 2 位小数，期货 2 位小数）)
        today_trd_val|float|今日交易金额  (只在真实交易环境下有效精度：3 位小数（A 股 2 位小数）期货不适用)
        today_buy_qty|float|今日买入总量  (只在真实交易环境下有效精度：3 位小数（A 股 2 位小数）期货不适用)
        today_buy_val|float|今日买入总额  (只在真实交易环境下有效精度：3 位小数（A 股 2 位小数）期货不适用)
        today_sell_qty|float|今日卖出总量  (只在真实交易环境下有效精度：3 位小数（A 股 2 位小数）期货不适用)
        today_sell_val|float|今日卖出总额  (只在真实交易环境下有效精度：3 位小数（A 股 2 位小数）期货不适用)
        unrealized_pl|float|未实现盈亏  (模拟证券账户不适用综合证券账户，返回平均成本价模式下的未实现盈亏金额)
        realized_pl|float|已实现盈亏  (模拟证券账户不适用综合证券账户，返回平均成本价模式下的已实现盈亏金额)
        position_id|int|持仓ID

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.position_list_query()
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果持仓列表不为空
        print(data['stock_name'][0])  # 获取持仓第一个股票名称
        print(data['stock_name'].values.tolist())  # 转为 list
else:
    print('position_list_query error: ', data)
trd_ctx.close()  # 关闭当条连接
```

* **Output**

```python
       code stock_name position_market    qty  can_sell_qty  cost_price  cost_price_valid average_cost  diluted_cost  market_val  nominal_price  pl_ratio  pl_ratio_valid pl_ratio_avg_cost  pl_val  pl_val_valid today_buy_qty today_buy_val today_pl_val today_trd_val today_sell_qty today_sell_val position_side unrealized_pl realized_pl currency asset_category position_id
0  HK.01810     小米集团-W              HK  400.0         400.0      53.975              True          53.975        53.975     19820.0          49.55  -8.19824            True            -8.19824    -1770.0          True           0.0           0.0          0.0           0.0            0.0            0.0          LONG           0.0         0.0      HKD      N/A      6596101776329286054
小米集团-W
['小米集团-W']
```

---



---

# 获取融资融券数据

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_margin_ratio(code_list)`

* **介绍**

    查询股票的融资融券数据。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code_list|list|股票代码列表  (每次最多可请求 100 个标的list 内元素类型为 str)
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回融资融券数据</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 融资融券数据格式如下：
        字段|类型|说明
        :-|:-|:-
        code| str| 股票代码
        is_long_permit|bool|是否允许融资
        is_short_permit | bool | 是否允许融券
        short_pool_remain | float | 卖空池剩余  (单位：股)
        short_fee_rate | float | 融券参考利率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        alert_long_ratio | float | 融资预警比率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        alert_short_ratio | float | 融券预警比率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        im_long_ratio | float | 融资初始保证金率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        im_short_ratio | float | 融券初始保证金率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        mcm_long_ratio | float | 融资 margin call 保证金率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        mcm_short_ratio | float  | 融券 margin call 保证金率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        mm_long_ratio |float | 融资维持保证金率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)
        mm_short_ratio |float | 融券维持保证金率  (该字段为百分比字段，默认不展示 %，如 20 实际对应 20%)

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.get_margin_ratio(code_list=['HK.00700','HK.09988'])  
if ret == RET_OK:
    print(data)
    print(data['is_long_permit'][0])  # 取第一条的是否允许融资
    print(data['im_short_ratio'].values.tolist())  # 转为 list
else:
    print('error:', data)
trd_ctx.close()  # 结束后记得关闭当条连接，防止连接条数用尽
```

* **Output**

```python
       code  is_long_permit  is_short_permit  short_pool_remain  short_fee_rate  alert_long_ratio  alert_short_ratio  im_long_ratio  im_short_ratio  mcm_long_ratio  mcm_short_ratio  mm_long_ratio  mm_short_ratio
0  HK.00700            True             True          1826900.0            0.89              33.0               56.0           35.0            60.0            32.0             53.0           25.0            40.0
1  HK.09988            True             True          1150600.0            0.95              48.0               46.0           50.0            50.0            47.0             43.0           40.0            30.0
True
[60.0, 50.0]
```

---



---

# 查询账户资金流水

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`get_acc_cash_flow(clearing_date='', trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, cashflow_direction=CashFlowDirection.NONE, start='', end='')`

* **介绍**

    查询交易业务账户在指定日期的资金流水数据。数据覆盖出入金、调拨、货币兑换、买卖金融资产、融资融券利息等所有导致资金变动的事项。

* **参数**
    
    参数|类型|说明
    :-|:-|:-
    clearing_date|str|清算日期 (- 证券/期货账户查询资金流水的必传参数。如需查询多日，需逐日请求
  - 格式：yyyy-MM-dd，例如："2017-06-20")
    trd_env|TrdEnv|交易环境
    acc_id|int|交易业务账户 ID   (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号
    cashflow_direction|[CashFlowDirection](./trade.md#7573)|筛选资金流方向
    start_time|str|开始时间  (仅加密货币账户使用，格式：yyyy-MM-dd HH:mm:ss)
    end_time|str|结束时间  (仅加密货币账户使用，格式：yyyy-MM-dd HH:mm:ss)

* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回交易业务账户资金流水列表格式</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 交易业务账户资金流水列表格式如下：
        字段|类型|说明
        :-|:-|:-
        cashflow_id|int|资金流ID
        clearing_date|str|清算日期
        settlement_date|str|交收日期
        currency|[Currency](./trade.md#3974)|币种
        cashflow_type|str|资金流类型
        cashflow_direction|[CashFlowDirection](./trade.md#7573)|资金流方向
        cashflow_amount|float|金额（正数表示流入，负数表示流出）
        cashflow_remark|str|备注
        create_time|str|创建日期  (仅加密货币账户返回，非加密货币账户此字段为空)


* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.get_acc_cash_flow(clearing_date='2025-02-18', trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, cashflow_direction=CashFlowDirection.NONE)
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果资金流水列表不为空
        print(data['cashflow_type'][0])  # 获取第一条流水的资金流类型
        print(data['cashflow_amount'].values.tolist())  # 转为 list
else:
    print('get_acc_cash_flow error: ', data)
trd_ctx.close()

```

* **Output**

```python
   cashflow_id     clearing_date     settlement_date     currency     cashflow_type     cashflow_direction     cashflow_amount     cashflow_remark
0  16308           2025-02-27        2025-02-28          HKD             其他                 N/A                   0.00      Opt ASS-P-JXC250227P13000-20250227
1  16357           2025-02-27        2025-03-03          HKD             其他                 OUT               -104000.00
2  16360           2025-02-27        2025-02-27          USD            基金赎回               IN                 23000.00     Fund Redemption#Taikang Kaitai US Dollar Money...
3  16384           2025-02-27        2025-02-27          HKD            基金赎回               IN                104108.96     Fund Redemption#Taikang Kaitai Hong Kong Dolla...
其他
[0.00, -104000.00, 23000.00, 104108.96]
```

---



---

# 下单

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`place_order(price, qty, code, trd_side, order_type=OrderType.NORMAL, adjust_limit=0, trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, remark=None, time_in_force=TimeInForce.DAY,  fill_outside_rth=False, aux_price=None, trail_type=None, trail_value=None, trail_spread=None, session=Session.NONE, jp_acc_type=SubAccType.JP_GENERAL, position_id=NONE)`

* **介绍**

    下单 
    :::tip 提示
    Python API 是同步的，但网络收发是异步的。当 place_order 对应的应答数据包与 [响应成交推送回调](../trade/update-order-fill.md) 或 [响应订单推送回调](../trade/update-order.md) 间隔很短时，就可能出现 place_order 的数据包先返回，但回调函数先被调用的情况。例如：可能先调用了 [响应订单推送回调](../trade/update-order.md)，然后 place_order 这个接口才返回。
    :::

* **参数**

    参数|类型|说明
    :-|:-|:-
    price|float|订单价格  (- 当订单是市价单或竞价单类型，仍需对 price 传参，price 可以传入任意值
  - 精度：
  - 期货：整数8位，小数9位，支持负数价格
  - 美股期权：小数2位
  - 美股：小于$1，允许小数4位；大于等于$1，允许小数2位
  - 其他：小数3位，超出部分四舍五入)
    qty|float|订单数量  (期权期货单位是"张")
    code|str|标的代码  (如果 code 为期货主连代码，则会自动转为实际对应的合约代码)
    trd_side|[TrdSide](./trade.md#5815)|交易方向
    order_type|[OrderType](./trade.md#4181)|订单类型
    adjust_limit|float|价格微调幅度  (OpenD 会对传入价格自动调整到合法价位上
  - 正数代表向上调整，负数代表向下调整
  - 例如：0.015 代表向上调整且幅度不超过 1.5%；-0.01 代表向下调整且幅度不超过 1%。默认 0 表示不调整)
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    remark|str|备注  (- 订单会带上此备注字段，方便您标识订单
  - 转成 utf8 后的长度上限为 64 字节)
    time_in_force|[TimeInForce](./trade.md#4241)|有效期限  (香港市场、A 股市场和环球期货的市价单，仅支持当日有效)
    fill_outside_rth|bool|是否允许盘前盘后(已弃用)  (该字段已废弃，建议使用 Session 交易时段下单用于港股盘前竞价与美股盘前盘后，且盘前盘后时段不支持市价单)
    aux_price|float|触发价格  (- 当订单是止损市价单、止损限价单、触及限价单（止盈）、触及市价单（止盈） 时，aux_price 为必传参数
  - 同price精度，超过部分四舍五入)
    trail_type|[TrailType](./trade.md#5644)|跟踪类型  (当订单是跟踪止损市价单、跟踪止损限价单时，trail_type 为必传参数)
    trail_value|float|跟踪金额/百分比  (- 当订单是跟踪止损市价单、跟踪止损限价单时，trail_value 为必传参数
  - 当跟踪类型为比例时，该字段为百分比字段，传入 20 实际对应 20%
  - 当跟踪类型为金额时，整数部分同price；小数部分美股期权固定2位，美股4位，其他同price；超过部分四舍五入
  - 当跟踪类型为比例时，精确到小数点后 2 位，整数部分同price，超过部分四舍五入)
    trail_spread|float|指定价差  (- 当订单是跟踪止损限价单时，trail_spread 为必传参数
  - 证券账户精确到小数点后 3 位，期货账户精确到小数点后 9 位，超过部分四舍五入)
    session|[Session](../quote/quote.md#9152)|美股交易时段  (仅对美股生效，支持传入RTH、ETH、OVERNIGHT、ALL)
    jp_acc_type|[SubAccType](./trade.md#6112)|日本账户类型  (仅日本券商适用)
    position_id|int|持仓ID  (- 日本券商平仓时需要填写
  - 可通过[查询持仓](./get-position-list.md)接口获取)


* **返回**
    
    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回订单列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 订单列表格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_side|[TrdSide](./trade.md#5815)|交易方向
        order_type|[OrderType](./trade.md#4181)|订单类型
        order_status|[OrderStatus](./trade.md#797)|订单状态
        order_id|str|订单号
        code|str|股票代码
        stock_name|str|股票名称
        qty|float|订单数量  (期权期货单位是"张")
        price|float|订单价格  (精确到小数点后 3 位，超出部分四舍五入)
        create_time|str|创建时间  (格式：yyyy-MM-dd HH:mm:ss
期货时区指定，请参见 [FutuOpenD 配置](../quick/opend-base.md#6724))
        updated_time|str|最后更新时间  (格式：yyyy-MM-dd HH:mm:ss
期货时区指定，请参见 [FutuOpenD 配置](../quick/opend-base.md#6724))
        dealt_qty|float|成交数量  (期权期货单位是"张")
        dealt_avg_price|float|成交均价  (无精度限制)
        last_err_msg|str|最后的错误描述  (如果有错误，会返回最后一次错误的原因如果无错误，返回空字符串)
        remark|str|下单时备注的标识  (详见 [place_order](./place-order.md) 接口参数中的 remark)
        time_in_force|[TimeInForce](./trade.md#4241)|有效期限
        fill_outside_rth|bool|是否允许盘前盘后（用于港股盘前竞价与美股盘前盘后）  (True：允许False：不允许)
        session|[Session](../quote/quote.md#9152)|交易订单时段（仅用于美股）
        aux_price|float|触发价格
        trail_type|[TrailType](./trade.md#5644)|跟踪类型
        trail_value|float|跟踪金额/百分比
        trail_spread|float|指定价差
        

* **Example**

```python
from futu import *
pwd_unlock = '123456'
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.unlock_trade(pwd_unlock)  # 若使用真实账户下单，需先对账户进行解锁。此处示例为模拟账户下单，也可省略解锁。
if ret == RET_OK:
    ret, data = trd_ctx.place_order(price=510.0, qty=100, code="HK.00700", trd_side=TrdSide.BUY, trd_env=TrdEnv.SIMULATE, session=Session.NONE)
    if ret == RET_OK:
        print(data)
        print(data['order_id'][0])  # 获取下单的订单号
        print(data['order_id'].values.tolist())  # 转为 list
    else:
        print('place_order error: ', data)
else:
    print('unlock_trade failed: ', data)
trd_ctx.close()
```

* **Output**

```python

       code stock_name trd_side order_type order_status           order_id    qty  price          create_time         updated_time  dealt_qty  dealt_avg_price last_err_msg remark time_in_force fill_outside_rth session aux_price trail_type trail_value trail_spread currency
0  HK.00700       腾讯控股      BUY     NORMAL   SUBMITTING  38196006548709500  100.0  420.0  2021-11-04 11:38:19  2021-11-04 11:38:19        0.0              0.0                               DAY              N/A       N/A    N/A      N/A         N/A          N/A      HKD
38196006548709500
['38196006548709500']
```

---



---

# 改单撤单

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`modify_order(modify_order_op, order_id, qty, price, adjust_limit=0, trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, aux_price=None, trail_type=None, trail_value=None, trail_spread=None)`

* **介绍**

    修改订单的价格和数量、撤单、操作订单的失效和生效、删除订单等。  
	如果是 A 股通市场，将不支持改单。可撤单。删除订单是 OpenD 本地操作。

* **参数**
    参数|类型|说明
    :-|:-|:-
    modify_order_op|[ModifyOrderOp](./trade.md#2969)|改单操作类型
    order_id|str|订单号
    qty|float|订单改单后的数量  (期权和期货单位是“张”精确到小数点后 0 位，超出部分会被舍弃)
    price|float|订单改单后的价格  (证券账户精确到小数点后 3 位，超出部分会被舍弃期货账户精确到小数点后 9 位，超出部分会被舍弃)
    adjust_limit|float|价格微调幅度  (OpenD 会对传入价格自动调整到合法价位上（期货忽略此参数）
  - 正数代表向上调整，负数代表向下调整
  - 例如：0.015 代表向上调整且幅度不超过 1.5%；-0.01 代表向下调整且幅度不超过 1%。默认 0 表示不调整)
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    aux_price|float|触发价格  (- 当订单是止损市价单、止损限价单、触及限价单（止盈）、触及市价单（止盈） 时，aux_price 为必传参数
  - 证券账户精确到小数点后 3 位，期货账户精确到小数点后 9 位，超过部分四舍五入)
    trail_type|[TrailType](./trade.md#5644)|跟踪类型  (当订单是跟踪止损市价单、跟踪止损限价单时，trail_type 为必传参数)
    trail_value|float|跟踪金额/百分比  (- 当订单是跟踪止损市价单、跟踪止损限价单时，trail_value 为必传参数
  - 当跟踪类型为比例时，该字段为百分比字段，传入 20 实际对应 20%
  - 当跟踪类型为金额时，证券账户精确到小数点后 3 位，期货账户精确到小数点后 9 位，超过部分四舍五入
  - 当跟踪类型为比例时，精确到小数点后 2 位，超过部分四舍五入)
    trail_spread|float|指定价差  (- 当订单是跟踪止损限价单时，trail_spread 为必传参数
  - 证券账户精确到小数点后 3 位，期货账户精确到小数点后 9 位，超过部分四舍五入)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回改单信息</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 改单信息格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_env|[TrdEnv](./trade.md#6374)|交易环境
        order_id|str|订单号

* **Example**

```python
from futu import *
pwd_unlock = '123456'
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.unlock_trade(pwd_unlock)  # 若使用真实账户改单/撤单，需先对账户进行解锁。此处示例为模拟账户撤单，也可省略解锁。
if ret == RET_OK:
    order_id = "8851102695472794941"
    ret, data = trd_ctx.modify_order(ModifyOrderOp.CANCEL, order_id, 0, 0)
    if ret == RET_OK:
        print(data)
        print(data['order_id'][0])  # 获取改单的订单号
        print(data['order_id'].values.tolist())  # 转为 list
    else:
        print('modify_order error: ', data)
else:
    print('unlock_trade failed: ', data)
trd_ctx.close()
```

* **Output**

```python
    trd_env             order_id
0    REAL      8851102695472794941
8851102695472794941
['8851102695472794941']
```


`cancel_all_order(trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, trdmarket=TrdMarket.NONE)`

* **介绍**

    撤消全部订单。模拟交易以及 A 股通账户暂不支持全部撤单。

* **参数**
    参数|类型|说明
    :-|:-|:-
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (当 acc_id 传 0 时， 以 acc_index 指定的账户为准当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    trdmarket|[TrdMarket](./trade.html#719)|指定交易市场  (撤销指定账户指定市场的订单默认状态时，撤销指定账户全部市场的订单)


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td>str</td>
            <td>接口调用结果。ret == RET_OK 代表接口调用正常，ret != RET_OK 代表接口调用失败</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td rowspan="2">str</td>
            <td>当 ret == RET_OK，返回"success"</td>
        </tr>
        <tr>
            <td>当 ret != RET_OK，返回错误描述</td>
        </tr>
    </table>

    * 全部撤单信息格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_env|[TrdEnv](./trade.md#6374)|交易环境
        order_id|str|订单号

* **Example**

```python
from futu import *
pwd_unlock = '123456'
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.unlock_trade(pwd_unlock)  # 若使用真实账户改单/撤单，需先对账户进行解锁。此处示例为模拟账户全部撤单，也可省略解锁。
if ret == RET_OK:
    ret, data = trd_ctx.cancel_all_order()
    if ret == RET_OK:
        print(data)
    else:
        print('cancel_all_order error: ', data)
else:
    print('unlock_trade failed: ', data)
trd_ctx.close()
```

* **Output**

```python
success
```

---



---

# 查询未完成订单

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`order_list_query(order_id="", order_market=TrdMarket.NONE, status_filter_list=[], code='', start='', end='', trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, refresh_cache=False)`

* **介绍**

    查询指定交易业务账户的未完成订单列表（包含未成交订单、24h内已成交或已撤订单）

* **参数**
    参数|类型|说明
    :-|:-|:-
    order_id|str|订单号过滤  (- 返回指定订单号的数据
  - 默认状态时，返回所有数据)
    order_market|[TrdMarket](./trade.md#719)|订单标的所属市场过滤 (- 订单标的市场过滤，会返回该市场下的标的订单
  - 默认值为NONE，会返回账户下所有市场的订单数据)
    status_filter_list|list|订单状态过滤  (- 返回指定状态的订单数据
  - 默认状态时，返回所有数据
  - list 中元素类型是 [OrderStatus](./trade.md#797))
    code|str|代码过滤  (- 返回指定代码的数据
  - 默认状态时，返回所有数据)
    start|str|开始时间  (- 严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
  - 期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
    end|str|结束时间  (- 严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
  - 期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    refresh_cache|bool|是否刷新缓存  (- True：立即向富途服务器重新请求数据，不使用 OpenD 的缓存，此时会受到接口限频的限制
  - False：使用 OpenD 的缓存（特殊情况导致缓存没有及时更新才需要刷新）)
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回订单列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 订单列表格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_side|[TrdSide](./trade.md#5815)|交易方向
        order_type|[OrderType](./trade.md#4181)|订单类型
        order_status|[OrderStatus](./trade.md#797)|订单状态
        order_id|str|订单号
        code|str|股票代码
        stock_name|str|股票名称
        order_market|[TrdMarket](./trade.md#719)|订单标的所属市场
        qty|float|订单数量  (期权期货单位是"张")
        price|float|订单价格  (精确到小数点后 3 位，超出部分四舍五入)
        currency|[Currency](./trade.md#8019)|交易货币
        create_time|str|创建时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        updated_time|str|最后更新时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        dealt_qty|float|成交数量  (期权期货单位是"张")
        dealt_avg_price|float|成交均价  (无精度限制)
        last_err_msg|str|最后的错误描述  (如果有错误，会返回最后一次错误的原因如果无错误，返回空字符串)
        remark|str|下单时备注的标识  (详见 [place_order](./place-order.md) 接口参数中的 remark)
        time_in_force|[TimeInForce](./trade.md#4241)|有效期限
        fill_outside_rth|bool|是否允许盘前盘后（用于港股盘前竞价与美股盘前盘后）  (True：允许False：不允许)
        session|[Session](../quote/quote.md#9152)|交易订单时段（仅用于美股）
        aux_price|float|触发价格
        trail_type|[TrailType](./trade.md#5644)|跟踪类型
        trail_value|float|跟踪金额/百分比
        trail_spread|float|指定价差
        jp_acc_type|[SubAccType](./trade.md#6112)|日本账户类型  (仅对日本券商生效)

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.order_list_query()
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果订单列表不为空
        print(data['order_id'][0])  # 获取未完成订单的第一个订单号
        print(data['order_id'].values.tolist())  # 转为 list
else:
    print('order_list_query error: ', data)
trd_ctx.close()
```

* **Output**

```python
        code stock_name  order_market   trd_side           order_type   order_status             order_id    qty  price              create_time             updated_time  dealt_qty  dealt_avg_price last_err_msg      remark time_in_force fill_outside_rth session aux_price trail_type trail_value trail_spread currency jp_acc_type
0   HK.00700        HK         BUY           NORMAL  CANCELLED_ALL  6644468615272262086  100.0  520.0  2021-09-06 10:17:52.465  2021-09-07 16:10:22.806        0.0              0.0               asdfg+=@@@           GTC        N/A      N/A       560        N/A         N/A          N/A      HKD        N/A
6644468615272262086
['6644468615272262086']
```

---



---

# 查询历史订单

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`history_order_list_query(status_filter_list=[], code='', order_market=TrdMarket.NONE, start='', end='', trd_env=TrdEnv.REAL, acc_id=0, acc_index=0)`

* **介绍**

    查询指定交易业务账户的历史订单列表

* **参数**
    参数|类型|说明
    :-|:-|:-
    status_filter_list|list|订单状态过滤  (- 返回指定状态的订单数据
  - 默认状态时，返回所有数据
  - list 中元素类型是 [OrderStatus](./trade.md#797))
    code|str|代码过滤  (- 返回指定代码的数据
  - 默认状态时，返回所有数据)
    order_market|[TrdMarket](./trade.md#719)|订单标的所属市场过滤 (- 订单标的市场过滤，会返回该市场下的标的订单
  - 默认值为NONE，会返回账户下所有市场的订单数据)
    start|str|开始时间  (- 严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
  - 期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
    end|str|结束时间  (- 严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
  - 期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)

    * start 和 end 的组合如下
        Start 类型|End 类型|说明
        :-|:-|:-
        str|str|start 和 end 分别为指定的日期
        None|str|start 为 end 往前 90 天
        str|None|end 为 start 往后 90 天
        None|None|start 为往前 90 天，end 当前日期

* **返回**
    
    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回订单列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 订单列表格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_side|[TrdSide](./trade.md#5815)|交易方向
        order_type|[OrderType](./trade.md#4181)|订单类型
        order_status|[OrderStatus](./trade.md#797)|订单状态
        order_id|str|订单号
        code|str|股票代码
        stock_name|str|股票名称
        order_market|[TrdMarket](./trade.md#719)|订单标的所属市场
        qty|float|订单数量  (期权期货单位是"张")
        price|float|订单价格  (精确到小数点后 3 位，超出部分四舍五入)
        currency|[Currency](./trade.md#8019)|交易货币
        create_time|str|创建时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        updated_time|str|最后更新时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        dealt_qty|float|成交数量  (期权期货单位是"张")
        dealt_avg_price|float|成交均价  (无精度限制)
        last_err_msg|str|最后的错误描述  (如果有错误，会返回最后一次错误的原因如果无错误，返回空字符串)
        remark|str|下单时备注的标识  (详见 [place_order](./place-order.md) 接口参数中的 remark)
        time_in_force|[TimeInForce](./trade.md#4241)|有效期限
        fill_outside_rth|bool|是否允许盘前盘后（用于港股盘前竞价与美股盘前盘后）  (True：允许False：不允许)
        session|[Session](../quote/quote.md#9152)|交易订单时段（仅用于美股）
        aux_price|float|触发价格
        trail_type|[TrailType](./trade.md#5644)|跟踪类型
        trail_value|float|跟踪金额/百分比
        trail_spread|float|指定价差
        jp_acc_type|[SubAccType](./trade.md#6112)|日本账户类型  (仅对日本券商生效)

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.US, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUINC)
ret, data = trd_ctx.history_order_list_query()
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果订单列表不为空
        print(data['order_id'][0])  # 获取持仓第一个订单号
        print(data['order_id'].values.tolist())  # 转为 list
else:
    print('history_order_list_query error: ', data)
trd_ctx.close()
```

* **Output**

```python
        code stock_name order_market    trd_side           order_type   order_status             order_id    qty  price              create_time             updated_time  dealt_qty  dealt_avg_price last_err_msg      remark time_in_force fill_outside_rth session aux_price trail_type trail_value trail_spread currency jp_acc_type
0   US.AAPL        US          BUY           NORMAL  CANCELLED_ALL  6644468615272262086  100.0  520.0  2021-09-06 10:17:52.465  2021-09-07 16:10:22.806        0.0              0.0               asdfg+=@@@           GTC      N/A        N/A       560        N/A         N/A          N/A      USD        N/A
6644468615272262086
['6644468615272262086']
```

---



---

# 响应订单推送回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    响应订单推送，异步处理 OpenD 推送过来的订单状态信息。  
    在收到 OpenD 推送过来的订单状态信息后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。

* **参数**
    
    参数|类型|说明
    :-|:-|:-
    rsp_pb|Trd_UpdateOrder_pb2.Response|派生类中不需要直接处理该参数

* **返回**
    
    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回订单列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 订单列表格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_side|[TrdSide](./trade.md#5815)|交易方向
        order_type|[OrderType](./trade.md#4181)|订单类型
        order_status|[OrderStatus](./trade.md#797)|订单状态
        order_id|str|订单号
        code|str|股票代码
        stock_name|str|股票名称
        qty|float|订单数量  (期权期货单位是"张")
        price|float|订单价格  (精确到小数点后 3 位，超出部分四舍五入)
        currency|[Currency](./trade.md#8019)|交易货币
        create_time|str|创建时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        updated_time|str|最后更新时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        dealt_qty|float|成交数量  (期权期货单位是"张")
        dealt_avg_price|float|成交均价  (无精度限制)
        last_err_msg|str|最后的错误描述  (如果有错误，会返回最后一次错误的原因如果无错误，返回空字符串)
        remark|str|下单时备注的标识  (详见 [place_order](./place-order.md) 接口参数中的 remark)
        time_in_force|[TimeInForce](./trade.md#4241)|有效期限
        fill_outside_rth|bool|是否允许盘前盘后（仅用于美股）  (True：允许False：不允许)
        session|[Session](../quote/quote.md#9152)|交易订单时段（仅用于美股）
        aux_price|float|触发价格
        trail_type|[TrailType](./trade.md#5644)|跟踪类型
        trail_value|float|跟踪金额/百分比
        trail_spread|float|指定价差

* **Example**

```python
from futu import *
from time import sleep
class TradeOrderTest(TradeOrderHandlerBase):
    """ order update push"""
    def on_recv_rsp(self, rsp_pb):
        ret, content = super(TradeOrderTest, self).on_recv_rsp(rsp_pb)
        if ret == RET_OK:
            print("* TradeOrderTest content={}\n".format(content))
        return ret, content

trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
trd_ctx.set_handler(TradeOrderTest())
print(trd_ctx.place_order(price=518.0, qty=100, code="HK.00700", trd_side=TrdSide.SELL))

sleep(15)
trd_ctx.close()
```

* **Output**

```python
* TradeOrderTest content=  trd_env      code stock_name  dealt_avg_price  dealt_qty    qty           order_id order_type  price order_status          create_time         updated_time trd_side last_err_msg trd_market remark time_in_force fill_outside_rth session aux_price trail_type trail_value trail_spread currency
0    REAL  HK.00700       腾讯控股              0.0        0.0  100.0  72625263708670783     NORMAL  518.0   SUBMITTING  2021-11-04 11:26:27  2021-11-04 11:26:27      BUY                      HK                  DAY      N/A        N/A       N/A        N/A         N/A          N/A      HKD
```

---



---

# 查询订单费用

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`order_fee_query(order_id_list=[], acc_id=0, acc_index=0, trd_env=TrdEnv.REAL)`

* **介绍**

    查询指定订单的收费明细（最低版本要求：8.2.4218）

* **参数**
    参数|类型|说明
    :-|:-|:-
    order_id_list|list|订单号列表 (- 每次请求最多查询 400 笔订单
  - list 内元素类型为 str)
    trd_env|[TrdEnv](./trade.md#6374)|交易环境
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回订单费用列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 订单列表格式如下：
        字段|类型|说明
        :-|:-|:-
        order_id|str|订单号
        fee_amount|float|总费用
        fee_details|list|收费明细 (- 格式：[('收费项1', 收费项1的金额), ('收费项2', 收费项2的金额), ('收费项3', 收费项3的金额)……]
  - 常见的收费项包括：佣金、平台使用费、期权监管费、期权清算费、期权交收费、交收费、证监会规费、交易活动费)

        
* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.US, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret1, data1 = trd_ctx.history_order_list_query(status_filter_list=[OrderStatus.FILLED_ALL])
if ret1 == RET_OK:
    if data1.shape[0] > 0:  # 如果订单列表不为空
        ret2, data2 = trd_ctx.order_fee_query(data1['order_id'].values.tolist())  # 将订单 id 转为 list，查询订单费用
        if ret2 == RET_OK:
            print(data2)
            print(data2['fee_details'][0])  # 打印第一笔订单的收费明细
        else:
            print('order_fee_query error: ', data2)
else:
    print('order_list_query error: ', data1)
trd_ctx.close()
```

* **Output**

```python
                                            order_id  fee_amount                                        fee_details
0  v3_20240314_12345678_MTc4NzA5NzY5OTA3ODAzMzMwN       10.46  [(佣金, 5.85), (平台使用费, 2.7), (期权监管费, 0.11), (期权清...
1  v3_20240318_12345678_MTM5Nzc5MDYxNDY1NDM1MDI1M        2.25  [(佣金, 0.99), (平台使用费, 1.0), (交收费, 0.15), (证监会规费...
[('佣金', 5.85), ('平台使用费', 2.7), ('期权监管费', 0.11), ('期权清算费', 0.18), ('期权交收费', 1.62)]
```

---



---

# 订阅交易推送

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>
    Python 不需要订阅交易推送

---



---

# 查询当日成交

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`deal_list_query(code="", deal_market= TrdMarket.NONE, trd_env=TrdEnv.REAL, acc_id=0, acc_index=0, refresh_cache=False)`

* **介绍**
    
	查询指定交易业务账户的当日成交列表。  
    该接口只支持实盘交易，不支持模拟交易。

* **参数**
    参数|类型|说明
    :-|:-|:-
    code|str|代码过滤  (只返回此代码对应的成交数据不传则返回所有)
    deal_market|[TrdMarket](./trade.md#719)|成交标的所属市场过滤  (- 成交标的市场过滤，会返回该市场下的成交数据
  - 默认值为NONE，会返回账户下所有市场的成交数据)
    trd_env|[TrdEnv](./trade.md#6374)|交易环境  (仅支持 TrdEnv.REAL（真实环境），模拟环境暂不支持查询成交数据)
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    refresh_cache|bool|是否刷新缓存  (- True：立即向富途服务器重新请求数据，不使用 OpenD 的缓存，此时会受到接口限频的限制
  - False：使用 OpenD 的缓存（特殊情况导致缓存没有及时更新才需要刷新）)
    


* **返回**

    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回交易成交列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 交易成交列表格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_side|[TrdSide](./trade.md#5815)|交易方向
        deal_id|str|成交号
        order_id|str|订单号
        code|str|股票代码
        stock_name|str|股票名称
        deal_market|[TrdMarket](./trade.md#719)|成交标的所属市场
        qty|float|成交数量  (期权期货单位是"张")
        price|float|成交价格  (精确到小数点后 3 位，超出部分四舍五入)
        create_time|str|创建时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        counter_broker_id|int|对手经纪号  (仅港股有效)
        counter_broker_name|str|对手经纪名称  (仅港股有效)
        status|[DealStatus](./trade.md#8317)|成交状态
        jp_acc_type|[SubAccType](./trade.md#6112)|日本账户类型  (仅对日本券商生效)

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.deal_list_query()
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果成交列表不为空
        print(data['order_id'][0])  # 获取当日成交的第一个订单号
        print(data['order_id'].values.tolist())  # 转为 list
else:
    print('deal_list_query error: ', data)
trd_ctx.close()
```

* **Output**

```python
    code stock_name     deal_market         deal_id             order_id        qty  price    trd_side     create_time      counter_broker_id counter_broker_name status jp_acc_type
0  HK.00388      香港交易所     HK    5056208452274069375  4665291631090960915  100.0  370.0      BUY  2020-09-17 21:15:59.979           5         OK       N/A
4665291631090960915
['4665291631090960915']
```

---



---

# 查询历史成交

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">
<template v-slot:py>


`history_deal_list_query(code='', deal_market=TrdMarket.NONE, start='', end='', trd_env=TrdEnv.REAL, acc_id=0, acc_index=0)`

* **介绍**

    查询指定交易业务账户的历史成交列表。  
    该接口只支持实盘交易，不支持模拟交易。

* **参数**

    参数|类型|说明
    :-|:-|:-
    code|str|代码过滤  (只返回此代码对应的成交数据不传则返回所有)
    deal_market|[TrdMarket](./trade.md#719)|成交标的所属市场过滤  (- 成交标的市场过滤，会返回该市场下的成交数据
  - 默认值为NONE，会返回账户下所有市场的成交数据)
    start|str|开始时间  (- 严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
  - 期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
    end|str|结束时间  (- 严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
  - 期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
    trd_env|[TrdEnv](./trade.md#6374)|交易环境  (仅支持 TrdEnv.REAL（真实环境），模拟环境暂不支持查询成交数据)
    acc_id|int|交易业务账户 ID  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。
  - 当 acc_id 传 0 时， 以 acc_index 指定的账户为准
  - 当 acc_id 传 ID 号时（不为 0 ），以 acc_id 指定的账户为准)
    acc_index|int|交易业务账户列表中的账户序号  (- acc_id 和 acc_index 都可用于指定交易业务账户，二选一即可，推荐使用 acc_id。acc_index 会在新开立/注销账户时发生变动，导致您指定的账户与实际交易账户不一致。
  - acc_index 默认为 0，表示指定第 1 个交易业务账户)
    
    * start 和 end 的组合如下
        Start 类型|End 类型|说明
        :-|:-|:-
        str|str|start 和 end 分别为指定的日期
        None|str|start 为 end 往前 90 天
        str|None|end 为 start 往后 90 天
        None|None|start 为往前 90 天，end 当前日期

* **返回**
    
    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回交易成交列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 交易成交列表格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_side|[TrdSide](./trade.md#5815)|交易方向
        deal_id|str|成交号
        order_id|str|订单号
        code|str|股票代码
        stock_name|str|股票名称
        deal_market|[TrdMarket](./trade.md#719)|成交标的所属市场
        qty|float|成交数量  (期权期货单位是"张")
        price|float|成交价格  (精确到小数点后 3 位，超过部分四舍五入)
        create_time|str|创建时间  (期货时区指定，请参见 [OpenD 配置](../quick/opend-base.md#6724))
        counter_broker_id|int|对手经纪号  (仅港股有效)
        counter_broker_name|str|对手经纪名称  (仅港股有效)
        status|[DealStatus](./trade.md#8317)|成交状态
        jp_acc_type|[SubAccType](./trade.md#6112)|日本账户类型  (仅对日本券商生效)

* **Example**

```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.history_deal_list_query()
if ret == RET_OK:
    print(data)
    if data.shape[0] > 0:  # 如果成交列表不为空
        print(data['deal_id'][0])  # 获取历史成交的第一个成交号
        print(data['deal_id'].values.tolist())  # 转为 list
else:
    print('history_deal_list_query error: ', data)
trd_ctx.close()
```

* **Output**

```python
    code stock_name     deal_market         deal_id             order_id    qty  price trd_side              create_time  counter_broker_id counter_broker_name status jp_acc_type
0  HK.00388      香港交易所    HK  5056208452274069375  4665291631090960915  100.0  370.0      BUY  2020-09-17 21:15:59.979                  5                         OK        N/A
5056208452274069375
['5056208452274069375']
```

---



---

# 响应成交推送回调

<FtSwitcher :languages="{py:'Python', pb:'Proto', cs:'C#', java:'Java', cpp:'C++', js:'JavaScript'}">

<template v-slot:py>


`on_recv_rsp(self, rsp_pb)`

* **介绍**

    响应成交推送，异步处理 OpenD 推送过来的成交状态信息。  
    在收到 OpenD 推送过来的成交状态信息后会回调到该函数，您需要在派生类中覆盖 on_recv_rsp。  
    该接口只支持实盘交易，不支持模拟交易。
 
* **参数**
    
    参数|类型|说明
    :-|:-|:-
    rsp_pb|Trd_UpdateOrderFill_pb2.Response|派生类中不需要直接处理该参数

* **返回**
    
    <table>
        <tr>
            <th>参数</th>
            <th>类型</th>
            <th>说明</th>
        </tr>
        <tr>
            <td>ret</td>
            <td><a href="../ftapi/common.html#7467"> RET_CODE</a></td>
            <td>接口调用结果</td>
        </tr>
        <tr>
            <td rowspan="2">data</td>
            <td>pd.DataFrame</td>
            <td>当 ret == RET_OK 时，返回交易成交列表</td>
        </tr>
        <tr>
            <td>str</td>
            <td>当 ret != RET_OK 时，返回错误描述</td>
        </tr>
    </table>

    * 交易成交列表格式如下：
        字段|类型|说明
        :-|:-|:-
        trd_side|[TrdSide](./trade.md#5815)|交易方向
        deal_id|str|成交号
        order_id|str|订单号
        code|str|股票代码
        stock_name|str|股票名称
        qty|float|成交数量  (期权期货单位是"张")
        price|float|成交价格
        create_time|str|创建时间  (期货时区指定，请参见 [FutuOpenD 配置](../quick/opend-base.md#6724))
        counter_broker_id|int|对手经纪号  (仅港股有效)
        counter_broker_name|str|对手经纪名称  (仅港股有效)
        status|[DealStatus](./trade.md#8317)|成交状态

* **Example**

```python
from futu import *
from time import sleep
class TradeDealTest(TradeDealHandlerBase):
    """ order update push"""
    def on_recv_rsp(self, rsp_pb):
        ret, content = super(TradeDealTest, self).on_recv_rsp(rsp_pb)
        if ret == RET_OK:
            print("TradeDealTest content={}".format(content))
        return ret, content

trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
trd_ctx.set_handler(TradeDealTest())
print(trd_ctx.place_order(price=595.0, qty=100, code="HK.00700", trd_side=TrdSide.BUY))

sleep(15)
trd_ctx.close()
```

* **Output**

```python
TradeDealTest content=  trd_env      code stock_name              deal_id             order_id    qty  price trd_side              create_time  counter_broker_id counter_broker_name trd_market status
0    REAL  HK.00700       腾讯控股  2511067564122483295  8561504228375901919  100.0  518.0      BUY  2021-11-04 11:29:41.595                  5                   5         HK     OK
```

---



---

# 交易定义

## 账户风控状态

**CltRiskLevel**

```protobuf
enum CltRiskLevel
{
    CltRiskLevel_Unknown = -1;        // 未知
    CltRiskLevel_Safe = 0;          // 安全
    CltRiskLevel_Warning = 1;       // 预警
    CltRiskLevel_Danger = 2;        // 危险
    CltRiskLevel_AbsoluteSafe = 3;  // 绝对安全
    CltRiskLevel_OptDanger = 4;     // 危险（期权相关）
}
```

## 货币类型

**Currency**

```protobuf
enum Currency
{
    Currency_Unknown = 0;  //未知货币
    Currency_HKD = 1;   // 港元
    Currency_USD = 2;   // 美元
    Currency_CNH = 3;   // 离岸人民币
    Currency_JPY = 4;   // 日元
    Currency_SGD = 5;   // 新元
	  Currency_AUD = 6;   // 澳元
    Currency_CAD = 7; // 加拿大元
    Currency_MYR = 8; // 马来西亚林吉特
}
```

## 跟踪类型

```protobuf
enum TrailType
{
	TrailType_Unknown = 0; //未知类型
	TrailType_Ratio = 1; //比例
	TrailType_Amount = 2; //金额
}
```

## 修改订单操作

**ModifyOrderOp**

```protobuf
enum ModifyOrderOp
{
    //港股支持全部操作，美股目前仅支持 ModifyOrderOp_Normal 和 ModifyOrderOp_Cancel
    ModifyOrderOp_Unknown = 0; //未知操作
    ModifyOrderOp_Normal = 1; //修改订单的价格、数量，即以前的改单
    ModifyOrderOp_Cancel = 2; //撤单。未成交订单将直接从交易所撮合队列中撤销。
    ModifyOrderOp_Disable = 3; //使失效。对交易所来说，「失效」的效果等同于 「撤单」。订单「失效」后，未成交订单将直接从交易所撮合队列中撤出，但订单信息（如价格和数量）会继续保留在富途服务器，您随时可以重新使它生效。
    ModifyOrderOp_Enable = 4; //使生效。对交易所来说，「生效」等同于下一笔新订单。订单重新「生效」后，将按照原来的价格数量重新提交到交易所，并按照价格优先、时间优先顺序重新排队。
    ModifyOrderOp_Delete = 5; //删除。指对已撤单/下单失败的订单进行隐藏操作。
}
```

## 成交状态

**OrderFillStatus**

```protobuf
enum OrderFillStatus
{
    OrderFillStatus_OK = 0; //正常
    OrderFillStatus_Cancelled = 1; //成交被取消
    OrderFillStatus_Changed = 2; //成交被更改
}
```

## 订单状态

**OrderStatus**

```protobuf
enum OrderStatus
{
    OrderStatus_Unknown = -1; //未知状态
    OrderStatus_WaitingSubmit = 1; //待提交
    OrderStatus_Submitting = 2; //提交中
    OrderStatus_Submitted = 5; //已提交，等待成交
    OrderStatus_Filled_Part = 10; //部分成交
    OrderStatus_Filled_All = 11; //全部已成
    OrderStatus_Cancelled_Part = 14; //部分成交，剩余部分已撤单
    OrderStatus_Cancelled_All = 15; //全部已撤单，无成交
    OrderStatus_Failed = 21; //下单失败，服务拒绝
    OrderStatus_Disabled = 22; //已失效
    OrderStatus_Deleted = 23; //已删除，无成交的订单才能删除
    OrderStatus_FillCancelled = 24; //成交被撤销（一般遇不到，意思是已经成交的订单被回滚撤销，成交无效变为废单）
};
```

## 订单类型

:::tip 提示
* [实盘交易中，各个品类支持的订单类型](../qa/trade.md#2731)
* 模拟交易中，仅支持限价单(NORMAL)和市价单(MARKET)。
:::

**OrderType**

```protobuf
enum OrderType
{
    OrderType_Unknown = 0; //未知类型
    OrderType_Normal = 1; //限价单
    OrderType_Market = 2; //市价单
    OrderType_AbsoluteLimit = 5; //绝对限价订单（仅港股），只有价格完全匹配才成交，否则下单失败。举例：下一笔价格为 5 元的绝对限价买单，卖方的价格必须也是5元才能成交，卖方即使低于 5 元也不能成交，下单失败。卖出同理
    OrderType_Auction = 6; //竞价订单（仅港股），仅港股早盘竞价和收盘竞价有效
    OrderType_AuctionLimit = 7; //竞价限价订单（仅港股），仅早盘竞价和收盘竞价有效，参与竞价，且要求满足指定价格才会成交
    OrderType_SpecialLimit = 8; //特别限价订单（仅港股），成交规则同增强限价订单，且部分成交后，交易所自动撤销订单
    OrderType_SpecialLimit_All = 9; //特别限价且要求全部成交订单（仅港股）。全部成交，否则自动撤单
    OrderType_Stop = 10; // 止损市价单
    OrderType_StopLimit = 11; // 止损限价单
    OrderType_MarketifTouched = 12; // 触及市价单（止盈）
    OrderType_LimitifTouched = 13; // 触及限价单（止盈）
    OrderType_TrailingStop = 14; // 跟踪止损市价单
    OrderType_TrailingStopLimit = 15; // 跟踪止损限价单
    OrderType_TWAP  = 16; // 时间加权市价算法单（仅美股）
    OrderType_TWAP_LIMIT = 17; // 时间加权限价算法单 （港股和美股）
    OrderType_VWAP  = 18; // 成交量加权市价算法单（仅美股）
    OrderType_VWAP_LIMIT  = 19; // 成交量加权限价算法单（港股和美股）
}
```

## 持仓方向

**PositionSide**

```protobuf
enum PositionSide
{
    PositionSide_Long = 0; //多仓，默认情况是多仓
    PositionSide_Unknown = -1; //未知方向
    PositionSide_Short = 1; //空仓
};
```

## 账户类型

**TrdAccType**

```protobuf
enum TrdAccType
{
    TrdAccType_Unknown = 0; //未知类型
    TrdAccType_Cash = 1;    //现金账户
    TrdAccType_Margin = 2;  //保证金账户
    TrdAccType_TFSA = 3;    //加拿大免税账户
    TrdAccType_RRSP = 4;    //加拿大注册退休账户
    TrdAccType_SRRSP = 5;    //加拿大配偶退休账户
    TrdAccType_Derivatives = 6;    //日本衍生品账户
};
```

## 交易环境

**TrdEnv**

```protobuf
enum TrdEnv
{
    TrdEnv_Simulate = 0; //模拟环境
    TrdEnv_Real = 1; //真实环境
}
```

## 交易市场

**TrdMarket**

```protobuf
enum TrdMarket
{
    TrdMarket_Unknown = 0; //未知市场
    TrdMarket_HK = 1; //香港市场（证券、期权）
    TrdMarket_US = 2; //美国市场（证券、期权）
    TrdMarket_CN = 3; //A 股市场（仅用于模拟交易）
    TrdMarket_HKCC = 4; //A 股通市场（股票）
    TrdMarket_Futures = 5; //期货市场（环球期货）
    TrdMarket_SG = 6; //新加坡市场
    TrdMarket_Crypto = 7; //加密货币市场
    TrdMarket_AU = 8; //澳洲市场
    TrdMarket_Futures_Simulate_HK = 10; //香港期货模拟市场
    TrdMarket_Futures_Simulate_US = 11; //美国期货模拟市场
    TrdMarket_Futures_Simulate_SG = 12; //新加坡期货模拟市场
    TrdMarket_Futures_Simulate_JP = 13; //日本期货模拟市场
    TrdMarket_JP = 15; //日本市场
    TrdMarket_MY = 111; //马来西亚市场
    TrdMarket_CA = 112; //加拿大市场
    TrdMarket_HK_Fund = 113; //香港基金市场
    TrdMarket_US_Fund = 123; //美国基金市场
}
```


## 账户状态

**TrdAccStatus**

```protobuf
enum TrdAccStatus
{
    TrdAccStatus_Active = 0; //生效账户
    TrdAccStatus_Disabled = 1; //失效账户
}
```


## 账户结构

**TrdAccRole**

```protobuf
enum TrdAccRole
{
    TrdAccRole_Unknown = 0; //未知
    TrdAccRole_Normal = 1; //普通账户
    TrdAccRole_Master = 2; //主账户
    TrdAccRole_IPO = 3; //马来西亚IPO账户
}
```


## 交易证券市场

**TrdSecMarket**

```protobuf
enum TrdSecMarket
{
    TrdSecMarket_Unknown = 0; //未知市场
    TrdSecMarket_HK = 1; //香港市场（股票、窝轮、牛熊、期权、期货等）
    TrdSecMarket_US = 2; //美国市场（股票、期权、期货等）
    TrdSecMarket_CN_SH = 31; //沪股市场（股票）
    TrdSecMarket_CN_SZ = 32; //深股市场（股票）
    TrdSecMarket_SG = 41;  //新加坡市场（期货）  
    TrdSecMarket_JP = 51;  //日本市场（期货）  
    TrdSecMarket_AU = 61; // 澳大利亚  
    TrdSecMarket_MY = 71; // 马来西亚  
    TrdSecMarket_CA = 81; // 加拿大  
    TrdSecMarket_FX = 91; // 外汇  
}
```

## 交易方向

**TrdSide**

```protobuf
enum TrdSide
{
    //客户端下单只传 Buy 或 Sell 即可，SellShort 是美股订单时服务器返回有此方向，BuyBack 目前不存在，但也不排除服务器会传
    TrdSide_Unknown = 0; //未知方向
    TrdSide_Buy = 1; //买入
    TrdSide_Sell = 2; //卖出
    TrdSide_SellShort = 3; //卖空
    TrdSide_BuyBack = 4; //买回
}
```

:::tip 提示
**下单** 接口的交易方向 ，建议仅使用 `买入` 和 `卖出` 两个方向作为入参。  
`卖空` 和 `买回` 仅适用于日本券商，其他券商仅用于 **查询今日订单** ，**查询历史订单** ，**响应订单推送回调** ，**查询当日成交** ，**查询历史成交** ，**响应成交推送回调** 接口的返回字段展示。
:::

## 订单有效期

**TimeInForce**

```protobuf
enum TimeInForce
{
    TimeInForce_DAY = 0;       // 当日有效
    TimeInForce_GTC = 1;       // 撤单前有效，最多持续90自然日。
    TimeInForce_IOC = 2;       // 立即成交或取消（仅适用于加密货币市价单）
}
```

## 账户所属券商

**SecurityFirm**

```protobuf
enum SecurityFirm
{
    SecurityFirm_Unknown = 0;        //未知
    SecurityFirm_FutuSecurities = 1; //富途证券（香港）
    SecurityFirm_FutuInc = 2;        //moomoo证券(美国)
    SecurityFirm_FutuSG = 3;        //moomoo证券(新加坡)
    SecurityFirm_FutuAU = 4;         //moomoo证券(澳大利亚)
    SecurityFirm_FutuCA = 5;         //富途证券（加拿大）
    SecurityFirm_FutuMY = 6;         //富途证券（马来西亚）
    SecurityFirm_FutuJP = 7;         //富途证券（日本）
}
```

## 模拟交易账户类型

**SimAccType**

```protobuf
enum SimAccType
{
    SimAccType_Unknown = 0;		//未知
    SimAccType_Stock = 1;		//股票模拟账户（仅用于交易证券类产品，不支持交易期权）
    SimAccType_Option = 2;      //期权模拟账户（仅用于交易期权，不支持交易股票证券类产品）
    SimAccType_Futures = 3;      //期货模拟账户
    SimAccType_StockAndOption = 4;      //美股融资融券模拟账户
}
```

## 风险状态

**CltRiskStatus**

```protobuf
enum CltRiskStatus
{
  CltRiskStatus_Level1 = 0;  //非常安全
  CltRiskStatus_Level2 = 1;  //安全
  CltRiskStatus_Level3 = 2;  //较安全
  CltRiskStatus_Level4 = 3;  //较低风险
  CltRiskStatus_Level5 = 4;  //中等风险
  CltRiskStatus_Level6 = 5;  //较高风险
  CltRiskStatus_Level7 = 6;  //预警
  CltRiskStatus_Level8 = 7;  //预警
  CltRiskStatus_Level9 = 8;  //预警
}
```

## 持仓限额状态

**ExposureLevel**

```protobuf
enum ExposureLevel
{
    ExposureLevel_Unknown = 0;    //未知
    ExposureLevel_Normal = 1;     //正常
    ExposureLevel_NearLimit = 2;  //即将用尽
    ExposureLevel_Restricted = 3; //受限
    ExposureLevel_Safe = 4;       //安全
    ExposureLevel_Moderate = 5;   //适中
    ExposureLevel_Warning = 6;    //预警
    ExposureLevel_MarginCall = 7; //危险
}
```

## 日内交易限制情况

**DTStatus**

```protobuf
enum DTStatus
{
	DTStatus_Unknown = 0; 		//未知
	DTStatus_Unlimited = 1;		//无限次(当前可以无限次日内交易，注意留意剩余日内交易购买力)
	DTStatus_EMCall = 2;		//EM Call(当前状态不能新建仓位，需要补充资产净值至$25000以上，否则会被禁止新建仓位90天)
	DTStatus_DTCall = 3;		//DT Call(当前状态有未补平的日内交易追缴金额（DTCall），需要在5个交易日内足额入金来补平 DTCall，否则会被禁止新建仓位，直到足额存入资金才会解禁)
}
```

## 现金流方向

**TrdCashFlowDirection**

```protobuf
enum TrdCashFlowDirection
{
	TrdCashFlowDirection_Unknown = 0; //未知
	TrdCashFlowDirection_In = 1; //现金流入
	TrdCashFlowDirection_Out = 2; //现金流出
}
```

## 日本子账户类型

**TrdSubAccType**

```protobuf
enum TrdSubAccType
{
	TrdSubAccType_None = 0; //未知
	TrdSubAccType_JP_GENERAL = 1; // 一般-Long
	TrdSubAccType_JP_TOKUTEI = 2; // 特定-Long
	TrdSubAccType_JP_NISA_GENERAL = 3; // 一般NISA
	TrdSubAccType_JP_NISA_TSUMITATE = 4; // 累计NISA

	TrdSubAccType_JP_GENERAL_SHORT = 5; // 一般-short
	TrdSubAccType_JP_TOKUTEI_SHORT = 6; // 特定-short
	TrdSubAccType_JP_HONPO_GENERAL = 7; // 本国信用交易抵押品-一般
	TrdSubAccType_JP_GAIKOKU_GENERAL = 8; // 外国信用交易抵押品-一般
	TrdSubAccType_JP_HONPO_TOKUTEI = 9; // 本国信用交易抵押品-特定
	TrdSubAccType_JP_GAIKOKU_TOKUTEI = 10; // 外国信用交易抵押品-特定

	TrdSubAccType_JP_DERIVATIVE_LONG = 11; // 衍生品子账户-Long
	TrdSubAccType_JP_DERIVATIVE_SHORT = 12; // 衍生品子账户-Short
	TrdSubAccType_JP_HONPO_DERIVATIVE_GENERAL = 13; // 本国衍生品证据金子账户-一般
	TrdSubAccType_JP_GAIKOKU_DERIVATIVE_GENERAL = 14; // 外国衍生品证据金子账户-一般
	TrdSubAccType_JP_HONPO_DERIVATIVE_TOKUTEI = 15; // 本国衍生品证据金子账户-特定
	TrdSubAccType_JP_GAIKOKU_DERIVATIVE_TOKUTEI = 16; // 外国衍生品证据金子账户-特定
}
```

## 资产类别

**TrdAssetCategory**

```protobuf
enum TrdAssetCategory
{
	TrdAssetCategory_Unknown = 0; 	//未知
	TrdAssetCategory_JP = 1;	    //本国
	TrdAssetCategory_US = 2;	    //外国
}
```

## 交易品类

**TrdCategory**

```protobuf
enum TrdCategory
{
    TrdCategory_Unknown = 0; //未知品类
    TrdCategory_Security = 1; //证券
    TrdCategory_Future = 2; //期货
    TrdCategory_Crypto = 3; //加密货币
}
```

## 账户现金信息

**AccCashInfo**

```protobuf
message AccCashInfo
{
    optional int32 currency = 1;        // 货币类型，取值参考 Currency
    optional double cash = 2;           // 现金结余
    optional double availableBalance = 3;   // 现金可提金额
    optional double netCashPower = 4;		// 现金购买力
}
```

## 分市场资产信息

**AccMarketInfo**

```protobuf
message AccCashInfo
{
    optional int32 trdMarket = 1;        // 交易市场, 参见TrdMarket的枚举定义
    optional double assets = 2;          // 分市场资产信息
}
```


## 交易协议公共参数头

**TrdHeader**

```protobuf
message TrdHeader
{
  required int32 trdEnv = 1; //交易环境, 参见 TrdEnv 的枚举定义
  required uint64 accID = 2; //业务账号, 业务账号与交易环境、市场权限需要匹配，否则会返回错误
  required int32 trdMarket = 3; //交易市场, 参见 TrdMarket 的枚举定义
  optional int32 jpAccType = 4; //JP子账户类型，取值见 TrdSubAccType
}
```

## 交易业务账户

**TrdAcc**

```protobuf
message TrdAcc
{
  required int32 trdEnv = 1; //交易环境，参见 TrdEnv 的枚举定义
  required uint64 accID = 2; //业务账号
  repeated int32 trdMarketAuthList = 3; //业务账户支持的交易市场权限，即此账户能交易那些市场, 可拥有多个交易市场权限，目前仅单个，取值参见 TrdMarket 的枚举定义
  optional int32 accType = 4;   //账户类型，取值见 TrdAccType
  optional string cardNum = 5;  //卡号
  optional int32 securityFirm = 6; //所属券商，取值见SecurityFirm
  optional int32 simAccType = 7; //模拟交易账号类型，取值见SimAccType
  optional string uniCardNum = 8;  //所属综合账户卡号
  optional int32 accStatus = 9; //账号状态，取值见TrdAccStatus
  optional int32 accRole = 10; //账号分类，是不是主账号，取值见TrdAccRole
  repeated int32 jpAccType = 11; //JP子账户类型，取值见 TrdSubAccType
}
```


## 账户资金

**Funds**

```protobuf
message Funds
{
  required double power = 1; //最大购买力（此字段是按照 50% 的融资初始保证金率计算得到的 近似值。但事实上，每个标的的融资初始保证金率并不相同。我们建议您使用 查询最大可买可卖 接口返回的 最大可买 字段，来判断实际可买入的最大数量）
  required double totalAssets = 2; //资产净值
  required double cash = 3; //现金（仅单币种账户使用此字段，综合账户请使用 cashInfoList 获取分币种现金）
  required double marketVal = 4; //证券市值, 仅证券账户适用
  required double frozenCash = 5; //冻结资金
  required double debtCash = 6; //计息金额
  required double avlWithdrawalCash = 7; //现金可提（仅单币种账户使用此字段，综合账户请使用 cashInfoList 获取分币种现金可提）

  optional int32 currency = 8;            //币种，本结构体资金相关的货币类型，取值参见 Currency，期货和综合证券账户适用
  optional double availableFunds = 9;     //可用资金，期货适用
  optional double unrealizedPL = 10;      //未实现盈亏，期货适用
  optional double realizedPL = 11;        //已实现盈亏，期货适用
  optional int32 riskLevel = 12;           //风控状态，参见 CltRiskLevel, 期货适用。建议统一使用 riskStatus 字段获取证券、期货账户的风险状态
  optional double initialMargin = 13;      //初始保证金
  optional double maintenanceMargin = 14;  //维持保证金
  repeated AccCashInfo cashInfoList = 15;  //分币种的现金、现金可提和现金购买力（仅综合账户适用）
  optional double maxPowerShort = 16; //卖空购买力（此字段是按照 60% 的融券保证金率计算得到的近似值。但事实上，每个标的的融券保证金率并不相同。我们建议您使用 查询最大可买可卖 接口返回的 可卖空 字段，来判断实际可卖空的最大数量。）
  optional double netCashPower = 17;  //现金购买力（仅单币种账户使用此字段，综合账户请使用 cashInfoList 获取分币种现金购买力）
  optional double longMv = 18;        //多头市值
  optional double shortMv = 19;       //空头市值
  optional double pendingAsset = 20;  //在途资产
  optional double maxWithdrawal = 21;          //融资可提，仅证券账户适用
  optional int32 riskStatus = 22;              //风险状态，参见 CltRiskStatus，共分 9 个等级，LEVEL1是最安全，LEVEL9是最危险
  optional double marginCallMargin = 23;       //	Margin Call 保证金

  optional bool isPdt = 24;				//是否PDT账户，仅moomoo证券(美国)账户适用
  optional string pdtSeq = 25;			//剩余日内交易次数，仅被标记为 PDT 的moomoo证券(美国)账户适用
  optional double beginningDTBP = 26;		//初始日内交易购买力，仅被标记为 PDT 的moomoo证券(美国)账户适用
  optional double remainingDTBP = 27;		//剩余日内交易购买力，仅被标记为 PDT 的moomoo证券(美国)账户适用
  optional double dtCallAmount = 28;		//日内交易待缴金额，仅被标记为 PDT 的moomoo证券(美国)账户适用
  optional int32 dtStatus = 29;				//日内交易限制情况，取值见 DTStatus。仅被标记为 PDT 的moomoo证券(美国)账户适用
  
  optional double securitiesAssets = 30; // 证券资产净值
  optional double fundAssets = 31; // 基金资产净值
  optional double bondAssets = 32; // 债券资产净值

  repeated AccMarketInfo marketInfoList = 33; //分市场资产信息

  optional double cryptoMv = 34; // 加密货币市值
  optional int32 exposureLevel = 35; // 持仓限额状态，取值见 ExposureLevel
  optional double exposureLimit = 36; // 持仓限额
  optional double usedLimit = 37; // 已用持仓限额
  optional double remainingLimit = 38; // 剩余持仓限额
}
```

## 账户持仓

**Position**

```protobuf
message Position
{
    required uint64 positionID = 1;     //持仓 ID，一条持仓的唯一标识
    required int32 positionSide = 2;    //持仓方向，参见 PositionSide 的枚举定义
    required string code = 3;           //代码
    required string name = 4;           //名称
    required double qty = 5;            //持有数量，2位精度，期权单位是"张"，下同
    required double canSellQty = 6;     //可用数量，是指持有的可平仓的数量。可用数量=持有数量-冻结数量。期权和期货的单位是“张”。
    required double price = 7;          //市价，3位精度，期货为2位精度
    optional double costPrice = 8;      //摊薄成本价（证券账户），平均开仓价（期货账户）。证券无精度限制，期货为2位精度，如果没传，代表此时此值无效
    required double val = 9;            //市值，3位精度, 期货此字段值为0
    required double plVal = 10;         //盈亏金额，3位精度，期货为2位精度
    optional double plRatio = 11;       //盈亏百分比(平均成本价模式)，无精度限制，如果没传，代表此时此值无效
    optional int32 secMarket = 12;      //证券所属市场，参见 TrdSecMarket 的枚举定义
    
	//以下是此持仓今日统计
    optional double td_plVal = 21;      //今日盈亏金额，3位精度，下同, 期货为2位精度
    optional double td_trdVal = 22;     //今日交易额，期货不适用
    optional double td_buyVal = 23;     //今日买入总额，期货不适用
    optional double td_buyQty = 24;     //今日买入总量，期货不适用
    optional double td_sellVal = 25;    //今日卖出总额，期货不适用
    optional double td_sellQty = 26;    //今日卖出总量，期货不适用

    optional double unrealizedPL = 28;       //未实现盈亏（仅期货账户适用）
    optional double realizedPL = 29;         //已实现盈亏（仅期货账户适用）	
    optional int32 currency = 30;        // 货币类型，取值参考 Currency
    optional int32 trdMarket = 31;  //交易市场, 参见 TrdMarket 的枚举定义

    optional double dilutedCostPrice = 32;      //摊薄成本价，仅支持证券账户使用
    optional double averageCostPrice = 33;      //平均成本价，模拟交易证券账户不适用
    optional double averagePlRatio = 34;        //盈亏百分比(平均成本价模式)，无精度限制，如果没传，代表此时此值无效
}
```

## 订单

**Order**

```protobuf
message Order
{
    required int32 trdSide = 1; //交易方向, 参见 TrdSide 的枚举定义
    required int32 orderType = 2; //订单类型, 参见 OrderType 的枚举定义
    required int32 orderStatus = 3; //订单状态, 参见 OrderStatus 的枚举定义
    required uint64 orderID = 4; //订单号
    required string orderIDEx = 5; //扩展订单号(仅查问题时备用)
    required string code = 6; //代码
    required string name = 7; //名称
    required double qty = 8; //订单数量，2位精度，期权单位是"张"
    optional double price = 9; //订单价格，3位精度
    required string createTime = 10; //创建时间，严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
    required string updateTime = 11; //最后更新时间，严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
    optional double fillQty = 12; //成交数量，2位精度，期权单位是"张"
    optional double fillAvgPrice = 13; //成交均价，无精度限制
    optional string lastErrMsg = 14; //最后的错误描述，如果有错误，会有此描述最后一次错误的原因，无错误为空
    optional int32 secMarket = 15; //证券所属市场，参见 TrdSecMarket 的枚举定义
    optional double createTimestamp = 16; //创建时间戳
    optional double updateTimestamp = 17; //最后更新时间戳
    optional string remark = 18; //用户备注字符串，最大长度64字节
    optional double auxPrice = 21; //触发价格
    optional int32 trailType = 22; //跟踪类型, 参见Trd_Common.TrailType的枚举定义
    optional double trailValue = 23; //跟踪金额/百分比
    optional double trailSpread = 24; //指定价差
    optional int32 currency = 25;        // 货币类型，取值参考 Currency
    optional int32 trdMarket = 26;  //交易市场, 参见TrdMarket的枚举定义
    optional int32 session = 27; //美股订单时段, 参见Common.Session的枚举定义
    optional int32 jpAccType = 28; //JP子账户类型，取值见 TrdSubAccType
}
```

## 订单费用条目

**OrderFeeItem**

```protobuf
message OrderFeeItem
{
    optional string title = 1; //费用名字
    optional double value = 2; //费用金额
}
```

## 订单费用

**OrderFee**

```protobuf
message OrderFee
{
    required string orderIDEx = 1; //扩展订单号
    optional double feeAmount = 2; //费用总额
    repeated OrderFeeItem feeList = 3; //费用明细
}
```

## 成交

**OrderFill**

```protobuf
message OrderFill
{
	required int32 trdSide = 1; //交易方向, 参见 TrdSide 的枚举定义
    required uint64 fillID = 2; //成交号
    required string fillIDEx = 3; //扩展成交号(仅查问题时备用)
    optional uint64 orderID = 4; //订单号
    optional string orderIDEx = 5; //扩展订单号(仅查问题时备用)
    required string code = 6; //代码
    required string name = 7; //名称
    required double qty = 8; //成交数量，2位精度，期权单位是"张"
    required double price = 9; //成交价格，3位精度
    required string createTime = 10; //创建时间（成交时间），严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传
    optional int32 counterBrokerID = 11; //对手经纪号，港股有效
    optional string counterBrokerName = 12; //对手经纪名称，港股有效
    optional int32 secMarket = 13; //证券所属市场，参见 TrdSecMarket 的枚举定义
    optional double createTimestamp = 14; //创建时间戳
    optional double updateTimestamp = 15; //最后更新时间戳
    optional int32 status = 16; //成交状态, 参见 OrderFillStatus 的枚举定义
    optional int32 trdMarket = 17;  //交易市场, 参见TrdMarket的枚举定义
    optional int32 jpAccType = 18; //JP子账户类型，取值见 TrdSubAccType
}
```

## 最大可交易数量

**MaxTrdQtys**

```protobuf
message MaxTrdQtys
{
	//因目前服务器实现的问题，卖空需要先卖掉多头持仓才能再卖空，是分开两步卖的，买回来同样是逆向两步；而看多的买是可以现金加融资一起一步买的，请注意这个差异
	required double maxCashBuy = 1;             //现金可买（期权的单位是“张”，期货账户不适用）
    optional double maxCashAndMarginBuy = 2;    //最大可买（期权的单位是“张”，期货账户不适用）
    required double maxPositionSell = 3;        //持仓可卖（期权的单位是“张”）
    optional double maxSellShort = 4;           //可卖空（期权的单位是“张”，期货账户不适用）
    optional double maxBuyBack = 5;             //平仓需买入（当持有净空仓时，必须先买回空头持仓的股数，才能再继续买多。期货、期权的单位是“张”）
    optional double longRequiredIM = 6;         //买 1 张合约所带来的初始保证金变动。仅期货和期权适用。无持仓时，返回 买入 1 张的初始保证金占用（正数）。有多仓时，返回 买入1 张的初始保证金占用（正数）。有空仓时，返回 买回 1 张的初始保证金释放（负数）。
    optional double shortRequiredIM = 7;        //卖 1 张合约所带来的初始保证金变动。仅期货和期权适用。无持仓时，返回 卖空 1 张的初始保证金占用（正数）。 有多仓时，返回卖出1 张的初始保证金占用（正数）。有空仓时，返回 卖空1 张的初始保证金释放（正数）。
}
```

## 现金流水数据

**FlowSummaryInfo**

```protobuf
message FlowSummaryInfo
{
	optional string clearingDate = 1; //清算日期
	optional string settlementDate = 2; //结算日期
	optional int32 currency = 3; //币种
	optional string cashFlowType = 4; //现金流类型
	optional int32 cashFlowDirection = 5; //现金流方向 TrdCashFlowDirection
	optional double cashFlowAmount = 6; //金额
	optional string cashFlowRemark = 7; //备注
	optional uint64 cashFlowID = 8; //现金流 ID
}
```

## 过滤条件

**TrdFilterConditions**

```protobuf
message TrdFilterConditions
{
  repeated string codeList = 1; //代码过滤，只返回包含这些代码的数据，没传不过滤
  repeated uint64 idList = 2; //ID 主键过滤，只返回包含这些 ID 的数据，没传不过滤，订单是 orderID、成交是 fillID、持仓是 positionID
  optional string beginTime = 3; //开始时间，严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传，对持仓无效，拉历史数据必须填
  optional string endTime = 4; //结束时间，严格按 YYYY-MM-DD HH:MM:SS 或 YYYY-MM-DD HH:MM:SS.MS 格式传，对持仓无效，拉历史数据必须填
  repeated string orderIDExList = 5; // 服务器订单ID列表，可以用来替代orderID列表，二选一
  optional int32 filterMarket = 6; //指定交易市场, 参见TrdMarket的枚举定义
}
```

---



---

# 基础功能

协议 ID|Protobuf 文件|说明
:-|:-|:-
1001|[InitConnect](../quote/base.md)|初始化连接
1002|[GetGlobalState](../quote/get-global-state.md)|获取全局状态
1003|[Notify](./init.md#6884)|事件通知推送
1004|[KeepAlive](./protocol.md#2603)|保活心跳

## 设置接口信息

InitConnect.proto  

```protobuf
message C2S
{
    required int32 clientVer = 1; //客户端版本号，clientVer = "."以前的数 * 100 + "."以后的，举例：1.1版本的 clientVer 为1 * 100 + 1 = 101，2.21版本为2 * 100 + 21 = 221
    required string clientID = 2; //客户端唯一标识，无生具体生成规则，客户端自己保证唯一性即可
    optional bool recvNotify = 3; //此连接是否接收市场状态、交易需要重新解锁等等事件通知，true 代表接收，OpenD 就会向此连接推送这些通知，反之 false 代表不接收不推送
    //如果通信要加密，首先得在 OpenD 和客户端都配置 RSA 密钥，不配置始终不加密
    //如果配置了 RSA 密钥且指定的加密算法不为 PacketEncAlgo_None 则加密(即便这里不设置，配置了 RSA 密钥，也会采用默认加密方式)，默认采用 FTAES_ECB 算法
    optional int32 packetEncAlgo = 4; //指定包加密算法，参见 Common.PacketEncAlgo 的枚举定义
    optional int32 pushProtoFmt = 5; //指定这条连接上的推送协议格式，若不指定则使用 push_proto_type 配置项
}
```

* **介绍**

    在初始化连接协议中 clientVer、clientID 字段设置该信息。

## 设置协议格式

InitConnect.proto  

```protobuf
message C2S
{
    required int32 clientVer = 1; //客户端版本号，clientVer = "."以前的数 * 100 + "."以后的，举例：1.1版本的 clientVer 为1 * 100 + 1 = 101，2.21版本为2 * 100 + 21 = 221
    required string clientID = 2; //客户端唯一标识，无生具体生成规则，客户端自己保证唯一性即可
    optional bool recvNotify = 3; //此连接是否接收市场状态、交易需要重新解锁等等事件通知，true 代表接收，OpenD 就会向此连接推送这些通知，反之 false 代表不接收不推送
    //如果通信要加密，首先得在 OpenD 和客户端都配置 RSA 密钥，不配置始终不加密
    //如果配置了 RSA 密钥且指定的加密算法不为 PacketEncAlgo_None 则加密(即便这里不设置，配置了 RSA 密钥，也会采用默认加密方式)，默认采用 FTAES_ECB 算法
    optional int32 packetEncAlgo = 4; //指定包加密算法，参见 Common.PacketEncAlgo 的枚举定义
    optional int32 pushProtoFmt = 5; //指定这条连接上的推送协议格式，若不指定则使用 push_proto_type 配置项
}
```


* **介绍**

    在初始化连接协议中 pushProtoFmt 字段指定该连接上推送数据格式。  
    请求数据格式参见[协议头](../ftapi/protocol.md#8205)中的 nProtoFmtType 字段。

## 对所有连接设置协议加密


## 设置私钥路径

InitConnect.proto  

```protobuf
message C2S
{
        required int32 clientVer = 1; //客户端版本号，clientVer = "."以前的数 * 100 + "."以后的，举例：1.1版本的 clientVer 为1 * 100 + 1 = 101，2.21版本为2 * 100 + 21 = 221
        required string clientID = 2; //客户端唯一标识，无生具体生成规则，客户端自己保证唯一性即可
        optional bool recvNotify = 3; //此连接是否接收市场状态、交易需要重新解锁等等事件通知，true 代表接收，OpenD 就会向此连接推送这些通知，反之 false 代表不接收不推送
        //如果通信要加密，首先得在 OpenD 和客户端都配置 RSA 密钥，不配置始终不加密
        //如果配置了 RSA 密钥且指定的加密算法不为 PacketEncAlgo_None 则加密(即便这里不设置，配置了 RSA 密钥，也会采用默认加密方式)，默认采用 FTAES_ECB 算法
        optional int32 packetEncAlgo = 4; //指定包加密算法，参见 Common.PacketEncAlgo 的枚举定义
        optional int32 pushProtoFmt = 5; //指定这条连接上的推送协议格式，若不指定则使用 push_proto_type 配置项
}
```


* **介绍**

    在初始化连接协议中 packetEncAlgo 字段指定该连接上加密算法。  
    协议加密详情，参见[加密通信流程](./protocol.md#2846)

## 设置线程模式


## 设置回调


## 获取连接 ID

InitConnect.proto

```protobuf
message S2C
{
	required int32 serverVer = 1; //OpenD 的版本号
	required uint64 loginUserID = 2; //OpenD 登录的用户 ID
	required uint64 connID = 3; //此连接的连接 ID，连接的唯一标识
	required string connAESKey = 4; //此连接后续 AES 加密通信的 Key，固定为16字节长字符串
	required int32 keepAliveInterval = 5; //心跳保活间隔
	optional string aesCBCiv = 6; //AES 加密通信 CBC 加密模式的 iv，固定为16字节长字符串
}
```

* **介绍**

    InitConnect 协议回包中的 connID 字段

## 事件通知回调

Notify.proto

```protobuf
message S2C
{
	required int32 type = 1; //通知类型
	optional GtwEvent event = 2; //事件通息
	optional ProgramStatus programStatus = 3; //程序状态
	optional ConnectStatus connectStatus = 4; //连接状态
	optional QotRight qotRight = 5; //行情权限
	optional APILevel apiLevel = 6; //用户等级，已在2.10版本之后废弃
	optional APIQuota apiQuota = 7; //API 额度
}

message Response
{
	required int32 retType = 1 [default = -400]; //RetType,返回结果
	optional string retMsg = 2;
	optional int32 errCode = 3;
	
	optional S2C s2c = 4;
}
```

## 设置是否在控制台打印连接信息

---



---

# 通用定义

## 接口调用结果

**RetType**  

```protobuf
enum RetType
{
    RetType_Succeed = 0; //成功
    RetType_Failed = -1; //失败
    RetType_TimeOut = -100; //超时
    RetType_Unknown = -400; //未知结果
}
```

## 协议格式

**ProtoFmt**  

```protobuf
enum ProtoFmt
{
    ProtoFmt_Protobuf = 0; //Google Protobuf 格式
    ProtoFmt_Json = 1; //Json 格式
}
```

## 包加密算法

**PacketEncAlgo**  

```protobuf
enum PacketEncAlgo
{
    PacketEncAlgo_FTAES_ECB = 0; //修改过的 AES 的 ECB 加密模式
    PacketEncAlgo_None = -1; //不加密
    PacketEncAlgo_AES_ECB = 1; //标准的 AES 的 ECB 加密模式
    PacketEncAlgo_AES_CBC = 2; //标准的 AES 的 CBC 加密模式
}
```

## 程序状态类型

**ProgramStatusType**  

```protobuf
enum ProgramStatusType
{
    ProgramStatusType_None = 0;
    ProgramStatusType_Loaded = 1; //已完成类似加载配置,启动服务器等操作,服务器启动之前的状态无需返回

    ProgramStatusType_Loging = 2; //登录中
    ProgramStatusType_NeedPicVerifyCode = 3; //需要图形验证码
    ProgramStatusType_NeedPhoneVerifyCode = 4; //需要手机验证码
    ProgramStatusType_LoginFailed = 5; //登录失败,详细原因在描述返回
    ProgramStatusType_ForceUpdate = 6; //客户端版本过低

    ProgramStatusType_NessaryDataPreparing = 7; //正在拉取类似免责声明等一些必要信息
    ProgramStatusType_NessaryDataMissing = 8; //缺少必要信息
    ProgramStatusType_UnAgreeDisclaimer = 9; //未同意免责声明
    ProgramStatusType_Ready = 10; //可以接收业务协议收发,正常可用状态
	
    //OpenD 登录后被强制退出登录，会导致连接全部断开,需要重连后才能得到以下该状态（并且需要在 ui 模式下）
    ProgramStatusType_ForceLogout = 11; //被强制退出登录,例如修改了登录密码,中途打开设备锁等,详细原因在描述返回

    ProgramStatusType_DisclaimerPullFailed = 12; //拉取免责声明标志失败
}
```

## 网关事件通知类型

**GtwEventType**  

```protobuf
enum GtwEventType
{
    GtwEventType_None = 0; //正常无错
    GtwEventType_LocalCfgLoadFailed	= 1; //加载本地配置失败
    GtwEventType_APISvrRunFailed = 2; //服务器启动失败
	  GtwEventType_ForceUpdate = 3; //客户端版本过低
	  GtwEventType_LoginFailed = 4; //登录失败
	  GtwEventType_UnAgreeDisclaimer = 5; //未同意免责声明
	  GtwEventType_NetCfgMissing = 6; //缺少必要网络配置信息;例如控制订阅额度 //已优化，不会再出现该情况
	  GtwEventType_KickedOut = 7; //牛牛帐号在别处登录
	  GtwEventType_LoginPwdChanged = 8; //登录密码被修改
	  GtwEventType_BanLogin = 9; //用户被禁止登录
	  GtwEventType_NeedPicVerifyCode = 10; //需要图形验证码
	  GtwEventType_NeedPhoneVerifyCode = 11; //需要手机验证码
	  GtwEventType_AppDataNotExist = 12; //程序自带数据不存在
	  GtwEventType_NessaryDataMissing = 13; //缺少必要数据
	  GtwEventType_TradePwdChanged = 14; //交易密码被修改
	  GtwEventType_EnableDeviceLock = 15; //启用设备锁
}
```


## 系统通知类型

**NotifyType**  

```protobuf
enum NotifyType
{
    NotifyType_None = 0; //无
	  NotifyType_GtwEvent = 1; //OpenD 运行事件通知
	  NotifyType_ProgramStatus = 2; //程序状态
	  NotifyType_ConnStatus = 3; //连接状态
	  NotifyType_QotRight = 4; //行情权限
	  NotifyType_APILevel = 5; //用户等级，已在2.10版本之后废弃
	  NotifyType_APIQuota = 6; //API 额度
}
```

## 包唯一标识

**PacketID** 

```protobuf
message PacketID
{
	  required uint64 connID = 1; //当前 TCP 连接的连接 ID，一条连接的唯一标识，InitConnect 协议会返回
	  required uint32 serialNo = 2; //自增序列号
}
```

## 程序状态

**ProgramStatus**

```protobuf
message ProgramStatus
{
	  required ProgramStatusType type = 1; //当前状态
	  optional string strExtDesc = 2; // 额外描述
}
```

---



---

# 底层协议介绍

Futu API 是富途为主流的编程语言（Python、Java、C#、C++、JavaScript）封装的 API SDK，以方便您调用，降低策略开发难度。  
这部分主要介绍策略脚本与 OpenD 服务之间通信的底层协议，适用于非上述 5 种编程语言用户，自行对接实现底层裸协议。

:::tip 提示
* 如果您使用的编程语言在上述的 5 种主流编程语言之内，可以直接跳过这部分内容。
:::

## 协议请求流程
* 建立连接
* 初始化连接
* 请求数据或接收推送数据
* 定时发送 KeepAlive 保持连接

![proto-process](../img/proto-process.png)


## 协议设计
协议数据包括协议头以及协议体，协议头固定字段，协议体根据具体协议决定。

### 协议头

```
struct APIProtoHeader
{
    u8_t szHeaderFlag[2];
    u32_t nProtoID;
    u8_t nProtoFmtType;
    u8_t nProtoVer;
    u32_t nSerialNo;
    u32_t nBodyLen;
    u8_t arrBodySHA1[20];
    u8_t arrReserved[8];
};
```
字段|说明
:-|:-
szHeaderFlag|包头起始标志，固定为“FT”
nProtoID|协议 ID
nProtoFmtType|协议格式类型，0 为 Protobuf 格式，1 为 Json 格式
nProtoVer|协议版本，用于迭代兼容，目前填 0
nSerialNo|包序列号，用于对应请求包和回包，要求递增
nBodyLen|包体长度
arrBodySHA1|包体原始数据(解密后)的 SHA1 哈希值
arrReserved|保留 8 字节扩展

::: tip 提示
* u8_t 表示 8 位无符号整数，u32_t 表示 32 位无符号整数
* OpenD 内部处理使用 Protobuf，因此协议格式建议使用 Protobuf，减少 Json 转换开销
* nProtoFmtType 字段指定了包体的数据类型，回包会回对应类型的数据；推送协议数据类型由 OpenD 配置文件指定
* **arrBodySHA1 用于校验请求数据在网络传输前后的一致性，必须正确填入**
* **协议头的二进制流使用的是小端字节序，即一般不需要使用 ntohl 等相关函数转换数据**
:::

### 协议体
#### Protobuf 协议请求包体结构
```
message C2S
{
    required int64 req = 1;
}

message Request
{
    required C2S c2s = 1;
}
```

#### Protobuf 协议回应包体结构
```
message S2C
{
    required int64 data = 1;
}

message Response
{
    required int32 retType = 1 [default = -400]; //RetType，返回结果
    optional string retMsg = 2;
    optional int32 errCode = 3;
    optional S2C s2c = 4;
}
```

字段|说明
:-|:-
c2s|请求参数结构
req|请求参数，实际根据协议定义
retType|请求结果
retMsg|若请求失败，说明失败原因
errCode|若请求失败对应错误码
s2c|回应数据结构，部分协议不返回数据则无该字段
data|回应数据，实际根据协议定义

::: tip 提示
* 包体格式类型请求包由协议头 nProtoFmtType 指定，OpenD 主动推送格式在 [InitConnect](../ftapi/init.md#1515) 设置。
* 原始协议文件格式是以 Protobuf 格式定义，若需要 json 格式传输，建议使用 protobuf3 的接口直接转换成 json。
* 枚举值字段定义使用有符号整形，注释指明对应枚举，枚举一般定义于 Common.proto，Qot_Common.proto，Trd_Common.proto 文件中。
* 协议中价格、百分比等数据用浮点类型来传输，直接使用会有精度问题，需要根据精度（如协议中未指明，默认小数点后三位）做四舍五入之后再使用。
:::

## 心跳保活

```protobuf
syntax = "proto2";
package KeepAlive;
option java_package = "com.futu.openapi.pb";
option go_package = "github.com/futuopen/ftapi4go/pb/keepalive";

import "Common.proto";

message C2S
{
	required int64 time = 1; //客户端发包时的格林威治时间戳，单位秒
}

message S2C
{
	required int64 time = 1; //服务器回包时的格林威治时间戳，单位秒
}

message Request
{
	required C2S c2s = 1;
}

message Response
{
	required int32 retType = 1 [default = -400]; //RetType,返回结果
	optional string retMsg = 2;
	optional int32 errCode = 3;
	
	optional S2C s2c = 4;
}
```

* **介绍**

    心跳保活

* **协议 ID**

    1004

* **使用**

    根据[初始化链接](./init.md#1990)返回的心跳保活间隔时间，向 OpenD 发送保活协议

## 加密通信流程

* 若 OpenD 配置了加密，[InitConnect](../ftapi/init.md#1515) 初始化连接协议必须使用 [RSA](../qa/other.md#4601) 公钥加密，后续其他协议使用 InitConnect 返回的随机密钥进行 AES 加密通信。
* OpenD 的加密流程借鉴了 SSL 协议，但考虑到一般是本地部署服务和应用，简化了相关流程，OpenD 与接入 Client 共用了同一个 [RSA](../qa/other.md#4601) 私钥文件，请妥善保存和分发私钥文件。
* 可到这个 [网址](http://web.chacuo.net/netrsakeypair) 在线生成随机 [RSA](../qa/other.md#4601) 密钥对，密钥格式必须为 PCKS#1，密钥长度 512，1024 都可以，不要设置密码，将生成的私钥复制保存到文件中，然后将私钥文件路径配置到 [OpenD 配置](../opend/opend-cmd.md#8799) 约定的 **rsa_private_key** 配置项中。
*  **建议有实盘交易的用户配置加密，避免账户和交易信息泄露。**

![encrypt](../img/encrypt.png)


## RSA 加解密
* [OpenD 配置](../opend/opend-cmd.md#8799) 约定 **rsa_private_key** 为私钥文件路径
* OpenD 与接入客户端共用相同的私钥文件
* RSA 加解密仅用于 InitConnect 请求，用于安全获取其它请求协议的对称加密 Key
* OpenD 的 [RSA](../qa/other.md#4601) 密钥为 1024 位，填充方式 PKCS1，公钥加密，私钥解密，公钥可通过私钥生成
* Python API 参考实现：[RsaCrypt](https://github.com/FutunnOpen/py-futu-api/tree/master/futu/common/sys_config.py) 类的 encrypt / decrypt 接口

### 发送数据加密
* RSA 加密规则:若密钥位数是 key_size，单次加密串的最大长度为 (key_size)/8 - 11，目前位数 1024，一次加密长度可定为 100。
* 将明文数据分成一个或数个最长 100 字节的小段进行加密，拼接分段加密数据即为最终的 Body 加密数据。

### 接收数据解密
* RSA 解密同样遵循分段规则，对于 1024 位密钥，每小段待解密数据长度为 128 字节。
* 将密文数据分成一个或数个 128 字节长的小段进行解密，拼接分段解密数据即为最终的 Body 解密数据。

## AES 加解密
* 加密 key 由 InitConnect 协议返回
* 默认使用的是 AES 的 ecb 加密模式。
* Python API 参考实现: [ConnMng](https://github.com/FutunnOpen/py-futu-api/tree/master/futu/common/conn_mng.py) 类的 encrypt_conn_data / decrypt_conn_data 接口

### 发送数据加密

* AES 加密要求源数据长度必须是 16 的整数倍，故需补‘0’对齐后再加密，记录 mod_len 为源数据长度与 16 取模值。
* 因加密前有可能对源数据作修改，故需在加密后的数据尾再增加一个 16 字节的填充数据块，其最后一个字节赋值 mod_len，其余字节赋值‘0’，将加密数据和额外的填充数据块拼接作为最终要发送协议的 body 数据。

### 接收数据解密

* 协议 body 数据，先将最后一个字节取出，记为 mod_len，然后将 body 截掉尾部 16 字节填充数据块后再解密（与加密填充额外数据块逻辑对应）。
* mod_len 为 0 时，上述解密后的数据即为协议返回的 body 数据，否则需截掉尾部(16 - mod_len)长度的用于填充对齐的数据。

![aes](../img/aes.png)

---



---

# OpenD 相关


## Q1：OpenD 因未完成“问卷评估及协议确认”自动退出

A: 您需要进行相关问卷评估及协议确认，才可以使用 OpenD，请先 [前往完成](https://www.futunn.com/about/api-disclaimer?lang=zh-CN)。

## Q2：OpenD 因”程序自带数据不存在“退出

A: 一般因权限问题导致自带数据拷贝失败，可以尝试将程序目录下 <font color=Gray> __*Appdata.dat*__ </font> 解压后的文件拷贝到程序数据目录下。

* windows 程序数据目录:`%appdata%/com.futunn.FutuOpenD/F3CNN`
* 非 windows 程序数据目录:`~/.com.futunn.FutuOpenD/F3CNN`

## Q3：OpenD 服务启动失败

A: 请检查：
1. 是否有其他程序占用所配置的端口；
2. 是否已经有配置了相同端口的 OpenD 在运行。

## Q4：如何验证手机验证码？

A: 在 OpenD 界面上或远程到 Telnet 端口，输入命令`input_phone_verify_code -code=123456`。

::: tip 提示
* 123456 是收到的手机验证码
* -code=123456 前有空格
:::

## Q5：是否支持其他编程语言？

A: OpenD 有对外提供基于 socket 的协议，目前我们提供并维护 Python，C++，Java，C# 和 JavaScript 接口，[下载入口](https://www.futunn.com/download/OpenAPI)。

如果上述语言仍不能满足您的需求，您可以自行对接 Protobuf 协议。

## Q6：在同一设备多次验证设备锁 

A: 设备标识随机生成并存放于 

windows: %appdata%/com.futunn.FutuOpenD/F3CNN/Device.dat 文件中。
非windows: ~/.com.futunn.FutuOpenD/F3CNN/Device.dat

::: tip 提示
1. 如果文件被删除或损坏，OpenD 会重新生成新设备标识，然后验证设备锁。  
2. 另外镜像拷贝部署的用户需要注意，如果多台机器的 Device.dat 内容相同，也会导致这些机器多次验证设备锁。删除 Device.dat 文件即可解决。
:::

## Q7：OpenD 是否有提供 Docker 镜像？

A: 目前没有提供。

## Q8：一个账号可以登录多个 OpenD 吗？

A: 一个账号可以在多台机器上登录 OpenD 或者其他客户终端，最多允许 10 个 OpenD 终端同时登录。同时有“行情互踢”的限制，只能有一个 OpenD 获得最高权限行情。例如：两个终端登录同一个账号，只能有一个港股 LV2 行情，另一个是港股 BMP 行情。

## Q9：如何控制 OpenD 和其他客户端（桌面端和移动端）的行情权限？

A: 应交易所的规定，多个终端同时在线会有“行情互踢”的限制，只能有一个终端获得最高权限行情。OpenD 命令行版本的启动参数中，内置了 [auto_hold_quote_right](../opend/opend-cmd.md#8799) 参数，用于灵活配置行情权限。当该参数选项开启时，OpenD 在行情权限被抢后，会自动抢回。如果 10 秒内再次被抢，则其他终端获得最高行情权限（OpenD 不会再抢）。

## Q10：如何优先保证 OpenD 行情权限？

A: 
1. 将 OpenD 启动参数 [auto_hold_quote_right](../opend/opend-cmd.md#8799) 配置为 1；
2. 保证不要在移动端或桌面端富途牛牛上在 10 秒内连续两次抢最高权限（登录算一次，点击“重启行情”算第二次）。

![quote-right-kick](../img/quote-right-kick.png)

## Q11：如何优先保证移动端（或桌面端）的行情权限？

A: OpenD 启动参数 [auto_hold_quote_right](../opend/opend-cmd.md#8799) 设置为 0，移动端或桌面端富途牛牛在 OpenD 之后登录即可。 

## Q12：使用可视化 OpenD 记住密码登录，长时间挂机后提示连接断开，需要重新登录？

A: 使用可视化 OpenD，如果选择记住密码登录，用的是记录在本地的令牌。由于令牌有时间限制，当令牌过期后，如果出现网络波动或富途后台发布，就可能导致与后台断开连接后无法自动连接上的情况。因此，可视化 OpenD 如果希望长时间挂机，建议手动输入密码登录，由 OpenD 自动处理该情况。


## Q13：遇到产品缺陷，如何请富途的研发工程师排查日志？

A: 
1. 与客服沟通问题表现，详述：发生错误的时间、OpenD 版本号、 API 版本号、脚本语言名、接口名或协议号、含详细入参和返回的短代码或截图。

2. 客服确认是产品缺陷后，如需进一步日志排查，研发工程师会主动联系。

3. 部分问题须提供 OpenD 日志，方便定位确认问题。交易类问题需要 info 日志级别，行情类问题需要 debug 日志级别。日志级别 log_level 可以在 <font color=Gray> __*OpenD.xml*__ </font> 中 [配置](../opend/opend-cmd.md#8799) ，配置后需要重启 OpenD 方能生效，待问题复现后，将该段日志打包发给富途研发工程师。

:::tip 提示
日志路径如下：  
windows：`%appdata%/com.futunn.FutuOpenD/Log`

非 windows：`~/.com.futunn.FutuOpenD/Log`
:::

## Q14：脚本连接不上 OpenD

A: 请先尝试检查：
1. 脚本连接的端口与 OpenD 配置的端口是否一致。
2. 由于 OpenD 连接上限为 128，是否有无用连接未关闭。
3. 检查监听地址是否正确，如果脚本和 OpenD 不在同一机器，OpenD 监听地址需要设置成 0.0.0.0 。

## Q15：连接上一段时间后断开

A: 如果是自己对接协议，检查下是否有定时发送心跳维持连接。


## Q16：Linux 下通过 multiprocessing 模块以多进程方式运行 Python 脚本，连不上 OpenD？

A: Linux/Mac 环境下以默认方式创建进程后，父进程中 py-futu-api 内部创建的线程将会在子进程中消失，导致程序内部状态错误。  
可以用 spawn 方式来启动进程：

```python
import multiprocessing as mp
mp.set_start_method('spawn')
p = mp.Process(target=func)
```


## Q17：如何在一台电脑同时登录两个 OpenD?

A: 可视化 OpenD 不支持，命令行 OpenD 支持。

1. 解压从官网下载的文件，复制整个命令行 OpenD 文件夹（如 OpenD_5.2.1408_Windows）得到副本（此处以 Windows 为例，其他系统可采取相同操作）。

![file-page](../img/nnfile-page.png)

2. 分别打开两个命令行 OpenD 文件夹配置好两份 OpenD.xml 文件。

第一份配置文件参数：api_port = 11111，login_account = 登录账号1，login_pwd = 登录密码1

第二份配置文件参数：api_port = 11112，login_account = 登录账号2，login_pwd = 登录密码2

![order-page](../img/nnorder-page.png)

3. 配置完成后，分别打开两个 OpenD 程序运行。

![fod-page](../img/nnfod-page.png)

4. 调用接口时，注意接口的参数`port`（OpenD 监听端口）与 OpenD.xml 文件中的参数`api_port`为对应关系  
例如：

```python
from futu import *

# 向账号1登录的 OpenD 进行请求
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111, is_encrypt=False)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽

# 向账号2登录的 OpenD 进行请求
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11112, is_encrypt=False)
quote_ctx.close() # 结束后记得关闭当条连接，防止连接条数用尽
```

## Q18：行情权限被其他客户端踢掉，如何通过脚本执行抢权限的运维命令？
A：
1. 在OpenD启动参数中，配置好 Telnet 地址和 Telnet 端口。
![telnet_GUI](../img/telnet_GUI.jpg)
![telnet_CMD](../img/telnet_CMD.jpg)
2. 启动 OpenD（会同时启动 Telnet）。
3. 当发现行情权限被抢之后，您可以参考如下代码示例，通过 Telnet，向 OpenD 发送 `request_highest_quote_right` 命令。
```python
from telnetlib import Telnet
with Telnet('127.0.0.1', 22222) as tn:  # Telnet 地址为：127.0.0.1，Telnet 端口为：22222
    tn.write(b'request_highest_quote_right\r\n')
    reply = b''
    while True:
        msg = tn.read_until(b'\r\n', timeout=0.5)
        reply += msg
        if msg == b'':
            break
    print(reply.decode('gb2312'))
```

<span id="update-failed-qa"></span>

## Q19：OpenD 自动升级失败

A：
通过`update`命令执行 OpenD 自动更新失败，可能的原因：
- 文件被其他进程占用：可以尝试关闭其他 OpenD 进程，或者重启系统后，再次执行 `update`
如果以上仍无法解决，可以通过[官网](https://www.futunn.com/download/OpenAPI?lang=zh-CN)自行下载更新。

## Q20：ubuntu22无法启动可视化 OpenD？
A：
在有些Linux发行版（例如Ubuntu 22.04）运行可视化OpenD时，可能会提示：`dlopen(): error loading libfuse.so.2`。
这是因为这些系统没有默认安装libfuse。通常可以手动安装来解决，例如对于Ubuntu22.04，可以在命令行运行：
```
sudo apt update
sudo apt install -y libfuse2
```
安装成功后就可以正常运行可视化OpenD了。详细信息请参考：[https://docs.appimage.org/user-guide/troubleshooting/fuse.html](https://docs.appimage.org/user-guide/troubleshooting/fuse.html)。

## Q21：Linux上如何在后台运行命令行OpenD？


A：先切到 FutuOpenD 所在目录，配置好 FutuOpenD.xml 之后，执行如下命令
```
nohup ./FutuOpenD &
```

---



---

# 行情相关


## Q1：订阅失败

A: 订阅接口返回错误，有以下两类常见情况：
* 订阅额度不足：

  订阅额度规则参见 [订阅额度 & 历史 K 线额度](../intro/authority.md#1314)

* 订阅权限不足：

  支持订阅的行情权限见下表
  <table>
    <tr>
      <th> 市场 </th>
      <th> 品种 </th>
      <th> 支持订阅的行情权限 </th>
    </tr>
    <tr>
      <td rowspan="3"> 香港市场 </td>
      <td > 股票 </td>
      <td > LV1, LV2, SF </td>
    </tr>
    <tr>
	    <td> 期权</td>
      <td> LV1, LV2</td>
    </tr>
    <tr>
	    <td> 期货</td>
      <td> LV1, LV2</td>
    </tr>
    <tr>
      <td rowspan="3"> 美国市场 </td>
      <td > 股票 </td>
      <td > LV1, LV2 </td>
    </tr>
    <tr>
	    <td> 期权</td>
      <td> LV1</td>
    </tr>
    <tr>
	    <td> 期货</td>
      <td> LV1, LV2</td>
    </tr>
    <tr>
      <td > A 股市场 </td>
      <td > 股票 </td>
      <td > LV1 </td>
    </tr>  
</table>

  获取行情权限的方式参见 [行情权限](../intro/authority.html#2867) 

  注意：若账号拥有上述权限，但仍订阅失败，可能存在被其他终端 [踢掉行情权限](./opend.html#1228) 的情况。

## Q2：反订阅失败

A: 订阅至少一分钟后才能反订阅。

## Q3：反订阅成功但没释放额度

A: 所有连接都对该行情反订阅，才会释放额度。

举例：A 连接和 B 连接都在订阅 HK.00700 的摆盘，当 A 连接反订阅后，由于 B 连接仍在调用腾讯的摆盘数据，因此 OpenD 的额度不会释放，直至所有连接都反订阅 HK.00700 的摆盘。


## Q4：订阅不足一分钟关闭脚本连接，会释放额度吗？

A: 不会。连接关闭后，订阅时长不足一分钟的标的类型，会在达到一分钟后才自动反订阅，并释放相应的订阅额度。


## Q5：请求限频的具体限制逻辑是怎样？

A: 30 秒内最多 n 次，是指第 1 次和第 n+1 次请求间隔需要大于 30 秒。

## Q6：自选股添加不上是什么原因？

A: 请先检查是否有超出上限，或者删除一部分自选。

## Q7：为什么 API 端的美股报价和牛牛客户端的报价有不同？

A: 由于美股交易分散在很多家交易所，富途提供多种美股基本报价行情。 自4 月 16 日起，Futu API **免费开放**美股实时行情权限（推广期限免）。原需单独购买行情卡才可获取的深度摆盘美股行情，现已调整为免费。Futu API 会接入两种美股报价行情：Nasdaq Basic + TotalView（Nasdaq 交易所60档），NYSE Arcabook（Arca 60档）。     
如果您发现美股当天开盘价与客户端显示不一致，这是因为 Futu API 实时上游行情会综合 Nasdaq 和 NYSE Arcabook 数据。


## Q8：API 行情卡在哪里购买？

A:  
* 港股市场
  * [港股 LV2 高级行情（仅港澳台及海外 IP）](https://qtcardfthk.futufin.com/buy?market_id=1&amp;channel=2&amp;good_type=1#/)
  * [港股期权期货 LV2高级行情（仅港澳台及海外 IP）](https://qtcardfthk.futufin.com/buy?market_id=1&amp;channel=2&amp;good_type=8#/)
  * [港股 LV2 + 期权期货 LV2 行情（仅港澳台及海外 IP）](https://qtcardfthk.futufin.com/buy?market_id=1&amp;channel=2&amp;good_type=9#/)
  * [港股高级全盘行情（SF 行情）](https://qtcardfthk.futufin.com/buy?market_id=1&amp;channel=2&amp;good_type=10#/)
  
* 美股市场 (**限时推免**)
  * [Nasdaq Basic](https://qtcardfthk.futufin.com/buy?market_id=2&amp;channel=2&amp;good_type=12#/)
  * [Nasdaq Basic+TotalView (Non-Pro)](https://qtcardfthk.futufin.com/buy?market_id=2&good_type=18&channel=2#/)
  * [Nasdaq Basic+TotalView (Pro)](https://qtcardfthk.futufin.com/buy?market_id=2&good_type=19&channel=2#/)
  * [期权 OPRA 实时行情](https://qtcardfthk.futufin.com/buy?market_id=2&good_type=16&qtcard_channel=2#/)


## Q9：为什么有时候，获取实时数据的 get 接口响应比较慢？

A: 因为获取实时数据的 get 接口需要先订阅，并依赖后台给 OpenD 的推送。如果用户刚订阅就立刻用 get 接口请求，OpenD 有可能尚未收到后台推送。为了防止这种情况的发生，get 接口内置了等待逻辑，3 秒内收到推送会立刻返回给脚本，超过 3 秒仍未收到后台推送，才会给脚本返回空数据。  
涉及的 get 接口包括：get_rt_ticker、get_rt_data、get_cur_kline、get_order_book、get_broker_queue、get_stock_quote。因此，当发现获取实时数据的 get 接口响应比较慢时，可以先检查一下是否是无成交数据的原因。


## Q10：API 美股 Nasdaq 行情卡限免，可以获取哪些数据？

A: 自 4 月 16日起，Nasdaq Basic+TotalView 行情卡和 NYSE Arcabook 行情权限，将限时推免。您可免费获取的品类涵盖 Nasdaq、NYSE、NYSE MKT 交易所上市证券（包括美股正股和 ETF，不包括美股期货和美股期权）。    
支持的数据接口包括：快照，历史 K 线，实时逐笔订阅，实时一档摆盘订阅，实时 K 线订阅，实时报价订阅，实时分时订阅，到价提醒。


## Q11：各个行情品类的摆盘支持多少档？

A: 
行情品类|LV1|LV2|LV3|SF
:-|:-|:-|:-|:-
港股（含正股、窝轮、牛熊、界内证）|/|10|/|全盘+千笔明细
港股期权期货|1|10|/|/
美股（含 ETF）|1|60档|Nasdaq 60档+Arca 60档|/
美股期权|1|/|/|/
美股期货 |/|40档|/|/
A 股|5|/|/|/

## Q12：为什么我购买激活了行情卡之后，OpenD 仍然没有行情权限？

A:   
1. 由于 Futu API 的行情权限跟 APP 的行情权限不完全一样，部分行情卡仅适用于 APP 端。请先确认您所购买的行情卡是否是 OpenD 适用的。   
我们已将 Futu API 适用的 **所有** 行情卡列在《权限与限制》一节，请点击 [这里](/intro/authority.html#2867) 查看。
2. 行情卡购买激活成功后，是立即生效的。请 **重新启动 OpenD** 后，再次查看权限状态。


## Q13：如何通过订阅接口获取实时行情？
**第一步：订阅**  

将标的的代码和数据类型传入 [订阅接口](../quote/sub.md)，完成订阅。  

订阅接口支持了实时报价、实时摆盘、实时逐笔、实时分时、实时 K 线、实时经纪队列数据的获取。订阅成功后，OpenD 会持续收到富途服务器的实时数据推送。

注意：订阅额度会根据您的总资产、交易笔数和交易量，来进行分配，具体规则参见 [订阅额度 & 历史 K 线额度](../intro/authority.md#1314)。所以，如果您的订阅额度不足，可以先检查一下是否有无用的订阅在占用额度，及时 [反订阅](../quote/sub.md) 即可释放已占用的订阅额度。

**第二步：取数据**  

如何将订阅推送的数据从 OpenD 取回脚本呢？我们提供了如下两种方式：

**方式 1：实时数据回调**  
设置相应的回调函数，来异步处理 OpenD 收到的数据推送。  

设置好回调函数后，OpenD 会将收到的实时数据，立即推给脚本的回调函数进行处理。  

如果所订阅的标的比较活跃，此时的推送数据可能数据量较大且频率较高。如果您希望适当降低 OpenD 给脚本的推送频率，建议在 [OpenD 启动参数](../opend/opend-cmd.md#8799) 中配置 API 推送频率（`qot_push_frequency`）。  

方式 1 涉及的接口包括：[实时报价回调](../quote/update-stock-quote.md)、[实时摆盘回调](../quote/update-order-book.md)、[实时 K 线回调](../quote/update-kl.md)、[实时分时回调](../quote/update-rt.md)、[实时逐笔回调](../quote/update-ticker.md)、[实时经纪队列回调](../quote/update-broker.md)。

**方式 2：获取实时数据**  
通过获取实时数据接口，可以将 OpenD 收到的最新的数据，取回脚本。这种方式更加灵活，脚本不需要处理海量的推送。只要 OpenD 在持续接收富途服务器的推送，脚本可以随用随取，不用不取。  

由于是从 OpenD 接收的推送数据中取，所以这类接口没有频率限制。  

方式 2 涉及的接口包括：[获取实时报价](../quote/get-stock-quote.md)、[获取实时摆盘](../quote/get-order-book.md)、[获取实时 K 线](../quote/get-kl.md)、[获取实时分时](../quote/get-rt.md)、[获取实时逐笔](../quote/get-ticker.md)、[获取实时经纪队列](../quote/get-broker.md)。

## Q14：各个市场状态对应什么时间段？
A: 
<table>
    <tr>
        <th>市场</th>
        <th>品类</th>
        <th>市场状态</th>
        <th>时间段（当地时间）</th>
    </tr>
    <tr>
        <td rowspan="19" width = "15%">香港市场</td>
	    <td rowspan="8" width = "15%">证券类产品（含股票、ETFs、窝轮、牛熊、界内证）</td>
	    <td> * NONE：无交易</td>
      <td> CST 08:55 - 09:00</td>
    </tr>
    <tr>
	    <td >* AUCTION：盘前竞价</td>
      <td> CST 09:00 - 09:20</td>
    </tr>
    <tr>
	    <td >* WAITING_OPEN：等待开盘</td>
      <td> CST 09:20 - 09:30</td>
    </tr>
    <tr>
	    <td>* MORNING：早盘</td>
      <td> CST 09:30 - 12:00</td>
    </tr>
    <tr>
      <td>* REST: 午间休市</td>
	    <td>CST 12:00 - 13:00</td>
    </tr>
    <tr>
	    <td>* AFTERNOON：午盘</td>
      <td>CST 13:00 - 16:00</td>
    </tr>
    <tr>
	    <td>* HK_CAS：港股盘后竞价（港股市场增加 CAS 机制对应的市场状态）</td>
      <td>CST 16:00 - 16:08</td>
    </tr>
    <tr>
	    <td>* CLOSED：收盘</td>
      <td>CST 16:08 - 08:55（T+1）</td>
    </tr>
    <tr>
	    <td rowspan="5">期权、期货（仅日市）</td>
      <td>* NONE：期权待开盘</td>
      <td> CST 08:55 - 09:30</td>
    </tr>
    <tr>
	    <td>* MORNING：早盘</td>
      <td>CST 09:30 - 12:00</td>
    </tr>
    <tr>
      <td>* REST: 午间休市</td>
	    <td>CST 12:00 - 13:00</td>
    </tr>
    <tr>
	    <td>* AFTERNOON：午盘</td>
      <td>CST 13:00 - 16:00</td>
    </tr>
    <tr>
	    <td>* CLOSED：收盘</td>
      <td>CST 16:00 - 08:55（T+1）</td>
    </tr>
    <tr>
	    <td rowspan="6">期货（日夜市）</td>
      <td>* FUTURE_DAY_WAIT_FOR_OPEN：期货待开盘</td>
      <td rowspan="6"> 不同品种交易时间不同</td>
    </tr>
    <tr>
	    <td>* NIGHT_OPEN: 夜市交易时段</td>
    </tr>
    <tr>
	    <td>* NIGHT_END：夜市收盘</td>
    </tr>
    <tr>
	    <td>* FUTURE_DAY_WAIT_FOR_OPEN：期货待开盘</td>
    </tr>
    <tr>
	    <td>* FUTURE_DAY_OPEN：日市交易时段</td>
    </tr>
    <tr>
	    <td>* FUTURE_DAY_CLOSE：日市收盘</td>
    </tr>
  <tr>
        <td rowspan="16">美国市场</td>
	    <td rowspan="5">证券类产品（含股票、ETFs）</td>
	    <td>* PRE_MARKET_BEGIN：美股盘前交易时段</td>
      <td>EST 04:00 - 09:30</td>
    </tr>
    <tr>
	    <td>* AFTERNOON：美股持续交易时段</td>
      <td>EST 09:30 - 16:00</td>
    </tr>
    <tr>
	    <td>* AFTER_HOURS_BEGIN：美股盘后交易时段</td>
      <td>EST 16:00 - 20:00</td>
    </tr>
    <tr>
	    <td>* AFTER_HOURS_END：美股盘后收盘</td>
      <td>EST 20:00 - 04:00（T+1）</td>
    </tr>
    <tr>
	    <td>* OVERNIGHT：美股夜盘交易时段</td>
      <td>EST 20:00 - 04:00（T+1）</td>
    </tr>
    <tr>
	    <td rowspan="6">期权</td>
      <td>* NONE：期权待开盘</td>
      <td rowspan="6"> 不同品种交易时间不同</td>
    </tr>
    <tr>
	    <td>* REST：美指期权午间休市</td>
    </tr>
    <tr>
	    <td>* AFTERNOON：美股持续交易时段</td>
    </tr>
    <tr>
	    <td>* TRADE_AT_LAST：美指期权盘尾交易时段</td>
    </tr>
    <tr>
	    <td>* NIGHT：美指期权夜市交易时段</td>
    </tr>
    <tr>
	    <td>* CLOSED：收盘</td>
    </tr>
    <tr>
	    <td rowspan="5">期货</td>
      <td>* FUTURE_SWITCH_DATE：美期待开盘</td>
      <td rowspan="5"> 不同品种交易时间不同</td>
    </tr>
    <tr>
	    <td>* FUTURE_OPEN：美期交易时段</td>
     </tr>
     <tr>
	    <td>* FUTURE_BREAK：美期中盘休息</td>
     </tr>
     <tr>
	    <td>* FUTRUE_BREAK_OVER：美期休息后交易时段</td>
     </tr>
     <tr>
	    <td>* FUTURE_CLOSE：美期收盘</td>
     </tr>
    <tr>
        <td rowspan="7">A股市场</td>
	    <td rowspan="7">证券类产品（含股票、ETFs）</td>
	    <td>* NONE：无交易</td>
      <td>CST 08:55 - 09:15</td>
    </tr>
    <tr>
	    <td>* Auction：盘前竞价</td>
      <td>CST 09:15 - 09:25</td>
    </tr>
    <tr>
	    <td>* WAITING_OPEN：等待开盘</td>
      <td> CST 09:25 - 09:30</td>
    </tr>
    <tr>
	    <td>* MORNING：早盘</td>
      <td>CST 09:30 - 11:30</td>
    </tr>
    <tr>
	    <td>* REST：午间休市</td>
      <td>CST 11:30 - 13:00</td>
    </tr>
    <tr>
	    <td>* AFTERNOON：午盘</td>
      <td>CST 13:00 - 15:00</td>
    </tr>
    <tr>
	    <td>* CLOSED：收盘</td>
      <td>CST 15:00 - 08:55（T+1）</td>
    </tr>
    <tr>
        <td rowspan="5">新加坡市场</td>
	    <td rowspan="5">期货</td>
	    <td>* FUTURE_DAY_WAIT_FOR_OPEN：期货待开盘</td>
      <td rowspan="5">不同品种交易时间不同</td>
    </tr>
     <tr>
	    <td>* NIGHT_OPEN：夜市交易时段</td>
    </tr>
     <tr>
	    <td>* NIGHT_END：夜市收盘</td>
    </tr>
     <tr>
	    <td>* FUTURE_DAY_OPEN：日市交易时段</td>
    </tr>
     <tr>
	    <td>* FUTURE_DAY_CLOSE：日市收盘</td>
    </tr>
    <tr>
        <td rowspan="5">日本市场</td>
	    <td rowspan="5">期货</td>
	    <td>* FUTURE_DAY_WAIT_FOR_OPEN：期货待开盘</td>
      <td>JST 16:25（T-1）- 16:30（T-1）</td>
    </tr>
     <tr>
	    <td>* NIGHT_OPEN：夜市交易时段</td>
      <td>JST 16:30（T-1） - 05:30</td>
    </tr>
     <tr>
	    <td>* NIGHT_END：夜市收盘</td>
      <td>JST 05:30 - 08:45</td>
    </tr>
     <tr>
	    <td>* FUTURE_DAY_OPEN：日市交易时段</td>
      <td>JST 08:45 - 15:15</td>
    </tr>
     <tr>
	    <td>* FUTURE_DAY_CLOSE：日市收盘</td>
      <td>JST 15:15 - 16:25</td>
    </tr>
    <tr>
        <td rowspan="3">加密货币市场</td>
	    <td rowspan="3">加密货币</td>
	    <td>* NONE：未交易</td>
      <td rowspan="3">不同币对可交易时间不同</td>
    </tr>
     <tr>
	    <td>* MORNING：早盘</td>
    </tr>
     <tr>
	    <td>* CLOSED：收盘</td>
    </tr>
</table>
\* CST, EST, JST 分别表示中国时间，美东时间，日本时间

## Q15：接口参数股票代码的格式

A：  
* 使用不同编程语言的用户，需要的股票代码的格式不同：
   * **Python 用户**  
    标的代码 code 使用 `exchange_market.symbol`格式，`exchange_market`表示交易所市场，`symbol`表示标的代码。支持订阅的标的如下：    

<table>
    <tr>
        <th>市场</th>
        <th>标的类别</th>
        <th>exchange_market</th>
        <th>example</th>
    </tr>
    <tr>
        <td rowspan="5">香港市场</td>
        <td>证券类产品（含股票、ETFs、窝轮、牛熊、界内证）</td>
        <td>HK</td>
        <td>腾讯控股：HK.00700</td>
    </tr>
    <tr>
        <td>指数</td>
        <td>HK</td>
        <td>恒生指数：HK.800000</td>
    </tr>  
    <tr>
        <td>期货</td>
        <td>HK</td>
        <td>恒指期货2606：HK.HSI2606</td>
    </tr>
    <tr>
        <td>期权</td>
        <td>HK</td>
        <td>* 股票期权 腾讯 260330 450.00购：HK.TCH260330C450000 <br> * 指数期权 恒指 260330 24000.00购：HK.HSI260330C24000000</td>
    </tr>
    <tr>
        <td>板块  (建议使用  get_plate_list 先获取板块列表) </td>
        <td>HK</td>
        <td>AI应用股：HK.LIST24037</td>
    </tr>
    <tr>
        <td rowspan="5">美国市场</td>
        <td>证券类产品（含纽交所、美交所、纳斯达克上市的股票、ETFs）</td>
        <td>US</td>
        <td>英伟达：US.NVDA</td>
    </tr>
    <tr>
        <td>期权</td>
        <td>US</td>
        <td>* 股票期权 NVDA 260330 160.00C：US.NVDA260330C160000 <br> * 指数期权 SPXW 260330 6330.00C: US..SPXW260330C6330000</td>
    </tr>
    <tr>
        <td>期货</td>
        <td>US</td>
        <td>标普500指数期货2606：US.ES2606</td>
    </tr>
    <tr>
        <td>板块  (建议使用  get_plate_list 先获取板块列表) </td>
        <td>US</td>
        <td>半导体精选：US.LIST20077</td>
    </tr>
    <tr>
        <td>指数（暂不支持获取）</td>
        <td>US</td>
        <td>标普500指数：US..SPX</td>
    </tr>
    <tr>
        <td rowspan="3">A股市场</td>
        <td>证券类产品（含股票、ETFs）</td>
        <td>SH/SZ</td>
        <td>贵州茅台：SH.600519</td>
    </tr>
    <tr>
        <td>指数</td>
        <td>SH/SZ</td>
        <td>上证指数：SH.000001</td>
    </tr>
    <tr>
        <td>板块  (建议使用  get_plate_list 先获取板块列表) </td>
        <td>SH/SZ</td>
        <td>汽车电子概念：SH.LIST0301</td>
    </tr>
    <tr>
        <td rowspan="1">新加坡市场</td>
        <td>期货（暂不支持获取）</td>
        <td>SG</td>
        <td>A50指数期货2606：SG.CN2606</td>
    </tr>
    <tr>
        <td rowspan="1">日本市场</td>
        <td>期货（暂不支持获取）</td>
        <td>JP</td>
        <td>大阪日经指数期货2606：JP.NK2252606</td>
    </tr>
    <tr>
        <td rowspan="1">加密货币市场</td>
        <td>加密货币指数及币对</td>
        <td>CC</td>
        <td>* 指数：CC.BTC <br> * 可交易币对: CC.BTCUSD</td>
    </tr>
    </table>
      

   * **非 Python 用户**   
    股票结构参见 [Security](../quote/quote.html#1377)。   
    例如：腾讯控股，参数 market 传入 QotMarket_HK_Security，参数 code 传入'00700'。

* 查询方式：  
   通过 APP 查看代码和行情市场：行情 > 自选 > 全部。  
   行情市场定义，请参考 [这里](../quote/quote.html#427)。  
    ![code](../img/code.png)    


## Q16：复权因子相关
A：  
### 概述
所谓 [复权](../quote/get-rehab.html#770) 就是对股价和成交量进行权息修复，按照股票的实际涨跌绘制股价走势图，并把成交量调整为相同的股本口径。  
公司行动（如：拆股、合股、送股、转增股、配股、增发股、分红）均可能对股价产生影响，而复权计算可对量价进行调整，剔除公司行动的影响，保持股价走势的连续性。   

### 名词解释
- 公司行动：上市公司进行一些股权、股票等影响公司股价和股东持仓变化的行为。
- 前复权：保持现有的股价不变，以当前的股价为基准，对以前的股价进行复权计算。
- 后复权：保持先前的股价不变，以过去的股价为基准，对以后的股价进行复权计算。
- 复权因子：即权息修复比例，用于计算复权后的价格及持仓数量。
- 除权除息日：即股权登记日下一个交易日。在股票的除权除息日，证券交易所都要计算出股票的除权除息价，以作为股民在除权除息日开盘的参考。其意义是股票股利分配给股东的日期。

### 复权方法
主流的复权计算方法分为两种：事件法和连乘法；而 Futu API 针对不同市场使用不同的计算方法。
- 事件复权法：通过还原除权除息的各类事件进行复权；存在两个复权因子（复权因子 A 和 复权因子 B），复权因子 B 主要调整现金分红对股价的影响，而复权因子 A 调整其他公司行动对股价的影响。
- 连乘复权法：通过复权因子连乘的方式进行复权，只保留 复权因子 A（或将 复权因子 B 置为0），复权因子 A 为 除权除息日前收盘价/该日经权息调整后的前收盘价。

::: tip 提示
*  API 对美股前复权使用连乘法，即将 复权因子 B 置为0。  
*  API 对除美股以外的标的（A股、港股、新加坡股票等）及美股后复权使用事件法。  
:::

### 计算公式
#### 单次复权
- 前复权：  
前复权价格 = 不复权价格 × 前复权因子 A + 前复权因子 B   
- 后复权：  
后复权价格 = 不复权价格 × 后复权因子 A + 后复权因子 B

#### 多次复权
- 前复权：按照时间顺序，筛选出大于计算日期的复权因子，优先使用时间较早的复权因子进行复权计算。以两次复权为例： 

  ![code](../img/forward_fomula.png)    
- 后复权：按照时间倒序，筛选出小于等于计算日期的复权因子，优先使用时间较晚的复权因子进行复权计算。以两次复权为例： 

  ![code](../img/backward_fomula.png)    

### 示例
#### 单次前复权示例
以牧原股份为例：
- 筛选复权因子如下：  

除权除息日|股票代码|方案说明|前复权因子 A |前复权因子 B 
:-|:-|:-|:-|:-
2021/06/03|SZ.002714|10转4.0股派14.61元（含税）|0.71429|-1.04357

- 不复权数据如下：  

日期|股票代码|不复权收盘价
:-|:-|:-
2021/06/02|SZ.002714|93.11
2021/06/03|SZ.002714|66.25

- 前复权数据如下：  

日期|股票代码|前复权收盘价
:-|:-|:-
2021/06/02|SZ.002714|65.4639719
2021/06/03|SZ.002714|66.25

- 前复权数据计算方法：  
牧原股份在 2021/06/03 进行拆股及现金分红行动（10转4.0股派14.61元），根据前复权计算公式对 2021/06/02 的收盘价进行调整计算，则：前复权价格（65.4639719） = 不复权价格（93.11） × 前复权因子 A（0.71429） + 前复权因子 B（-1.04357）   

  ![code](../img/forward_example.png)    

#### 多次后复权示例
接上一个例子，计算牧原股份在 2021/06/02 的后复权价格：
- 筛选复权因子如下：  

除权除息日|股票代码|方案说明|后复权因子 A |后复权因子 B 
:-|:-|:-|:-|:-|
2014/07/04|SZ.002714|10派2.34元（含税）|1|0.234
2015-06-10|SZ.002714|10转10.0股派0.61元（含税）|2|0.061
2016-07-08|SZ.002714|10转10.0股派3.53元（含税）|2|0.353
2017-07-11|SZ.002714|10转8.0股派6.9元（含税）|1.8|0.69
2018-07-03|SZ.002714|10派6.91元（含税）|1|0.691
2019-07-04|SZ.002714|10派0.5元（含税）|1|0.05
2020-06-04|SZ.002714|10转7.0股派5.5元（含税）|1.7|0.55

- 不复权数据如下：  

日期|股票代码|不复权收盘价
:-|:-|:-
2021/06/02|SZ.002714|93.11

- 后复权数据如下：  

日期|股票代码|后复权收盘价
:-|:-|:-
2021/06/02|SZ.002714|1152.7226

- 后复权数据计算方法：  
为了计算牧原股份在 2021/06/02 的后复权价格，需要将早于 2021/06/02 的复权事件进行一一复权，得到最后的后复权价格，具体计算如下：

![code](../img/backward_example.jpg)

## Q17：加密货币多券商行情相关

#### 1. 为什么加密货币行情会因券商不同而有所差异？
A：由于各券商对接的行情上游不同，同一币对在不同券商下可能存在行情数据差异。API支持根据券商切换行情数据源（OpenQuoteContext 指定 security_firm），确保您看到的行情与实际交易一致。

#### 2. 如果我没有指定券商，会展示哪个数据源的行情？
A：未指定券商时，API默认返回您的主推券商行情上游数据。

#### 3. 我有多个券商账户都支持加密货币交易，应该如何选择？
A：建议选择您实际交易账户所对应的券商来获取行情。这样可以确保所见行情与下单时的撮合价格一致，避免因行情数据源不同导致的价格偏差。

---



---

# 交易相关

## Q1：模拟交易相关

A:
### 概述
模拟交易是在真实的市场环境中，用虚拟资金做交易，不会对您的真实账户的资产造成影响。

#### 交易时间
模拟交易支持的时段：常规交易时段（所有市场）、美股盘中时段、美股盘前盘后时段（仅美股融资融券模拟账户支持）   
模拟交易不支持的时段：美股夜盘时段、A股竞价时段、港股竞价时段    
详情可点击 [模拟交易规则](https://support.futunn.com/topic692)


#### 支持品类
Futu API 支持模拟交易的品类请参考 [这里](../intro/intro.md#1396)。

#### 解锁
与真实交易不同，模拟交易无需对账户进行解锁，即可下单或改单撤单。


#### 订单
1. 订单类型：限价单和市价单。  
2. 改单操作类型：模拟交易不支持使生效、使失效、删除，仅支持修改订单、 撤单。  
3. 成交：模拟交易不支持成交相关操作，包括 [查询今日成交](../trade/get-order-fill-list.md#2621)、[查询历史成交](../trade/get-history-order-fill-list.md#9015)、[响应成交推送回调](../trade/update-order-fill.md#210)。
4. 有效期限：模拟交易有效期限仅支持当日有效。
5. 卖空：期权和期货支持卖空。股票仅美股支持卖空。 
6. 模拟交易账户不支持查询订单费用。
7. 模拟交易账户不支持查询现金流水。
8. 在组合期权订单场景下，支持持仓查询，暂不支持组合订单查询。

#### 操作平台
1. 移动端：我的 — 模拟交易  

![sim-page](../img/sim-page.png)

2. 桌面端：左侧模拟 tab  

![sim-page](../img/create-sim-account.png)


3. 网页端：[模拟交易界面](https://m-match.futunn.com/simulate/)

4. Futu API：在调用接口时，设置参数交易环境为模拟环境即可。详见 [如何使用 Futu API 进行模拟交易](../qa/trade.md#8728)。

::: tip 提示
* 以上四种方式只是操作平台不同，四种方式操作的模拟账户是共通的。  
:::


### 如何使用 Futu API 进行模拟交易？

#### 创建连接
先根据交易品种 [创建相应的连接](../trade/base.md#7902) 。当交易品种是股票或期权时，请使用 `OpenSecTradeContext`。当交易品种是期货时，请使用 `OpenFutureTradeContext`。

#### 获取交易业务账户列表
使用 [获取交易业务账户列表](../trade/get-acc-list.md#5754) 查看交易账户（包括模拟账户、真实账户）。以 Python 为例：返回字段交易环境 `trd_env` 为 `SIMULATE`，表示模拟账户。   
获取港股模拟交易账户，需要指定 filter_trdmarket 为 TrdMarket.HK，此时会返回2个模拟交易账号。其中 sim_acc_type = STOCK 为港股模拟账户，sim_acc_type = OPTION 为港股期权模拟账户，sim_acc_type = FUTURES 为港股期货模拟账户。   
获取美股模拟交易账户，需要指定 filter_trdmarket 为 TrdMarket.US，sim_acc_type = STOCK_AND_OPTION 代表美股融资融券模拟账户，可以模拟交易股票和期权。sim_acc_type = FUTURES 为美国期货模拟账户。    

* **Example：Stocks and Options**
```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
#trd_ctx = OpenFutureTradeContext(host='127.0.0.1', port=11111, is_encrypt=None, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.get_acc_list()
if ret == RET_OK:
    print(data)
    print(data['acc_id'][0])  # get the first account id
    print(data['acc_id'].values.tolist())  # convert to list format
else:
    print('get_acc_list error: ', data)
trd_ctx.close()
```

* **Output**
```python
               acc_id   trd_env acc_type          card_num   security_firm  \
0  281756480572583411      REAL   MARGIN  1001318721909873  FUTUSECURITIES   
1             9053218  SIMULATE     CASH               N/A             N/A   
2             9048221  SIMULATE   MARGIN               N/A             N/A   

  sim_acc_type  trdmarket_auth  
0          N/A  [HK, US, HKCC]  
1        STOCK            [HK]  
2       OPTION            [HK] 
```
::: tip 提示
* 模拟交易中，区分股票账户和期权账户，股票账户只能交易股票，期权账户只能交易期权；以 Python 为例：返回字段中模拟账户类型 `sim_acc_type` 为 `STOCK`，表示股票账户；为`OPTION`，表示期权账户。
::: 

* **Example: Futures**
```python
from futu import *
#trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
trd_ctx = OpenFutureTradeContext(host='127.0.0.1', port=11111, is_encrypt=None, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.get_acc_list()
if ret == RET_OK:
    print(data)
    print(data['acc_id'][0])  # get the first account id
    print(data['acc_id'].values.tolist())  # convert to list format
else:
    print('get_acc_list error: ', data)
trd_ctx.close()
```

* **Output**
```python
    acc_id   trd_env acc_type card_num security_firm sim_acc_type  \
0  9497808  SIMULATE   MARGIN      N/A           N/A      FUTURES   
1  9497809  SIMULATE   MARGIN      N/A           N/A      FUTURES   
2  9497810  SIMULATE   MARGIN      N/A           N/A      FUTURES   
3  9497811  SIMULATE   MARGIN      N/A           N/A      FUTURES   

          trdmarket_auth  
0  [FUTURES_SIMULATE_HK]  
1  [FUTURES_SIMULATE_US]  
2  [FUTURES_SIMULATE_SG]  
3  [FUTURES_SIMULATE_JP]  
```  

#### 下单
使用 [下单接口](../trade/place-order.md) 时，设置交易环境为模拟环境即可。以 Python 为例：`trd_env = TrdEnv.SIMULATE`。

* **Example**
```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.place_order(price=510.0, qty=100, code="HK.00700", trd_side=TrdSide.BUY, trd_env=TrdEnv.SIMULATE)
if ret == RET_OK:
    print(data)
else:
    print('place_order error: ', data)
trd_ctx.close()
```
* **Output**
```python
	code	stock_name	trd_side	order_type	order_status	order_id	qty	price	create_time	updated_time	dealt_qty	dealt_avg_price	last_err_msg	remark	time_in_force	fill_outside_rth
0	HK.00700	腾讯控股	BUY	NORMAL	SUBMITTING	4642000476506964749	100.0	510.0	2021-10-09 11:34:54	2021-10-09 11:34:54	0.0	0.0			DAY	N/A
```

#### 撤单改单
使用 [撤单接口](../trade/modify-order.md) 时，设置交易环境为模拟环境即可。以 Python 为例： `trd_env = TrdEnv.SIMULATE`。

* **Example**
```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
order_id = "4642000476506964749"
ret, data = trd_ctx.modify_order(ModifyOrderOp.CANCEL, order_id, 0, 0, trd_env=TrdEnv.SIMULATE)
if ret == RET_OK:
    print(data)
else:
    print('modify_order error: ', data)
trd_ctx.close()
```
* **Output**
```python
    trd_env             order_id
0  SIMULATE  4642000476506964749
```

#### 查询历史订单
使用 [查询历史订单接口](../trade/get-history-order-list.md) 时，设置交易环境为模拟环境即可。以 Python 为例：`trd_env = TrdEnv.SIMULATE`。

* **Example**
```python
from futu import *
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK, host='127.0.0.1', port=11111, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.history_order_list_query(trd_env=TrdEnv.SIMULATE)
if ret == RET_OK:
    print(data)
else:
    print('history_order_list_query error: ', data)
trd_ctx.close()
```
* **Output**
```python
	code	stock_name	trd_side	order_type	order_status	order_id	qty	price	create_time	updated_time	dealt_qty	dealt_avg_price	last_err_msg	remark	time_in_force	fill_outside_rth
0	HK.00700	腾讯控股	BUY	ABSOLUTE_LIMIT	CANCELLED_ALL	4642000476506964749	100.0	510.0	2021-10-09 11:34:54	2021-10-09 11:37:08	0.0	0.0			DAY	N/A
```

### 如何重置模拟账户？
目前 Futu API 不支持重置模拟账户，您可在移动端使用复活卡重置指定模拟账户，重置后账户资金将恢复至初始值，历史订单将会被清空。

#### 具体操作
移动端：我的 — 模拟交易 — 我的头像 — 我的道具 — 复活卡。
![sim-page](../img/sim-reset.png)


## Q2：是否支持 A 股交易？

A: 模拟交易支持 A 股交易。但真实交易仅可通过 A 股通交易部分 A 股，具体详见 [A 股通名单](https://www.hkex.com.hk/Mutual-Market/Stock-Connect/Eligible-Stocks/View-All-Eligible-Securities?sc_lang=zh-HK)。

## Q3：各市场支持的交易方向

A: 除了期货，其他股票都只支持传入 BUY 和 SELL 两个交易方向。在空仓情况下传入 SELL，产生的订单交易方向是卖空。

## Q4：真实交易中，各市场支持的订单类型

A: 
<table style="font-size:14px;">
    <tr>
        <th>市场</th>
        <th>品种</th>
        <th>限价单</th>
        <th>市价单</th>
        <th>竞价限价单</th>
        <th>竞价市价单</th>
        <th>绝对限价单</th>
        <th>特别限价单</th>
        <th>特别限价且要求<br/>全部成交订单</th>
        <th>止损市价单</th>
        <th>止损限价单</th>
        <th>触及市价单（止盈）</th>
        <th>触及限价单（止盈）</th>
        <th>跟踪止损市价单</th>
        <th>跟踪止损限价单</th>
    </tr>
    <tr>
        <td rowspan="3">香港市场</td>
        <td>证券类产品（含股票、ETFs、<br/>窝轮、牛熊、界内证）</td>
        <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td>
    </tr>
    <tr>
        <td>期权</td>
        <td>✓</td> <td>X</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>X</td> <td>✓</td> <td>X</td> <td>✓</td> <td>X</td> <td>✓</td>
    </tr>
    <tr>
        <td>期货</td>
        <td>✓</td> <td>✓</td> <td>-</td> <td>✓</td> <td>-</td> <td>-</td> <td>-</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td>
    </tr>
    <tr>
        <td rowspan="3">美国市场</td>
        <td>证券类产品（含股票、ETFs）</td>
        <td>✓</td> <td>✓</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td>
    </tr>
    <tr>
        <td>期权</td>
        <td>✓</td> <td>✓</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td>
    </tr>
    <tr>
        <td>期货</td>
        <td>✓</td> <td>✓</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td>
    </tr>
    <tr>
        <td>A 股通市场</td>
        <td>证券类产品（含股票、ETFs）</td>
        <td>✓</td> <td>X</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>X</td> <td>✓</td> <td>X</td> <td>✓</td> <td>X</td> <td>✓</td>
    </tr>
    <tr>
        <td>新加坡市场</td>
        <td>期货</td>
        <td>✓</td> <td>✓</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td>
    </tr>
    <tr>
        <td>日本市场</td>
        <td>期货</td>
        <td>✓</td> <td>✓</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td> <td>✓</td>
    </tr>
</table>


## Q5：各市场支持的订单操作

A: 
* 港股支持改单、撤单、生效、失效、删除
* 美股仅支持改单和撤单
* A 股通仅支持撤单
* 期货支持改单、撤单、删除

## Q6：OpenD 启动参数 future_trade_api_time_zone 如何使用？

A：由于期货账户支持交易的品种分布在全球多个交易所，交易所的所属时区各有不同，因此期货交易 API 的时间显示就成为了一个问题。  
OpenD 启动参数中新增了 future_trade_api_time_zone 这一参数，供全球不同地区的期货交易者灵活指定时区。默认时区为 UTC+8，如果您更习惯美东时间，只需将此参数配置为 UTC-5 即可。
::: tip  提示
+ 此参数仅会对期货交易接口类对象生效。港股交易、美股交易、A 股通交易接口类对象的时区，仍然按照交易所所在的时区进行显示。
+ 此参数会影响的接口包括：响应订单推送回调，响应成交推送回调，查询今日订单，查询历史订单，查询当日成交，查询历史成交，下单。
:::

## Q7：通过 API 下的订单，能在 APP 上面看到吗？
A：可以看到。  
通过 Futu API 成功发出下单指令后，您可以在 APP 的 **交易** 页面，查看今日订单、订单状态、成交情况等等，也可以在 **消息—订单消息** 中收到成交提醒的通知。

## Q8：哪些品类支持在非交易时段下单？
A：所有的订单，都需要在开盘期间才能够成交。  
Futu API 仅对一部分品类，支持了 **非交易时段下单** 的功能（APP 上支持更多品类的非交易时段下单功能）。具体请参考下表：

<table>
    <tr>
        <th rowspan="2">市场</th>
        <th rowspan="2">标的类型</th>
        <th rowspan="2">模拟交易</th>
        <th colspan="7">真实交易</th>
    </tr>
    <tr>
        <th>Futu HK</th>
        <th>Moomoo US</th>
        <th>Moomoo SG</th>
        <th>Moomoo AU</th>
        <th>Moomoo MY</th>
        <th>Moomoo CA</th>
        <th>Moomoo JP</th>
    </tr>
    <tr>
        <td rowspan="3">香港市场</td>
	    <td>股票、ETFs、窝轮、牛熊、界内证</td>
	    <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
   <tr>
	    <td>期权 (含指数期权，需使用期货账户交易)</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="3">美国市场</td>
	    <td>股票、ETFs</td>
	    <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
    </tr>
    <tr>
        <td>期权</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
    </tr>
   <tr>
	    <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td rowspan="2">A 股市场</td>
	    <td>A 股通股票</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
     <tr>
	    <td>非 A 股通股票</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
   <tr>
        <td rowspan="2">新加坡市场</td>
	    <td>股票、ETFs、窝轮、REITs、DLCs</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td rowspan="2">日本市场</td>
        <td>股票、ETFs、REITs</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
        <td>期货</td>
        <td align="center">✓</td>
        <td align="center">✓</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td rowspan="1">澳大利亚市场</td>
        <td>股票、ETFs</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
    <tr>
	    <td rowspan="1">加拿大市场</td>
        <td>股票</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
        <td align="center">X</td>
    </tr>
</table>
::: tip 提示
- ✓：支持非交易时段下单
- X：暂不支持非交易时段下单（或暂不支持交易）
:::

## Q9：对于下单接口，各订单类型对应的必传参数以及券商对单笔订单的下单限制
A1: 各订单类型对应的必传参数

<table style="font-size:14px;">
    <tr>
        <th>参数</th>
        <th>限价单</th>
        <th>市价单</th>
        <th>竞价限价单</th>
        <th>竞价市价单</th>
        <th>绝对限价单</th>
        <th>特别限价单</th>
        <th>特别限价且要求<br/>全部成交订单</th>
        <th>止损市价单</th>
        <th>止损限价单</th>
        <th>触及市价单（止盈）</th>
        <th>触及限价单（止盈）</th>
        <th>跟踪止损市价单</th>
        <th>跟踪止损限价单</th>
    </tr>
    <tr>
        <td>price</td>
        <td>✓</td> <td></td> <td>✓</td> <td> </td> <td>✓</td> <td>✓</td> <td>✓</td>  <td></td><td>✓</td> <td></td> <td>✓</td><td> </td><td> </td>
    </tr>
    <tr>
        <td>qty</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>code</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>trd_side</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>order_type</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>trd_env</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>aux_price</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td> </td><td> </td>
    </tr>
    <tr>
        <td>trail_type</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td> </td><td> </td><td> </td><td> </td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>trail_value</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td> </td><td> </td><td> </td><td> </td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>trail_spread</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td> </td><td> </td><td> </td><td> </td> <td> </td><td>✓</td>
    </tr>
</table>

`Python 用户` 注意，[place_order](../trade/place-order.html#4080) 并未对 price 设置默认值，对于上述五类订单类型，仍需对 price 传参，price 可以传入任意值。

A2：各券商对单笔订单的股数及金额限制
<table style="font-size:14px;">
    <tr>
        <th>券商</th>
        <th>品类</th>
        <th>单笔订单股数上限</th>
        <th>单笔订单金额上限</th>
    </tr>
    <tr>
        <td rowspan="3">FUTU HK</td>
        <td>A股通</td>
        <td>1,000,000 股</td>
        <td>￥5,000,000</td>
    </tr>
    <tr>
        <td>美股</td>
        <td>500,000 股</td>
        <td>$5,000,000</td>
    </tr>
    <tr>
        <td>香港股票期货/期权</td>
        <td>3,000 手</td>
        <td>无限制</td>
    </tr>
    <tr>
        <td>moomoo US</td>
        <td>美股</td>
        <td>500,000 股</td>
        <td>$10,000,000</td>
    </tr>
    <tr>
        <td>moomoo SG</td>
        <td>美股</td>
        <td>500,000 股</td>
        <td>$5,000,000</td>
    </tr>
    <tr>
        <td>moomoo AU</td>
        <td>美股</td>
        <td>无限制</td>
        <td>无限制</td>
    </tr>
</table>


## Q10：对于改单接口，修改订单时，各订单类型对应的必传参数
A: 

<table style="font-size:14px;">
    <tr>
        <th>参数</th>
        <th>限价单</th>
        <th>市价单</th>
        <th>竞价限价单</th>
        <th>竞价市价单</th>
        <th>绝对限价单</th>
        <th>特别限价单</th>
        <th>特别限价且要求<br/>全部成交订单</th>
        <th>止损市价单</th>
        <th>止损限价单</th>
        <th>触及市价单（止盈）</th>
        <th>触及限价单（止盈）</th>
        <th>跟踪止损市价单</th>
        <th>跟踪止损限价单</th>
    </tr>
    <tr>
        <td>modify_order_op</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>order_id</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>price</td>
        <td>✓</td> <td></td> <td>✓</td> <td> </td> <td>✓</td> <td>✓</td> <td>✓</td>  <td></td><td>✓</td> <td></td> <td>✓</td><td> </td><td> </td>
    </tr>
    <tr>
        <td>qty</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>trd_env</td>
        <td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>aux_price</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td>✓</td><td>✓</td><td>✓</td><td>✓</td> <td> </td><td> </td>
    </tr>
    <tr>
        <td>trail_type</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td> </td><td> </td><td> </td><td> </td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>trail_value</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td> </td><td> </td><td> </td><td> </td> <td>✓</td><td>✓</td>
    </tr>
    <tr>
        <td>trail_spread</td>
        <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td> </td><td> </td><td> </td><td> </td><td> </td> <td> </td><td>✓</td>
    </tr>
</table>

`Python 用户` 注意，[modify_order](../trade/modify-order.html#7408) 并未对 price 设置默认值，对于上述五类订单类型，仍需对 price 传参，price 可以传入任意值。

## Q11：交易接口返回“当前证券业务账户尚未同意免责协议”？
A：  
点击下方链接完成协议确认，重启 OpenD 即可正常使用交易功能。
所属券商|协议确认
:-|:-|:-
FUTU HK|[点击这里](https://risk-disclosure.futuhk.com/index?agreementNo=HKOT0015)
Moomoo US|[点击这里](https://risk-disclosure.us.moomoo.com/index?agreementNo=USOT0027)
Moomoo SG|[点击这里](https://risk-disclosure.sg.moomoo.com/index?agreementNo=SGOT0015)
Moomoo AU|[点击这里](https://risk-disclosure.au.moomoo.com/index?agreementNo=AUOT0025)
Moomoo CA|[点击这里](https://risk-disclosure.ca.moomoo.com/index?agreementNo=CAOT0117)
Moomoo MY|[点击这里](https://risk-disclosure.my.moomoo.com/index?agreementNo=MYOT0066)
Moomoo JP|[点击这里](https://risk-disclosure.jp.moomoo.com/index?agreementNo=JPOT0140)


## Q12：典型日内交易者（PDT）相关

### 概述

客户使用moomoo证券(美国) 账户进行日内交易时，会受到美国 FINRA 的监管限制（此为美国券商受到的监管要求，与交易股票的所属市场无关。其他国家或地区的券商  (如：富途证券(香港)、moomoo证券(新加坡)) 的交易账户则不受此限制）。若用户在任意连续的5个交易日内，进行日内交易 3 次以上，则会被标记为典型日内交易者（PDT）。  
更多详情，[点击这里](https://fastsupport.fututrade.com/hans/category11014/scid11017)

### 进行日内交易的流程图
![PDT_process](../img/PDT_process.png) 

### 我愿意被标记为 PDT，且不希望程式交易被打断，如何关闭“防止被标记为 PDT”？
A：  
当您在连续的 5 个交易日内，进行第 4 次日内交易时，为了防止您被无意识地标记为 PDT，服务器会对此交易进行拦截。若您主动想被标记为 PDT，并且不希望服务器拦截，可以采取以下措施：  
在 [命令行 OpenD 中配置参数](../opend/opend-cmd.html#8799)，将启动参数 `pdt_protection` 的值修改为 0，以关闭“防止被标记为日内交易者”的功能。

![US_para](../img/US_para.png)  
注意：若您被标记 PDT，当您的账户权益小于$25000时，您将无法开仓。

### 如何关闭 DTCall 预警提醒？
A：  
您被标记为 PDT 后，需要留意账户的日内交易购买力（DTBP），日内交易超出 DTBP 时将收到日内交易保证金追缴（DTCall）。服务器会在您即将开仓下单超出剩余日内交易购买力前，阻止您的下单。若您仍然希望进行下单，并且不希望服务器拦截，可以采取以下措施：    
在 [命令行 OpenD 中配置参数](../opend/opend-cmd.html#8799)，将启动参数 `dtcall_confirmation` 的值修改为 0，以关闭“日内交易保证金追缴预警”的功能。

![US_para2](../img/US_para2.png)  
注意：若您开仓订单的市值大于您的剩余日内交易购买力，并且在今日平仓当前标的，您将会收到日内交易保证金追缴通知（Day-Trading Call），只能通过存入资金才能解除。

### 如何查看 DTBP 的值？
A：  
通过 [查询账户资金](../trade/get-funds.html#4346) 接口，可以获取日内交易相关的返回值，如：剩余日内交易次数、初始日内交易购买力、剩余日内交易购买力等。


## Q13：如何跟踪订单成交状态
A:
下单后，可使用以下接口跟踪订单成交状态：
<table>
    <tr>
      <th> 交易环境 </th>
      <th> 接口 </th>
    </tr>
    <tr>
      <td > 真实交易 </td>
      <td > [响应订单推送回调](../trade/update-order.html)，[响应成交推送回调](../trade/update-order-fill.html) </td>
    </tr>
    <tr>
	  <td> 模拟交易</td>
      <td> [响应订单推送回调](../trade/update-order.html)</td>
    </tr>
</table>

注意：对于非 python 语言用户，在使用上述两个接口之前，需要先进行 [订阅交易推送](../trade/sub-acc-push.html)

#### 响应订单推送回调 的特点：
反馈 整个订单 的信息变动。当以下 8 个字段发生变化时，会触发订单推送：  
`订单状态`，`订单价格`，`订单数量`，`成交数量`，`触发价格`，`跟踪类型`，`跟踪金额/百分比`，`指定价差`  

因此，当您进行下单、改单，撤单、使生效、使失效操作，或者订单在市场中发生了高级订单被触发、有成交变动的情况，都会触发订单推送。您只需要调用 [响应成交推送回调](../trade/update-order-fill.html)，即可监听这些信息。

#### 响应成交推送回调 的特点：
只反馈 单笔成交 的信息。当以下 1 个字段发生变化时，会触发订单推送：  
`成交状态`  

举例：假设一笔限价单订单 900 股，分成了 3 次才完全成交，每次成交分别是：200、300、400 股。  
![example](../img/example.png)


## Q14：下单接口返回“此产品最小单位为 xxx，请调整至最小单位的整数倍后再提交”？
A:  
对于不同市场的标的，交易所有着不同的最小变动单位要求。如果提交的订单价格不符合要求，订单将会被拒绝。各市场价位规则如下：  

### 价位规则
#### 香港市场

以港交所官方说明为准，点击 [这里](https://www.futufin.com/hans/support/topic605?lang=zh-cn)。


#### A 股市场
股票价位：0.01。

#### 美国市场
股票价位：
<table>
    <tr>
      <th> 合约价格 </th>
      <th> 价位 </th>
    </tr>
    <tr>
      <td > $1 以下 </td>
      <td > $0.0001 </td>
    </tr>
    <tr>
	  <td> $1 以上</td>
      <td> $0.01 </td>
    </tr>
</table>

期权价位：
<table>
    <tr>
      <th> 合约价格 </th>
      <th> 价位 </th>
    </tr>
    <tr>
      <td > $0.10 - $3.00 </td>
      <td > $0.01 或者 $0.05</td>
    </tr>
    <tr>
	  <td> $3.00 以上</td>
      <td> $0.05 或者 $0.10</td>
    </tr>
</table>

期货价位：不同合约价位规则不同。可以通过 [获取期货合约资料](../quote/get-future-info.html#7447) 接口的返回字段 `最小变动的单位` 查看。

### 怎么避免订单价格不在价位上？
* 方法一：通过 [获取实时摆盘](../quote/get-order-book.html) 接口，获取合法的交易价格。交易所摆盘上的价位一定是合法的价位。  
* 方法二：通过 [下单](../trade/place-order.html) 接口的参数 `价格微调幅度`，将传入价格自动调整到合法的交易价格上。  

   例如：假设腾讯控股当前市价为 359.600，根据价位规则，对应的最小变动价位为 0.200。  

   假设您的下单传入订单价格为 359.678，价格微调幅度为 0.0015，代表接受 OpenD 对传入价格自动向上调整到最近的合法价位，且不能超过 0.15%。此情景下，向上最近的合法价格为 359.800，价格实际需要调整的幅度为 0.034%，符合价格微调幅度的要求，因此最终提交的订单价格为 359.800。  

   若价格微调幅度设置数值小于实际需要调整的幅度，OpenD 自动调整价位失败，订单仍会返回报错“订单价格不在价位上”。


## Q15：我的购买力足够，为什么下市价单会返回“购买力不足”？
A：
### 为什么市价单会提示购买力不足  
- 出于风控考量，系统给了市价单较高的购买力系数。在所有订单参数都相同的情况下，选择市价单会比限价单占用更多的购买力。  
- 而且对于不同的品种，和不同的市场情况，风控系统会对市价单的购买力系数做动态调整。所以在下市价单时，若您通过最大购买力去计算最大可买数量，计算的结果很可能是不准确的。  
### 如何计算正确的可买数量  
不建议自己计算，您可以通过 [查询最大可买可卖](../trade/get-max-trd-qtys.html) 接口获取正确的可买数量。  
### 如何尽可能买更多  
您可以用价格为对价的限价单，替代市价单进行交易。  
其中，对价：买1价（下卖单时）或 卖1价（下买单时）  


## Q16：API模拟交易下单，支持美股融资融券模拟账户接入
A：  
API模拟交易下单，已经支持美股融资融券模拟账户接入，交易能力更全面。  
原API接口后续将陆续下线美股模拟交易服务，为保障更优质的使用体验，建议您尽快切换至新接口，畅享专业的美股模拟交易服务。


## Q17：交易接口参数使用说明
### 1. 什么是交易对象？
您的平台账号下一般会开设一个保证金综合账户，其中有多个交易子账户（正常有两个，一个综合证券账户，一个综合期货账户；根据需要还可能有综合外汇账户等其他子账户）。一些特殊用户或机构客户可能会在多个券商下开设多个综合账户。  
创建交易对象，是初步筛选子账户的过程。
- 使用 OpenSecTradeContext 创建的交易对象，调用 get_acc_list 时只会返回**证券交易账户**
- 使用 OpenFutureTradeContext 创建的交易对象，调用 get_acc_list 时只会返回**期货交易账户**  

参数 security_firm 用来筛选对应归属券商的账户，参数 filter_trdmarket  用来筛选对应交易市场权限的账户。
#### 1.1 security_firm 券商参数
Futu API 目前支持的券商有 [这些](../trade/trade.html#572)。  
创建的交易对象，在调用 get_acc_list 时，会返回 security_firm 对应券商的真实账户和所有模拟交易账户（这是因为模拟交易没有券商的概念，所以无论 security_firm 传什么，都会返回所有的模拟账户）。  
security_firm 的默认值是 FUTUSECURITIES，FUTU HK 券商账户可以不填此参数，但需要获取其他券商的账户时，需要修改券商参数。  
* **Example 1**

```python
trd_ctx = OpenSecTradeContext(security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.get_acc_list()
print(data)
```

* **Output**

```python
               acc_id   trd_env acc_type      uni_card_num          card_num   security_firm sim_acc_type                  trdmarket_auth acc_status
0  281756478396547854      REAL   MARGIN  1001200163530138  1001369091153722  FUTUSECURITIES          N/A  [HK, US, HKCC, HKFUND, USFUND]     ACTIVE
1             3450309  SIMULATE     CASH               N/A               N/A             N/A        STOCK                            [HK]     ACTIVE
2             3548731  SIMULATE   MARGIN               N/A               N/A             N/A       OPTION                            [HK]     ACTIVE
3  281756455998014447      REAL   MARGIN               N/A  1001100320482767  FUTUSECURITIES          N/A                            [HK]   DISABLED
```

* **Example 2**
```python
trd_ctx = OpenSecTradeContext(security_firm=SecurityFirm.FUTUSG)
ret, data = trd_ctx.get_acc_list()
print(data)
```
* **Output**
```python
    acc_id   trd_env acc_type uni_card_num card_num security_firm sim_acc_type trdmarket_auth acc_status
0  3450309  SIMULATE     CASH          N/A      N/A           N/A        STOCK           [HK]     ACTIVE
1  3548731  SIMULATE   MARGIN          N/A      N/A           N/A       OPTION           [HK]     ACTIVE
```


#### 1.2 filter_trdmarket 交易市场参数
Futu API 目前支持的交易市场有 [这些](../trade/trade.html#719)。

创建的交易对象，在调用 get_acc_list 时，会返回所有拥有 filter_trdmarket 市场交易权限的账户；当 filter_trdmarket 入参传 NONE 时，不过滤市场，返回所有的账户。  
filter_trdmarket 的默认参数是 HK，在综合账户体系下，这个参数用来筛选不同市场下的模拟交易账户。  
* **Example 1**

```python
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.US)
ret, data = trd_ctx.get_acc_list()
print(data)
```
* **Output**
```python
               acc_id   trd_env acc_type      uni_card_num          card_num   security_firm sim_acc_type                  trdmarket_auth acc_status
0  281756478396547854      REAL   MARGIN  1001200163530138  1001369091153722  FUTUSECURITIES          N/A  [HK, US, HKCC, HKFUND, USFUND]     ACTIVE
1             3450310  SIMULATE   MARGIN               N/A               N/A             N/A        STOCK                            [US]     ACTIVE
2             3548732  SIMULATE   MARGIN               N/A               N/A             N/A       OPTION                            [US]     ACTIVE
3  281756460292981743      REAL   MARGIN               N/A  1001100520714263  FUTUSECURITIES          N/A                            [US]   DISABLED
```

* **Example 2**
```python
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.NONE)
ret, data = trd_ctx.get_acc_list()
print(data)
```
* **Output**
```python
                acc_id   trd_env acc_type      uni_card_num          card_num   security_firm sim_acc_type                  trdmarket_auth acc_status
0   281756478396547854      REAL   MARGIN  1001200163530138  1001369091153722  FUTUSECURITIES          N/A  [HK, US, HKCC, HKFUND, USFUND]     ACTIVE
1              3450309  SIMULATE     CASH               N/A               N/A             N/A        STOCK                            [HK]     ACTIVE
2              3450310  SIMULATE   MARGIN               N/A               N/A             N/A        STOCK                            [US]     ACTIVE
3              3450311  SIMULATE     CASH               N/A               N/A             N/A        STOCK                            [CN]     ACTIVE
4              3548732  SIMULATE   MARGIN               N/A               N/A             N/A       OPTION                            [US]     ACTIVE
5              3548731  SIMULATE   MARGIN               N/A               N/A             N/A       OPTION                            [HK]     ACTIVE
6   281756455998014447      REAL   MARGIN               N/A  1001100320482767  FUTUSECURITIES          N/A                            [HK]   DISABLED
7   281756460292981743      REAL   MARGIN               N/A  1001100520714263  FUTUSECURITIES          N/A                            [US]   DISABLED
8   281756468882916335      REAL   MARGIN               N/A  1001100610464507  FUTUSECURITIES          N/A                          [HKCC]   DISABLED
9   281756507537621999      REAL     CASH               N/A  1001100910390035  FUTUSECURITIES          N/A                        [HKFUND]   DISABLED
10  281756550487294959      REAL     CASH               N/A  1001101010406844  FUTUSECURITIES          N/A                        [USFUND]   DISABLED
```
::: tip 提示  
当 filter_trdmarket 入参NONE时，可以返回所有的交易账户。其中第0行是真实账户，1~5行均为模拟交易账户，6~10行是已失效的真实账户。这些失效账户都是单市场账户，现已被综合账户替代。但历史订单和历史成交还在这些已失效的账户中，可以通过这些账户来查询。  
OpenFutureTradeContext 对象中没有 filter_trdmarket 参数，只有 security_firm 参数，功能与 OpenSecTradeContext  一样。  
:::  

### 2. 交易接口参数
在使用具体的交易接口（如下单、查询订单列表）时，接口中的 `trd_env`, `acc_index` 和 `acc_id` 参数，会先筛选确认一个唯一的账户，对此账户实施对应的接口行为。
![acc-select](../img/acc-select.jpg)

::: tip 总结
1. 根据 trd_env 筛选出真实账户还是模拟账户
2. 在筛选结果中，优先选择 acc_id 指定的账户
3. 如果 acc_id 为0，则通过 acc_index选取对应账号
4. 报错场景：指定的 acc_id 不存在，或 acc_index 超出范围  
:::


### 3. 应用举例
#### 3.1 综合证券账户实盘下单
```python
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.NONE, security_firm=SecurityFirm.FUTUSECURITIES)
ret, data = trd_ctx.unlock_trade("123123")
if ret == RET_OK:
    print("解锁成功")
    ret, data = trd_ctx.place_order(45, 200, 'HK.00700', TrdSide.BUY,
                                    order_type=OrderType.NORMAL,
                                    trd_env=TrdEnv.REAL,  # 和默认参数一样，可以不填
                                    acc_id=0)  # 和默认参数一样，可以不填
    print(data)
```

#### 3.2 综合期货账户查询实盘订单列表
```python
trd_ctx = OpenFutureTradeContext(security_firm=SecurityFirm.FUTUSECURITIES)

ret, data = trd_ctx.order_list_query(trd_env=TrdEnv.REAL,   # 和默认参数一样，可以不填
                                     acc_id=0)  # 和默认参数一样，可以不填
print(data)
```

#### 3.3 港股模拟现金账户查询账户资金
```python
# filter_trdmarket 填 TrdMarket.HK
# trd_env 填 TrdEnv.SIMULATE
# acc_index 填 0
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.HK)
ret, data = trd_ctx.accinfo_query(trd_env=TrdEnv.SIMULATE, acc_index=0)
print(data)
```

#### 3.4 美股模拟保证金账户下单期权
```python
# 通过 filter_trdmarket 和 trd_env 筛选完之后只剩两个账户
# 第0个是美股现金账户（交易股票）,第1个是美股保证金账户（交易期权）
# acc_index 填 1 指定美股保证金账户
trd_ctx = OpenSecTradeContext(filter_trdmarket=TrdMarket.US)
ret, data = trd_ctx.place_order(10, 1, code="US.AAPL250618P550000",trd_side=TrdSide.BUY,
                                trd_env=TrdEnv.SIMULATE,
                                acc_index=1)
print(data)
```

#### 3.5 日本期货模拟账户查询最大可买卖
```python
# 将 get_acc_list 的结果打印出来，可以看到日本期货模拟账户的 acc_id 是 6271199
# 请求最大可买卖接口时传入这个 acc_id 
trd_ctx = OpenFutureTradeContext()
ret, data = trd_ctx.acctradinginfo_query(order_type=OrderType.NORMAL,
                                         price=5000,
                                         trd_env=TrdEnv.SIMULATE,
                                         acc_id=6271199,
                                         code="JP.NK225main")
print(data)
```


### 4. API 中的账户如何与 APP/桌面端对应

![card-app](../img/card-app.png)
APP 上的账户仅显示卡号后 4 位数字，我们将 [get_acc_list](../trade/get-acc-list.html) 的返回结果打印出来后，有 uni_card_num 列和 card_num 列，分别对应综合账户的卡号，和单币种账户（已废弃）的卡号。通过卡号后 4 位数就能把 API 中获取到的账号与 APP 上对应起来了。

---



---

# 其他

## Q1：如何编译C++ API？

A: 
futu api c++ SDK支持Windows/MacOS/Linux，每个系统提供了以下编译环境生成的库文件：
操作系统|编译工具
:-|:-
Windows |Visual Studio 2013
Centos 7|g++ 4.8.5
Ubuntu 16.04|g++ 5.4.0
MacOS | XCode 11

如果编译器版本不同，或依赖的protobuf版本不同，则可能需要自己使用源码重新编译FTAPI和protobuf，源码位置见下图目录：

```
FTAPI目录结构：
+---Bin                               存放各个系统默认编译环境编译出的依赖库
+---Include                           存放公共头文件，以及proto协议生成的.h/.cc文件
+---Sample                            示例工程
\---Src
    +---FTAPI                         FTAPI源码
    +---protobuf-all-3.5.1.tar.gz     protobuf源码
```

#### 编译步骤：
1. 重新编译protobuf：生成libprotobuf静态库
2. 从协议proto文件中生成C++文件
3. 重新编译FTAPI: 源码在Src/FTAPI，生成libFTAPI静态库

#### 步骤1： 重新编译protobuf：
- Windows：
  - 安装CMake
  - 打开VS命令行工具，cd到protobuf/cmake目录
  - 执行：cmake -G "Visual Studio 12 2019" -DCMAKE_INSTALL_PREFIX=install -Dprotobuf_BUILD_TESTS=OFF  这样会生成Visual Studio 2019的项目文件，其它版本Visual Studio请修改-G参数
  - 打开生成的Visual Studio项目文件，平台工具集设置为v120_xp，编译即可
- Linux（参考protobuf/src/README）
  - 执行 ./autogen.sh
  - 执行 CXXFLAGS="-std=gnu++11" ./configure --disable-shared
  - 执行 make
  - 将生成的libprotobuf.a放入Bin/Linux目录
- MacOS（参考protobuf/src/README）
  - 使用brew安装这些依赖库：autoconf automake libtool
  - 执行./configure CC=clang CXX="clang++ -std=gnu++11 -stdlib=libc++" --disable-shared

#### 步骤2: 重新生成proto代码
- 上面编译Protobuf后会同时生成可执行文件protoc。用protoc将Include/Proto下面的.proto文件生成对应的.h和.cc文件。例如命令以下命令会从Common.proto生成对应的Common.pb.h和Common.pb.cc
  - protoc -I="FTAPI路径/Include/Proto" --cpp_out="." FTAPI路径/Include/Proto/Common.proto
- 将生成的.h和.cc文件放到Include/Proto下面

#### 步骤3: 重新编译FTAPI
- Windows：新建Visual Studio C++静态库工程，将Src/FTAPI和Include下的源码加入工程中，平台工具集设置为v120_xp，然后编译
- Mac：新建XCode C++静态库工程，将Src/FTAPI和Include下的源码加入工程中，然后编译
- Linux：使用CMake编译FTAPI静态库，在FTAPI路径/Src目录下执行：
  - cmake -DTARGET_OS=Linux

## Q2：有没有更完整的策略样例可以参考？

A:
* Python 策略样例在 /futu/examples/ 文件夹下。您可以通过执行如下命令，找到 Python API 的安装路径：
    ```
    import futu
    print(futu.__file__)
    ```
* C# 策略样例在 /FTAPI4NET/Sample/ 文件夹下
* Java 策略样例在 /FTAPI4J/sample/ 文件夹下
* C++ 策略样例在 /FTAPI4CPP/Sample/ 文件夹下
* JavaScript 策略样例在 /FTAPI4JS/sample/ 文件夹下


## Q3：使用 python API 导入异常

A：

**场景一**：已经在 Python 环境中安装了 futu 模块，仍然提示 No module named 'futu'？  
很可能是因为当前 IDE 所使用的 interpreter 并不是你装过 futu 模块的 interpreter。也就是说，您的电脑可能装了两个以上的 Python 环境。
您可以操作如下两步：
1. 在 Python 中运行如下代码，得到当前 interpreter 的路径：
```
import sys
print(sys.executable)
```
示例图：  
 ![No module named 'futu'](../img/import-futu-error.png)

2. 在命令行中，执行 `$ D:\software\anaconda3\python.exe -m pip install futu-api`（其中前半部分的文件路径来自第 1 步打印的路径）。
这样就可以在当前的 interpreter 中也安装一份 futu 模块。

## Q4： import 成功了，仍然调用不了相关接口？ 

A：通常遇到这种情况，需要确认一下：成功导入的 futu，是不是真正的 Futu API 模块。以下几种场景也可能 import 成功。

**场景一**：存在与“futu”重名的文件

  1. 当前文件名是 futu.py
  2. 当前文件所在目录下存在另一个名为 futu.py 的文件
  3. 当前文件所在目录下存在名为 `/futu` 的文件夹    

因此，我们强烈建议您，在给文件 / 文件夹 / 工程起名的时候，不要起名叫“futu”。重名一时爽，查 bug 两行泪。

**场景二**：误装了一个名为“futu”的第三方库  

   Futu API 的正确名称为`futu-api`，而非“futu”。   

   如果您安装过名为“futu”的第三方库，请将其卸载，并 [下载 futu-api](../quick/demo.md#4688)。
   
   以 PyCharm 为例：查看第三方库的安装情况。

   ![settings](../img/settings.png)  
   ![futuku](../img/futuku.png)


## Q5：协议加密相关

A：  
### 概述
您可以使用非对称加密算法 RSA，对策略程序（Futu API）与 OpenD 之间的请求和返回内容进行加密，以保证通信安全。  
如果您的策略程序（Futu API）与 FutuOpenD 在同一台电脑上，则通常无需加密。

### 协议加密流程
您可以尝试通过以下步骤解决此问题：
1. 通过第三方 web 平台自动生成密钥文件。  
    - 具体方法：在 baidu 或 google 上搜索“RSA 在线生成”，**密钥格式**设置为 PKCS#1，**密钥长度**设置为 1024 bit，不需要设置私钥密码，点击**生成密钥对**。  
    ![ui-config](../img/create_rsa.png)  

2. 将生成的 **RSA 加密私钥** 复制粘贴至 txt 记事本，并保存至 OpenD 所在电脑的指定路径。
3. 在 OpenD 所在的电脑中，指定 **RSA 加密私钥** 的路径。  
    - 方式一：在 [可视化 OpenD](../quick/opend-base.md#4147) 启动界面右侧的“加密私钥”一栏，指定上一步骤中放置 **RSA 加密私钥** 的路径。如下图所示：  
    ![ui-config](../img/nnrsa_ui-config.png)  
    - 方式二：在 [命令行 OpenD](../opend/opend-cmd.md#8799) 启动文件 OpenD.xml 中，找到参数`rsa_private_key`，将其配置为第 2 步中 **RSA 加密私钥** 的路径。如下图所示：  
    ![ui-config](../img/nnrsa_xml.png)  
4. 将第 2 步中 txt 文件另存至策略程序（Futu API）所在电脑的指定路径， 并在策略程序中将此路径 [设置为私钥路径](../ftapi/init.md#5641)。
5. 在策略程序（Futu API）中启用协议加密。 启用协议加密的方式有两种，其中方式二的优先级更高。
    - 方式一：对单条的连接加密（通用）。在对 [行情对象](../quote/base.md#7902) 或 [交易对象](../trade/base.md#7902) 创建连接时，通过 **是否启用加密** 参数设置加密。
    - 方式二：对所有的连接加密（仅 Python）。通过`enable_proto_encrypt`接口设置加密，详见 [这里](../ftapi/init.md#319)。


:::tip 提示
* 在 OpenD 或策略程序（Futu API）中指定 **RSA 加密私钥** 路径时，需指定至 txt 文件本身。
* RSA 加密公钥无需保存，可通过私钥计算得到。
:::


## Q6：为什么我获取的 DataFrame 数据，只能展示一部分 ？

A：打印 pandas.DataFrame 数据的时候，如果行列数过多，pandas 默认会将数据折叠，导致看起来显示不全。  
因此，并不是接口返回数据真的不全。您只需要在 Python 脚本前面加上如下代码即可解决。

```
import pandas as pd
pd.options.display.max_rows=5000
pd.options.display.max_columns=5000
pd.options.display.width=1000
```

## Q7：Mac 机器使用 C++ 语言的 API，遇到 “无法打开 libFTAPIChannel.dylib” 的问题

A：在对应库目录中执行以下命令即可解决:`$ xattr -r -d com.apple.quarantine libFTAPIChannel.dylib`。


## Q8：Python 用户，为什么在 OpenD 配置文件中设置了日志级别为 no 后，log 文件夹下仍然持续产生超大容量的日志文件？

A：OpenD 配置文件中的日志级别参数，只用来控制 OpenD 产生的日志。而 Python API 默认也会产生日志，如果您不希望希望 Python API 产生日志，可以在 Python 脚本加上如下语句：

```
logger.file_level = logging.FATAL  # 用于关闭 Python API 日志
logger.console_level = logging.FATAL  # 用于关闭 Python 运行时的控制台日志
```


## Q9：对于 5.4 及以上的版本，Java API 的库名和配置方式的变更

A:
* 如果您是 Java API 5.3 及以下版本的用户，在更新版本时，请注意以下变更：

  **配置流程的变更**：

  1. 通过 [富途牛牛官网](https://www.futunn.com/download/OpenAPI)下载 Futu API。
  2. 解压下载好的 FTAPI 文件，`/FTAPI4J` 是 Java API 的目录，将目录结构中的 `/lib/futu-api-.x.y.z.jar` 添加到您的工程设置中。创建 futu-api 工程请参考 [这里](../quick/demo.html#2927)。


  **目录结构的变更**：
  1. Futu API 的 Java 版本，库名由之前的 ftapi4j.jar 变更为 `futu-api-x.y.z.jar`，其中 “x.y.z” 表示版本号。
  2. 第三方库的引用中，去掉了 /lib/jna.jar 和 /lib/jna-platform.jar 依赖，增加了 `/lib/bcprov-jdk15on-1.68.jar` 和 `/lib/bcpkix-jdk15on-1.68.jar` 依赖。
    ```
    +---ftapi4j                      futu-api 源码，如果所用 JDK 版本不兼容可以用这里的工程重新编译出 futu-api.jar
    +---lib                          存放公共库文件
    |    futu-api-x.y.z.jar          Futu API 的 Java 版本
    |    bcprov-jdk15on-1.68.jar     第三方库，用于加解密
    |    bcpkix-jdk15on-1.68.jar     第三方库，用于加解密
    |    protobuf-java-3.5.1.jar     第三方库，用于解析 protobuf 数据
    +---sample                       示例工程
    +---resources                    maven 工程默认生成的目录
    ```
* 如果您第一次接触 Futu API，我们提供了更便捷的通过 maven 仓库配置 Java API 的方式。配置流程请参考 [这里](../quick/demo.html#5757)。


## Q10：Python 用户，使用 pyinstaller 打包脚本时报错：找不到 Common_pb2 模块

A：你可以尝试通过以下步骤解决此问题：
1. 假设你需要对 main.py 进行打包。使用命令行语句，运行代码：pyinstaller main.py，不要加参数 “- F”（path 为 main.py 的所在路径）
  ```
  pyinstaller path\main.py
  ```
  打包成功后，main.py 所在目录下的 /dist 中，会生成 /main 文件夹，main.exe 就在这个文件夹中。  
  ![dist](../img/dist.png)  
2. 运行以下代码，找到 futu-api 的安装目录。  
  ```
  import futu
  print(futu.__file__)
  ```
  运行结果:  
  ```
  C:\Users\ceciliali\Anaconda3\lib\site-packages\futu\__init__.py
  ```
  ![path_futu](../img/path_futu.png)  

3. 打开上图文件夹中的 /common/pb，将所有文件全部复制到 /main 中。

4. 在 /main 中创建文件夹，命名为 futu，将上图文件夹中的 `VERSION.txt` 文件复制到 /main/futu 中。  
  ![main_futu](../img/main_futu.png) 
5. 再次尝试运行 main.exe

## Q11：接口调用结果正常，但其返回表现不符合预期？
A:
* 接口调用结果正常，表示富途已经成功收到并响应了您的请求，但接口返回表现可能与您的预期不符。  

  例如：若您在非交易时段调用 [订阅](../quote/sub.md) 接口，虽然您的请求可以被成功响应，并且接口调用结果正常，但在非交易时段下，交易所无行情数据变动，所以您将暂时无法收到行情数据推送，直至市场重新回到交易时段。  
* 接口调用结果可以通过返回字段（定义参见：[接口调用结果](../ftapi/common.md#7467)）查看，返回字段为 0 代表接口调用正常，非 0 代表接口调用失败。  
  
  对于 Python 用户，下面两种写法等价：
  ```
  if ret_code == RET_OK:
  ```
  ```
  if ret_code == 0:
  ```

## Q12：WebSocket相关
A：

### 概述

Futu API 中，WebSocket 主要用于以下两方面：
* 可视化 OpenD 中，UI 界面跟底层的命令行 OpenD 的通信使用 WebSocket 方式。
* JavaScript API 跟 OpenD 之间的通信使用 WebSocket 方式。

![WebSocket-struct](../img/WebSocket-struct.png)  
* 当 WebSocket 启动时，命令行 OpenD 会与 **FTWebSocket 中转服务** 建立 Socket 连接（TCP），这一连接会用到默认的 **监听地址** 和 **API 协议监听端口**。
* 同时，JavaScript API 会与 **FTWebSocket 中转服务** 建立 WebSocket 连接（HTTP），这一连接会用到 **WebSocket 监听地址** 和 **WebSocket 端口**。

### 使用
为保证账户安全，当 WebSocket 监听来自非本地请求时，我们强烈建议您启用 SSL 并配置 **WebSocket 鉴权密钥**。

SSL 通过在配置 **WebSocket 证书** 以及 **WebSocket 私钥** 来启用。  
命令行 OpenD 可通过配置 OpenD.xml 或配置命令行参数来设置文件路径。可视化 OpenD 点击【更多选项】下拉菜单，可以看到设置项。

![ui-more-config](../img/ui-more-config.png)

::: tip 提示
如果证书是自签的，则需要在调用 JavaScript 接口所在机器上安装该证书，或者设置不验证证书。
:::

#### 生成自签证书
自签证书生成详细资料不便在此文档展开，请自行查阅。  
在此提供较简单可用的生成步骤：
1. 安装 openssl。
2. 修改 openssl.cnf，在 alt_names 节点下加上 OpenD 所在机器 IP 地址或域名。  
例如：IP.2 = xxx.xxx.xxx.xxx, DNS.2 = www.xxx.com
3. 生成私钥以及证书（PEM）。

**证书生成参数参考如下**：  
`openssl req -x509 -newkey rsa:2048 -out futu.cer -outform PEM -keyout futu.key -days 10000 -verbose -config openssl.cnf -nodes -sha256 -subj "/CN=Futu CA" -reqexts v3_req -extensions v3_req`

::: tip 提示
* openssl.cnf 需要放到系统路径下，或在生成参数中指定绝对路径。
* 注意生成私钥需要指定不设置密码（-nodes）。
:::

附上本地自签证书以及生成证书的配置文件供测试：  
* [openssl.cnf](../file/openssl.cnf)  
* [futu.cer](../file/cer)  
* [futu.key](../file/key)

## Q13：API 的行情和交易服务分别部署在哪里？
A：  
- 行情：  

平台账号|行情服务器所在地
:-|:-|:-
牛牛号|腾讯云广州和香港
moomoo 号|腾讯云美国弗吉尼亚和新加坡

- 交易：  

所属券商|交易服务器所在地
:-|:-|:-
富途证券(香港)|香港
moomoo证券(美国)|腾讯云美国弗吉尼亚
moomoo证券(新加坡) |腾讯云新加坡
moomoo证券(澳大利亚)|腾讯云新加坡
moomoo证券(马来西亚)|阿里云马来西亚
moomoo证券(加拿大)|AWS加拿大
moomoo证券(日本)|腾讯云日本


## Q14：关于综合账户升级的过渡指引

### 1. [**综合账户升级**](https://www.futuhk.com/hans/support/topic2_1734)
综合账户支持以多种货币在同一个账户内交易不同市场品类。从单币种账户升级到综合账户，是在您原来的牛牛号下，进行账户迁移。主要包括：
- 创建新的综合账户
- 将您原来单币种业务账户里的资产，转移到综合账户里
- 关闭原来的单币种账户

### 2. **OpenD版本升级**
我们会在 2024年9月14日、15日 集中为 Futu API 客户的账户做升级，请提前检查 OpenD 和 API 版本号：  
- **7.01 及以下版本**  
  OpenD 因版本过旧，将于 2024/09/14 停止服务。届时，已登录的账户会被强制退出登录。我们建议您在 9/14 之前升级 [OpenD](../quick/opend-base.html#4147) 和 [API](../quick/demo.html#4688) 至最新版本，且不要在 9/14~9/15 期间跨周末运行策略。
- **7.02 ~ 8.2 版本**  
  OpenD 版本较旧，无法获取综合账户。我们建议您在 9/14 之前升级 [OpenD](../quick/opend-base.html#4147) 和 [API](../quick/demo.html#4688) 至最新版本，且不要在 9/14~9/15 期间跨周末运行策略。
- **8.3 及以上版本**  
  可以正常使用，我们建议您不要在 9/14~9/15 期间跨周末运行策略。  

综合账户升级时，您的资产会转移到新的综合账户，如果策略指定旧的账户，可能会运行异常。同时，在实盘交易之前，建议您进行必要的检查与测试，确保一切设置正常。

### 3. **账户升级后，Futu API有哪些表现？**
- Python API 将不再支持使用 OpenHKTradeContext,  OpenUSTradeContext, OpenHKCCTradeContext, OpenCNTradeContext 创建交易对象，请参考 [创建交易对象连接](../trade/base.html#7902) 改用 OpenSecTradeContext。  
- 非Python API用户，在使用 Trd_GetAccList 接口时，需要将 needGeneralSecAccount 参数设为 true，才能获取到综合账户的相关信息。  
- 账户新增 [账户状态](../trade/trade.html#121): 在使用 [获取交易业务账户列表](../trade/get-acc-list.html#5754) 时，返回结果新增了账户状态 。综合账户标记为 `ACTIVE` 生效账户，被停用的单币种账户标记为 `DISABLED` 失效账户。  
- [下单](../trade/place-order.html#4080)、[改单撤单](../trade/modify-order.html#7408)、[查询最大可买可卖](../trade/get-max-trd-qtys.html#2713) 等交易接口表现  
    - 支持使用 `ACTIVE` 生效账户所对应的 acc_id或acc_index 进行购买力查询与交易。
    - 不支持使用 `DISABLED` 失效账户所对应的 acc_id或acc_index 进行购买力查询与交易，若使用，将会出现报错信息。
    - Python API用户：在接口入参中，请指定 acc_id 为升级后的综合账户。
    - 非Python API用户：在 TrdHeader 中，请指定accID为升级后的综合账户。

---

