|
|
第1行: |
第1行: |
− | 新的公式逐根运行模式每次只计算新增数据,不需要整条序列重新运算,这样可以大大提升效率。
| |
− | 有鉴于此,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);
| |
− |
| |
− | =DLL的参数类型=
| |
− | {| class="wikitable"
| |
− | |-
| |
− | ! - !! 单值 !! 序列 !! 数组 !! 引用
| |
− | |-
| |
− | | 数值 || NumericSimple || NumericSeries || NumericArray || NumericRef
| |
− | |-
| |
− | | 字符串 || String || - || StringArray || StringRef
| |
− | |}
| |
− |
| |
− | =无效数据表示=
| |
− | 公式系统使用std的无效浮点数表示无效值,浮点无效值的一个重要特征是 f != f 为真,可作为判断依据,
| |
− | 其它运算皆输出无效值,其它比较皆输出假。当序列作为指标输出时,开始和结束两段的无效值自动截除,不作为指标输出。
| |
− | 例如要输出5日均线,序列的前4个值可填充无效值(填充0时会使指标线变形)
| |
− | #include <limits>
| |
− | #define INVALID_NUMERIC std::numeric_limits<float>::quiet_NaN()
| |
− | 无效值在公式里可以用 Invalid 关键字指定,例如
| |
− | k1:Invalid;
| |
− | 则k1指标线不会输出
| |
− |
| |
− | =编写调用公式=
| |
− |
| |
− | =开发DLL的详细例子=
| |
− |
| |
− | =实例下载=
| |
− |
| |
− | [[Category:公式系统]]
| |