您好,欢迎光临花生网![请登录] [免费注册] 我的花生地|帮助|服务中心|网站导航|繁体中文
  • 打印
  • 字号

金魔方DLL接口说明

欢迎发表评论 2012-9-21 17:31   编辑:foxar
       新的金魔方DLL接口不但兼容老飞狐DLL格式,而且新增了对普通任意DLL的支持。只要在公式中描述清楚函数的定义,就能在金魔方中使用它们。
      例如,您在DLL实现了一个函数my_ma,c中定义如下:
  1. extern "C" __declspec(dllexport) void WINAPI my_ma(double* resultArray, double* array, int n, int barpos)
  2. {
  3.         int nK = barpos - 1;
  4.         if(barpos >= n)
  5.         {
  6.                 double sum=0;
  7.                 for(int i = 0; i < n; i++)
  8.                         sum += array[nK-i];
  9.                 resultArray[nK] = sum / n;
  10.         }
  11.         else
  12.         {
  13.                 resultArray[nK] = INVALID_NUMERIC;
  14.         }

  15. }
解释一下各参数:resultArray是一个浮点数组,array是将要被计算的序列,n是周期,barpos是当期K线序号

那么在公式中,只需要作此声明:
  1. #RunMode Run_By_Bar
  2. extern 'FoxFunc.dll'  void  my_ma(NumericSeries resultArray, NumericSeries array, int n, int barpos);

就可以在接下来的语句中使用my_ma这个函数了。

  1. ma1:0;
  2. my_ma(ma1, close, 5, BARPOS);

必须说明的是:这一套新的用法只能工作在逐根模式下,所以必须声明#RunMode Run_by_bar
或者#trade

除了可以处理序列,DLL还能传入传出单值。
在DLL中写一段这样的代码:
  1. extern "C"  __declspec(dllexport) void WINAPI TestNumbericRef(double* x, double* y, double* z)
  2. {
  3.         *x = 6;
  4.         *y = 7;
  5.         *z = 8;
  6. }

然后在公式中声明:
extern 'FoxFunc.dll'  void   TestNumbericRef(NumericRef x, NumericRef y, NumericRef z);

然后在接下来的语句中使用:
  1. x:=0;
  2. y:=0;
  3. z:=0;
  4. TestNumbericRef(x, y, z);
  5. COMMENT(x);
  6. COMMENT(y);
  7. COMMENT(z);

将会看到屏幕打印的是6,7,和8

      除了自己写的DLL,只要你知道DLL中包含了什么函数并且知道它的格式,并且是金魔方所支持的数据类型,那也可以在金魔方中调用

     举例,GetTickCount()是windowsApi中常用的函数,用来返回windows启动以来所经过的微秒数,那在金魔方公式里是可以直接使用的
  1. extern 'kernel32.dll' int GetTickCount();
  2. tickcount:GetTickCount(),ownerscale;

随着公式的每一次调用,将看到tickcount在变化

除了通过引用参数或序列返回计算结果,也可以通过函数的return返回结果
例如,写一个这样的DLL函数:
  1. 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)
  2. {
  3.         double sum = d1 +  d2 +   d3 +   d4 +   d5 +   d6 +   d7 +   d8;
  4.         return sum;
  5. }

并在公式中使用它
alladd:ALL_TYPE_ADD(1,1,1,1,1,1,1,1);

传入传出字符串也毫无压力
  1. // 传入字符串
  2. static buf[255];
  3. extern "C"  __declspec(dllexport) void WINAPI SetString(LPCWSTR str1, LPCWSTR str2)
  4. {
  5.         strcpy_s( buf, 255, str1 );
  6.        strcat_s( buf ,255, str2);
  7. }

  8. // 传回字符串
  9. extern "C"  __declspec(dllexport) LPCWSTR WINAPI MyString()
  10. {
  11.         return buf;
  12. }

公式:
  1. extern 'FoxFunc.dll'  void  SetString(LPCWSTR str1, LPCWSTR str2);
  2. extern 'FoxFunc.dll'   LPCWSTR  MyString();

  3. SetString('msg', 'hello');
  4. COMMENT(MyString());

关于DLL接口c源码与使用DLL的范例公式代码,已内置于金魔方安装目录下的:
其中:
foxfunc.rar是DLL的c源码
dllcall.rar中是使用DLL的范例公式代码


















发表评论

我要评论

引用 zenchange 2015-11-14 14:43
为什么引用我的DLL,老是崩溃
引用 wangzhibiao 2013-8-3 13:49
DLL是逐行模式,以该DLL函数写的指标信号可以被智能交易引用吗?
引用 机机 2012-12-22 16:02
不忘记老飞狐朋友,又结交魔方新朋友
引用 out-u 2012-12-6 20:13
xx(CALCINFO* pData)
又怎么声明?
引用 花生油 2012-11-13 10:33
太好了+强大
引用 博弈男爵 2012-11-2 18:59
太好了
引用 333333 2012-9-21 19:00
强大

查看全部评论(7)

验证问答 换一个 验证码 换一个



Copyright©广州新博庭网络信息科技股份有限公司 粤ICP备11107430号 All Rights Reserved 版权所有 复制必究

合作联系邮箱: sueiyou@126.com

地址:广州市天河区花城大道667号美林基业大厦1201

回顶部