宝宝嘴巴霉菌感染图片:MT4编程:自带的DLL范例

来源:百度文库 编辑:中财网 时间:2024/05/04 22:46:00
MT4编程:自带的DLL范例

俺不是编程高手,而且时间和精力都很有限,因此编程对于我来说最理想的境界是"知其然",而不必"知其所以然"。当然,如果程序出错,那就要好好研究一下"其所以然"了。所以每次编程都会经历一个预热的学习过程,看看范例--然后温故而知新......MT4自带的DLL范例,就放在在文件夹MetaTrader 4\EXPERTS\SAMPLES中。该范例值得细细研究,是因为它展示了如何使用mq4语言来调用C++语言编写的DLL。而我们需要重点留意的,就是调用DLL函数时所展现的函数参数的传递方式;显然,针对不同类型的变量,都有其不同的传递方式,实现的结果亦各不相同。

1)变量传递。

对于mq4的double/int类型变量,与C++的通讯只需要用到值传递。
在C++里我们要定义一个函数,如func1(double x,int y){......;......;}
mq4里我们必须在头文件里做一个函数声明:func1(double,int),调用的时候以相应的变量值作为参数,如func1(10.56,8)。

对于mq4的String类型,在C++里可以用指针如char *str来代替String类型。
在C++里我们要定义一个函数,如func2(char *str){......;......;}
mq4里我们必须在头文件里做一个函数声明:func2(string),调用的时候以字符串作为参数,如func2("something")。

2)数组的传递。

对于mq4的double/int类型数组,C++通过指针来接收相应的参数。
关于数组与指针,在网上查阅了很多论述:其实,在C++中数据名作为函数形参时,等同于指向数组的指针!
于是,下面2个函数是等效的:

double sample1(double*);             //在声明中,描述参数为(指向数组的)指针:double*;
......
double sample1(double aa[])        //在函数中,以aa[](数组)来接收该指针。
{
aa[4]=55.5;
return(aa[4]);
}

double sample2(double []);             //在声明中,描述参数为数组:double [];
......
double sample2(double *aa)          //在函数中,以*aa(指针)来接收该数组。
{
aa[4]=55.5;
return(aa[4]);
}
当然,2个函数的声明其实也是等效的。mq4中没有指针类型,所以传递数组的方式类似sample2。

3)行情数据的传递
mq4提供了ArrayCopyRates函数,用于复制一段走势图上的数据到一个二维数组,并返回复制柱子的总数。其第二维为固定的6个项目,从0到5分别为“时间、开盘价格、最低价格、最高价格、收盘价格、成交量”。
如:
   double rates[][6];
int totalRecords = ArrayCopyRates(rates,Symbol(),0);

mq4调用DLL函数的时候,把该数组作为参数,向DLL函数提供二维数组的指针,这也就是就mq4程序实现行情数据传递的默认方式。
如:
   ArrayCopyRates(rates);
price=GetRatesItemValue(rates,Bars,0,CLOSE_INDEX);

对应地,我们在C++代码中可以定义一个结构类型RateInfo:
struct RateInfo
{
unsigned int time;    //时间
double open;           //开盘价格
double low;              //最低价格
double high;            //最高价格
double close;          //收盘价格
double volume;       //成交量
};
这里的RateInfo结构定义正好对应mq4里二维数组的第二维,在DLL函数里,结构指针RateInfo*被映射为二维数组double rates[][6]。也就是说,当mq4调用DLL的时候,由操作系统根据内存指针完成了数据的访问,且结构定义中的unsigned int是从double类型转换后得到的。

需要注意的是:mq4数组顺序与DLL数组顺序完全相反。mq4数组顺序是:从Bars-1到0;而传递到DLL后,数组顺序变为0到Bars-1?

这里,再提供一个我自己编程的参考实例。