我有一个包含一些数据的.csv文件,例如date(30/10/2013),closePrice(361.08),volume(4500014),openPrice(362.62),highPrice(365),lowPrice(358.65)。该文件包含2510X6的数据,我想绘制一个吊灯 - 棒图可以有人帮助我吗?这就是我所做的:
fid = fopen('Amazon.csv');
HDRS = textscan(fid,'%s %s %s %s %s %s',1, 'delimiter',',');
DATA = textscan(fid,'%s %f %f %f %f %f','delimiter',',');
fclose(fid);
outCell = cell(size(DATA{1},1), length(HDRS));
for i = 1:length(HDRS);
if isnumeric(DATA{i});
outCell(:,i) = num2cell(DATA{i});
else
outCell(:,i) = DATA{i};
end
end
candle (outCell{:,5}, outCell{:,6}, outCell{:,2}, outCell{:,4}, 'b', outCell{:,1});
运行文件时,我收到错误Error using candle Too many input arguments
。我正在使用数组的单元格因为我有日期并将日期转换为向量我决定使用数组的单元格。
答案 0 :(得分:1)
curly-bracket derefencing,与outCell{:, 5}
调用中的candle
一样,扩展为Matlab称之为“以逗号分隔的列表”。每当你看到花括号解除引用时,你可以认为它完全等同于键入隐含的单独元素,用逗号分隔---所以如果size(outCell, 1)
是3,那就好像你有键入outCell{1, 5}, outCell{2, 5}, outCell{3, 5}
。这就是candle
的三个输入参数,你认为你只传递了一个。
我不熟悉candle
本身,但如果它想要一个单列单元格数组作为它的第一个参数,那么从outCell
中获取单列单元格数组的方法是使用普通的圆括号解除引用来对其进行切片:outCell(:, 5)
如果另一方面candle
需要数字向量而不是单元格数组,则可以说cell2mat(outCell(:, 5))
。另一种方式(第二个例子是花括号解引用和逗号分隔列表变得明显的地方)就是说[outCell{:, 5}]'
- 这是一个以逗号分隔的列表,被方括号括起来,这意味着水平连接元素。
答案 1 :(得分:0)
我找到了以下方法:
首先,我观察到您需要以列向量格式表示日期而不是cell
。实现这一目标的唯一方法是将日期转换为某种数字表示。这正是datenum
的作用。示例如下:
DateString = '11/12/2013';
formatIn = 'mm/dd/yyyy';
datenum(DateString,formatIn)
ans =
735550
以此格式转换所有日期。接下来,我觉得如果你构建时间序列对象,那么绘制如here所示更容易。这需要财务时间序列对象才能工作。没问题。它可以如here所示构建。在这种情况下,我相信它可以构造为(虚拟示例):
dates={'11/12/2013';'11/13/2013'}
higPrice=[100;100]
lowPrice=[10;10]
closePrice=[90;80]
openPrice=[80;70]
%construct a financial time series object
tsobj = fints(datenum(dates,formatIn), [higPrice lowPrice closePrice openPrice], {'high','low','close','open'}) %put in correct order
candle(tsobj); %I get the plot
编辑:我忘了提及如果我尝试提供除'high','low','open','close'
以外的任何其他名称,它就不起作用。例如,我尝试使用'highPrice','lowPrice','openPrice','closePrice'
。我不知道原因,因为我第一次使用candle
。