# Option Underlying Historical Volatility
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_option_underlying_his_volatility(code, index_option_type=IndexOptionType.NORMAL, begin_time=None, end_time=None, page_req_key=None)
Description
Get option underlying historical volatility data, returning daily IV and HV time series along with the underlying's closing price, with pagination support.
Parameters
Parameter Type Description code str Underlying stock code e.g. 'US.AAPL'index_option_type IndexOptionType Index option type NORMAL=standard options (default), SMALL=mini index optionsbegin_time str Start date, format 'YYYY-MM-DD' end_time str End date, format 'YYYY-MM-DD' page_req_key bytes Pagination request key Pass None for first call, pass previous return value for subsequent callsTime Range
- Maximum span between
begin_timeandend_timeis 364 days - Both empty:
end_time= today,begin_time= today minus 364 days - Only
begin_timeprovided:end_time=begin_timeplus 364 days - Only
end_timeprovided:begin_time=end_timeminus 364 days
- Maximum span between
Returns
Parameter Type Description ret RET_CODE Interface call result data pandas.DataFrame When ret == RET_OK, returns volatility data str When ret != RET_OK, returns error description page_req_key bytes Next page key, None indicates no more data Return DataFrame fields:
Field Type Description code str Stock code name str Stock name time str Trading day time string timestamp float Trading day timestamp (Unix seconds) iv float Implied volatility (percentage) hv float Historical volatility (percentage) underlying_price float Underlying closing price (mark price for current day)
Example
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data, page_req_key = quote_ctx.get_option_underlying_his_volatility(
'US.AAPL',
begin_time='2026-06-01',
end_time='2026-06-15'
)
if ret == RET_OK:
print(data)
else:
print('error:', data)
quote_ctx.close()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- Output
code name time timestamp iv hv underlying_price
0 US.AAPL Apple 2026-06-12 1.781237e+09 25.126 23.324 291.13
1 US.AAPL Apple 2026-06-11 1.781150e+09 25.617 23.270 295.63
2 US.AAPL Apple 2026-06-10 1.781064e+09 27.384 22.892 291.58
3 US.AAPL Apple 2026-06-09 1.780978e+09 27.237 22.854 290.55
4 US.AAPL Apple 2026-06-08 1.780891e+09 26.368 19.028 301.54
5 US.AAPL Apple 2026-06-05 1.780632e+09 26.995 18.024 307.34
6 US.AAPL Apple 2026-06-04 1.780546e+09 25.249 17.366 311.23
7 US.AAPL Apple 2026-06-03 1.780459e+09 26.801 18.927 310.26
8 US.AAPL Apple 2026-06-02 1.780373e+09 26.258 18.415 315.20
9 US.AAPL Apple 2026-06-01 1.780286e+09 25.864 16.841 306.31
2
3
4
5
6
7
8
9
10
11
# Qot_GetOptionUnderlyingHisVolatility.proto
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
uint GetOptionUnderlyingHisVolatility(Qot_GetOptionUnderlyingHisVolatility.Request req); virtual void OnReply_GetOptionUnderlyingHisVolatility(FTAPI_Conn client, uint nSerialNo, Qot_GetOptionUnderlyingHisVolatility.Response rsp);
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
int getOptionUnderlyingHisVolatility(Qot_GetOptionUnderlyingHisVolatility.Request req) onReply_GetOptionUnderlyingHisVolatility(FTAPI_Conn client, int nSerialNo, Qot_GetOptionUnderlyingHisVolatility.Response rsp)
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
Futu::u32_t GetOptionUnderlyingHisVolatility(const Qot_GetOptionUnderlyingHisVolatility::Request &stReq);
virtual void OnReply_GetOptionUnderlyingHisVolatility(Futu::u32_t nSerialNo, const Qot_GetOptionUnderlyingHisVolatility::Response &stRsp) = 0;
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
Example
class Program : public FTSPI_Qot, 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) {
Qot_GetOptionUnderlyingHisVolatility::Request req;
Qot_GetOptionUnderlyingHisVolatility::C2S *c2s = req.mutable_c2s();
// TODO: populate c2s fields per proto
m_GetOptionUnderlyingHisVolatilitySerialNo = m_pQotApi->GetOptionUnderlyingHisVolatility(req);
}
virtual void OnReply_GetOptionUnderlyingHisVolatility(Futu::u32_t nSerialNo, const Qot_GetOptionUnderlyingHisVolatility::Response &stRsp) {
if (nSerialNo != m_GetOptionUnderlyingHisVolatilitySerialNo) return;
string resp_str;
ProtoBufToBodyData(stRsp, resp_str);
cout << UTF8ToLocal(resp_str) << endl;
}
protected:
FTAPI_Qot *m_pQotApi;
Futu::u32_t m_GetOptionUnderlyingHisVolatilitySerialNo = 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
getOptionUnderlyingHisVolatility(qotGetOptionUnderlyingHisVolatility)
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
Example
import ftWebsocket from "futu-api";
import { Common, Qot_Common } from "futu-api/proto";
import beautify from "js-beautify";
function QotGetOptionUnderlyingHisVolatility(){
const { RetType } = Common
const { QotMarket } = Qot_Common
let [addr, port, enable_ssl, key] = ["127.0.0.1", 11112, false, ''];
let websocket = new ftWebsocket();
websocket.onlogin = (ret, msg)=>{
if (ret) {
const req = {
c2s: {
owner: { market: QotMarket.QotMarket_US_Security, code: 'AAPL' },
beginTime: '2026-06-01',
endTime: '2026-06-15',
},
};
websocket.GetOptionUnderlyingHisVolatility(req)
.then((res)=>{
let { errCode, retMsg, retType, s2c } = res
console.log("GetOptionUnderlyingHisVolatility: 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("start error", msg);
}
};
websocket.start(addr, port, enable_ssl, key);
setTimeout(()=>{ websocket.stop(); process.exit(); }, 5000);
}
QotGetOptionUnderlyingHisVolatility()
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
- Output
GetOptionUnderlyingHisVolatility: errCode 0, retMsg , retType 0
{
"owner": { "market": 1, "code": "AAPL" },
"code": "US.AAPL",
"name": "Apple",
"volatilityList": [
{ "time": "2026-06-12", "timestamp": 1781237000, "iv": 25.126, "hv": 23.324, "underlyingPrice": 291.13 },
{ "time": "2026-06-11", "timestamp": 1781150000, "iv": 25.617, "hv": 23.27, "underlyingPrice": 295.63 },
{ "time": "2026-06-10", "timestamp": 1781064000, "iv": 27.384, "hv": 22.892, "underlyingPrice": 291.58 },
{ "time": "2026-06-09", "timestamp": 1780978000, "iv": 27.237, "hv": 22.854, "underlyingPrice": 290.55 },
{ "time": "2026-06-08", "timestamp": 1780891000, "iv": 26.368, "hv": 19.028, "underlyingPrice": 301.54 }
]
}
2
3
4
5
6
7
8
9
10
11
12
13
Rate Limit
- Maximum 60 requests per 30 seconds (for paginated interfaces, only the first call counts)
- Python
- Proto
- C#
- Java
- C++
- JavaScript
get_option_underlying_his_volatility(code, index_option_type=IndexOptionType.NORMAL, begin_time=None, end_time=None, page_req_key=None)
Description
Get option underlying historical volatility data, returning daily IV and HV time series along with the underlying's closing price, with pagination support.
Parameters
Parameter Type Description code str Underlying stock code e.g. 'US.AAPL'index_option_type IndexOptionType Index option type NORMAL=standard options (default), SMALL=mini index optionsbegin_time str Start date, format 'YYYY-MM-DD' end_time str End date, format 'YYYY-MM-DD' page_req_key bytes Pagination request key Pass None for first call, pass previous return value for subsequent callsTime Range
- Maximum span between
begin_timeandend_timeis 364 days - Both empty:
end_time= today,begin_time= today minus 364 days - Only
begin_timeprovided:end_time=begin_timeplus 364 days - Only
end_timeprovided:begin_time=end_timeminus 364 days
- Maximum span between
Returns
Parameter Type Description ret RET_CODE Interface call result data pandas.DataFrame When ret == RET_OK, returns volatility data str When ret != RET_OK, returns error description page_req_key bytes Next page key, None indicates no more data Return DataFrame fields:
Field Type Description code str Stock code name str Stock name time str Trading day time string timestamp float Trading day timestamp (Unix seconds) iv float Implied volatility (percentage) hv float Historical volatility (percentage) underlying_price float Underlying closing price (mark price for current day)
Example
from moomoo import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111)
ret, data, page_req_key = quote_ctx.get_option_underlying_his_volatility(
'US.AAPL',
begin_time='2026-06-01',
end_time='2026-06-15'
)
if ret == RET_OK:
print(data)
else:
print('error:', data)
quote_ctx.close()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- Output
code name time timestamp iv hv underlying_price
0 US.AAPL Apple 2026-06-12 1.781237e+09 25.126 23.324 291.13
1 US.AAPL Apple 2026-06-11 1.781150e+09 25.617 23.270 295.63
2 US.AAPL Apple 2026-06-10 1.781064e+09 27.384 22.892 291.58
3 US.AAPL Apple 2026-06-09 1.780978e+09 27.237 22.854 290.55
4 US.AAPL Apple 2026-06-08 1.780891e+09 26.368 19.028 301.54
5 US.AAPL Apple 2026-06-05 1.780632e+09 26.995 18.024 307.34
6 US.AAPL Apple 2026-06-04 1.780546e+09 25.249 17.366 311.23
7 US.AAPL Apple 2026-06-03 1.780459e+09 26.801 18.927 310.26
8 US.AAPL Apple 2026-06-02 1.780373e+09 26.258 18.415 315.20
9 US.AAPL Apple 2026-06-01 1.780286e+09 25.864 16.841 306.31
2
3
4
5
6
7
8
9
10
11
# Qot_GetOptionUnderlyingHisVolatility.proto
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
uint GetOptionUnderlyingHisVolatility(Qot_GetOptionUnderlyingHisVolatility.Request req); virtual void OnReply_GetOptionUnderlyingHisVolatility(MMAPI_Conn client, uint nSerialNo, Qot_GetOptionUnderlyingHisVolatility.Response rsp);
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
int getOptionUnderlyingHisVolatility(Qot_GetOptionUnderlyingHisVolatility.Request req) onReply_GetOptionUnderlyingHisVolatility(MMAPI_Conn client, int nSerialNo, Qot_GetOptionUnderlyingHisVolatility.Response rsp)
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
Moomoo::u32_t GetOptionUnderlyingHisVolatility(const Qot_GetOptionUnderlyingHisVolatility::Request &stReq);
virtual void OnReply_GetOptionUnderlyingHisVolatility(Moomoo::u32_t nSerialNo, const Qot_GetOptionUnderlyingHisVolatility::Response &stRsp) = 0;
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
Example
class Program : public MMSPI_Qot, 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) {
Qot_GetOptionUnderlyingHisVolatility::Request req;
Qot_GetOptionUnderlyingHisVolatility::C2S *c2s = req.mutable_c2s();
// TODO: populate c2s fields per proto
m_GetOptionUnderlyingHisVolatilitySerialNo = m_pQotApi->GetOptionUnderlyingHisVolatility(req);
}
virtual void OnReply_GetOptionUnderlyingHisVolatility(Moomoo::u32_t nSerialNo, const Qot_GetOptionUnderlyingHisVolatility::Response &stRsp) {
if (nSerialNo != m_GetOptionUnderlyingHisVolatilitySerialNo) return;
string resp_str;
ProtoBufToBodyData(stRsp, resp_str);
cout << UTF8ToLocal(resp_str) << endl;
}
protected:
MMAPI_Qot *m_pQotApi;
Moomoo::u32_t m_GetOptionUnderlyingHisVolatilitySerialNo = 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
getOptionUnderlyingHisVolatility(qotGetOptionUnderlyingHisVolatility)
Description
Get option underlying historical volatility data
Parameters
message C2S
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional int32 indexOptionType = 2; //Qot_Common.IndexOptionType
required string beginTime = 3; //Start time string
required string endTime = 4; //End time string
optional bytes nextPageKey = 5; //Pagination request key
}
message Request
{
required C2S c2s = 1;
}
2
3
4
5
6
7
8
9
10
11
12
13
- Returns
message VolatilityItem
{
required string time = 1; //Trading day time string
optional double timestamp = 2; //Trading day timestamp
optional double iv = 3; //Implied volatility (percentage)
optional double hv = 4; //Historical volatility (percentage)
optional double underlyingPrice = 5; //Underlying close price
}
message S2C
{
required Qot_Common.Security owner = 1; //Option underlying stock
optional string code = 2; //Stock code
optional string name = 3; //Stock name
repeated VolatilityItem volatilityList = 4; //Volatility data list, sorted by trading day descending
optional bytes nextPageKey = 5; //Pagination request key
}
message Response
{
required int32 retType = 1 [default = -400]; //RetType, return result
optional string retMsg = 2;
optional int32 errCode = 3;
optional S2C s2c = 4;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- Interface call result, structure refer to RetType
Protocol ID
3304
Example
import mmWebsocket from "moomoo-api";
import { Common, Qot_Common } from "moomoo-api/proto";
import beautify from "js-beautify";
function QotGetOptionUnderlyingHisVolatility(){
const { RetType } = Common
const { QotMarket } = Qot_Common
let [addr, port, enable_ssl, key] = ["127.0.0.1", 11112, false, ''];
let websocket = new mmWebsocket();
websocket.onlogin = (ret, msg)=>{
if (ret) {
const req = {
c2s: {
owner: { market: QotMarket.QotMarket_US_Security, code: 'AAPL' },
beginTime: '2026-06-01',
endTime: '2026-06-15',
},
};
websocket.GetOptionUnderlyingHisVolatility(req)
.then((res)=>{
let { errCode, retMsg, retType, s2c } = res
console.log("GetOptionUnderlyingHisVolatility: 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("start error", msg);
}
};
websocket.start(addr, port, enable_ssl, key);
setTimeout(()=>{ websocket.stop(); process.exit(); }, 5000);
}
QotGetOptionUnderlyingHisVolatility()
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
- Output
GetOptionUnderlyingHisVolatility: errCode 0, retMsg , retType 0
{
"owner": { "market": 1, "code": "AAPL" },
"code": "US.AAPL",
"name": "Apple",
"volatilityList": [
{ "time": "2026-06-12", "timestamp": 1781237000, "iv": 25.126, "hv": 23.324, "underlyingPrice": 291.13 },
{ "time": "2026-06-11", "timestamp": 1781150000, "iv": 25.617, "hv": 23.27, "underlyingPrice": 295.63 },
{ "time": "2026-06-10", "timestamp": 1781064000, "iv": 27.384, "hv": 22.892, "underlyingPrice": 291.58 },
{ "time": "2026-06-09", "timestamp": 1780978000, "iv": 27.237, "hv": 22.854, "underlyingPrice": 290.55 },
{ "time": "2026-06-08", "timestamp": 1780891000, "iv": 26.368, "hv": 19.028, "underlyingPrice": 301.54 }
]
}
2
3
4
5
6
7
8
9
10
11
12
13
Rate Limit
- Maximum 60 requests per 30 seconds (for paginated interfaces, only the first call counts)