查看: 388|回复: 2

[编程技巧] 定时运行MATLAB程序任务的解决方案

[复制链接]
发表于 2015-10-16 09:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?我要加入

x
有的时候我们编写好一个MATLAB程序后,可能需要每天某一时间定时运行这个程序,比如某个量化模型每天的回测结果和报告,需要在收盘后运行或需要在第二天开盘前看到回测结果,比如某些本地的数据库需要定时更新(比如FQuantToolBox本地数据每日全市场数据更新)等等这些需要每天(或每隔某一固定时间区间)定时跑一个MATLAB程序,当然我们可以每天在某一时间打开MATLAB运行相应的程序,但这样一则显得不够pro,二则当你需要定时运行程序增多的时候,这种方式根本不现实,尤其当你由于其他事情(比如开会或者出差时)不在电脑前时。所以需要一个定时运行MATLAB程序任务的解决方案,故有此篇。

定时运行MATLAB程序任务的解决方案我能想到的大体有两种方法,第一种方法是使用timer函数来实现,关于timer的东西这里不做过多展开;第二种方法是本篇重点讲解的。

大体的解决方法就是

编写好待运行的MATLAB程序(比如叫做Main_AutoRunMatlabProgram.m)——>
编写一个脚本文件可以启动MATLAB运行上述M文件
(比如叫做Main_AutoRunMatlabProgram.bat)——>
设置电脑定时任务,定时启动上述脚本文件。

当然这个定时运行MATLAB程序任务的解决方案有一个要求就是你的电脑常开或者是把相关文件提交到服务器上运行。

下面以FQuantToolBox本地数据每日全市场数据更新为例,来看下具体的操作。

1.首先编写好一个待运行的MATLAB程序

