ptLibert 发表于 2012-9-21 14:36:53

金魔方DLL接口

本帖最后由 ptLibert 于 2012-10-23 11:06 编辑

新的金魔方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;
                resultArray = sum / n;
        }
        else
        {
                resultArray = 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);
必须说明的是:老的一套DLL调用方式只能工作在逐行模式,而新的一套用法只能工作在逐根模式下所
用到新模式的时候,必须声明#RunMode Run_by_bar
或者
#trade

10月23日新增数组传递支持http://www.hs633.com/forum.php?mod=viewthread&tid=395&pid=3949&page=4&extra=#pid3949


ptLibert 发表于 2012-9-21 14:42:06

本帖最后由 ptLibert 于 2012-9-21 14:59 编辑

除了可以处理序列,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

ptLibert 发表于 2012-9-21 14:48:49

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

举例,GetTickCount()是windowsApi中常用的函数,用来返回windows启动以来所经过的微秒数,那在金魔方公式里是可以直接使用的
extern 'kernel32.dll' int GetTickCount();
tickcount:GetTickCount(),ownerscale;随着公式的每一次调用,将看到tickcount在变化

ptLibert 发表于 2012-9-21 15:08:19

除了通过引用参数或序列返回计算结果,也可以通过函数的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);

ptLibert 发表于 2012-9-21 15:14:13

本帖最后由 ptLibert 于 2012-9-21 15:23 编辑

传入传出字符串也毫无压力

// 传入字符串
// 传入字符串
static buf;
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());


ptLibert 发表于 2012-9-21 15:34:07

本帖最后由 ptLibert 于 2012-10-23 17:12 编辑

其中,foxfunc.rar是DLL的c源码
dllcall.rar中是使用DLL的范例公式代码




ptLibert 发表于 2012-9-21 17:54:10

.net DLL也能支持// 公式这样写
extern 'testManaged.dll'  
void  testManaged.TestClass1.my_ma(NumericSeries resultArray, NumericSeries array, int n, int barpos);
my_ma(ma1, close, 5, barpos);


dll 里的一个类这样写

namespace testManaged
{
    public class TestClass1
    {

        public void my_ma(ref 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;
                    resultArray = sum / n;
                }
                else
                {
                    resultArray = double.NaN;
                }


        }

    }
}

udbsss 发表于 2012-9-21 20:51:07

有一个疑问,金语言中,序列下标0代表最近的一根K线所对应的序列数据,那barpos不是一直等于0?

ptLibert 发表于 2012-9-21 21:18:45

udbsss 发表于 2012-9-21 20:51 static/image/common/back.gif
有一个疑问,金语言中,序列下标0代表最近的一根K线所对应的序列数据,那barpos不是一直等于0? ...

跟在公式里不同,序列传入DLL中之后,下标0是代表最古老的元素。。

在公式里,下标是解释引擎作了转换的,序列的物理存放方式,其实还是古老的元素放在数组的第一个位置,最近的元素存在最后。

所以送进DLL之后,要改变访问方式,0访问早的。

udbsss 发表于 2012-9-21 21:45:24

ptLibert 发表于 2012-9-21 21:18 static/image/common/back.gif
跟在公式里不同,序列传入DLL中之后,下标0是代表最古老的元素。。

在公式里,下标是解释引擎作了转换的 ...

意思是序列传入DLL时反序了,然后从DLL传回时又再反序了?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 金魔方DLL接口