新的金魔方DLL接口不但兼容老飞狐DLL格式,而且新增了对普通任意DLL的支持。只要在公式中描述清楚函数的定义,就能在金魔方中使用它们。
      例如,您在DLL实现了一个函数my_ma,c中定义如下:- extern "C" __declspec(dllexport) void WINAPI my_ma(double* resultArray, double* array, int n, int barpos)
 
- {
 
-         int nK = barpos - 1;
 
-         if(barpos >= n)
 
-         {
 
-                 double sum=0;
 
-                 for(int i = 0; i < n; i++)
 
-                         sum += array[nK-i];
 
-                 resultArray[nK] = sum / n;
 
-         }
 
-         else
 
-         {
 
-                 resultArray[nK] = INVALID_NUMERIC;
 
-         }
 
 
- }
解释一下各参数:resultArray是一个浮点数组,array是将要被计算的序列,n是周期,barpos是当期K线序号
那么在公式中,只需要作此声明:
- #RunMode Run_By_Bar
 
- extern 'FoxFunc.dll'  void  my_ma(NumericSeries resultArray, NumericSeries array, int n, int barpos);
就可以在接下来的语句中使用my_ma这个函数了。
- ma1:0;
 
- my_ma(ma1, close, 5, BARPOS);
必须说明的是:这一套新的用法只能工作在逐根模式下,所以必须声明#RunMode Run_by_bar
或者#trade
除了可以处理序列,DLL还能传入传出单值。
在DLL中写一段这样的代码:
- extern "C"  __declspec(dllexport) void WINAPI TestNumbericRef(double* x, double* y, double* z)
 
- {
 
-         *x = 6;
 
-         *y = 7;
 
-         *z = 8;
 
- }
然后在公式中声明:
extern 'FoxFunc.dll'  void   TestNumbericRef(NumericRef x, NumericRef y, NumericRef z);
然后在接下来的语句中使用:
- x:=0;
 
- y:=0;
 
- z:=0;
 
- TestNumbericRef(x, y, z);
 
- COMMENT(x);
 
- COMMENT(y);
 
- COMMENT(z);
将会看到屏幕打印的是6,7,和8
      除了自己写的DLL,只要你知道DLL中包含了什么函数并且知道它的格式,并且是金魔方所支持的数据类型,那也可以在金魔方中调用
     举例,GetTickCount()是windowsApi中常用的函数,用来返回windows启动以来所经过的微秒数,那在金魔方公式里是可以直接使用的
- extern 'kernel32.dll' int GetTickCount();
 
- tickcount:GetTickCount(),ownerscale;
随着公式的每一次调用,将看到tickcount在变化
除了通过引用参数或序列返回计算结果,也可以通过函数的return返回结果
例如,写一个这样的DLL函数:
- extern "C" __declspec(dllexport) double WINAPI ALL_TYPE_ADD(char d1,  int d2, LONG d3, DWORD d4, float d5, double d6, BOOL d7, ULONG d8)
 
- {
 
-         double sum = d1 +  d2 +   d3 +   d4 +   d5 +   d6 +   d7 +   d8;
 
-         return sum;
 
- }
并在公式中使用它
alladd:ALL_TYPE_ADD(1,1,1,1,1,1,1,1);
传入传出字符串也毫无压力
- // 传入字符串
 
- static buf[255];
 
- extern "C"  __declspec(dllexport) void WINAPI SetString(LPCWSTR str1, LPCWSTR str2)
 
- {
 
-         strcpy_s( buf, 255, str1 );
 
-        strcat_s( buf ,255, str2);
 
- }
 
 
- // 传回字符串
 
- extern "C"  __declspec(dllexport) LPCWSTR WINAPI MyString()
 
- {
 
-         return buf;
 
- }
公式:
- extern 'FoxFunc.dll'  void  SetString(LPCWSTR str1, LPCWSTR str2);
 
- extern 'FoxFunc.dll'   LPCWSTR  MyString();
 
 
- SetString('msg', 'hello');
 
- COMMENT(MyString());
关于DLL接口c源码与使用DLL的范例公式代码,已内置于金魔方安装目录下的:
其中:
foxfunc.rar是DLL的c源码
dllcall.rar中是使用DLL的范例公式代码