勇华投资-股票,证券,投资,资料  
返回首页 | 勇华简介 | 盘前策略 | 早盘即时分析 | 午间指导 | 异动股解析| 在线咨询 | 股票入门 |
盘后分析 | 股市焦点 | 市场要闻 | 板块风云 | 导航 | 荐股回顾| 服务方式 | 联系| 论坛 |加入收藏
 

如何用dll文件制作公式?

文章出处:   发布时间:2006-03-13   

如何用dll文件制作公式? 

为什么要用dll文件来开发公式?
1.为了突破分析家和飞狐现有功能的限制。
2.为了提高公式速度。
3.为了加密公式的理念。
4.增加新的功能。
 下面我们逐渐用vc++ 6.0来讲制作分析家dll公式的过程。

准备的东东
1.安装VC++ 6.0软件
2.下载分析家C语言接口文件。
3.具备C++编程的知识。
如果不会,自己下载教学软件,或找本相关的书籍。
4.会分析家基本公式编写。
如果不会,在本站下载相关分析家公式编写资料。
准备好后,我开始讲一个完整公式的编写过程。  

练习编译dll文件。
1.解包分析家c语言接口
2.启动Vc++
点击菜单选Open Workspace。
选择文件FxjFunc.dsw
3.选择菜单,选择Build FxjFunc.dll
生成FxjFunc.dll文件。如果没有错误,显示下面结果。
--------------------Configuration: FxjFunc - Win32 Debug--------------------
FxjFunc.dll - 0 error(s), 0 warning(s)
4.生成的FxjFunc.dll文件在D:\SUPERSTK目录中。
如果不在当前使用的分析家目录,可以将FxjFunc.dll文件复制到分析家目录中,也可以复制到飞狐\FoxTrader\FmlDLL目录中。
5.在飞狐或分析家建立公式,看看结果。公式只有下面一句,10日close均线。
ma1:"fxjfunc@mymaclose"(10); 如果结果正确,你已经成功编写了dll公式了。
在后面的讲课中介绍编写技巧。
第三讲]分析家扩展函数规范及设计
分析家扩展函数规范如下:
///////////////////////////////////////////////////////////////////////////
#ifndef __FXJFUNC_H_INCLUDE
#define __FXJFUNC_H_INCLUDE
/*
///////////////////////////////////////////////////////////////////////////
分析家扩展函数规范V3.10
1.本规范适用于分析家3.10标准版和专业版公式系统.
2.扩展函数用于实现系统函数不能实现的特殊算法.
3.扩展函数用windows 32位动态连接库实现,建议使用Microsoft Visual C++编程.
4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FXJFUNC@MYCMALOSE"(5)
5.动态连接库名称和函数名称可以自己定义.
6.使用时可以将动态库拷贝到分析家目录下使用.
*/
#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus
  
  
///////////////////////////////////////////////////////////////////////////
//分析周期
enum DATA_TYPE
{
TICK_DATA=2, //分笔成交
MIN1_DATA, //1分钟线
MIN5_DATA, //5分钟线
MIN15_DATA, //15分钟线
MIN30_DATA, //30分钟线
MIN60_DATA, //60分钟线
DAY_DATA, //日线
WEEK_DATA, //周线
MONTH_DATA, //月线
MULTI_DATA //多日线
};
  