比如叫做Main_AutoRunMatlabProgramNum1.m其内容为:


  1. %%Main_AutoRunMatlabProgramNum1

  2. %by LiYang_faruto

  3. %Email:farutoliyang@foxmail.com

  4. %2015/01/01


  5. %%A Little Clean Work

  6. tic;

  7. %clear;

  8. %clc;

  9. %close all;

  10. formatcompact;

  11. %%目录调整


  12. FileStr= ['E:\###数据库-Faruto的数据库\FQuantToolBox']

  13. cd(FileStr);

  14. %%日志文件


  15. fid= fopen('Dlog.txt','at+');

  16. TitleStr= ['日期时间:',datestr(now),'操作记录日志by李洋faruto'];

  17. fprintf(fid,'%s\n',TitleStr);

  18. %%获取股票代码列表

  19. run= 1;

  20. if1 == run

  21. ticID = tic;

  22. try

  23. [StockList,StockListFull] =GetStockList_Web;

  24. save('StockList','StockList');


  25. TitleStr = ['日期时间:',datestr(now),'更新股票代码列表成功'];

  26. fprintf(fid,'%s\n',TitleStr);


  27. elapsedTime = toc(ticID);

  28. TimeStr = [ '共耗时',num2str(elapsedTime), ' seconds(',num2str(elapsedTime/60), ' minutes)', ...

  29. '(',num2str(elapsedTime/60/60), 'hours)'];

  30. fprintf(fid,'%s\n',TimeStr);


  31. subject = TitleStr;

  32. content = TimeStr;

  33. TargetAddress = '516667408@qq.com';

  34. Attachments = 'Dlog.txt';

  35. MatlabSentMail(subject, content,TargetAddress, Attachments);


  36. catch err

  37. TitleStr = ['日期时间:',datestr(now),'更新股票代码列表失败:',err.message];

  38. fprintf(fid,'%s\n',TitleStr);

  39. for i = 1:size(err.stack,1)

  40. StrTemp = ['FunName:',err.stack(i).name,'Line:',num2str(err.stack(i).line)];

  41. fprintf(fid,'%s\n',StrTemp);

  42. end

  43. subject = TitleStr;

  44. content = [];

  45. TargetAddress = '516667408@qq.com';

  46. Attachments = 'Dlog.txt';

  47. MatlabSentMail(subject, content,TargetAddress, Attachments);

  48. end

  49. else

  50. load StockList;

  51. end


  52. %%获取指数代码列表

  53. run= 1;

  54. if1 == run


  55. ticID = tic;

  56. try

  57. [IndexList] = GetIndexList_Web;

  58. save('IndexList','IndexList');


  59. TitleStr = ['日期时间:',datestr(now),'更新指数代码列表成功'];

  60. fprintf(fid,'%s\n',TitleStr);


  61. elapsedTime = toc(ticID);

  62. TimeStr = [ '共耗时',num2str(elapsedTime), ' seconds(',num2str(elapsedTime/60), ' minutes)', ...

  63. '(',num2str(elapsedTime/60/60), 'hours)'];

  64. fprintf(fid,'%s\n',TimeStr);


  65. subject = TitleStr;

  66. content = TimeStr;

  67. TargetAddress = '516667408@qq.com';

  68. Attachments = 'Dlog.txt';

  69. MatlabSentMail(subject, content,TargetAddress, Attachments);


  70. catch err

  71. TitleStr = ['日期时间:',datestr(now),'更新指数代码列表失败:',err.message];

  72. fprintf(fid,'%s\n',TitleStr);

  73. for i = 1:size(err.stack,1)

  74. StrTemp = ['FunName:',err.stack(i).name,'Line:',num2str(err.stack(i).line)];

  75. fprintf(fid,'%s\n',StrTemp);

  76. end

  77. subject = TitleStr;

  78. content = [];

  79. TargetAddress = '516667408@qq.com';

  80. Attachments = 'Dlog.txt';

  81. MatlabSentMail(subject, content,TargetAddress, Attachments);

  82. end

  83. else

  84. load IndexList;

  85. end

  86. %%获取股票基本信息以及所属行业板块(证监会行业分类)和所属概念板块(新浪财经定义)

  87. run= 1;

  88. if1 == run


  89. ticID = tic;

  90. try

  91. [SaveLog,ProbList,NewList] =SaveStockInfo(StockList);


  92. TitleStr = ['日期时间:',datestr(now),'更新股票基本信息成功'];

  93. fprintf(fid,'%s\n',TitleStr);


  94. elapsedTime = toc(ticID);

  95. TimeStr = [ '共耗时',num2str(elapsedTime), ' seconds(',num2str(elapsedTime/60), ' minutes)', ...

  96. '(',num2str(elapsedTime/60/60), 'hours)'];

  97. fprintf(fid,'%s\n',TimeStr);


  98. subject = TitleStr;

  99. content = TimeStr;

  100. TargetAddress = '516667408@qq.com';

  101. Attachments = 'Dlog.txt';

  102. MatlabSentMail(subject, content,TargetAddress, Attachments);


  103. catch err

  104. TitleStr = ['日期时间:',datestr(now),'更新股票基本信息失败:',err.message];

  105. fprintf(fid,'%s\n',TitleStr);

  106. for i = 1:size(err.stack,1)

  107. StrTemp = ['FunName:',err.stack(i).name,'Line:',num2str(err.stack(i).line)];

  108. fprintf(fid,'%s\n',StrTemp);

  109. end

  110. subject = TitleStr;

  111. content = [];

  112. TargetAddress = '516667408@qq.com';

  113. Attachments = 'Dlog.txt';

  114. MatlabSentMail(subject, content,TargetAddress, Attachments);

  115. end

  116. end

  117. %%更新指数数据

  118. run= 1;

  119. if1 == run


  120. ticID = tic;

  121. try

  122. [SaveLog,ProbList,NewList] =SaveIndexTSDay(IndexList);


  123. TitleStr = ['日期时间:',datestr(now),'更新指数日线数据成功'];

  124. fprintf(fid,'%s\n',TitleStr);


  125. elapsedTime = toc(ticID);

  126. TimeStr = [ '共耗时',num2str(elapsedTime), ' seconds(',num2str(elapsedTime/60), ' minutes)', ...

  127. '(',num2str(elapsedTime/60/60), 'hours)'];

  128. fprintf(fid,'%s\n',TimeStr);


  129. subject = TitleStr;

  130. content = TimeStr;

  131. TargetAddress = '516667408@qq.com';

  132. Attachments = 'Dlog.txt';

  133. MatlabSentMail(subject, content,TargetAddress, Attachments);


  134. catch err

  135. TitleStr = ['日期时间:',datestr(now),'更新指数日线数据失败:',err.message];

  136. fprintf(fid,'%s\n',TitleStr);

  137. for i = 1:size(err.stack,1)

  138. StrTemp = ['FunName:',err.stack(i).name,'Line:',num2str(err.stack(i).line)];

  139. fprintf(fid,'%s\n',StrTemp);

  140. end

  141. subject = TitleStr;

  142. content = [];

  143. TargetAddress = '516667408@qq.com';

  144. Attachments = 'Dlog.txt';

  145. MatlabSentMail(subject, content,TargetAddress, Attachments);

  146. end

  147. end

  148. %%股票日线数据更新-除权除息数据-无并行操作

  149. run= 1;

  150. if1 == run

  151. ticID = tic;

  152. try

  153. AdjFlag = 0;

  154. XRDFlag = 0;

  155. [SaveLog,ProbList,NewList] =SaveStockTSDay(StockList,AdjFlag,XRDFlag);


  156. TitleStr = ['日期时间:',datestr(now),'股票日线数据更新-除权除息数据成功!'];

  157. fprintf(fid,'%s\n',TitleStr);


  158. elapsedTime = toc(ticID);

  159. TimeStr = [ '共耗时',num2str(elapsedTime), ' seconds(',num2str(elapsedTime/60), ' minutes)', ...

  160. '(',num2str(elapsedTime/60/60), 'hours)'];

  161. fprintf(fid,'%s\n',TimeStr);


  162. subject = TitleStr;

  163. content = TimeStr;

  164. TargetAddress = '516667408@qq.com';

  165. Attachments = 'Dlog.txt';

  166. MatlabSentMail(subject, content,TargetAddress, Attachments);


  167. catch err

  168. TitleStr = ['日期时间:',datestr(now),'股票日线数据更新-除权除息数据失败!:',err.message];

  169. fprintf(fid,'%s\n',TitleStr);

  170. for i = 1:size(err.stack,1)

  171. StrTemp = ['FunName:',err.stack(i).name,'Line:',num2str(err.stack(i).line)];

  172. fprintf(fid,'%s\n',StrTemp);

  173. end

  174. subject = TitleStr;

  175. content = [];

  176. TargetAddress = '516667408@qq.com';

  177. Attachments = 'Dlog.txt';

  178. MatlabSentMail(subject, content,TargetAddress, Attachments);

  179. end

  180. end


  181. %%股票数据更新-前复权

  182. run= 1;

  183. if1 == run

  184. ticID = tic;

  185. try

  186. AdjFlag = 1;

  187. XRDFlag = 0;

  188. [SaveLog,ProbList,NewList] =SaveStockTSDay(StockList,AdjFlag,XRDFlag);

  189. TitleStr = ['日期时间:',datestr(now),'股票数据更新-前复权成功!'];

  190. fprintf(fid,'%s\n',TitleStr);


  191. elapsedTime = toc(ticID);

  192. TimeStr = [ '共耗时',num2str(elapsedTime), ' seconds(',num2str(elapsedTime/60), ' minutes)', ...

  193. '(',num2str(elapsedTime/60/60), 'hours)'];

  194. fprintf(fid,'%s\n',TimeStr);


  195. subject = TitleStr;

  196. content = TimeStr;

  197. TargetAddress = '516667408@qq.com';

  198. Attachments = 'Dlog.txt';

  199. MatlabSentMail(subject, content,TargetAddress, Attachments);

  200. catch err

  201. TitleStr = ['日期时间:',datestr(now),'股票数据更新-前复权失败!:',err.message];

  202. fprintf(fid,'%s\n',TitleStr);

  203. for i = 1:size(err.stack,1)

  204. StrTemp = ['FunName:',err.stack(i).name,'Line:',num2str(err.stack(i).line)];

  205. fprintf(fid,'%s\n',StrTemp);

  206. end

  207. subject = TitleStr;

  208. content = [];

  209. TargetAddress = '516667408@qq.com';

  210. Attachments = 'Dlog.txt';

  211. MatlabSentMail(subject, content,TargetAddress, Attachments);

  212. end

  213. end


  214. %… …

  215. %由于代码过程没有粘贴全部代码

  216. %%Exit


  217. fclose(fid);

  218. exit;


  219. %%Record Time

  220. toc;

  221. displayEndOfDemoMessage(mfilename);
