график свечей в Matlab

У меня есть файл .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. Я использую ячейку массива, потому что у меня есть дата, и для преобразования даты в вектор я решаю использовать ячейку массива.


person Community    schedule 21.11.2013    source источник


Ответы (2)


Я нашел такой способ сделать это:

Во-первых, я заметил, что вам нужна дата в формате вектора столбца, а не cell. Единственный способ добиться этого - преобразовать дату в некоторое числовое представление. Это именно то, что делает datenum. Пример следующим образом:

DateString = '11/12/2013';
formatIn = 'mm/dd/yyyy';
datenum(DateString,formatIn)

ans = 

  735550

Преобразуйте все свои даты в этот формат. Далее, я считаю, что если вы создадите объект временного ряда, будет намного проще построить график, как показано здесь. Для работы необходим объект финансового временного ряда. Без проблем. Его можно создать, как показано здесь. В этом случае я считаю, что его можно построить как (фиктивный пример):

 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.

person Autonomous    schedule 21.11.2013

Разъединение фигурных скобок, как в 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}]' - это список, разделенный запятыми, заключенный в квадратные скобки, что означает горизонтальное объединение элементов.

person jez    schedule 21.11.2013