如何将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 Files\Microsoft Visual Studio\MyProjects\Mode1 里边。
工程---》添加到工程---》文件 将上述三个文件添加到该项目
VC配置:
1 组建---》配置---》移除 Win32 Debug
2 工具---》选项---》目录---》Win32 目录 include files 加上:
G:\PROGRAM FILES\MATLAB\R2009B\EXTERN\INCLUDE
G:\PROGRAM FILES\MATLAB\R2009B\EXTERN\INCLUDE\WIN32
3 工具---》选项---》目录---》Win32 目录 Library files加上:
G:\PROGRAM FILES\MATLAB\R2009B\BIN\WIN32
G:\PROGRAM FILES\MATLAB\R2009B\EXTERN\LIB\WIN32\MICROSOFT
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主目录:..\experts\libraries\ 下
把 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[];这种数组进行的。
如果大小确定的数组,则不能赋值。