///////////////////////////////////////////////////////////////////////////
//基本数据
typedef struct tagSTKDATA
{
time_t m_time; //时间,UCT
float m_fOpen; //开盘
float m_fHigh; //最高
float m_fLow; //最低
float m_fClose; //收盘
float m_fVolume; //成交量
float m_fAmount; //成交额
WORD m_wAdvance; //上涨家数(仅大盘有效)
WORD m_wDecline; //下跌家数(仅大盘有效)
} STKDATA;
////////////////////////////////////////////////////////////////////////////
//扩展数据,用于描述分笔成交数据的买卖盘
typedef union tagSTKDATAEx
{
struct
{
float m_fBuyPrice; //买1--买3价
float m_fBuyVol; //买1--买3量
float m_fSellPrice; //卖1--卖3价
float m_fSellVol; //卖1--卖3量
};
float m_fDataEx; //保留
} STKDATAEx;
/////////////////////////////////////////////////////////////////////////////
/*财务数据顺序(m_pfFinData内容)
  
序号 内容
  
0 总股本(万股),
1 国家股,
2 发起人法人股,
3 法人股,
4 B股,
5 H股,
6 流通A股,
7 职工股,
8 A2转配股,
9 总资产(千元),
10 流动资产,
11 固定资产,
12 无形资产,
13 长期投资,
14 流动负债,
15 长期负债,
16 资本公积金,
17 每股公积金,
18 股东权益,
19 主营收入,
20 主营利润,
21 其他利润,
22 营业利润,
23 投资收益,
24 补贴收入,
25 营业外收支,
26 上年损益调整,
27 利润总额,
28 税后利润,
29 净利润,
30 未分配利润,
31 每股未分配,
32 每股收益,
33 每股净资产,
34 调整每股净资,
35 股东权益比,
36 净资收益率
*/
/////////////////////////////////////////////////////////////////////////////
//函数数据结构
typedef struct tagCALCINFO
{
const DWORD m_dwSize; //结构大小
const DWORD m_dwVersion; //调用软件版本(V2.10 : 0x210)
const DWORD m_dwSerial; //调用软件序列号
const char* m_strStkLabel; //股票代码
const BOOL m_bIndex; //大盘
  
const int m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)
const STKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为 NULL
const STKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为 NULL
  
const int m_nParam1Start; //参数1有效位置
const float* m_pfParam1; //调用参数1
const float* m_pfParam2; //调用参数2
const float* m_pfParam3; //调用参数3
const float* m_pfParam4; //调用参数3
  
float* m_pResultBuf; //结果缓冲区
const DATA_TYPE m_dataType; //数据类型
const float* m_pfFinData; //财务数据
} CALCINFO;
/*
注:
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
2.当一个参数无效时,则其后的所有参数均无效.
如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.
3.参数1可以是常数参数或序列数参数,其余参数只能为常数参数.
4.若m_nParam1Start<0, 则参数1为常数参数,参数等于*m_pfParam1;
5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
数组大小为m_nNumData,数据有效范围为m_nParam1Start--m_nNumData.
在时间上m_pData 与 m_pfParam1是一致的
*/
///////////////////////////////////////////////////////////////////////////////////
/* 函数输出
__declspec(dllexport) int xxxxxxxx(CALCINFO* pData); ---------- A
__declspec(dllexport) int xxxxxxxxVAR(CALCINDO* pData); ---------- B
  
1.函数名称需全部大写.
2.函数必须以上述A,B两种形式之一声明,请用实际函数名称替代xxxxxxxx;
对于C++程序还需包括在 extern "C" { } 括号中.
3.上述形式A用于声明不带参数或全部参数为常数的函数;
形式B用于声明参数1为序列数的函数;两种函数的区别在于后者以VAR结尾.
4.函数计算结果用pData->m_pResultBuf带回.
5.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:
m_pResultBuf -- m_pResultBuf间为有效值.
6.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER
7.编译时请请选择1字节对齐
*/
//示例函数,使用时用实际名称替换
__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData);
__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);
__declspec(dllexport) int WINAPI MYMACLOSE_CALC_PREV(CALCINFO* pData);
__declspec(dllexport) int WINAPI MYMAVAR_CALC_PREV(CALCINFO* pData);
#ifdef __cplusplus
}
#endif //__cplusplus
#endif //__FXJFUNC_H_INCLUDE
////////////////////////////////////////////////////////////////////////
  分析家的数据结构见上面。
//基本数据
typedef struct tagSTKDATA
{
time_t m_time; //时间,UCT
float m_fOpen; //开盘
float m_fHigh; //最高
float m_fLow; //最低
float m_fClose; //收盘
float m_fVolume; //成交量
float m_fAmount; //成交额
WORD m_wAdvance; //上涨家数(仅大盘有效)
WORD m_wDecline; //下跌家数(仅大盘有效)
} STKDATA;
在前一讲中,求均线ma(c,x),是用收盘价,我们可以改成中值(h+l+c)/3的均线。
将FxjFunc.cpp程序中
fTotal += pData->m_pData.m_fClose;
改为
fTotal=fTotal + ( pData->m_pData.m_fClose+ pData->m_pData.m_fLow+ pData->m_pData.m_fHigh )/3;
  
