# Get Morningstar Research Report
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_research_morningstar_report(code)
Description
Get the Morningstar research report for the specified stock, including star rating, fair value, economic moat, uncertainty, financial health, capital allocation, bull/bear arguments, and analyst notes
Parameters
Parameter Type Description code str Stock code Return
Parameter Type Description ret RET_CODE API call result data dict If ret == RET_OK, returns Morningstar research report data dict str If ret != RET_OK, returns error description The returned dict contains the following fields:
Field Type Description rating_type MorningstarRatingType Rating type 0=Unknown, 1=Quantitative (system model), 2=Qualitative (analyst manual)star_rating int Morningstar star rating Value 1~5 starsstar_update_time int Star rating update timestamp Seconds, in market timezonestar_update_time_str str Star rating update date Format YYYY-MM-DD, in market timezonefair_value float Fair value fair_value_content dict Fair value analysis, see StringWithUpdateTime field table economic_moat_label str Economic moat rating e.g. Wide, Narrow, Noneeconomic_moat_content dict Economic moat analysis, see StringWithUpdateTime field table uncertainty_label str Uncertainty rating e.g. Low, Medium, High, Very High, Extremeuncertainty_content dict Uncertainty analysis, see StringWithUpdateTime field table financial_health_label str Financial health rating financial_health_content dict Financial health analysis, see StringWithUpdateTime field table analyst_report_by_line list Analyst byline list e.g. ["William Kerwin, CFA"]analyst_report_update_time int Analyst report update timestamp Seconds, in market timezoneanalyst_report_update_time_str str Analyst report update date Format YYYY-MM-DD, in market timezonebull_say list Bull arguments list, each item see StringWithUpdateTime field table bear_say list Bear arguments list, each item see StringWithUpdateTime field table capital_allocation_label str Capital allocation rating capital_allocation_content dict Capital allocation analysis, see StringWithUpdateTime field table analyst_note_title dict Analyst note title, see StringWithUpdateTime field table analyst_note_content dict Analyst note content, see StringWithUpdateTime field table investment_thesis_content dict Investment thesis, see StringWithUpdateTime field table fundamentals_content dict Fundamentals report, see StringWithUpdateTime field table valuation_content dict Valuation report, see StringWithUpdateTime field table pdf_url str PDF report download URL StringWithUpdateTime fields (nested text structure):
Field Type Description context str Text content update_time int Update timestamp Seconds, in market timezoneupdate_time_str str Update date Format YYYY-MM-DD, in market timezone
Example
import json
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data = quote_ctx.get_research_morningstar_report("HK.00700")
if ret == RET_OK:
print(json.dumps(data, indent=2, ensure_ascii=False))
else:
print('error:', data)
quote_ctx.close()
2
3
4
5
6
7
8
9
10
- Output
{
"rating_type": 2,
"star_rating": 4,
"star_update_time": 1778257800,
"star_update_time_str": "2026-05-09",
"fair_value": 800.0,
"fair_value_content": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent’s core business, while ...
"update_time": 1755138060,
"update_time_str": "2025-08-14"
},
"economic_moat_label": "Wide",
"economic_moat_content": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses ...
"update_time": 1766457150,
"update_time_str": "2025-12-23"
},
"uncertainty_label": "High",
"uncertainty_content": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across...
"update_time": 1766457180,
"update_time_str": "2025-12-23"
},
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Qot_GetResearchMorningstarReport.proto
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- Morningstar rating type, see MorningstarRatingType
Protocol ID
3231
uint GetResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
virtual void OnReply_GetResearchMorningstarReport(FTAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp);
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- 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_HK_Security)
.SetCode("00700")
.Build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.CreateBuilder()
.SetSecurity(sec)
.Build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.CreateBuilder().SetC2S(c2s).Build();
uint seqNo = qot.GetResearchMorningstarReport(req);
Console.Write("Send QotGetResearchMorningstarReport: {0}\n", seqNo);
}
public void OnDisconnect(FTAPI_Conn client, long errCode)
{
Console.Write("Qot onDisConnect: {0}\n", errCode);
}
public void OnReply_GetResearchMorningstarReport(FTAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp)
{
Console.Write("Reply: QotGetResearchMorningstarReport: {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 {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
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
int getResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
void onReply_GetResearchMorningstarReport(FTAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp);
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- 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_HK_Security_VALUE)
.setCode("00700")
.build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.newBuilder()
.setSecurity(sec)
.build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.newBuilder().setC2S(c2s).build();
int seqNo = qot.getResearchMorningstarReport(req);
System.out.printf("Send QotGetResearchMorningstarReport: %d\n", seqNo);
}
@Override
public void onDisconnect(FTAPI_Conn client, long errCode) {
System.out.printf("Qot onDisConnect: %d\n", errCode);
}
@Override
public void onReply_GetResearchMorningstarReport(FTAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp) {
if (rsp.getRetType() != 0) {
System.out.printf("QotGetResearchMorningstarReport failed: %s\n", rsp.getRetMsg());
}
else {
try {
String json = JsonFormat.printer().print(rsp);
System.out.printf("Receive QotGetResearchMorningstarReport: %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=7459212590244939522
Send Qot_GetResearchMorningstarReport: 2
Receive Qot_GetResearchMorningstarReport: retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800.0
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
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
Futu::u32_t GetResearchMorningstarReport(const Qot_GetResearchMorningstarReport::Request &stReq);
virtual void OnReply_GetResearchMorningstarReport(Futu::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp) = 0;
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- 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_GetResearchMorningstarReport::Request req;
Qot_GetResearchMorningstarReport::C2S *c2s = req.mutable_c2s();
Qot_Common::Security *sec = c2s->mutable_security();
sec->set_code("00700");
sec->set_market(Qot_Common::QotMarket::QotMarket_HK_Security);
m_pQotApi->GetResearchMorningstarReport(req);
cout << "GetResearchMorningstarReport" << endl;
}
virtual void OnReply_GetResearchMorningstarReport(Futu::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp){
cout << "OnReply_GetResearchMorningstarReport:" << 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_GetResearchMorningstarReport seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
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
GetResearchMorningstarReport(req);
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- Example
import ftWebsocket from "futu-api";
import { Common, Qot_Common } from "futu-api/proto";
import beautify from "js-beautify";
function QotGetResearchMorningstarReport(){
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_HK_Security,
code: "00700",
},
},
};
websocket.GetResearchMorningstarReport(req)
.then((res) => {
let { errCode, retMsg, retType,s2c } = res
console.log("GetResearchMorningstarReport: 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
GetResearchMorningstarReport: errCode 0, retMsg , retType 0
{
"ratingType": "MorningstarRatingType_Qualitative",
"starRating": 4,
"starUpdateTime": "1778257800",
"starUpdateTimeStr": "2026-05-09",
"fairValue": 800,
"fairValueContent": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm's free cash flows usin...
"updateTime": "1755138060",
"updateTimeStr": "2025-08-14"
},
"economicMoatLabel": "Wide",
"economicMoatContent": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent's proven ability to monetize its massive network of users through g...
"updateTime": "1766457150",
"updateTimeStr": "2025-12-23"
},
"uncertaintyLabel": "High",
"uncertaintyContent": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later...
"updateTime": "1766457180",
"updateTimeStr": "2025-12-23"
},
//...
}
stop
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
Restrictions
- Maximum 30 requests per 30 seconds.
- Supports common stocks and REITs.
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_research_morningstar_report(code)
Description
Get the Morningstar research report for the specified stock, including star rating, fair value, economic moat, uncertainty, financial health, capital allocation, bull/bear arguments, and analyst notes
Parameters
Parameter Type Description code str Stock code Return
Parameter Type Description ret RET_CODE API call result data dict If ret == RET_OK, returns Morningstar research report data dict str If ret != RET_OK, returns error description The returned dict contains the following fields:
Field Type Description rating_type MorningstarRatingType Rating type 0=Unknown, 1=Quantitative (system model), 2=Qualitative (analyst manual)star_rating int Morningstar star rating Value 1~5 starsstar_update_time int Star rating update timestamp Seconds, in market timezonestar_update_time_str str Star rating update date Format YYYY-MM-DD, in market timezonefair_value float Fair value fair_value_content dict Fair value analysis, see StringWithUpdateTime field table economic_moat_label str Economic moat rating e.g. Wide, Narrow, Noneeconomic_moat_content dict Economic moat analysis, see StringWithUpdateTime field table uncertainty_label str Uncertainty rating e.g. Low, Medium, High, Very High, Extremeuncertainty_content dict Uncertainty analysis, see StringWithUpdateTime field table financial_health_label str Financial health rating financial_health_content dict Financial health analysis, see StringWithUpdateTime field table analyst_report_by_line list Analyst byline list e.g. ["William Kerwin, CFA"]analyst_report_update_time int Analyst report update timestamp Seconds, in market timezoneanalyst_report_update_time_str str Analyst report update date Format YYYY-MM-DD, in market timezonebull_say list Bull arguments list, each item see StringWithUpdateTime field table bear_say list Bear arguments list, each item see StringWithUpdateTime field table capital_allocation_label str Capital allocation rating capital_allocation_content dict Capital allocation analysis, see StringWithUpdateTime field table analyst_note_title dict Analyst note title, see StringWithUpdateTime field table analyst_note_content dict Analyst note content, see StringWithUpdateTime field table investment_thesis_content dict Investment thesis, see StringWithUpdateTime field table fundamentals_content dict Fundamentals report, see StringWithUpdateTime field table valuation_content dict Valuation report, see StringWithUpdateTime field table pdf_url str PDF report download URL StringWithUpdateTime fields (nested text structure):
Field Type Description context str Text content update_time int Update timestamp Seconds, in market timezoneupdate_time_str str Update date Format YYYY-MM-DD, in market timezone
Example
import json
from moomoo import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data = quote_ctx.get_research_morningstar_report("HK.00700")
if ret == RET_OK:
print(json.dumps(data, indent=2, ensure_ascii=False))
else:
print('error:', data)
quote_ctx.close()
2
3
4
5
6
7
8
9
- Output
{
"rating_type": 2,
"star_rating": 4,
"star_update_time": 1778257800,
"star_update_time_str": "2026-05-09",
"fair_value": 800.0,
"fair_value_content": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent’s core business, while ...
"update_time": 1755138060,
"update_time_str": "2025-08-14"
},
"economic_moat_label": "Wide",
"economic_moat_content": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses ...
"update_time": 1766457150,
"update_time_str": "2025-12-23"
},
"uncertainty_label": "High",
"uncertainty_content": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across...
"update_time": 1766457180,
"update_time_str": "2025-12-23"
},
//...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Qot_GetResearchMorningstarReport.proto
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
Protocol ID
3231
uint GetResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
virtual void OnReply_GetResearchMorningstarReport(MMAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp);
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- 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_HK_Security)
.SetCode("00700")
.Build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.CreateBuilder()
.SetSecurity(sec)
.Build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.CreateBuilder().SetC2S(c2s).Build();
uint seqNo = qot.GetResearchMorningstarReport(req);
Console.Write("Send QotGetResearchMorningstarReport: {0}\n", seqNo);
}
public void OnDisconnect(MMAPI_Conn client, long errCode)
{
Console.Write("Qot onDisConnect: {0}\n", errCode);
}
public void OnReply_GetResearchMorningstarReport(MMAPI_Conn client, uint nSerialNo, QotGetResearchMorningstarReport.Response rsp)
{
Console.Write("Reply: QotGetResearchMorningstarReport: {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 {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
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
int getResearchMorningstarReport(QotGetResearchMorningstarReport.Request req);
void onReply_GetResearchMorningstarReport(MMAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp);
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- 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_HK_Security_VALUE)
.setCode("00700")
.build();
QotGetResearchMorningstarReport.C2S c2s = QotGetResearchMorningstarReport.C2S.newBuilder()
.setSecurity(sec)
.build();
QotGetResearchMorningstarReport.Request req = QotGetResearchMorningstarReport.Request.newBuilder().setC2S(c2s).build();
int seqNo = qot.getResearchMorningstarReport(req);
System.out.printf("Send QotGetResearchMorningstarReport: %d\n", seqNo);
}
@Override
public void onDisconnect(MMAPI_Conn client, long errCode) {
System.out.printf("Qot onDisConnect: %d\n", errCode);
}
@Override
public void onReply_GetResearchMorningstarReport(MMAPI_Conn client, int nSerialNo, QotGetResearchMorningstarReport.Response rsp) {
if (rsp.getRetType() != 0) {
System.out.printf("QotGetResearchMorningstarReport failed: %s\n", rsp.getRetMsg());
}
else {
try {
String json = JsonFormat.printer().print(rsp);
System.out.printf("Receive QotGetResearchMorningstarReport: %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=7459212590244939522
Send Qot_GetResearchMorningstarReport: 2
Receive Qot_GetResearchMorningstarReport: retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800.0
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
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
moomoo::u32_t GetResearchMorningstarReport(const Qot_GetResearchMorningstarReport::Request &stReq);
virtual void OnReply_GetResearchMorningstarReport(moomoo::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp) = 0;
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- 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_GetResearchMorningstarReport::Request req;
Qot_GetResearchMorningstarReport::C2S *c2s = req.mutable_c2s();
Qot_Common::Security *sec = c2s->mutable_security();
sec->set_code("00700");
sec->set_market(Qot_Common::QotMarket::QotMarket_HK_Security);
m_pQotApi->GetResearchMorningstarReport(req);
cout << "GetResearchMorningstarReport" << endl;
}
virtual void OnReply_GetResearchMorningstarReport(moomoo::u32_t nSerialNo, const Qot_GetResearchMorningstarReport::Response &stRsp){
cout << "OnReply_GetResearchMorningstarReport:" << 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_GetResearchMorningstarReport seqNo=3
retType: 0
retMsg: ""
errCode: 0
s2c {
ratingType: MorningstarRatingType_Qualitative
starRating: 4
starUpdateTime: 1778257800
starUpdateTimeStr: "2026-05-09"
fairValue: 800
fairValueContent {
context: "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm\'s free cash flows using...
updateTime: 1755138060
updateTimeStr: "2025-08-14"
}
economicMoatLabel: "Wide"
economicMoatContent {
context: "Tencent\'s wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent\'s proven ability to monetize its massive network of users through g...
updateTime: 1766457150
updateTimeStr: "2025-12-23"
}
uncertaintyLabel: "High"
uncertaintyContent {
context: "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later c...
updateTime: 1766457180
updateTimeStr: "2025-12-23"
}
//...
}
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
GetResearchMorningstarReport(req);
Description
Get Morningstar research report
Parameters
message C2S
{
required Qot_Common.Security security = 1; // Stock
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
- Security structure, refer to Security
- Return
// Text content with update time
message StringWithUpdateTime {
optional string context = 1; // Text content
optional int64 updateTime = 2; // Update timestamp (seconds)
optional string updateTimeStr = 3; // Update time string, format YYYY-MM-DD, in market timezone
}
message S2C
{
optional Qot_Common.MorningstarRatingType ratingType = 1; // Rating type (refer to Qot_Common.MorningstarRatingType)
optional int32 starRating = 2; // Morningstar star rating, value 1-5 stars
optional int64 starUpdateTime = 3; // Star rating update timestamp (seconds)
optional string starUpdateTimeStr = 4; // Star rating update time string, format YYYY-MM-DD, in market timezone
optional double fairValue = 5; // Fair value
optional StringWithUpdateTime fairValueContent = 6; // Fair value analysis text and update time
optional string economicMoatLabel = 7; // Economic moat rating, e.g. Wide, Narrow, None
optional StringWithUpdateTime economicMoatContent = 8; // Economic moat analysis text and update time
optional string uncertaintyLabel = 9; // Uncertainty rating, e.g. Low, Medium, High, Very High, Extreme
optional StringWithUpdateTime uncertaintyContent = 10; // Uncertainty analysis text and update time
optional string financialHealthLabel = 11; // Financial health rating
optional StringWithUpdateTime financialHealthContent = 12; // Financial health analysis text and update time
repeated string analystReportByLine = 13; // Analyst byline list, e.g. ["William Kerwin, CFA"]
optional int64 analystReportUpdateTime = 14; // Analyst report update timestamp (seconds)
optional string analystReportUpdateTimeStr = 15; // Analyst report update time string, format YYYY-MM-DD, in market timezone
repeated StringWithUpdateTime bullSay = 16; // Bull arguments list
repeated StringWithUpdateTime bearSay = 17; // Bear arguments list
optional string capitalAllocationLabel = 18; // Capital allocation rating
optional StringWithUpdateTime capitalAllocationContent = 19; // Capital allocation analysis text and update time
optional StringWithUpdateTime analystNoteTitle = 20; // Analyst note title and update time
optional StringWithUpdateTime analystNoteContent = 21; // Analyst note content text and update time
optional StringWithUpdateTime investmentThesisContent = 22; // Investment thesis text and update time
optional StringWithUpdateTime fundamentalsContent = 23; // Fundamentals report text and update time
optional StringWithUpdateTime valuationContent = 24; // Valuation report text and update time
optional string pdfUrl = 25; // PDF report download URL
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
- API call result, refer to RetType
- MorningstarRatingType: 0=Unknown, 1=Quantitative, 2=Qualitative, see MorningstarRatingType
- Example
import mmWebsocket from "moomoo-api";
import { Common, Qot_Common } from "moomoo-api/proto";
import beautify from "js-beautify";
function QotGetResearchMorningstarReport(){
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_HK_Security,
code: "00700",
},
},
};
websocket.GetResearchMorningstarReport(req)
.then((res) => {
let { errCode, retMsg, retType,s2c } = res
console.log("GetResearchMorningstarReport: 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
GetResearchMorningstarReport: errCode 0, retMsg , retType 0
{
"ratingType": "MorningstarRatingType_Qualitative",
"starRating": 4,
"starUpdateTime": "1778257800",
"starUpdateTimeStr": "2026-05-09",
"fairValue": 800,
"fairValueContent": {
"context": "Our fair value estimate for Tencent is HKD 800 per share. About 85% of our valuation comes from Tencent's core business, while the remaining 20% comes from its investments. Our valuation for the core business implies a 2025 P/E of 30 times. We discount the firm's free cash flows usin...
"updateTime": "1755138060",
"updateTimeStr": "2025-08-14"
},
"economicMoatLabel": "Wide",
"economicMoatContent": {
"context": "Tencent's wide moat is primarily based on network effects around its massive user base. In addition, Tencent possesses secondary moat sources like intangible assets, cost advantage, and switching costs. Given Tencent's proven ability to monetize its massive network of users through g...
"updateTime": "1766457150",
"updateTimeStr": "2025-12-23"
},
"uncertaintyLabel": "High",
"uncertaintyContent": {
"context": "Our Morningstar Uncertainty Rating for Tencent is High due to regulatory risks and competitive intensity across its core businesses. \n\nIn payments, the 2017 rule that forced third-party providers to park customer reserves in non-interest-bearing central bank accounts--and the later...
"updateTime": "1766457180",
"updateTimeStr": "2025-12-23"
},
//...
}
stop
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
Restrictions
- Maximum 30 requests per 30 seconds.
- Supports common stocks and REITs.