# 獲取內部人持股列表
- 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 Independent Non-Executive Chairperson 4125576 0.028
169600 Timothy Cook Chief Executive Officer 3280418 0.022
626415138 Sabih Khan Officer 1105527 0.007
34123508 Katherine Adams Senior Vice President 175408 0.001
531640091 Deirdre O’Brien Senior Vice President of Retail 136810 0.000
285767 Ronald Sugar Independent Director 110566 0.000
50035778 Luca Maestri Chief Financial Officer 91304 0.000
253136 Andrea Jung Independent Director 77664 0.000
22072913 Susan Wagner Independent Director 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: "Independent Non-Executive Chairperson"
}
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=7459212661260089877
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: "Independent Non-Executive Chairperson"
}
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: "Independent Non-Executive Chairperson"
}
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": "Independent Non-Executive Chairperson"
//...
}],
"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 Independent Non-Executive Chairperson 4125576 0.028
169600 Timothy Cook Chief Executive Officer 3280418 0.022
626415138 Sabih Khan Officer 1105527 0.007
34123508 Katherine Adams Senior Vice President 175408 0.001
531640091 Deirdre O’Brien Senior Vice President of Retail 136810 0.000
285767 Ronald Sugar Independent Director 110566 0.000
50035778 Luca Maestri Chief Financial Officer 91304 0.000
253136 Andrea Jung Independent Director 77664 0.000
22072913 Susan Wagner Independent Director 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: "Independent Non-Executive Chairperson"
}
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=7459212661260089877
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: "Independent Non-Executive Chairperson"
}
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: "Independent Non-Executive Chairperson"
}
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": "Independent Non-Executive Chairperson"
//...
}],
"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 為空)額外返回內部人統計摘要(總人數/買入人數/賣出人數)。