Matlab實時監控股票交易數據之Timer函數應用實例

如今項目中有個需求要從股票開盤開始,實時監控指定股票(例如100只股票)的交易明細數據,這邊明顯要用到多線程進行處理每條股票的數據,查了下Matlab相關函數,居然沒有多線程的說法,網上說惟一一個多線實現方法就是Timer,好吧,既然只提供這個,那就沒什麼好說的了,就去研究下這個函數唄,但忽然發現Timer只是一個定時處理數據,跟多線程有什麼關係呢,後來發現是我誤會了,人家Timer不只提供定時,並且多個Timer是異步執行的(以前一直覺得Matlab只存在單線程,全部數據處理都是串行機制),這樣就能知足個人需求啦,而後進行實現,結果確實能夠達到預期效果。數據庫

這邊主要介紹下使用Timer實現實時監控股票交易數據的例子,Timer的具體用法度娘中多個是,就不具體分析啦windows

實時監控股票交易數據這邊主要分爲倆個部分,一個定時腳本,一個處理單隻股票的函數,這邊只是各初級例子,後面還有待完善,有相關需求的朋友能夠拿來參考。markdown

一、定時腳本多線程

%% 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數據存儲到本地文件)異步

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 執行次數這倆個屬性,就是執行多少次,執行頻率加上執行次數,確實也能夠算出結束時間。函數

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。spa

相關文章
相關標籤/搜索