复制代码


由于代码过长没有粘贴全部代码

Main_AutoRunMatlabProgramNum1.m中的代码内容基本就是运行FQuantToolBox中的相关函数,进行本地数据更新。(更新股票代码列表,更新指数代码列表,更新个股信息数据,更新本地指数数据,更新本地股票数据等等等等)

这里有几点需要大家注意

(1)try catch的使用,一则可以防止某一块cell模块的运行出现问题,导致整个程序停止;二则若果真出现问题可以捕获相应的报错写入log文件(Dlog.txt)。

(2)设置log文件[fid =fopen('Dlog.txt','at+');],将所有的操作记录和运行情况记录在日志里面,一则方便事后查看(程序运行时间、是否有报错、报错内容、报错位置);二则可以将日志以附件的形式给自己发送邮件,移动办公查看程序运行情况,很是方便。

(3)程序运行情况给自己发送邮件推送通知,包括数据是否更新成功、运行时间、是否有异常报错等等。

[MatlabSentMail(subject,content, TargetAddress, Attachments);]

(4)别忘了日志文件的句柄关闭,在程序尾端关闭相关日志文件并退出MATLAB

fclose(fid);

exit;


转自:http://www.360doc.com/content/15/0206/13/14222116_446668320.shtml
回复
分享到:

