客服热线:18391752892

MT4 DLL开发经验

   日期:2019-01-12     浏览:563    
马上注册,结交更多好友,下载更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 在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
 GetHighValue GetSMAArray
复制代码
将生成的DLL文件拷贝到MT4程序的”experts/libraries目录下。在MT4程序中调用引用DLL的代码为:
#import demo.dll
   double GetClosevalue( double rates[][6], int totalRecords, int shift );
   double GetHighValue( double rates[][6], int totalRecords, int shift );
   void   GetSMAArray( double rates[][6], int totalRecords, int period, double results[]);#import
复制代码
这里引用DLL函数的一个重要的区别在于RateInfo*被映射为二维数组double rates[][6],也就是说MT4调用DLL的时候由操作系统根据内存指针完成了数据的访问,且结构定义中的unsigned int是从double类型转换后得到的。在MT4程序中调用DLL中函数的代码为:
int start()
{
 double rates[][6];
 int totalRecords = ArrayCopyRates( rates, Symbol(), 0 );
 for( int i = totalRecords; i 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[totalRecords-shift-1].close );
}
MT4_EXPFUNC double _stdcall GetHighValue( RateInfo* rates,int totalRecords, int shift )
{
return( rates[totalRecords-shift-1].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[totalRecords-i-1-k].close;
}
result[totalRecords-i-1] = sum / period ;
}}

外汇交易有很大的风险性,本站所有资源均来自网络,请选择使用,如若出现亏损,本站不承担任何责任!


特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关行情
推荐行情
点击排行