MT4/MT5使用dll调用matlab

前言

     matlab中具有很多丰富的函数,可以很方便地进行统计分析和科学计算,而MT4/MT5有很好的回测平台和可扩展的MQL语言,但是缺少很多分析函数库。在MT5的社区上有很多将matlab引擎封装成dll与MT4/MT5连接起来,但是这些文章的调用都比较过时,这其中涉及到许多的错误问题。目前MT4调用的dll只能是Visual studio2008/2010,本文采用2010版本。经过测试,发现MT4只能调用32位的matlab,而MT5可以调用64位的matlab,且在X64的平台下编译成Dll运行。关于Dll的其他问题可以参考前一个博文。

一、matlab引擎介绍

   1.1  在Visual studio2010中的环境配置问题

     详细过程可以根据 http://jingyan.baidu.com/article/60ccbceb6e862e64cab1978e.html  中的内容进行配置,如果出现下图的错误,应该将debug的平台改为x64:
 
   1.2  engine例子代码解读
  
  
  
  1. // MQL5DLLSamples.cpp : 定义 DLL 应用程序的导出函数。
  2. //例子是利用matlab引擎绘制竖直自由落体的时间与位移变化关系图
  3. #include "stdafx.h"
  4. #include "engine.h" //注意必须先按照1.1中的说明来进行matlab文件的配置
  5. #include <stdio.h>
  6. #define BUFSIZE 256
  7. _DLLAPI bool __stdcall EngBegin(void)
  8. {
  9. Engine *ep; //引擎对象指针
  10. mxArray *T = NULL, *a = NULL, *d = NULL; //声明三个变量的数组
  11. char buffer[BUFSIZE+1]; //从matlab输出的数据的缓存数组
  12. double *Dreal, *Dimag;
  13. double time[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  14. /*
  15. * 启动 MATLAB engine
  16. */
  17. if (!(ep = engOpen(NULL))) {
  18. MessageBox ((HWND)NULL, (LPCWSTR)"Can't start MATLAB engine",
  19. (LPCWSTR) "Engwindemo.c", MB_OK);
  20. exit(-1);
  21. }
  22. /*
  23. *第一部分
  24. *
  25. * 将数据传输给matlab,并计算数据,绘图
  26. *
  27. */
  28. /*
  29. * 建立一个double型的实数矩阵对象,关于这些函数可以从matlab的帮助文档中找到
  30. */
  31. T = mxCreateDoubleMatrix(1, 10, mxREAL);
  32. //将数组time的数赋值给T对象
  33. memcpy((char *) mxGetPr(T), (char *) time, 10*sizeof(double));
  34. /*
  35. * 将变量 T 传送到 MATLAB 的工作空间
  36. */
  37. engPutVariable(ep, "T", T);
  38. /*
  39. * 计算位移,其中9.8是重力加速度g
  40. */
  41. engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
  42. /*
  43. * 绘制结果,也可以将matlab的代码封装成一个函数脚本调用,但是脚本文件必须在MT5\Libaray\下面
  44. */
  45. engEvalString(ep, "plot(T,D);");
  46. engEvalString(ep, "title('Position vs. Time for a falling object');");
  47. engEvalString(ep, "xlabel('Time (seconds)');");
  48. engEvalString(ep, "ylabel('Position (meters)');");
  49. /*
  50. * 第二部分
  51. * 这部分例子是计算一个矩阵A的特征值
  52. *
  53. */
  54. a = mxCreateDoubleMatrix(3, 2, mxREAL);
  55. memcpy((char *) mxGetPr(a), (char *) time, 6*sizeof(double));
  56. engPutVariable(ep, "A", a);
  57. /*
  58. * 计算特征值
  59. */
  60. engEvalString(ep, "d = eig(A*A')");
  61. /*
  62. *使用 engOutputBuffer来获得 MATLAB 的输出. 但是必须确保缓存区间开始是空的
  63. */
  64. buffer[BUFSIZE] = '\0';
  65. engOutputBuffer(ep, buffer, BUFSIZE);
  66. /*
  67. *显示输出缓存区的信息
  68. */
  69. engEvalString(ep, "whos");
  70. MessageBox ((HWND)NULL, (LPCWSTR)buffer, (LPCWSTR) "MATLAB - whos", MB_OK);
  71. /*
  72. * 获得输出结果的数据
  73. */
  74. d = engGetVariable(ep, "d");
  75. engClose(ep);
  76. if (d == NULL) {
  77. MessageBox ((HWND)NULL, (LPCWSTR)"Get Array Failed", (LPCWSTR)"Engwindemo.c", MB_OK);
  78. }
  79. else {
  80. Dreal = mxGetPr(d);
  81. Dimag = mxGetPi(d);
  82. if (Dimag)
  83. sprintf(buffer,"Eigenval 2: %g+%gi",Dreal[1],Dimag[1]);
  84. else
  85. sprintf(buffer,"Eigenval 2: %g",Dreal[1]);
  86. MessageBox ((HWND)NULL, (LPCWSTR)buffer, (LPCWSTR)"Engwindemo.c", MB_OK);
  87. mxDestroyArray(d);
  88. }
  89. /*
  90. * 最后要销毁mxArray变量
  91. */
  92. mxDestroyArray(T);
  93. mxDestroyArray(a);
  94. return true;
  95. }

二、在MT5中的调用

   
   
  1. //+------------------------------------------------------------------+
  2. //| DllTest.mq5 |
  3. //| Copyright 2016, DaiXiaoRong. |
  4. //| https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright 2016, MetaQuotes Software Corp."
  7. #property link "https://www.mql5.com"
  8. #property version "1.00"
  9. #import "MQL5DLLSamples.dll"
  10. bool EngBegin(void);
  11. #import
  12. //+------------------------------------------------------------------+
  13. //| Script program start function |
  14. //+------------------------------------------------------------------+
  15. void OnStart()
  16. {
  17. //---
  18. EngBegin();
  19. //---
  20. }
  21. //+------------------------------------------------------------------+
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值