使用道具 举报

 楼主| 发表于 2015-10-16 09:11 | 显示全部楼层
2.编写一个脚本文件可以启动MATLAB运行上述M文件

比如叫做Main_AutoRunMatlabProgram.bat,其内容为:



  1. rem注释内容

  2. remMATLAB AutoRun

  3. remby LiYang_faruto

  4. rem2015.03.01

  5. rem-nojvm 禁用JAVA虚拟机
  6. rem-nosplash 启动闪屏(splash windows)禁用

  7. start D:\'ProgramFiles'\MATLAB_R2014b\bin\matlab.exe -nosplash -r 'run('E:\###数据库-Faruto的数据库\AutoRunProgram\Main_AutoRunMatlabProgramNum1.m')'

复制代码


你需要稍微熟悉一下脚本文件语言,也不是很复杂。上面代码中rem就想相当于MATLAB中的%是注释的作用可以忽略,重点看下面这段代码

start D:\'Program Files'\MATLAB_R2014b\bin\matlab.exe-nosplash -r 'run('E:\###数据库-Faruto的数据库\AutoRunProgram\Main_AutoRunMatlabProgramNum1.m')'

作用就是启动以无闪屏模式(-nosplash)启动MATLAB并运行指定位置的m文件。i.e.你若双击Main_AutoRunMatlabProgram.bat这个文件,就会启动MATLAB然后运行Main_AutoRunMatlabProgramNum1.m文件。


3.设置电脑定时任务,定时启动上述脚本文件

通过设置电脑定时任务,就可以定时运行相关程序了。

Windows平台下,打开“任务计划程序”(控制面板-管理工具-任务计划程序),点击“创建基本任务程序”:
01.jpg
然后一步一步按照创建基本任务向导操作即可,目的是让电脑能自动运行
Main_AutoRunMatlabProgram.bat文件(意味着可以自动运行里面的MATLAB程序)。
02.jpg
03.jpg
04.jpg
05.jpg
06.jpg
07.jpg
08.jpg
最后可以看到设置好的定时任务
09.jpg
4.整体运行情况
至此,定时运行MATLAB程序任务都设置完毕,看下每天运行的情况,不外乎每天会在凌晨1点定时运行,然后可以收到邮件,在手机上查看运行情况,收到的邮件为:
10.jpg
邮件内容:
10.jpg
通过查看附件Dlog.txt可以查看全部的运行日志。

4.总结
这样的话就可以省时省心的定时运行MATLAB程序,然后查看邮件即可。这篇内容还仅仅是数据更新,但大体框架是类似的,比如您可以定时运行相关量化模型的回测结果,然后生成pdf或者doc报告文件(都可以用MATLAB自动生成),然后推送给自己的邮箱,第一时间查看相关择时模型、选股模型或者相关CTA模型的信号、股票列表和结果。

哦。对了,上面用到了使用MATLAB收发邮件,实现方式也很多。具体可以去MATLAB技术论坛找相关的实现函数,核心用到了MATLAB中的sendmail函数,涉及到国内具体的邮箱域名,需要再封装调整一下,也不复杂。

希望这篇<定时运行MATLAB程序任务的解决方案>能帮助到您,如果您遇到了类似的问题。
发表于 2017-10-9 10:04 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

快速回复 返回顶部 返回列表