我正在尝试创建一个与api(准确地说是Questrade API)交换信息的应用程序。 api使用oauth2进行安全性和身份验证。
在获取授权令牌,刷新令牌和查询基本信息(我的帐户信息和股票报价)方面,我已经成功 1 。
但是,当我尝试查询股票期权报价时遇到问题(如here所述)。
我尝试了许多不同的排列,但无济于事。这是我到目前为止所做的:
1)。我采用了上面链接中“示例请求”部分中显示的示例,并执行了jsondecode
以获取等效的MATLAB和“精确模板”必须为其编码参数结构:
>> eg_param = jsondecode('{"filters":{"optionType":"Call","underlyingId":27426,"expiryDate":"2017-01-20T00:00:00.000000-05:00","minstrikePrice":70,"maxstrikePrice":80},"optionIds":[9907637, 9907638]}')
eg_param =
struct with fields:
filters: [1×1 struct]
optionIds: [2×1 double]
>> eg_param.filters
ans =
struct with fields:
optionType: 'Call'
underlyingId: 27426
expiryDate: '2017-01-20T00:00:00.000000-05:00'
minstrikePrice: 70
maxstrikePrice: 80
>> eg_param.optionIds
ans =
9907637
9907638
2)。将我的实际值(real_params
)替换为示例中的值:
real_params.optionIds = 23255262;
real_params.filters.optionType = 'Call';
real_params.filters.expiryDate ='2018-11-09T00:00:00.000000-05:00';
real_params.filters.underlyingId = 40825;
real_params.filters.minstrikePrice = [];
real_params.filters.maxstrikePrice = [];
3)。将weboptions
'RequestMethod
参数更改为post
web_opt.RequestMethod = 'Post';
4)。使用了webwrite
功能(而不是“ webread”功能)来发布和查询服务器:
new_data = webwrite(['https://api01.iq.questrade.com/',...
'v1/markets/quotes/options'], real_params, web_opt);
但是,当我这样做时,会收到错误消息:
*The server returned the status 400 with
message "Bad Request" in response to the
request to URL
https://api01.iq.questrade.com/v1/markets/quotes/options.*
我尝试了许多不同的排列方式,包括更改方括号,[],{},{{}},并对参数使用不同的值,但是结果是相同的。另外,无论何时进行测试,我都确保确保刷新访问令牌并使用“帐户信息”请求测试连接是否正常运行,因此此错误与任何授权,安全性或连接问题无关。
1 例如,要获取website指示为的帐户信息:
GET https://api01.iq.questrade.com/v1/accounts
我有 1)。使用MATLAB的weboptions
并创建了一个对象来将令牌信息存储在HeaderFields
中:
web_opt = weboptions;
web_opt.RequestMethod = 'Get';
headerFields = {'Authorization', ['Bearer ', 'ZHHgMgh0up5UqJ9TSOIALpkoVpi0']};
web_opt.HeaderFields = headerFields;
和 2)。使用以下命令查询服务器:
data = webread(['https://api01.iq.questrade.com/', 'v1/accounts'], web_opt);
这可以完成与API服务器的通信,并且MATLAB将我的帐户信息作为结构数组存储在变量data
中。
答案 0 :(得分:1)
不幸的是,由于您提供的API密钥似乎无法正常工作,因此我无法测试该解决方案,但是仍然可以为您提供帮助。
您能发现使用这两个模块生成的JSON之间的区别吗?
% Original code:
real_params.optionIds = 23255262;
real_params.filters.optionType = 'Call';
real_params.filters.expiryDate ='2018-11-09T00:00:00.000000-05:00';
real_params.filters.underlyingId = 40825;
real_params.filters.minstrikePrice = [];
real_params.filters.maxstrikePrice = [];
%{
>> jsonencode(real_params)
ans =
'{"optionIds":2.3255262E+7,"filters":{"optionType":"Call","expiryDate":"2018-11-09T00:00:00.000000-05:00","underlyingId":40825,"minstrikePrice":[],"maxstrikePrice":[]}}'
%}
% Slightly modified code:
real_params = struct();
real_params.optionIds = int32(23255262);
real_params.filters.optionType = 'Call';
real_params.filters.expiryDate ='2018-11-09T00:00:00.000000-05:00';
real_params.filters.underlyingId = 40825;
real_params.filters.minstrikePrice = [];
real_params.filters.maxstrikePrice = [];
%{
>> jsonencode(real_params)
ans =
'{"optionIds":23255262,"filters":{"optionType":"Call","expiryDate":"2018-11-09T00:00:00.000000-05:00","underlyingId":40825,"minstrikePrice":[],"maxstrikePrice":[]}}'
%}
在这种情况下,自动转换可能是罪魁祸首(出于缺乏更好的原因,将optionIds
作为double
值发送,而不是API期望的整数。