matlab中k线怎么算,4.K线图以及常用技术指标的Matlab实现-基于Matlab的量化投资

本次主要讲解用Matlab来实现K线图以及常用的技术指标。

相关前导帖子浏览:

系列帖子目录

Matlab的Bar图中Bar颜色灵活设置的一点总结【by faruto】

[原创]坐标轴刻度标签旋转升级版

========================

本次测试Demo使用数据,IF在20120104的主力数据-1分钟线。数据形式:

a4c26d1e5885305701be709a3d33442f.png

K线图实现:

a4c26d1e5885305701be709a3d33442f.png

局部:

a4c26d1e5885305701be709a3d33442f.png

该K线图实现与matlab自带的candle的K线图实现的区别是

matlab的candle生成的K线图阴线阳线的颜色是一样的,不能灵活设置。该K线图可以灵活设置阴线阳线的颜色。

实现测试脚本代码:

[code]

%% K线图Matlab实现Demo

% by LiYang/faruto

%

Email:farutoliyang@gmail.com

% 2012/8/4

scrsz =

get(0,'ScreenSize');

figure('Position',[1 1 scrsz(3)*4/5

scrsz(4)]);

subplot(3,1,[1 2]);

OHLC = F(:,3:6);

cndlV2(OHLC,0,'r','b','k');

xlim([1,length( OHLC )]);

% % Tick Label Set

XTick = [];

XTickLabel = [];

XTick = [XTick; 1];

str = [num2str(F(1,1)),'-',num2str(F(1,2))];

XTickLabel{numel(XTickLabel)+1, 1} = str;

ind = find(F(:,2) == 1000, 1);

if ~isempty(ind)

XTick = [XTick; ind ];

str = [num2str(F(ind, 1)),'-',num2str(F(ind, 2))];

XTickLabel{numel(XTickLabel)+1, 1} = str;

end

ind = find(F(:,2) == 1130, 1);

if ~isempty(ind)

XTick = [XTick; ind ];

str = [num2str(F(ind, 1)),'-',num2str(F(ind, 2))];

XTickLabel{numel(XTickLabel)+1, 1} = str;

end

ind = find(F(:,2) == 1400, 1);

if ~isempty(ind)

XTick = [XTick; ind ];

str = [num2str(F(ind, 1)),'-',num2str(F(ind, 2))];

XTickLabel{numel(XTickLabel)+1, 1} = str;

end

ind = length(F(:,1));

XTick = [XTick; ind ];

str = [num2str(F(ind, 1)),'-',num2str(F(ind, 2))];

XTickLabel{numel(XTickLabel)+1, 1} = str;

set(gca,'XTick', XTick);

set(gca,'XTickLabel', XTickLabel);

TickLabelRotate(gca, 'x', 30, 'right');

title('K线图Matlab实现Demo', 'FontWeight','Bold',

'FontSize', 15);

subplot(313);

bar( F(:,7) );

xlim([1,length( OHLC )]);

title('成交量', 'FontWeight','Bold', 'FontSize',

15);

set(gca,'XTick', XTick);

set(gca,'XTickLabel', XTickLabel);

TickLabelRotate(gca, 'x', 30, 'right');

[/code]

K线图函数代码(只需开高低收,即可画出K线图)

[code]

function

cndlV2(varargin)

% See if we have [OHLC] or

seperate vectors and retrieve our

% required variables (Feel

free to make this code more pretty ;-)

isMat =

size(varargin{1},2);

indexShift = 0;

useDate = 0;

if isMat == 4,

O = varargin{1}(:,1);

H = varargin{1}(:,2);

L = varargin{1}(:,3);

C = varargin{1}(:,4);

else

O = varargin{1};

H = varargin{2};

L = varargin{3};

C = varargin{4};

indexShift = 3;

end

if nargin+isMat

< 7,

colorDown = 'k';

colorUp = 'w';

colorLine = 'k';

else

colorUp = varargin{3+indexShift};

colorDown = varargin{4+indexShift};

colorLine = varargin{5+indexShift};

end

if nargin+isMat

< 6,

date = (1:length(O))';

else

if varargin{2+indexShift} ~= 0

date = varargin{2+indexShift};

useDate = 1;

else

date = (1:length(O))';

end

end

% w = Width of body, change

multiplier to draw body thicker or thinner

% the 'min' ensures no

errors on weekends ('time gap Fri. Mon.' >

wanted

% spacing)

w=.3*min([(date(2)-date(1))

(date(3)-date(2))]);

%%%%%%%%%%%Find up and down

days%%%%%%%%%%%%%%%%%%%

d=C-O;

l=length(d);

hold on

%%%%%%%%draw line from Low

to High%%%%%%%%%%%%%%%%%

for i=1:l

line([date(i) date(i)],[L(i) H(i)],'Color',colorLine)

end

%%%%%%%%%%draw white (or

user defined) body (down day)%%%%%%%%%%%%%%%%%

n=find(d<0);

for i=1:length(n)

x=[date(n(i))-w date(n(i))-w date(n(i))+w date(n(i))+w

date(n(i))-w];

y=[O(n(i)) C(n(i)) C(n(i)) O(n(i)) O(n(i))];

fill(x,y,colorDown)

end

%%%%%%%%%%draw black (or

user defined) body(up day)%%%%%%%%%%%%%%%%%%%

