# 获取内部人持股列表
- Python
- Proto
- C#
- Java
- C++
- JavaScript
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返回
参数 类型 说明 ret RET_CODE 接口调用结果 data pd.DataFrame 当 ret == RET_OK,返回内部人持股 DataFrame str 当 ret != RET_OK,返回错误描述 返回 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
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()
2
3
4
5
6
7
8
9
10
11
- Output
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
2
3
4
5
6
7
8
9
10
11
12
13
# Qot_GetInsiderHolderList.proto
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
协议 ID
3241
uint GetInsiderHolderList(QotGetInsiderHolderList.Request req);
virtual void OnReply_GetInsiderHolderList(FTAPI_Conn client, uint nSerialNo, QotGetInsiderHolderList.Response rsp);
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
public class Program : FTSPI_Qot, FTSPI_Conn
{
FTAPI_Qot qot = new FTAPI_Qot();
public Program()
{
qot.SetClientInfo("csharp", 1);
qot.SetConnCallback(this);
qot.SetQotCallback(this);
}
public void Start()
{
qot.InitConnect("127.0.0.1", (ushort)11111, false);
}
public void OnInitConnect(FTAPI_Conn client, long errCode, String desc)
{
Console.Write("Qot onInitConnect: ret={0} desc={1} connID={2}\n", errCode, desc, client.GetConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.CreateBuilder()
.SetMarket((int)QotCommon.QotMarket.QotMarket_US_Security)
.SetCode("AAPL")
.Build();
QotGetInsiderHolderList.C2S c2s = QotGetInsiderHolderList.C2S.CreateBuilder()
.SetSecurity(sec)
.Build();
QotGetInsiderHolderList.Request req = QotGetInsiderHolderList.Request.CreateBuilder().SetC2S(c2s).Build();
uint seqNo = qot.GetInsiderHolderList(req);
Console.Write("Send QotGetInsiderHolderList: {0}\n", seqNo);
}
public void OnDisconnect(FTAPI_Conn client, long errCode)
{
Console.Write("Qot onDisConnect: {0}\n", errCode);
}
public void OnReply_GetInsiderHolderList(FTAPI_Conn client, uint nSerialNo, QotGetInsiderHolderList.Response rsp)
{
Console.Write("Reply: QotGetInsiderHolderList: {0} {1}\n", nSerialNo, rsp.ToString());
}
public static void Main(String[] args)
{
FTAPI.Init();
Program qot = new Program();
qot.Start();
while (true)
Thread.Sleep(1000 * 600);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
- Output
sent seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
itemList {
holderId: 234085
holderQuantity: 4125576
holderPct: 0.028
name: "Arthur Levinson"
title: "独立非执行主席"
}
itemList {
//...
}
allCount: 17
nextKey: "10"
insiderTotalCount: 17
insiderBoughtCount: 11
insiderSoldCount: 8
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int getInsiderHolderList(QotGetInsiderHolderList.Request req);
void onReply_GetInsiderHolderList(FTAPI_Conn client, int nSerialNo, QotGetInsiderHolderList.Response rsp);
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
public class QotDemo implements FTSPI_Qot, FTSPI_Conn {
FTAPI_Conn_Qot qot = new FTAPI_Conn_Qot();
public QotDemo() {
qot.setClientInfo("javaclient", 1);
qot.setConnSpi(this);
qot.setQotSpi(this);
}
public void start() {
qot.initConnect("127.0.0.1", (short)11111, false);
}
@Override
public void onInitConnect(FTAPI_Conn client, long errCode, String desc)
{
System.out.printf("Qot onInitConnect: ret=%b desc=%s connID=%d\n", errCode, desc, client.getConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.newBuilder()
.setMarket(QotCommon.QotMarket.QotMarket_US_Security_VALUE)
.setCode("AAPL")
.build();
QotGetInsiderHolderList.C2S c2s = QotGetInsiderHolderList.C2S.newBuilder()
.setSecurity(sec)
.build();
QotGetInsiderHolderList.Request req = QotGetInsiderHolderList.Request.newBuilder().setC2S(c2s).build();
int seqNo = qot.getInsiderHolderList(req);
System.out.printf("Send QotGetInsiderHolderList: %d\n", seqNo);
}
@Override
public void onDisconnect(FTAPI_Conn client, long errCode) {
System.out.printf("Qot onDisConnect: %d\n", errCode);
}
@Override
public void onReply_GetInsiderHolderList(FTAPI_Conn client, int nSerialNo, QotGetInsiderHolderList.Response rsp) {
if (rsp.getRetType() != 0) {
System.out.printf("QotGetInsiderHolderList failed: %s\n", rsp.getRetMsg());
}
else {
try {
String json = JsonFormat.printer().print(rsp);
System.out.printf("Receive QotGetInsiderHolderList: %s\n", json);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
FTAPI.init();
QotDemo qot = new QotDemo();
qot.start();
while (true) {
try {
Thread.sleep(1000 * 600);
} catch (InterruptedException exc) {
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
- Output
Qot onInitConnect: ret=0 desc= connID=7459213608141408964
Send Qot_GetInsiderHolderList: 2
Receive Qot_GetInsiderHolderList: retType: 0
retMsg: ""
errCode: 0
s2c {
itemList {
holderId: 234085
holderQuantity: 4125576
holderPct: 0.028
name: "Arthur Levinson"
title: "独立非执行主席"
}
itemList {
//...
}
allCount: 17
nextKey: "10"
insiderTotalCount: 17
insiderBoughtCount: 11
insiderSoldCount: 8
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Futu::u32_t GetInsiderHolderList(const Qot_GetInsiderHolderList::Request &stReq);
virtual void OnReply_GetInsiderHolderList(Futu::u32_t nSerialNo, const Qot_GetInsiderHolderList::Response &stRsp) = 0;
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
class Program : public FTSPI_Qot, public FTSPI_Trd, public FTSPI_Conn
{
public:
Program() {
m_pQotApi = FTAPI::CreateQotApi();
m_pQotApi->RegisterQotSpi(this);
m_pQotApi->RegisterConnSpi(this);
}
~Program() {
if (m_pQotApi != nullptr)
{
m_pQotApi->UnregisterQotSpi();
m_pQotApi->UnregisterConnSpi();
FTAPI::ReleaseQotApi(m_pQotApi);
m_pQotApi = nullptr;
}
}
void Start() {
m_pQotApi->InitConnect("127.0.0.1", 11111, false);
}
virtual void OnInitConnect(FTAPI_Conn* pConn, Futu::i64_t nErrCode, const char* strDesc) {
cout << "connect" << endl;
// construct request message
Qot_GetInsiderHolderList::Request req;
Qot_GetInsiderHolderList::C2S *c2s = req.mutable_c2s();
Qot_Common::Security *sec = c2s->mutable_security();
sec->set_code("AAPL");
sec->set_market(Qot_Common::QotMarket::QotMarket_US_Security);
m_pQotApi->GetInsiderHolderList(req);
cout << "GetInsiderHolderList" << endl;
}
virtual void OnReply_GetInsiderHolderList(Futu::u32_t nSerialNo, const Qot_GetInsiderHolderList::Response &stRsp){
cout << "OnReply_GetInsiderHolderList:" << endl;
// print response
// ProtoBufToBodyData and UTF8ToLocal refer to tool.h in Samples
string resp_str;
ProtoBufToBodyData(stRsp, resp_str);
cout << UTF8ToLocal(resp_str) << endl;
}
protected:
FTAPI_Qot *m_pQotApi;
};
int32_t main(int32_t argc, char** argv)
{
FTAPI::Init();
{
Program program;
program.Start();
getchar();
}
protobuf::ShutdownProtobufLibrary();
FTAPI::UnInit();
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
- Output
onInitConnect: ret=0 desc=Succeed!
Send Qot_GetInsiderHolderList seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
itemList {
holderId: 234085
holderQuantity: 4125576
holderPct: 0.028
name: "Arthur Levinson"
title: "独立非执行主席"
}
itemList {
//...
}
allCount: 17
nextKey: "10"
insiderTotalCount: 17
insiderBoughtCount: 11
insiderSoldCount: 8
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GetInsiderHolderList(req);
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
import ftWebsocket from "futu-api";
import { Common, Qot_Common } from "futu-api/proto";
import beautify from "js-beautify";
function QotGetInsiderHolderList(){
const { RetType } = Common
const { QotMarket } = Qot_Common
let [addr, port, enable_ssl, key] = ["127.0.0.1", 33333, false, '7522027ccf5a06b1'];
let websocket = new ftWebsocket();
websocket.onlogin = (ret, msg)=>{
if (ret) {
const req = {
c2s: {
security: {
market: QotMarket.QotMarket_US_Security,
code: "AAPL",
},
},
};
websocket.GetInsiderHolderList(req)
.then((res) => {
let { errCode, retMsg, retType,s2c } = res
console.log("GetInsiderHolderList: errCode %d, retMsg %s, retType %d", errCode, retMsg, retType);
if(retType == RetType.RetType_Succeed){
let data = beautify(JSON.stringify(s2c), {
indent_size: 2,
space_in_empty_paren: true,
});
console.log(data);
}
})
.catch((error) => {
console.log("error:", error);
});
} else {
console.log("error", msg);
}
};
websocket.start(addr, port, enable_ssl, key);
setTimeout(()=>{
websocket.stop();
console.log("stop");
}, 5000);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
- Output
GetInsiderHolderList: errCode 0, retMsg , retType 0
{
"itemList": [{
"holderId": "234085",
"holderQuantity": "4125576",
"holderPct": 0.028,
"name": "Arthur Levinson",
"title": "独立非执行主席"
//...
}],
"allCount": 17,
"nextKey": "10",
"insiderTotalCount": 17,
"insiderBoughtCount": 11,
"insiderSoldCount": 8
}
stop
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
接口限制
- 每 30 秒内最多请求 30 次。
- 仅美股正股及基金有意义。
- 支持分页,默认每页 10 条,最多 20 条;分页标识为字符串类型。
- 仅首页(首次请求,nextKey 为空)额外返回内部人统计摘要(总人数/买入人数/卖出人数)。
- Python
- Proto
- C#
- Java
- C++
- JavaScript
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返回
参数 类型 说明 ret RET_CODE 接口调用结果 data pd.DataFrame 当 ret == RET_OK,返回内部人持股 DataFrame str 当 ret != RET_OK,返回错误描述 返回 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
from moomoo 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()
2
3
4
5
6
7
8
9
10
11
- Output
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
2
3
4
5
6
7
8
9
10
11
12
13
# Qot_GetInsiderHolderList.proto
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
协议 ID
3241
uint GetInsiderHolderList(QotGetInsiderHolderList.Request req);
virtual void OnReply_GetInsiderHolderList(MMAPI_Conn client, uint nSerialNo, QotGetInsiderHolderList.Response rsp);
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
public class Program : MMSPI_Qot, MMSPI_Conn
{
MMAPI_Qot qot = new MMAPI_Qot();
public Program()
{
qot.SetClientInfo("csharp", 1);
qot.SetConnCallback(this);
qot.SetQotCallback(this);
}
public void Start()
{
qot.InitConnect("127.0.0.1", (ushort)11111, false);
}
public void OnInitConnect(MMAPI_Conn client, long errCode, String desc)
{
Console.Write("Qot onInitConnect: ret={0} desc={1} connID={2}\n", errCode, desc, client.GetConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.CreateBuilder()
.SetMarket((int)QotCommon.QotMarket.QotMarket_US_Security)
.SetCode("AAPL")
.Build();
QotGetInsiderHolderList.C2S c2s = QotGetInsiderHolderList.C2S.CreateBuilder()
.SetSecurity(sec)
.Build();
QotGetInsiderHolderList.Request req = QotGetInsiderHolderList.Request.CreateBuilder().SetC2S(c2s).Build();
uint seqNo = qot.GetInsiderHolderList(req);
Console.Write("Send QotGetInsiderHolderList: {0}\n", seqNo);
}
public void OnDisconnect(MMAPI_Conn client, long errCode)
{
Console.Write("Qot onDisConnect: {0}\n", errCode);
}
public void OnReply_GetInsiderHolderList(MMAPI_Conn client, uint nSerialNo, QotGetInsiderHolderList.Response rsp)
{
Console.Write("Reply: QotGetInsiderHolderList: {0} {1}\n", nSerialNo, rsp.ToString());
}
public static void Main(String[] args)
{
MMAPI.Init();
Program qot = new Program();
qot.Start();
while (true)
Thread.Sleep(1000 * 600);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
- Output
sent seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
itemList {
holderId: 234085
holderQuantity: 4125576
holderPct: 0.028
name: "Arthur Levinson"
title: "独立非执行主席"
}
itemList {
//...
}
allCount: 17
nextKey: "10"
insiderTotalCount: 17
insiderBoughtCount: 11
insiderSoldCount: 8
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int getInsiderHolderList(QotGetInsiderHolderList.Request req);
void onReply_GetInsiderHolderList(MMAPI_Conn client, int nSerialNo, QotGetInsiderHolderList.Response rsp);
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
public class QotDemo implements MMSPI_Qot, MMSPI_Conn {
MMAPI_Conn_Qot qot = new MMAPI_Conn_Qot();
public QotDemo() {
qot.setClientInfo("javaclient", 1);
qot.setConnSpi(this);
qot.setQotSpi(this);
}
public void start() {
qot.initConnect("127.0.0.1", (short)11111, false);
}
@Override
public void onInitConnect(MMAPI_Conn client, long errCode, String desc)
{
System.out.printf("Qot onInitConnect: ret=%b desc=%s connID=%d\n", errCode, desc, client.getConnectID());
if (errCode != 0)
return;
QotCommon.Security sec = QotCommon.Security.newBuilder()
.setMarket(QotCommon.QotMarket.QotMarket_US_Security_VALUE)
.setCode("AAPL")
.build();
QotGetInsiderHolderList.C2S c2s = QotGetInsiderHolderList.C2S.newBuilder()
.setSecurity(sec)
.build();
QotGetInsiderHolderList.Request req = QotGetInsiderHolderList.Request.newBuilder().setC2S(c2s).build();
int seqNo = qot.getInsiderHolderList(req);
System.out.printf("Send QotGetInsiderHolderList: %d\n", seqNo);
}
@Override
public void onDisconnect(MMAPI_Conn client, long errCode) {
System.out.printf("Qot onDisConnect: %d\n", errCode);
}
@Override
public void onReply_GetInsiderHolderList(MMAPI_Conn client, int nSerialNo, QotGetInsiderHolderList.Response rsp) {
if (rsp.getRetType() != 0) {
System.out.printf("QotGetInsiderHolderList failed: %s\n", rsp.getRetMsg());
}
else {
try {
String json = JsonFormat.printer().print(rsp);
System.out.printf("Receive QotGetInsiderHolderList: %s\n", json);
} catch (InvalidProtocolBufferException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MMAPI.init();
QotDemo qot = new QotDemo();
qot.start();
while (true) {
try {
Thread.sleep(1000 * 600);
} catch (InterruptedException exc) {
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
- Output
Qot onInitConnect: ret=0 desc= connID=7459213608141408964
Send Qot_GetInsiderHolderList: 2
Receive Qot_GetInsiderHolderList: retType: 0
retMsg: ""
errCode: 0
s2c {
itemList {
holderId: 234085
holderQuantity: 4125576
holderPct: 0.028
name: "Arthur Levinson"
title: "独立非执行主席"
}
itemList {
//...
}
allCount: 17
nextKey: "10"
insiderTotalCount: 17
insiderBoughtCount: 11
insiderSoldCount: 8
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
moomoo::u32_t GetInsiderHolderList(const Qot_GetInsiderHolderList::Request &stReq);
virtual void OnReply_GetInsiderHolderList(moomoo::u32_t nSerialNo, const Qot_GetInsiderHolderList::Response &stRsp) = 0;
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
class Program : public MMSPI_Qot, public MMSPI_Trd, public MMSPI_Conn
{
public:
Program() {
m_pQotApi = MMAPI::CreateQotApi();
m_pQotApi->RegisterQotSpi(this);
m_pQotApi->RegisterConnSpi(this);
}
~Program() {
if (m_pQotApi != nullptr)
{
m_pQotApi->UnregisterQotSpi();
m_pQotApi->UnregisterConnSpi();
MMAPI::ReleaseQotApi(m_pQotApi);
m_pQotApi = nullptr;
}
}
void Start() {
m_pQotApi->InitConnect("127.0.0.1", 11111, false);
}
virtual void OnInitConnect(MMAPI_Conn* pConn, moomoo::i64_t nErrCode, const char* strDesc) {
cout << "connect" << endl;
// construct request message
Qot_GetInsiderHolderList::Request req;
Qot_GetInsiderHolderList::C2S *c2s = req.mutable_c2s();
Qot_Common::Security *sec = c2s->mutable_security();
sec->set_code("AAPL");
sec->set_market(Qot_Common::QotMarket::QotMarket_US_Security);
m_pQotApi->GetInsiderHolderList(req);
cout << "GetInsiderHolderList" << endl;
}
virtual void OnReply_GetInsiderHolderList(moomoo::u32_t nSerialNo, const Qot_GetInsiderHolderList::Response &stRsp){
cout << "OnReply_GetInsiderHolderList:" << endl;
// print response
// ProtoBufToBodyData and UTF8ToLocal refer to tool.h in Samples
string resp_str;
ProtoBufToBodyData(stRsp, resp_str);
cout << UTF8ToLocal(resp_str) << endl;
}
protected:
MMAPI_Qot *m_pQotApi;
};
int32_t main(int32_t argc, char** argv)
{
MMAPI::Init();
{
Program program;
program.Start();
getchar();
}
protobuf::ShutdownProtobufLibrary();
MMAPI::UnInit();
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
- Output
onInitConnect: ret=0 desc=Succeed!
Send Qot_GetInsiderHolderList seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
itemList {
holderId: 234085
holderQuantity: 4125576
holderPct: 0.028
name: "Arthur Levinson"
title: "独立非执行主席"
}
itemList {
//...
}
allCount: 17
nextKey: "10"
insiderTotalCount: 17
insiderBoughtCount: 11
insiderSoldCount: 8
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GetInsiderHolderList(req);
介绍
获取内部人持股列表
参数
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // 分页标识,首次不填,续拉时填上次返回的 nextKey;"-1" 表示无更多数据
optional int32 num = 3; // 每页返回数量,默认 10,范围 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- 股票结构参见 Security
- 返回
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // 股东id,可作为 GetInsiderTradeList 和 Qot_GetShareholdersHolderDetail 的入参
optional int64 holderQuantity = 2; // 总持股数
optional double holderPct = 3; // 持股比例,百分号前的值,如 12.34 表示 12.34%
optional string name = 4; // 股东名称
optional string title = 5; // 股东职位
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // 总数
optional string nextKey = 3; // 分页标识,"-1" 表示无更多数据
optional int32 insiderTotalCount = 4; // 内部人总人数,仅首次请求(nextKey为空)时返回
optional int32 insiderBoughtCount = 5; // 内部人买入总人数,仅首次请求时返回
optional int32 insiderSoldCount = 6; // 内部人卖出总人数,仅首次请求时返回
}
message Response
{
required int32 retType = 1 [default = -400]; // 返回结果,详见 Common.RetType
optional string retMsg = 2; // 返回结果描述
optional int32 errCode = 3; // 错误码
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- 接口调用结果,结构参见 RetType
- Example
import mmWebsocket from "moomoo-api";
import { Common, Qot_Common } from "moomoo-api/proto";
import beautify from "js-beautify";
function QotGetInsiderHolderList(){
const { RetType } = Common
const { QotMarket } = Qot_Common
let [addr, port, enable_ssl, key] = ["127.0.0.1", 33333, false, '7522027ccf5a06b1'];
let websocket = new mmWebsocket();
websocket.onlogin = (ret, msg)=>{
if (ret) {
const req = {
c2s: {
security: {
market: QotMarket.QotMarket_US_Security,
code: "AAPL",
},
},
};
websocket.GetInsiderHolderList(req)
.then((res) => {
let { errCode, retMsg, retType,s2c } = res
console.log("GetInsiderHolderList: errCode %d, retMsg %s, retType %d", errCode, retMsg, retType);
if(retType == RetType.RetType_Succeed){
let data = beautify(JSON.stringify(s2c), {
indent_size: 2,
space_in_empty_paren: true,
});
console.log(data);
}
})
.catch((error) => {
console.log("error:", error);
});
} else {
console.log("error", msg);
}
};
websocket.start(addr, port, enable_ssl, key);
setTimeout(()=>{
websocket.stop();
console.log("stop");
}, 5000);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
- Output
GetInsiderHolderList: errCode 0, retMsg , retType 0
{
"itemList": [{
"holderId": "234085",
"holderQuantity": "4125576",
"holderPct": 0.028,
"name": "Arthur Levinson",
"title": "独立非执行主席"
//...
}],
"allCount": 17,
"nextKey": "10",
"insiderTotalCount": 17,
"insiderBoughtCount": 11,
"insiderSoldCount": 8
}
stop
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
接口限制
- 每 30 秒内最多请求 30 次。
- 仅美股正股及基金有意义。
- 支持分页,默认每页 10 条,最多 20 条;分页标识为字符串类型。
- 仅首页(首次请求,nextKey 为空)额外返回内部人统计摘要(总人数/买入人数/卖出人数)。