将上面接口规范看懂后,你可以创作各种函数。
当将你公式中的一些分析家函数替换成dll中的函数,可以实现简单的加密。
另一方面,使用dll文件读取数据,是没有经过精度转换的原始记录数据,有助
于精确分析。此外用c++编写公式可以使用循环,遍历等很多分析家所不能实现
的功能。
公式中的数据传递
一.dll公式计算的结果如何返回到分析家中
dll函数计算结果用pData->m_pResultBuf带回.
也就是说dll函数必须有值返回。
函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:
m_pResultBuf -- m_pResultBuf间为有效值.
例如上例:i表示当前所计算的周期。
pData->m_pResultBuf = fTotal/nPeriod;
全部数据为m_nNumData组。超过会出现错误。数据下标从0开始到m_nNumData-1二.分析家中公式的参数如何传递到dll公式。
1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
2.当一个参数无效时,则其后的所有参数均无效.
  如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.
3.参数1可以是常数参数或序列数参数,其余参数只能为常数参数.
4.若m_nParam1Start<0, 则参数1为常数参数,参数等于*m_pfParam1;
5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,数组大小为m_nNumData,数据有效范围为m_nParam1Start--m_nNumData.在时间上m_pData 与 m_pfParam1是一致的
在参数上,分析家不如飞狐交易师灵活。分析家只允许1个变化序列数据,飞狐可以允许四个变化序列数据。三.公式的设计和使用
1.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FXJFUNC@MYCMALOSE"(5)
2.动态连接库名称和函数名称可以自己定义.
3.使用时可以将动态库拷贝到分析家目录下使用.
分析家在SUPERSTK目录中
飞狐在FoxTrader\FmlDLL目录中例子:在公式接口中有,这个例子告诉你如何使用两个参数。
//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期
//调用方法:
// MYMAVAR(CLOSE-OPEN,5)
__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData)
{
float f,fTotal;
const float* pvalue;
int nPeriod,nFirst,i,j;
if(pData->m_pfParam1 && pData->m_pfParam2 &&  //参数1,2有效
  pData->m_nParam1Start>=0 &&     //参数1为序列数
  pData->m_pfParam3==NULL)     //有2个参数
{
  pvalue = pData->m_pfParam1;     //参数1
  nFirst = pData->m_nParam1Start;    //有效值
  f = *pData->m_pfParam2;
  nPeriod = (int)f;       //参数2
  if(nFirst>=0 && nPeriod>0)
  {
   for(i=nFirst+nPeriod-1;im_nNumData;i++)
   {
    fTotal = 0.0f;
    for(j=0;j      fTotal += pData->m_pData.m_fClose;
    pData->m_pResultBuf = fTotal/nPeriod;      //平均
   }
   return nFirst+nPeriod-1;
  }
}
return -1;
}大家可以参照上例来设计自己的dll公式。实际上我设计公式也是从看懂例子,修改开始的。
                                                                                  

--------------------------------------------------------------------------------

yhcheng

可否说明一下CALCINFO struc 里的每一个变量各是多少byte,尤其是那些不是pointer的变量,我只是在猜想有否可能直接做Assembly DLL而不必先叫C++再叫Assembly,谢谢
                                                                                  

--------------------------------------------------------------------------------

股市骑兵00

1.安装VC++ 6.0软件
2.下载分析家C语言接口文件。
3.具备C++编程的知识。


1;2俺都有的,就是3没。来学习的。:P
楼上2位教俺好吗?
再问问分析家和飞狐的DLL通用吗?
                                                                                  

--------------------------------------------------------------------------------

zn88331122

非常感谢,学习了!~

--------------------------------------------------------------------------------

tyw666

学习,谢谢!

--------------------------------------------------------------------------------

stock.top

我以前在机子上试过BC,有这么一个问题,比如我遍了一个程序,"1+1";在调试的时候就一闪而过,DOS窗口藏到任务栏,看不到,按书上讲的调试系统,没用;就自学一半不玩啦.

--------------------------------------------------------------------------------

静听花落

了解一下

--------------------------------------------------------------------------------

linguofa

学习

--------------------------------------------------------------------------------

冰雪寒香

Originally posted by yhcheng at 2004-11-18 21:55
可否说明一下CALCINFO struc 里的每一个变量各是多少byte,尤其是那些不是pointer的变量,我只是在猜想有否可能直接做Assembly DLL而不必先叫C++再叫Assembly,谢谢

我是不清楚那些变量是多少字节,看你的意思是不满意c的速度?非要去用汇编.
我认为这个必要性不大.

为什么dll的公式少呢,我看是因为官方没有开发一个函数库供大家直接调用.
那个c语言接口模板中只有些数据定义和调用方法说明,这真是太不重视了.

--------------------------------------------------------------------------------

年后山迷

好文

--------------------------------------------------------------------------------

yhcheng

Originally posted by 冰雪寒香 at 2004-11-18 23:14


我是不清楚那些变量是多少字节,看你的意思是不满意c的速度?非要去用汇编.
我认为这个必要性不大.

为什么dll的公式少呢,我看是因为官方没有开发一个函数库供大家直接调用.
那个c语言接口模板中只有些数据 ...
大姊讲的好对,飞狐不提供内建几何图形函数(只有工具)如画圆,椭园,任意直线,或弧形等,而VB也不提供绘图函数,所以想要做各种江恩几何图形,就难做,这也是很不得以才要想外接DLL,且主要也是其它语言有现成码,否则VB也可算,只是其数学函数较少罢了,如果有人可建议飞狐多加一些内建绘图函数就很棒了,谢谢妳的说明

--------------------------------------------------------------------------------

股盲痴人

不懂,学习。

--------------------------------------------------------------------------------

tyw666

按你给的例子dll到是出来了但没有显示,不知如何调用,请指教。谢谢!
工程名:fxj   函数:"fxj@mymavar"

--------------------------------------------------------------------------------

冰雪寒香

各位如果不愿装VC这样的大型可视化编程工具,可以试试

http://jaist.dl.sourceforge.net/sourceforge/dev-cpp/devcpp4980.exe

这个在c++业内很有名气的新秀编程工具,一样可以对付这种dll编译工作.

--------------------------------------------------------------------------------

macdok

收藏了

--------------------------------------------------------------------------------

flong68

收藏 慢慢看!~~@v@~~

--------------------------------------------------------------------------------

kenning

学习学习

--------------------------------------------------------------------------------

洪雷

谢谢!

--------------------------------------------------------------------------------

长阳软件

 

--------------------------------------------------------------------------------

江山俏

一无用处,炒股用什么指标

--------------------------------------------------------------------------------

stkkinger

xiexie

--------------------------------------------------------------------------------

飞网

扔下很久了,又要重新学习!

--------------------------------------------------------------------------------

z.biao

文章好,人更漂亮!梦中情人。:P

--------------------------------------------------------------------------------

ldf0

望楼主不要限于接口说明,能够深入展开最好!如能另外举几个典型例子就更好了!

--------------------------------------------------------------------------------

求得顺

ding!!

--------------------------------------------------------------------------------

trueman100

thank

--------------------------------------------------------------------------------

分析家钱倍

就想学这个!谢谢,加5分.

--------------------------------------------------------------------------------

ahfyxl

这可不是一回两回学会的。谢谢!!
我的硬盘小,待有机会再认真学!!

--------------------------------------------------------------------------------

dzhkks

看了这文章,也真该顶下,谢谢了

--------------------------------------------------------------------------------

lgyzj

ok

--------------------------------------------------------------------------------

ldf0

感谢提供,但引用的"计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期"实例是原分析家论坛上有问题的范例,分析家论坛经读者反应后才改正确了,需要者可在现在的分析家论坛上去下载!

--------------------------------------------------------------------------------

小山1

Originally posted by ldf0 at 2005-10-12 09:02
感谢提供,但引用的"计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期"实例是原分析家论坛上有问题的范例,分析家论坛经读者反应后才改正确了,需要者可在现在的分析家论坛上去下载!

是否可以转贴过来啊?

--------------------------------------------------------------------------------

ldf0

只转这个例题:
//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期
//调用方法:
//        MYMAVAR(CLOSE-OPEN,5)

__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData)
{
        float f,fTotal;
        const float* pValue;
        int nPeriod,nFirst,i,j;
        if(pData->m_pfParam1 && pData->m_pfParam2 &&                 //参数1,2有效
                pData->m_nParam1Start>=0 &&                        //参数1为序列数
                pData->m_pfParam3==NULL)                        //有2个参数
        {
                pValue = pData->m_pfParam1;                        //参数1
                nFirst = pData->m_nParam1Start;                        //有效值
                f = *pData->m_pfParam2;
                nPeriod = (int)f;                                //参数2
                if(nFirst>=0 && nPeriod>0)
                {
                        for(i=nFirst+nPeriod-1;im_nNumData;i++)
                        {
                                fTotal = 0.0f;
                                for(j=0;j                                         fTotal += pValue;
                                pData->m_pResultBuf = fTotal/nPeriod;                                                //平均
                        }
                        return nFirst+nPeriod-1;
                }
        }
        return -1;
}

--------------------------------------------------------------------------------

shzxx

好文!!保留、谢谢!!

--------------------------------------------------------------------------------

140270

望楼主再写几个实例

--------------------------------------------------------------------------------

M_CFLY

辛苦啦!!

--------------------------------------------------------------------------------

dzhkks

我上次那问题也是ldfo兄帮助解决的,好人呐。我编程也是半路出家的,汗,看那例程猜了几个小时,但因为分析家显示引用时数据无效,都没法猜测。高手能不能对这个例程给大家做下剖析,功德无量啊。

--------------------------------------------------------------------------------

小山1

有没有谁会写DLL的CYC指标啊?我想学习DLL文件源代码!

Last edited by 小山1 on 2005-10-13 at 19:11 ]

