function FT_Candle(hi, lo, cl, op, color, dates, dateform)
%% Modified by fantuanxiaot
%% 模仿faruto进行修改
%% 以下是一些例子
% load disney
% FT_Candle(dis_HIGH(end-20:end),dis_LOW(end-20:end),dis_CLOSE(end-20:end),dis_OPEN(end-20:end))
% FT_Candle(dis_HIGH(end-200:end),dis_LOW(end-200:end),dis_CLOSE(end-200:end),dis_OPEN(end-200:end))
% FT_Candle(dis_HIGH(end-200:end),dis_LOW(end-200:end),dis_CLOSE(end-200:end),dis_OPEN(end-200:end),'m')
% FT_Candle(dis_HIGH(end-200:end),dis_LOW(end-200:end),dis_CLOSE(end-200:end),dis_OPEN(end-200:end),'m',dis_nv.dates(end-200:end))
% FT_Candle(dis_HIGH(end-200:end),dis_LOW(end-200:end),dis_CLOSE(end-200:end),dis_OPEN(end-200:end),'m',datestr(dis_nv.dates(end-200:end))
% FT_Candle(dis_HIGH(end-200:end),dis_LOW(end-200:end),dis_CLOSE(end-200:end),dis_OPEN(end-200:end),'m',dis_nv.dates(end-200:end),2)
% FT_Candle(dis_HIGH(end-200:end),dis_LOW(end-200:end),dis_CLOSE(end-200:end),dis_OPEN(end-200:end),'m',datestr(dis_nv.dates(end-200:end)),2)
% FT_Candle(dis_HIGH(end-200:end),dis_LOW(end-200:end),dis_CLOSE(end-200:end),dis_OPEN(end-200:end),'m',datestr(dis_nv.dates(end-200:end)),17)
% FT_Candle(dis_HIGH,dis_LOW,dis_CLOSE,dis_OPEN,'m',datestr(dis_nv.dates),17)
% FT_Candle(dis_HIGH(end-400:end),dis_LOW(end-400:end),dis_CLOSE(end-400:end),dis_OPEN(end-400:end),'m',datestr(dis_nv.dates(end-400:end)),17)
%% 以上是一些例子
% CANDLE Candlestick chart.
% CANDLE(HI, LO, CL, OP)
% CANDLE(HI, LO, CL, OP, COLOR, DATES, DATEFORM)
% Optional Inputs: COLOR, DATES, DATEFORM
% Inputs:
% HI - Column vector of high prices of a security.
%
% LO - Column vector of low prices of a security.
%
% CL - Column vector of closing prices of a security.
%
% OP - Column vector of opening prices of a security.
% Optional Inputs:
% COLOR - Three element color vector, [R G B], or a string specifying the
% color name. MATLAB supplies a default color if none is specified
% or if it is empty. The default color differs depending on the
% background color of the figure window. See COLORSPEC in the
% MATLAB Reference Guide for color names.
% DATES - Column vector of dates for user specified X-axis tick
% labels.
%
% DATEFORM - A scalar dictating the format of the date string tick labels.
% See DATEAXIS for details on the date string formats.
%
% See also BOLLING, HIGHLOW, MOVAVG, POINTFIG.
% Copyright 1995-2006 The MathWorks, Inc.
% Revision:1.9.2.4[ DISCUZCODE4 ]nbsp;Revision: 1.9.2.4 [ DISCUZ_CODE_4 ]nbsp; Date: 2008/01/10 21:10:22 $
if nargin < 5 || isempty(color)
color ='k';
end
if nargin < 4
error('finance:candle:missingInputs', ...
'Missing high, low, closing, or opening data.')
end
if size(hi, 2) > 1 || size(lo, 2) > 1 || size(cl, 2) > 1 || size(op, 2) > 1
error('finance:candle:invalidInputs', ...
'Please specify input data as column vectors.')
elseif size(hi, 1) ~= size(lo, 1) || size(lo, 1) ~= size(cl, 1) || size(cl, 1) ~= size(op, 1),
error('finance:candle:mismatchInputData', ...
'Number of data must be consistent across inputs.');
end
if nargin == 6 || nargin == 7
% 补充了一下
dates=datenum(dates);
if size(dates, 2) ~= 1
error('finance:candle:invalidDateSize', ...
'DATES must be a column vector.');
elseif size(dates, 1) ~= size(hi, 1)
error('finance:candle:mismatchDatesData', ...
'Number of dates must correspond to number of data.');
end
end
%% 以下作图进行了修改
backg='g';
backr='r';
% Determine if current plot is held or not
if ishold
hldflag = 1;
else
hldflag = 0;
end
m = length(hi(:));
figure(1)
scrsz=get(0,'ScreenSize');
set(figure(1),'Position',[scrsz(3)*0.1 scrsz(4)*0.25 scrsz(3)*0.95 scrsz(4)]*0.7,...
'color','w')
movegui(figure(1),'center')
% Need to pad all inputs with NaN's to leave spaces between day data
tmp = nan;
nanpad = tmp(1, ones(1, m));
hilo = [hi'; lo'; nanpad];
index = 1:m;
indhilo = index(ones(3, 1), :);
plot(indhilo(:), hilo(:), 'color', color)
clpad = [cl(:)';nanpad];
clpad = clpad(:)';
oppad = [op(:)'; nanpad];
oppad = oppad(:)';
% Create boundaries for filled regions
xbottom = index - 0.25;
xbotpad = [xbottom(:)'; nanpad];
xbotpad = xbotpad(:)';
xtop = index + 0.25;
xtoppad = [xtop(:)'; nanpad];
xtoppad = xtoppad(:)';
ybottom = min(clpad, oppad);
ytop = max(clpad, oppad);
% Plot lines between high and low price for day
hold on
% z-data used to stagger layering. This prevents renderer layering issues.
zdata = xtoppad;
zdata(~isnan(zdata)) = .01;
zdata2 = zdata + .01;
% Plot box representing closing and opening price span
% If the opening price is less than the close, box is empty
i = find(oppad(:) <= clpad(:));
boxes(i) = patch([xbotpad(i); xbotpad(i); xtoppad(i); xtoppad(i)],...
[ytop(i); ybottom(i); ybottom(i); ytop(i)], ...
[zdata(i); zdata(i); zdata(i); zdata(i)], ...
backr, 'edgecolor', 'r');
% If the opening price is greater than the close, box is filled
% If the opening price is greater than the close, box is filled
i = find(oppad(:) > clpad(:));
boxes(i) = patch([xbotpad(i); xbotpad(i); xtoppad(i); xtoppad(i)],...
[ytop(i); ybottom(i); ybottom(i); ytop(i)],...
[zdata2(i); zdata2(i); zdata2(i); zdata2(i)], ...
backg, 'edgecolor', 'g'); %#ok
% set tag for use with timeser.m
setappdata(gca, 'plottype', 'Candle ') % set tag for use with timeser.m
[Highest,hind] = max(hi);
[Lowest,lind] = min(lo);
% If original figure was not held, turn hold off
if ~hldflag
hold off
end
%[EOF]
hold on;
if nargin < 6
text(hind,Highest*1.001,['\leftarrow',num2str(Highest)],'fontname','Times','fontsize',14);
text(lind,Lowest*0.999,['\leftarrow',num2str(Lowest)],'fontname','Times','fontsize',14);
end
if nargin >=6
dateset = dates;
text(dateset(hind),Highest*1.001,['\leftarrow',num2str(Highest)],'fontname','Times','fontsize',14);
text(dateset(lind),Lowest*0.999,['\leftarrow',num2str(Lowest)],'fontname','Times','fontsize',14);
end
% Add support for providing dates.
% Add support for providing dates.
if nargin == 6 || nargin == 7
dateset = dates;
hcdl_vl = findobj(gca, 'Type', 'line');
hcdl_bx = findobj(gca, 'Type', 'patch');
% The CANDLE plot is made up of patch(es) and a line. hcdl_vl is the
% handle to the vertical lines; it's actually only 1 line object.
% hcdl_bx contains the handle(s) of the patch object(s) that make up the
% empty and filled boxes. The XData of those objects need to be changed
% to dates so that ZOOM works correctly.
line_xdata = get(hcdl_vl, 'XData');
set(hcdl_vl, 'XData', dateset(line_xdata));
for pidx=1:length(hcdl_bx), % Need to do loop since there can be 1 or 2 patches.
patch_xdata = get(hcdl_bx(pidx), 'XData');
offset = [-0.25*ones(2, size(patch_xdata, 2)); ...
+0.25*ones(2, size(patch_xdata, 2))] * min(abs(diff(dateset)));
set(hcdl_bx(pidx), 'XData', dateset(round(patch_xdata))+offset);
end
% Change XTickLabel to date string format.
if ~exist('dateform', 'var') || isempty(dateform)
datetick('x',20);
else
datetick('x', dateform);
end
end
set(gca,'fontname','Times','fontsize',10)
hold off
%[EOF]