本站分享:AI、大数据、数据分析师培训认证考试,包括:Python培训Excel培训Matlab培训SPSS培训SAS培训R语言培训Hadoop培训Amos培训Stata培训Eviews培训

matlab通过vc6生成mt4可调用的dll_matlab教程

matlab培训 cdadata 3586℃

matlab通过vc6生成mt4可调用的dll

如何将m文件转换成可供mt4调用的dll
环境:
matlab r2009b
Microsoft Visual C++ 6.0

在MATLAB中:
mbuild -setup
mex -setup
mcc  -W lib:Mode1FunctionLib -T link:lib demo1.m

demo1.m就是要编译的m文件。

生成 Mode1functionLib.dll,Mode1FunctionLib.lib,Mode1Function.h
把这三个文件放到VC的项目里边。如 D:Program FilesMicrosoft Visual StudioMyProjectsMode1 里边。

工程—》添加到工程—》文件 将上述三个文件添加到该项目
VC配置:

1    组建—》配置—》移除 Win32 Debug

2    工具—》选项—》目录—》Win32 目录 include files 加上:
G:PROGRAM FILESMATLABR2009BEXTERNINCLUDE
G:PROGRAM FILESMATLABR2009BEXTERNINCLUDEWIN32
3    工具—》选项—》目录—》Win32 目录 Library files加上:
G:PROGRAM FILESMATLABR2009BBINWIN32
G:PROGRAM FILESMATLABR2009BEXTERNLIBWIN32MICROSOFT

VC生成项目Mode1

在VC项目里边的Mode1.def 最后加上:Mode1

如下
; Mode1.def : Declares the module parameters for the DLL.

LIBRARY      “Mode1”
DESCRIPTION  ‘Mode1 Windows Dynamic Link Library’

EXPORTS
; Explicit exports can go here
Mode1

表示输出Mode1函数

主文件Mode1.cpp如下

 

// 该函数将matlab生成的dll进行转接口生成mt4的dll。
#define WIN32_LEAN_AND_MEAN
#include “stdafx.h”
#include “Mode1.h”
#include “mclmcrrt.h”        //Matlab函数需要的头文件 mxArray之类的。
#include “Mode1FunctionLib.h”  //m文件生成的头文件
#pragma comment(lib, “Mode1FunctionLib.lib”) //加载m文件生成的lib文件
#pragma comment(lib,”mclmcrrt.lib”)      //加载matalb的 lib文件

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MT4_EXPFUNC __declspec(dllexport)  //MT4的格式

MT4_EXPFUNC double _stdcall Mode1(double *data_H,double *data_L,double *Result,int Msize) //MT4函数格式
{

//double R[10]={0,0,0,0,0,0,0,0,0,0};
//data_H[1]=R[0];
//R[0]=data_H[0];

double *data=new double[2*Msize];
memcpy(data,data_H,Msize * sizeof(double));
memcpy(data+Msize,data_L,Msize* sizeof(double));

Mode1FunctionLibInitialize();                //这条语句一定要在前边。不然后边的memcpy会copy错误。
mxArray *result;                            //声明两个mxArray指针
mxArray *x;
x=mxCreateDoubleMatrix(Msize, 2, mxREAL);  //创建一个矩阵
result=mxCreateDoubleMatrix(1,10,mxREAL);
memcpy(mxGetPr(x), data, Msize*2 * sizeof(double)); //吧data里边的值赋值给矩阵
mlfDemo1(1,&result,x);                                //调用m文件生成函数进行计算。该函数格式在Mode1FunctionLib.h最后有声明
//memcpy(Result,mxGetPr(result),10*sizeof(double));
memcpy(Result,mxGetPr(result),10*sizeof(double));    //把计算结果矩阵赋值给指针。
Mode1FunctionLibTerminate();    //结束调用dll
mxDestroyArray(x);                //清楚mxArray类型变量
mxDestroyArray(result);

delete data;

//Rusult=
return Result[0];
}

编译 生成Mode1.dll
复制该dll到 mt4主目录:..expertslibraries 下

把 Mode1functionLib.dll 复制到 mt4主目录 要和 mt4主程序terminal.exe 一个目录

MT4 脚本文件MY_dll_demo.mq4调用dll
在文件开始部分加上

#import “Mode1.dll”
double Mode1(double& H[],double& L[],double& R[],int Size);
#import

注意在使用mt4赋值序列函数ArrayCopySeries 是针对double H[];这种数组进行的。
如果大小确定的数组,则不能赋值。

转载请注明:数据分析 » matlab通过vc6生成mt4可调用的dll_matlab教程

喜欢 (1)or分享 (0)