matlab接mt4,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 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[];这种数组进行的。

如果大小确定的数组,则不能赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值