首页 MT5andMATLAB交互编程

MT5andMATLAB交互编程

举报
开通vip

MT5andMATLAB交互编程MT5 and MATLAB 交互编程 (1):数据类型和处理 (2010-09-10 12:21:37) 转载▼ 标签: 杂谈 分类: CrewsHE 原文地址: http://www.whool.net/archives/13094 这个一篇在MQL5论坛上的帖子,挺感兴趣的,拉过来跑跑。 原文连接:http://www.mql5.com/en/articles/44 文章包括3个部分,介绍: theory, reference and practice.首先是关于数据类型的讨论,然后是dll...

MT5andMATLAB交互编程
MT5 and MATLAB 交互编程 (1):数据类型和处理 (2010-09-10 12:21:37) 转载▼ 标签: 杂谈 分类: CrewsHE 原文地址: http://www.whool.net/archives/13094 这个一篇在MQL5论坛上的帖子,挺感兴趣的,拉过来跑跑。 原文连接:http://www.mql5.com/en/articles/44 文章包括3个部分,介绍: theory, reference and practice.首先是关于数据类型的讨论,然后是dll的建立最后给出了一个例子,由于之前没有用dll在MT5中做过,所以还是从头开始了。 一:数据类型的设定 数据类型的对比: 值得注意的是:在MQL中,变量可以是简单的变量而在Matlab中所有用到的变量都应该是以数组变量存在的,所以在做交换的时候要始终注意。 在MQL中使用的有四种变量类型:数组,字符串,结构以及类,在于matlab做交换的时候我们使用的仅仅是数组和字符串变量,使用结构和类进行的交互太过于麻烦而且不好实现。 在对数组类的变量进行传递的时候我们需要知道的是,数组的类型以及数组的大小(通过使用ArraySize()得到),值得注意的是在MT5中数组存储的 方式是按照时间的倒序进行的,也就是越靠前面的越靠近现在的时间.而在Matlab中是相反的,即数组开始的地方就是时间开始的地方,为了解决这个矛盾, 我们要对数组进行一些处理。 首先使用的是ArrayIsSeries(),如果得到的结果是AS_SERIES =TURE,我们要采取之下的方法: 1.对于MQL传到MATLAB,数组必须是反转之后的,字符串和多位的数组类型保持不变。 2,对于MATLAB传到MQL的数据,必须是经过反转后,而且标记AS_SERIES =TURE,字符串和多维数组不进行反转。 3.对于MQL编程中使用的数组,必须满足倒序原则,保证了数据的一致性,字符串类型的使用正常顺序。 4,为了避免在转换过程中出现错误,对于数组变量只使用1,2维数组进行传递。 另外值得注意的是在涉及字符串类型的时候,由于在MQL中是用的是Unicode而在Matlab中使用的是ANSI encoding 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 ,在进行传递的时候应该使用转换编码的函数,具体的使用是: 1.使用StringToCharArray()把Unicode转换到ANSI; 2.使用CharToStringArray()把ANSI转换到Unicode; 为了避免出现问题,设定在MQL5中使用Unicode格式。 为了使之后的编程更为简单,我们对MQL和MATLAB的数据类型做了一个映射,按照这样的 办法 鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载 不会降低数据精度不过可以简化处理的过程:   MT5 and MATLAB 交互编程(2):matlab接口和编译器选择 (2010-09-10 13:23:07) 转载▼ 标签: 杂谈 分类: CrewsHE 原文地址: http://www.whool.net/archives/13099 这个一篇在MQL5论坛上的帖子,挺感兴趣的,拉过来跑跑。 原文连接:http://www.mql5.com/en/articles/44 文章包括3个部分,介绍: theory, reference and practice.首先是关于数据类型的讨论,然后是dll的建立最后给出了一个例子,由于之前没有用dll在MT5中做过,所以还是从头开始了。 二:MATLAB Engine API 接口和输入输出函数的介绍 关于Matlab混合编程,现在用得比较多的有四种: a)通过Matlab Engine的方式。 b)直接调用Matlab的C/C++ 数学 数学高考答题卡模板高考数学答题卡模板三年级数学混合运算测试卷数学作业设计案例新人教版八年级上数学教学计划 函数库。 c)用Matlab自带的Matlab Complier。 d)使用Matlab的combuilde工具。 1. 利用Matlab引擎 Matlab引擎(Matlab engine)提供了一组 Matlab API 函数,用户不必关心这个Matlab引擎是如何实现的,只需要调用这些函数即可。正是通过这些 API 函数,实现了应用程序进程之间的传递数据,从而达到两者之间的良好结合。 Matlab引擎应用程序的实质是把Matlab作为一个引擎,允许从自己的Visual C++程序调用这个引擎。在运行时,引擎作为一个进程单独运行,此时Visual C++程序也作为一个进程单独运行,两者可以通过进程间的通信机制进行交互。 Matlab引擎采用客户和服务器计算模式。在运行中,Visual C++的C语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,Matlab引擎提供了下列几个函数: MATLAB    Engine engClose                            Quit MATLAB engine session engEvalString                 Evaluate expression in string engGetVariable               Copy variable from MATLAB engine workspace engGetVisible                  Determine visibility of MATLAB engine session engOpen                            Start MATLAB engine session engOpenSingleUse         Start MATLAB engine session for single, nonshared use engOutputBuffer             Specify buffer for MATLAB  output engPutVariable               Put variables into MATLAB  engine workspace engSetVisible                    Show or hide MATLAB  engine session 库文件的制作: 程序在Visual C++下编译,还需要用到相应的导入库libeng.lib,libmx.lib,libmat.lib和matlab.lib这几个动态链接库。在 Matlab的安装目录Matlab\extern\include下,有以下几个定义文件:libeng.def,libmx.def,libmat.def,matlab.def。以libeng.def为例,用如下的命令生成导入库: C:\MATLABR11\extern\include>lib/def:libeng.def /out:libeng.lib /machine:ix86 其中C:\MATLABR11为本地机器的Matlab安装目录,/out:libeng.lib指定的是输出文件,/machine:ix86是指所用的机器环境,这里的ix86是指支持Intel的处理器。 同样,生成libmx.lib,libmat.lib以及matlab.lib这几个相应的库文件。 库文件的加入: 把所生成的库文件加入到VC工程的Project->Settings->link->Object/Library Modules文本框中即可。 优点:可以应用MATLAB中的toolbox进行运算; 缺点:电脑必须要安装matlab环境或者有MCR环境。 2. 利用Matlab自身的编译器调用工具箱中的函数 Matlab 的编译器可将Matlab的M文件转换为C或C++的源代码,以便产生完全脱离Matlab运行环境的独立的运用程序,但Matlab本身的资料说明编译器如用来建立独立的运用程序,就不能调用Matlab工具箱中的函数,这非常不利于实现一些特殊的算法。然而工具箱中的函数既然是M文件,那么就一定可以用编译器来编译,以提供如Visual C++的调用函数,但是编译器只能编译一个独立的M文件,也就是说这个 M文件必须不依赖于其他的M文件。如果这个M文件中又调用了其他的M文件,那么可以将被调用的M文件拷贝到调用M文件的相应位置,并做适当的改动,这样就可以用编译器来编译。需要注意的是,编译器不支持图形函数,所以M文件中如果有图形函数,则需要将其注释掉。 优点:简单,容易操作,不需要MCR环境 缺点:不能调用工具箱,不支持多个M文件   3. 利用Visual C++进行外部调用 利用Visual C++进行外部调用的基本思路是这样的:首先把,M文件加入到一段C程序中去,然后通过Matlab中的mex批处理文件将该C文件生成.exe文件,再通过Visual C++的外部调用的函数ShellExecute()或WinExec()实现外部调用。 mex批处理文件的调用格式如下: mex –f msvc60engmatopts.bat *.c 利用Visual C++的ShellExecute()函数调用的方法如下: ShellExecute()函数是在应用程序中运行其他函数的,该函数既可以运行可执行文件,也可以使用相应的可执行文件打开数据文件。它的函数原形是这样的: HINSTANCE ShellExecute ( HWND hwnd, //父句柄窗口 LPCTSTR lpVerb, //包含所要执行的操作的字符串 LPCTSTR lpFile, //文件名 LPCTSTR lpParameters, //包含可执行文件的参数的字符串 LPCTSTR lpDirectory, //默认路径 INT nShowCmd //所创建进程的显示方法 ); 其中,参数lpVerb可以是“edit”、“find”、“open”、“print”、“explore”或“properties” 优点:适合VC联合编程 缺点:不好掌握 MATLAB Engine API 和MCR 方程   这里简单地列举一下Matlab混合编程中Matlab Engine经常用到的几个API函数: 1.int engClose(Engine *ep); 此函数用于退出Matlab引擎。 2.int engEvalString(Engine *ep,const char *string); 此函数用于使Matlab引擎执行字符串string中的 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达式。 3.mxArray *engGetVariable(Engine *ep,const char *name); 此函数用于从Matlab引擎工作区间中复制名字为name的变量。 4.int engGetVisible(Engine *ep,bool *value); 此函数用于判断Matlab引擎工作窗口是否可见。 5.Engine *engOpen(const char *startcmd); 此函数用于启动一个Matlab引擎,在Windows操作环境下startcmd参数必须为NULL。 6.Engine *engOpenSingleUse(const char *startcmd,void *dcom,int *retstatus); 此函数用于启动一个只允许用户使用的Matlab引擎,在Windows系统中Startcmd和dcom参数始终为NULL,retstatus返回engOpenSingleUse函数的执行状态。 7.int engOutputBuffer(Engine *ep,char *p,int n); 此函数用于设置Matlab引擎的输出内存,存储engEvalString函数后的输出结果。其中n表示设置的 输出内存可以存放的字符个数,如果输出结果的字符串大于n,则只存储前n个字符。 8.int engPutVariable(Engine *ep,const char *name,const mxArray *mp); 此函数用于向Matlab引擎工作区间中写入一个Matlab阵列变量,其中name为在Matlab引擎工作区间写入的变量名字。 9.int engSetVisible(Engine *ep,bool value); 此函数用于设置Matlab引擎窗口是否可见的属性;如果value=true,则Matlab引擎窗口可见;如果 value=false,则Matlab引擎窗口不可见。 MCR对于matlab来说一般是默认关闭的,所以在进行操作之前要想检查MCR的状态,运行完之后要关闭MCR以节约资源。具体的操作是 首先安装MCR通过运行 MCRInstaller.exe文件,文件位置在《MATLAB>\Toolbox\compiler\deploy\win32 folder.在运行MCR之前运行一下命令: bool = mclInitializeApplication(const char **option, int count)– 如果得到的是TRUE表示MCR运行成功,如果是FALSE的话就是关闭的。参数设置: · const char **option — string of options, like in mcc – R; usually is NULL   · int count — size options string, typically 0. On ending public library work you must call: bool = mclTerminateApplication(void)— returns TRUE if MCR was successfully closed. 2.2 MATLAB Compiler 4 使用matlab compiler可以的得到标准的运行文件即使没有安装matlab,或者得到c/c++的libraries,在所有的机子上运行,具体的matlab 编译器的方法另外再说了。一些注意事项和MCC的用法: 1. Dependencies analysis — at this stage determine all functions, MEX-files and P-files, that compiled m-functions depend on.   2. Creating archive – CTF-file is created, it is encrypted and compressed.   3. Generating the object code of wrapper – at this stage all source codes are created, needed for component: · C/C++ interface code for m-functions specified in the command line (NameFile_main.c). · Component file (NameFile_component.dat), which contains all the information needed to execute m-code (including encryption keys and paths, stored in CTF-file).   4. C/C++ translation. At this stage C/C++ source code files are compiled into object files. 5. Linking. The final stage of project building.   2.3 C++标准输入输出库 为了使整个过程的数据变量更一致,我们使用C++的标准输入输出库。 void *pIn = memcpy(void *pIn, void *pOut, int nSizeByte)– this function copies (clones) variable/array from pOut to pIn with size of nSizeByte bytes, where: · void *pIn — pointer to array, where to copy.   · void *pOut — pointer to array, from which copying is made.   · int nSizeByte — the size of copied data, should not exceed the size of the pIn array, otherwise memory access error will occur.  
本文档为【MT5andMATLAB交互编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_997338
暂无简介~
格式:doc
大小:41KB
软件:Word
页数:0
分类:初中语文
上传时间:2017-06-05
浏览量:34