新的金魔方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的范例公式代码