kun 发表于 2011-11-3 13:30:57

MT4 DLL开发经验--通过DLL传递数据到外部程序

在Visual C++开发工具中创建一个工程,选择MFC(DLL)类型,假设工程名为demo。创建好工程后,最核心的两个文件为demo.cpp和demo.def。
假设希望开发的dll文件中包含三个功能函数:
[*] double GetCloseValue( RateInfo* rates,int totalRecords, int shift )返回收盘价位
[*] double GetHighValue( RateInfo* rates,int totalRecords, int shift )返回最高价位 void GetSMAArray( RateInfo* rates, int totalRecords, int period, double result[] ) 返回SMA移动平均线值

复制代码
其中RateInfo被定义为结构类型:
[*]struct RateInfo
[*]{
[*]unsigned int time;   //时间
[*]double open;      //开盘价格
[*]double low;       //最低价格
[*]double high;      //最高价格
[*]double close;   //收盘价格
[*]double volume;   //成交量};

复制代码
比较精妙的是MT4提供了ArrayCopyRates函数用于复制一段走势图上的数据到一个二维数组,并返回复制柱子的总数。其第二维为固定的6个项目,从0到5分别为“时间、开盘价格、最低价格、最高价格、收盘价格、成交量”。int ArrayCopyRates( void dest_array[], void symbol, void timeframe)

复制代码
因此这里的RateInfo结构定义正好对应上面二维数组的第二维,MT4程序也是默认通过这种方式来提供二维数组到结构指针(即RateInfo结构数组)的映射的。
在demo.def中定义DLL的输出函数(如下),经过编译后将在指定目录生成DLL文件。
[*]LIBRARY      \"demo\"
[*]EXPORTS
[*]GetCloseValue
[*]GetHighValueGetSMAArray

复制代码
将生成的DLL文件拷贝到MT4程序的”experts/libraries目录下。在MT4程序中调用引用DLL的代码为:
[*]#import \"demo.dll\"
[*]   double GetCloseValue( double rates[], int totalRecords, int shift );
[*]   doubleGetHighValue( double rates[], int totalRecords, int shift );
[*]   void   GetSMAArray( double rates[], int totalRecords, int period, double& results[]);#import

复制代码
这里引用DLL函数的一个重要的区别在于RateInfo*被映射为二维数组double rates[],也就是说MT4调用DLL的时候由操作系统根据内存指针完成了数据的访问,且结构定义中的unsigned int是从double类型转换后得到的。在MT4程序中调用DLL中函数的代码为:
[*]int start()
[*]{
[*]double rates[];
[*]int totalRecords = ArrayCopyRates( rates, Symbol(), 0 );
[*]for( int i = totalRecords; i >= 0; i-- )
[*]{ `
[*]    results = EMPTY;
[*]}
[*]      
[*]GetSMAArray( rates, totalRecords, period, results );      
[*]return(0);}

复制代码
示例代码(DLL对应cpp文件中的函数定义和代码):
[*]//+------------------------------------------------------------------+
[*]//|                        MT4调用DLL示例程序 |
[*]//|             Copyright @2009-2010, 笨蛋学经济 |
[*]//|                     http://macy01.blogcn.com |
[*]//+------------------------------------------------------------------+
[*]#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
[*]#define MT4_EXPFUNC __declspec(dllexport)
[*]//+-----------------------------------------------------------------------------------------------------------------------------+
[*]//| MT4数据结构                              |
[*]//+-----------------------------------------------------------------------------------------------------------------------------+
[*]#pragma pack(push,1)
[*]struct RateInfo
[*]{
[*]unsigned int time;
[*]double open;
[*]double low;
[*]double high;
[*]double close;
[*]double volume;
[*]};
[*]struct MqlStr   
[*]{
[*]int len;
[*]char* string;
[*]};
[*]#pragma pack(pop)
[*]
[*]//+-----------------------------------------------------------------------------------------------------------------------------+
[*]//|          DLL函数定义                           |
[*]//+-----------------------------------------------------------------------------------------------------------------------------+
[*]MT4_EXPFUNC double _stdcall GetCloseValue( RateInfo* rates,int totalRecords, int shift )
[*]{
[*] return( rates.close );
[*]}
[*]
[*]MT4_EXPFUNC double _stdcall GetHighValue( RateInfo* rates,int totalRecords, int shift )
[*]{
[*] return( rates.high );
[*]}
[*]
[*]MT4_EXPFUNC void _stdcall GetSMAArray( RateInfo* rates, int totalRecords, int period, double result[] )
[*]{
[*] for( int i = 0; i < totalRecords; i++)
[*] {
[*] double sum = 0.0;
[*] for( int k = 0; k < period ; k++ )
[*] {
[*] sum += rates.close;
[*] }
[*] result = sum / period ;
[*] }}

复制代码

dyh3154 发表于 2012-11-22 02:15:12

顶你一下.

sacrifice 发表于 2012-11-22 02:15:12

小心大家盯上你哦

gp123456789 发表于 2012-11-22 02:15:12

这个贴好像之前没见过

爻爻 发表于 2012-11-22 02:15:12

我有一个EA 好坏你自己定免费的需要的话 可以发给你玩玩

fxsin8.7 发表于 2012-11-22 02:15:12

哈哈,看的人少,回一下

纵海金融 发表于 2012-11-22 02:15:12

路过,一般是有提供的Ea的平台,有EA社区...

你的太在乎 发表于 2014-12-10 07:27:02

想学EA,拜师,谁收了我吧

姐就是这么靓 发表于 2014-12-10 09:05:18

看看怎么样

flying5960 发表于 2018-9-10 20:08:21

写的真的很不错
页: [1]
查看完整版本: MT4 DLL开发经验--通过DLL传递数据到外部程序