--------------------------------------------------------------------------------

knight_133

谢谢,好帖就要顶 !

--------------------------------------------------------------------------------

凯旋归来

不懂,学习。

--------------------------------------------------------------------------------

ccwcy

学习学习

--------------------------------------------------------------------------------

51783

一定谦虚学习 !

好人耶!!!!:):):)!

本帖最后由 51783 于 2005-12-21 13:15 编辑 ]

--------------------------------------------------------------------------------

adsl2008adsl

收藏 慢慢看!

--------------------------------------------------------------------------------

beihu0036

 

--------------------------------------------------------------------------------

rcfcu

不错,顶一下!!

--------------------------------------------------------------------------------

猴年新手

原帖由 冰雪寒香 于 2004-11-18 21:42 发表
:o
如何用dll文件制作公式? 

为什么要用dll文件来开发公式?
1.为了突破分析家和飞狐现有功能的限制。
2.为了提高公式速度。
3.为了加密公式的理念。
4.增加新的功能。
 下面我们逐渐用vc++ 6.0来讲 ...
版主你好,能发几个通用指标如:MACD,KDJ,RSI,SMA,EMA,HHV,LLV的源码上来大家学习一下吗?

--------------------------------------------------------------------------------

dhl888

学习学习,谢谢了

--------------------------------------------------------------------------------

