# Get Insider Holder List
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_insider_holder_list(code, next_key=None, num=None)
Description
Get the list of insider holders (executives/directors/major shareholders) for a US stock, with pagination support; the first page additionally returns an insider summary
Parameters
Parameter Type Description code str Stock code e.g. US.AAPL; supports US stocks and fundsnext_key str Pagination key Leave empty for the first request; pass the next_key returned from the previous response for subsequent pages; "-1" means no more datanum int Items per page Default 10, range 1~20Return
Parameter Type Description ret RET_CODE API call result data pd.DataFrame When ret == RET_OK, returns insider holder DataFrame str When ret != RET_OK, returns error description DataFrame field description:
Field Type Description holder_id int Holder ID Can be used as input for get_insider_trade_list and get_shareholders_holder_detailholder_quantity int Total shares held Unit: sharesholder_pct float Holding ratio Value before the percent sign; e.g. 12.34 means 12.34%name str Holder name title str Holder title all_count int Total count next_key str Pagination key "-1" means no more data; pass as-is for subsequent pagesinsider_total_count int Total insider count Returned only on the first page (when next_key is empty)insider_bought_count int Bought count Number of insiders who bought; returned only on the first pageinsider_sold_count int Sold count Number of insiders who sold; returned only on the first page
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
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to RetType
Protocol ID
3241
uint GetInsiderHolderList(QotGetInsiderHolderList.Request req);
virtual void OnReply_GetInsiderHolderList(FTAPI_Conn client, uint nSerialNo, QotGetInsiderHolderList.Response rsp);
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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);
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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;
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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);
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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
API Limitations
- Maximum 30 requests per 30 seconds.
- Only meaningful for US stocks and funds.
- Supports pagination; default 10 items per page, maximum 20; the pagination key is a string type.
- The insider summary (total/bought/sold count) is only returned on the first page (when nextKey is empty).
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_insider_holder_list(code, next_key=None, num=None)
Description
Get the list of insider holders (executives/directors/major shareholders) for a US stock, with pagination support; the first page additionally returns an insider summary
Parameters
Parameter Type Description code str Stock code e.g. US.AAPL; supports US stocks and fundsnext_key str Pagination key Leave empty for the first request; pass the next_key returned from the previous response for subsequent pages; "-1" means no more datanum int Items per page Default 10, range 1~20Return
Parameter Type Description ret RET_CODE API call result data pd.DataFrame When ret == RET_OK, returns insider holder DataFrame str When ret != RET_OK, returns error description DataFrame field description:
Field Type Description holder_id int Holder ID Can be used as input for get_insider_trade_list and get_shareholders_holder_detailholder_quantity int Total shares held Unit: sharesholder_pct float Holding ratio Value before the percent sign; e.g. 12.34 means 12.34%name str Holder name title str Holder title all_count int Total count next_key str Pagination key "-1" means no more data; pass as-is for subsequent pagesinsider_total_count int Total insider count Returned only on the first page (when next_key is empty)insider_bought_count int Bought count Number of insiders who bought; returned only on the first pageinsider_sold_count int Sold count Number of insiders who sold; returned only on the first page
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
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to RetType
Protocol ID
3241
uint GetInsiderHolderList(QotGetInsiderHolderList.Request req);
virtual void OnReply_GetInsiderHolderList(MMAPI_Conn client, uint nSerialNo, QotGetInsiderHolderList.Response rsp);
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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);
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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;
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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);
Description
Get insider holder list
Parameters
message C2S
{
required Qot_Common.Security security = 1;
optional string nextKey = 2; // Pagination key; leave empty for the first request; pass the previous nextKey for subsequent pages; "-1" means no more data
optional int32 num = 3; // Items per page, default 10, range 1~20
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
- For the security structure, refer to Security
- Return
message OwnerInsiderHolderItem
{
optional int64 holderId = 1; // Holder ID; can be used as input for GetInsiderTradeList and Qot_GetShareholdersHolderDetail
optional int64 holderQuantity = 2; // Total shares held
optional double holderPct = 3; // Holding ratio; value before the percent sign; e.g. 12.34 means 12.34%
optional string name = 4; // Holder name
optional string title = 5; // Holder title
}
message S2C
{
repeated OwnerInsiderHolderItem itemList = 1;
optional int32 allCount = 2; // Total count
optional string nextKey = 3; // Pagination key; "-1" means no more data
optional int32 insiderTotalCount = 4; // Total insider count; returned only on the first request (when nextKey is empty)
optional int32 insiderBoughtCount = 5; // Number of insiders who bought; returned only on the first request
optional int32 insiderSoldCount = 6; // Number of insiders who sold; returned only on the first request
}
message Response
{
required int32 retType = 1 [default = -400]; // Return result; refer to Common.RetType
optional string retMsg = 2; // Return result description
optional int32 errCode = 3; // Error code
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
- For the API call result structure, refer to 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
API Limitations
- Maximum 30 requests per 30 seconds.
- Only meaningful for US stocks and funds.
- Supports pagination; default 10 items per page, maximum 20; the pagination key is a string type.
- The insider summary (total/bought/sold count) is only returned on the first page (when nextKey is empty).