n=find(d>=0);

for i=1:length(n)

x=[date(n(i))-w date(n(i))-w date(n(i))+w date(n(i))+w

date(n(i))-w];

y=[O(n(i)) C(n(i)) C(n(i)) O(n(i)) O(n(i))];

fill(x,y,colorUp)

end

if (nargin+isMat

> 5) &&

useDate,

%

tlabel('x');

dynamicDateTicks

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

hold off

[/code]

常见技术指标

1)MA(移动平均)

2)MACD(指数平滑异同移动平均线)

MACD 的计算:

(1)计算短期(S日)指数移动平均线和长期(L日)指数移动平均线EMA1、EMA2。

(2)计算离差值DIF=EMA1-EMA2。

(3)计算

DIF的N日指数移动平均线,即DEA。

(4)计算MACD=2*(DIF-DEA)。

3)DMA(平均线差指标)

DMA的计算:

(1)计算短期(S日)移动均线和长期(L日)移动均线MA1、MA2。

(2)计算平均线差DMA=MA1-MA2。

(3)计算DMA的M日移动平均线,即AMA。

4)TRIX(三重指数平滑移动平均指标)

TRIX的计算:

(1)计算N日的指数移动平均线EMA。

(2)对上述EMA再进行两次N 日指数移动平均后得到TR。

(3)计算TRIX=(TR-昨日TR)/昨日TR*100。

(4)计算TRIX的M日简单移动平均MATRIX。

实现Demo

a4c26d1e5885305701be709a3d33442f.png

实现测试脚本代码:

[code]

%% 常见技术指标Matlab实现

% by

LiYang/faruto

%

Email:farutoliyang@gmail.com

% 2012/8/4

%% MA

S = 5;

L = 20;

[SMA, LMA] = movavg(Data, S,

L);

SMA(1:S-1) = NaN;

LMA(1:L-1) = NaN;

scrsz =

get(0,'ScreenSize');

figure('Position',[1 1

scrsz(3)*4/5 scrsz(4)]);

subplot(221);

OHLC = F(:,3:6);

cndlV2(OHLC,0,'r','b','k');

xlim([1,length( OHLC

)]);

set(gca,'XTick', XTick);

set(gca,'XTickLabel', XTickLabel);

TickLabelRotate(gca, 'x', 30, 'right');

hold on;

H1 =

plot(SMA,'g','LineWidth',1.5);

H2 =

plot(LMA,'r','LineWidth',1.5);

title('常见技术指标SMA(简单移动平均线)Matlab实现Demo', 'FontWeight','Bold', 'FontSize',

15);

M =

{'MA5';'MA20'};

legend([H1,H2],M);

%% MACD

S = 12;

L = 26;

EMA1 = EMA(Data,

S);

EMA2 = EMA(Data,

L);

DIFF = EMA1-EMA2;

M = 10;

DEA = EMA(DIFF,

M);

MACD =

2*(DIFF-DEA);

subplot(222);

MACD_p = MACD;

MACD_n = MACD;

MACD_p(MACD_p<0) = 0;

MACD_n(MACD_n>0) = 0;

bar(MACD_p,'r','EdgeColor','r');

hold on;

bar(MACD_n,'b','EdgeColor','b');

plot(DIFF,'k','LineWidth',1.5);

plot(DEA,'g','LineWidth',1.5);

xlim([1,length( OHLC

)]);

set(gca,'XTick', XTick);

set(gca,'XTickLabel', XTickLabel);

TickLabelRotate(gca, 'x', 30, 'right');

title('常见技术指标MACD(指数平滑异同移动平均线)Matlab实现Demo', 'FontWeight','Bold', 'FontSize',

15);

%% DMA

S = 5;

L = 20;

[MA1, MA2] = movavg(Data, S,

L);

MA1(1:S-1) = NaN;

MA2(1:L-1) = NaN;

DMA = MA1-MA2;

M = 5;

AMA = movavg(DMA, M,

M);

AMA(1:M-1) = NaN;

subplot(223);

hold on;

plot(DMA,'k','LineWidth',1.5);

plot(AMA,'r','LineWidth',1.5);

title('常见技术指标DMA(平均线差指标)Matlab实现Demo', 'FontWeight','Bold', 'FontSize',

15);

legend('DMA','AMA');

xlim([1,length( OHLC

)]);

set(gca,'XTick', XTick);

set(gca,'XTickLabel', XTickLabel);

TickLabelRotate(gca, 'x', 30, 'right');

%% TRIX

N = 2;

ema = EMA(Data,

N);

M = 20;

TR = EMA( EMA(ema,N) ,

N);

TRIX = (

TR(2:end)-TR(1:end-1) )./TR(1:end-1)*100;

TRIX = [NaN;

TRIX];

MATRIX = movavg(TRIX, M,

M);

subplot(224);

hold on;

plot(TRIX,'k','LineWidth',1.5);

plot(MATRIX,'r','LineWidth',1.5);

title('常见技术指标TRIX(三重指数平滑移动平均指标)Matlab实现Demo', 'FontWeight','Bold', 'FontSize',

15);

legend('TRIX','MATRIX');

xlim([1,length( OHLC

)]);

set(gca,'XTick', XTick);

set(gca,'XTickLabel', XTickLabel);

TickLabelRotate(gca, 'x', 30, 'right');

[/code]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值