新格式 DLL调用
来自tradeStar帮助系统
(版本间的差异)
(→逐根模式DLL接口说明) |
(→DLL的返回值) |
||
第20行: | 第20行: | ||
=DLL的返回值= | =DLL的返回值= | ||
+ | 新格式DLL可返回单值,序列和数组。单值类型大致分为两种:数值类型和字符串类型,可以通过函数返回值直接返回。 | ||
+ | *返回单值类型的例子 | ||
+ | //返回整数 | ||
+ | extern "C" __declspec(dllexport) int WINAPI my_test1() | ||
+ | { | ||
+ | return 1; | ||
+ | } | ||
+ | //返回浮点 | ||
+ | extern "C" __declspec(dllexport) float WINAPI my_test2() | ||
+ | { | ||
+ | return 2.0f; | ||
+ | } | ||
+ | //返回字符串 | ||
+ | extern "C" __declspec(dllexport) LPCWSTR WINAPI my_test3() | ||
+ | { | ||
+ | return L"TEST STRING"; | ||
+ | } | ||
+ | 相应的公式调用例子 | ||
+ | #MAINCHART | ||
+ | #Run_By_Bar | ||
+ | extern 'MyDll2.dll' int my_test1(); | ||
+ | extern 'MyDll2.dll' float my_test2(); | ||
+ | extern 'MyDll2.dll' LPCWSTR my_test3(); | ||
+ | k1: my_test1; | ||
+ | k2: my_test2; | ||
+ | comment(my_test3); | ||
+ | |||
+ | 若要返回序列或数组,则把需要返回的序列赋值目标当作参数传递给DLL,在DLL内部直接修改已达到赋值。 | ||
+ | 注意逐根运行模式下,每一根K线都会调用dll,所以通常每次调用只需要赋值比上一根K线新增加的类型, | ||
+ | 例如计算收盘价均值时,每次在BarPos位置填入当根K线的均值即可。由此可见,这种应用下通常需要把 | ||
+ | BarPos(当前是第几根K线)作为参数传入Dll中。 | ||
+ | *返回序列和数组的例子 | ||
+ | extern "C" __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex) | ||
+ | { | ||
+ | pReturn[nIndex-1] = 123; | ||
+ | } | ||
+ | |||
+ | extern "C" __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen) | ||
+ | { | ||
+ | for(int i=0;i<nLen;i++) | ||
+ | pReturn[i] = 0; | ||
+ | } | ||
+ | 相应的公式调用例子 | ||
+ | #MAINCHART | ||
+ | #Run_By_Bar | ||
+ | variable: | ||
+ | NumericSeries mySequence(0); | ||
+ | array: | ||
+ | myArray[100](1); | ||
+ | |||
+ | extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex); | ||
+ | extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen); | ||
+ | my_test4(mySequence, BarPos); | ||
+ | my_test5(myArray, 100); | ||
=DLL的参数类型= | =DLL的参数类型= |
2013年4月12日 (五) 17:34的版本
新的公式逐根运行模式每次只计算新增数据,不需要整条序列重新运算,这样可以大大提升效率。 有鉴于此,DLL调用也有了新的格式。
目录 |
逐根模式DLL接口说明
- 扩展函数用windows 32位动态链接库实现,建议使用Microsoft Visual C++编程
- 只能用于逐根运行模式#Run_By_Bar, 参考公式运行模式
- 调用前需要声明 extern 返回值类型 函数名(参数类型 参数,...);
- 调用时直接调用函数名,与普通函数调用方式一样
- DLL名称和函数名可以自己定义
- 使用时必须将DLL放在软件安装目录下的FmlDll子目录下
DLL函数格式
- DLL名称和函数名都是大小写敏感的,代码声明和公式调用时需要匹配。
- 参数的个数和名称都没有限制,支持基础的数据类型float, double, int,BOOL, LONG, DWORD, float*, LPCWSTR等,注意序列类型只能是 float*, 单值类型则是通用的
// C 代码里的声明 extern "C" __declspec(dllexport) void WINAPI my_ma2(float* pResultBuffer, float* pDataBuffer, int n, int barpos)
公式里面的声明
// 公式里面的声明 extern 'MyDll2.dll' void my_ma2(NumericSeries ResultBuffer, NumericSeries DataBuffer, int n, int barpos);
DLL的返回值
新格式DLL可返回单值,序列和数组。单值类型大致分为两种:数值类型和字符串类型,可以通过函数返回值直接返回。
- 返回单值类型的例子
//返回整数 extern "C" __declspec(dllexport) int WINAPI my_test1() { return 1; } //返回浮点 extern "C" __declspec(dllexport) float WINAPI my_test2() { return 2.0f; } //返回字符串 extern "C" __declspec(dllexport) LPCWSTR WINAPI my_test3() { return L"TEST STRING"; }
相应的公式调用例子
#MAINCHART #Run_By_Bar extern 'MyDll2.dll' int my_test1(); extern 'MyDll2.dll' float my_test2(); extern 'MyDll2.dll' LPCWSTR my_test3(); k1: my_test1; k2: my_test2; comment(my_test3);
若要返回序列或数组,则把需要返回的序列赋值目标当作参数传递给DLL,在DLL内部直接修改已达到赋值。 注意逐根运行模式下,每一根K线都会调用dll,所以通常每次调用只需要赋值比上一根K线新增加的类型, 例如计算收盘价均值时,每次在BarPos位置填入当根K线的均值即可。由此可见,这种应用下通常需要把 BarPos(当前是第几根K线)作为参数传入Dll中。
- 返回序列和数组的例子
extern "C" __declspec(dllexport) void WINAPI my_test4(float*pReturn, int nIndex) { pReturn[nIndex-1] = 123; } extern "C" __declspec(dllexport) void WINAPI my_test5(float*pReturn, int nLen) { for(int i=0;i<nLen;i++) pReturn[i] = 0; }
相应的公式调用例子
#MAINCHART #Run_By_Bar variable: NumericSeries mySequence(0); array: myArray[100](1); extern 'MyDll2.dll' void my_test4(NumericSeries mySequence, int nIndex); extern 'MyDll2.dll' void my_test5(NumericArray myArray, int nLen); my_test4(mySequence, BarPos); my_test5(myArray, 100);