〓〓 飞狐交易师 DLL公式的入门 — 如何《用LCC--编写DLL公式使用》 〓〓
来自:MACD论坛(bbs.shudaoyoufang.com)
作者:冰火岛坐看云起
浏览:13058
回复:7
http://bbs.macd.cn/viewthread.php?tid=834578&extra=page%3D1
DLL公式的入门 — 教你如何《用LCC--编写DLL公式使用》......作者:金水木
《用LCC编写DLL的入门使用》
关于用C语言写DLL公式很多朋友都想了解,我虽然学会很久,但基础很差,所以一直没运用好这工具。在这里我介绍一个比VC用法简单,但跟VC基本兼容的编程软件。并把清扬兄关于ZIG拐点的VBS公式翻译成C程序,把过程做成了动画,希望对飞狐的兄弟们又帮助。我这程序是在LCC-Win32编译成功,但在VC就不行,具体原因我也搞不明白,希望高手们指正!!
软件简介:
LCC-Win32是运行于Windows9x/Me/NT/2000/XP下的免费的32位C语言编译系统。它的原始发布文件只有 3M,但却拥有一个功能强大的集成开发环境(IDE)、速度极快的编译器与连接器、方便顺手的调试器、资源编辑器和版本控制系统。另外还提供图像编辑器和C 语言源文件格式化缩进器等附加工具。通过它的应用程序向导,你可以单击几次鼠标轻松得到一个应用程序框架,丝毫不比其它庞大的同类软件逊色。
你可以用LCC-Win32开发32位的控制台程序、Windows常规程序、动态连接库(DLL)以及静态连接库(LIB)。LCC编译器支持标准的ANSI C,同时支持 C语言的扩展。通过下载相关工具,LCC-Win32还提供对Eiffel、Fortran语言的支持。
准备步骤:
1。下载,安装LCC-Win32系统。
原版下载:http://www.skycn.com/soft/6518.html
汉化补丁下载:http://www.skycn.com/soft/6519.html
2。下载飞狐的C语言接口,并把foxfunc.h修改两个地方,加上一句。
a.加一句
#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus
#include <time.h> //在这里加上这句
///////////////////////////////////////////////////////////////////////////
b.改两处
const DATA_TYPE m_dataType; //数据类型
改成:
enum DATA_TYPE m_dataType; //数据类型
把下面的删去
//示例函数,使用时用实际名称替换
__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData);
__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
__declspec(dllexport) int WINAPI MYBBI(CALCINFO* pData);
把改好的foxfunc.h拷贝到C:\lcc\include,好了预备的工作做好了,我们开始些公式。
DLL公式如下:
ZIG拐点:
CODE:[Copy to clipboard]__declspec(dllexport) int WINAPI ZIG(CALCINFO* pData)
{
float c2[pData->m_nNumData],c3[pData->m_nNumData];
if ( pData->m_pfParam1 && //参数1有效
pData->m_nParam1Start<0 && //参数1为常数
pData->m_pfParam2==NULL ) //仅有一个参数
{
float fParam = *pData->m_pfParam1;
int nPeriod = (int)fParam; //参数1
if(nPeriod>0)
{
int i, p;
float vclose;
p=0;
for ( i =0; i < pData->m_nNumData; i++ ) //全部清零
{
pData->m_pResultBuf = 0;
c2=pData->m_pData.m_fClose;
c3=pData->m_pData.m_fClose;
}
for(i=1;i<pData->m_nNumData;i++)
{
vclose=pData->m_pData.m_fClose;
if(p==0 || p==1)
{
if(vclose >= c2[i-1]*(1-(float)nPeriod/100))
c2= c2>=c2[i-1] ? c2:c2[i-1];
else
{ p=-1;
pData->m_pResultBuf=-1;
}
}
if(p==0 || p==-1)
{
if(vclose <= c3[i-1]*(1+(float)nPeriod/100))
c3=c3>=c3[i-1] ? c3[i-1]:c3;
else
{ p=1;
pData->m_pResultBuf=1;
}
}
}
}
}
return 0;
}
加权均线:
CODE:[Copy to clipboard]__declspec (dllexport) int WINAPI HENGYUE(CALCINFO* pData)
{
float f,fTotal;
int i,j,k,m;
// 定义变量
if(pData->m_pfParam1 && //参数1有效
pData->m_pfParam2==NULL) //只有1个参数
// 检查传过来的参数是否只有一个参数
{
f = *pData->m_pfParam1;
k=(int ) f;
// 数据类型转换
if (k>0) {
// 检查参数是否有效
for(i=0;i<pData->m_nNumData;i++){
k=(int )f;
m=0;
fTotal=0;
for(j=i;(j>i-(int )f)&&(j>=0);j--,k--) {
fTotal=fTotal+pData->m_pData[j].m_fClose*k;
//计算: (C1*1+C2*2+C3*3+..Cn*n)
m=m+k;
//计算: (1+2+3…+n)
}
pData->m_pResultBuf = fTotal/m;
// 把计算结果放入结果数组里,从此数组里提取数据绘制曲线
}
return 0;
// 返回第一个有效数据的位置
}
return -1;
}
return -1;
//返回 �1 表示所有的数据是无效的
}
以上两个DLL的C语言代码,我已做了测试,只要LCC软件正确安装后,你就能做出真正属于你自己的扩展函数DLL了!!!
祝你成功!!!
注意:
Lcc安装时,有一个界面不能关闭,需静待其自行关闭,直到安装完成的界面出现!!!
另外:工程文件的配置中,把输出的文件路径改为x:\foxtrader\fmldll\fox.dll
其中x:是安装飞狐后时,飞狐所在的盘符。
修改后,输出的dll就会直接升成在所需的位置,可以直接在飞狐之中察看结果,如果结果有问题的话,可以修改源代码,再输出,不用关闭飞狐。这点比fxj方便多了,在fxj中,如果fxj是在运行状态,dll文件将无法输出覆盖原来的文件,需要关闭fxj后才能重新输出dll文件,非常烦人。
操作过程参考下面的动画:
这个是修改好的foxfunc.h,可以直接放在C:\lcc\include目录(附件)
[ 本帖最后由 冰火岛坐看云起 于 2007-8-11 10:30 编辑 ] |