如今項目中有個需求要從股票開盤開始,實時監控指定股票(例如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