jingyi123

学习

--------------------------------------------------------------------------------

adsl2008adsl

版主你好,能发几个通用指标如:MACD,KDJ,RSI,SMA,EMA,HHV,LLV的源码上来大家学习一下吗?

--------------------------------------------------------------------------------

gm

谢谢!!!学习中。

--------------------------------------------------------------------------------

ted32333

谢谢提供

--------------------------------------------------------------------------------

yang中国

非常感谢,学习了!~

--------------------------------------------------------------------------------

思迷思

只学到第5步。

--------------------------------------------------------------------------------

f8f8

其实用LCC做很容易的。

--------------------------------------------------------------------------------

41448381

kj看不懂

--------------------------------------------------------------------------------

思迷思

不知为什么第二讲照做后,无曲线输出呢?

--------------------------------------------------------------------------------

思迷思

也能做一个录象就好了

--------------------------------------------------------------------------------

cecilia911

学习呀!!!

--------------------------------------------------------------------------------

思迷思

飞狐的C语言接口比分析家强。不容易啊,有后发优势,但也到了升级的时候了。

相关文章
用户名: 新注册) 密码: 匿名评论 [查看评论]  发表评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
?
  站内搜索
 
  
最新短信回顾
最新传真回顾
热门文章
每日更新栏目
勇华投资股票首页 - 勇华简介 - 服务方式 - 联系我们 - 网站地图
 
 
本网站所载文章及数据资料仅供参考,使用者风险自担。
在本机构、本人所知情的范围内,本机构、本人以及财产上的利害关系人与所评价或推荐的证券没有利害关系
Copyright © 2000-2005 勇华投资股票网-股票飞鹰荐股网. All Rights Reserved.
本章所有资源均收集自网上,如果你认为侵犯了你的版权,请通知我们,我们立即删除.