搜索
查看: 13058|回复: 7

〓〓 飞狐交易师 DLL公式的入门 — 如何《用LCC--编写DLL公式使用》 〓〓

[复制链接]

签到天数: 103 天

发表于 2005-11-30 13:07 | 显示全部楼层

〓〓 飞狐交易师 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;
//返回 &#0;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 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

签到天数: 1 天

发表于 2005-12-4 19:12 | 显示全部楼层
原帖由 冰火岛坐看云起 于 2005-11-30 13:07 发表
http://bbs.macd.cn/viewthread.php?tid=834578&extra=page%3D1



帮你顶,好久没来这里了!

还是老样子…………
金币:
奖励:
热心:
注册时间:
2003-9-7

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2005-12-4 20:18 | 显示全部楼层
周期内的收盘最大价:HHV(C,N);


CODE:[Copy to clipboard]__declspec(dllexport) int WINAPI FOXX(CALCINFO* pData)
   {
             float f,a,max;
             int i,j,k;
             // 定义变量
             if(pData->m_pfParam1 && //参数1有效
             pData->m_pfParam2==NULL) //只有1个参数
             // 检查
            {
              f= *pData->m_pfParam1;
              k=(int ) f;
              // 数据类型转换
              if (k>0)
                          {
              // 检查参数是否有效
               a=pData->m_nNumData;
               for(i=a-k;i<a;i++)
               {
                       max=0;
               max=pData->m_pData.m_fClose;
                  for(j=i;j>=a-k;j--)
                  {
                  if(pData->m_pData[j].m_fClose>max) max=pData->m_pData[j].m_fClose;
                  }
              pData->m_pResultBuf = max;
              // 把计算结果放入结果数组里;
               }
             return a-k;
             // 返回第一个有效数据的位置
             }
          return -1;
           }
      return -1;
     //返回 &#0;1 表示所有的数据是无效的
   }




其实飞狐系统已有了许多内部函数,功能已非常强大了,自已再从DLL里写这种函数,有点多余了(除非是为了加密的原故,不想让人家知道你的想法),一般情况下,尽可能地用系统提供的函数比较好:

[ 本帖最后由 冰火岛坐看云起 于 2007-8-11 10:29 编辑 ]
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

发表于 2007-7-23 11:32 | 显示全部楼层
:) :mad: :*22*: :*P :*29*: :*19*:
金币:
奖励:
热心:
注册时间:
2007-3-27

回复 使用道具 举报

发表于 2007-11-5 16:25 | 显示全部楼层
vv  
谢谢分享
金币:
奖励:
热心:
注册时间:
2007-7-24

回复 使用道具 举报

签到天数: 103 天

 楼主| 发表于 2007-11-5 17:08 | 显示全部楼层
LCC-Win32 V3.0


    LCC-Win32 是运行于Windows9x/Me/NT/2000下的免费的32位C语言编译系统。它的原始发布文件只有 3M,但却拥有一个功能强大的集成开发环境(IDE)、速度极快的编译器与连接器、方便顺手的调试器、资源编辑器和版本控制系统。另外还提供图像编辑器和 C 语言源文件格式化缩进器等附加工具。通过它的应用程序向导,你可以单击几次鼠标轻松得到一个应用程序框架,丝毫不比其它庞大的同类软件逊色。 你可以用LCC-Win32开发32位的控制台程序、Windows常规程序、动态连接库(DLL) 以及静态连接库(LIB)。LCC编译器支持标准的ANSI C,同时支持 C语言的扩展。通过下载相关工具,LCC-Win32还提供对Eiffel、Fortran语言的支持。


原版下载:






汉化补丁下载:



[ 本帖最后由 冰火岛坐看云起 于 2007-11-5 17:10 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2003-10-8

回复 使用道具 举报

发表于 2008-6-28 00:59 | 显示全部楼层

编译通不过啊

float c2[pData->m_nNumData],c3[pData->m_nNumData];
这句话不认,估计是数组的边界有问题
金币:
奖励:
热心:
注册时间:
2008-1-8

回复 使用道具 举报

发表于 2008-10-26 16:14 | 显示全部楼层
万分感谢。。。。。。。:*19*:
金币:
奖励:
热心:
注册时间:
2006-8-11

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

举报|意见反馈|手机版|MACD俱乐部

GMT+8, 2025-4-15 15:11 , Processed in 0.033829 second(s), 11 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表