Matlab实时监控股票交易数据之Timer函数应用实例

人点击

现在项目中有个需求要从股票开盘开始,实时监控指定股票(例如100只股票)的交易明细数据,这边明显要用到多线程进行处理每条股票的数据,查了下Matlab相关函数,竟然没有多线程的说法,网上说唯一一个多线实现方法就是Timer,好吧,既然只提供这个,那就没什么好说的了,就去研究下这个函数呗,但突然发现Timer只是一个定时处理数据,跟多线程有什么关系呢,后来发现是我误会了,人家Timer不仅提供定时,而且多个Timer是异步执行的(之前一直以为Matlab只存在单线程,所有数据处理都是串行机制),这样就能满足我的需求啦,然后进行实现,结果确实可以达到预期效果。

这边主要介绍下使用Timer实现实时监控股票交易数据的例子,Timer的具体用法度娘中多个是,就不具体分析啦

实时监控股票交易数据这边主要分为俩个部分,一个定时脚本,一个处理单只股票的函数,这边只是各初级例子,后面还有待完善,有相关需求的朋友可以拿来参考。

定时脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
%% Main_GetRealTimeStockDataTest
% 定时获取股票的实时数据
% by qm
% Email:305638715@qq.com
% 2015/09/09
%% A Little Clean Work
tic;
% clear;
% clc;
% close all;
format compact;
%% 定时程序
data = {'600000';'600005';'600006';'600007';'300200'};

Len = size(data);

for i = 1:Len
StockCode = data{i};
t=timer(...
'Name',['RealTimeStockData_',StockCode],...
'TimerFcn',@GetRealTimeStockData,...
'Period',5,...
'ExecutionMode','fixedrate');

set(t,'UserData',StockCode);

start(t);

end

%% Record Time
toc;

针对一只股票实时数据处理(这里是将每5s数据存储到本地文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
function [DataOutput, Status] = GetRealTimeStockData(obj,eventdata,UserData)
% 获取实时交易数据
% by qm
% Email:305638715@qq.com
% 2015/09/09

%% 输入输出预处理

DataOutput = [];

Status = 0;

StockCode = obj.UserData;

%获取实时数据
GetRTQuotes = fGetRTQuotes();

GetRTQuotes.Code = StockCode;

DataCell = GetRTQuotes.GetRTQuotes();

Header = { '时间','今开盘','昨收盘','当前价','今最高','今最低',...
'竞买价,即“买一”报价','竞卖价,即“卖一”报价', ...
'成交量,单位“股”','成交额,单位“元”',...
'买一量','买一价','买二量','买二价','买三量','买三价',...
'买四量','买四价','买五量','买五价', ...
'卖一量','卖一价','卖二量','卖二价','卖三量','卖三价',...
'卖四量','卖四价','买五量','卖五价'};

DataCellTemp = {1,32};

% 数据转换
DataCellTemp(1,2:30) = DataCell(2:30,1);

dateTemp = [char(DataCell(31)),' ',char(DataCell(32))];

dateTemp = datenum( dateTemp, 'yyyy-mm-dd HH:MM:SS');

dateTemp = datestr(dateTemp,'yyyymmddHHMM.SS');

dateTemp = str2double(dateTemp);

DataCellTemp{1} = dateTemp;

StockTickRealTime = DataCellTemp;

disp(StockTickRealTime);

%保存数据,已有文件进行追加,没有则新建
% 读取数据库地址
load 'Config';

HomeFolder = Config{1};

FolderStr = [HomeFolder,'/DataBase/Stock/Tick_RealTime_mat/',datestr(date,'yyyy-mm-dd')];
if ~isdir( FolderStr )
mkdir( FolderStr );
end

FileStr = [FolderStr,'/',StockCode,'_Tick_RealTime.mat'];

FileExist = 0;
if exist(FileStr, 'file') == 2
FileExist = 1;
end

% % 本地数据存在,进行尾部更新添加
if 1 == FileExist

try
MatObj = matfile(FileStr,'Writable',true);
[nrows, ncols]=size(MatObj,'StockTickRealTime');
if nrows > 0
MatObj.StockTickRealTime = [MatObj.StockTickRealTime(1:nrows,:);StockTickRealTime];
else
MatObj.StockTickRealTime = StockTickRealTime;
end

catch errormsg
str = [ StockCode,datestr(clock,'yyyy-mm-dd HH:MM:SS'),' 数据保存失败!' ];
disp(errormsg);
disp(str);
end
end

% % 本地数据不存在
if 0 == FileExist
save(FileStr,'StockTickRealTime','Header','-v7.3');
end

针对这个需求,这个例子还不是很完善,因为要股票有开盘时间和收盘时间的说法,并不是需求一直取数据,这边可以用windows的定时任务处理,执行指定脚本,或者利用Timer本身的函数,但我这边看到Timer只有startat方法,并没有理想中的endat方法,但提供了Period 时间间隔(执行周期)和TasksToExecute 执行次数这俩个属性,就是执行多少次,执行频率加上执行次数,确实也可以算出结束时间。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器