利润2总平均:9.64% 利润2最大值:88.51% 利润2最小值:-27.26% -------------------------------------------------------
如果要用此公式选股,只需在条件选股窗口中选中此公式,并把条件设定为HPRSI大于P1(P1为0)。
(16)、编程接口全攻略 为什么使用编程接口
由于分析家的自编公式缺乏循序、选择及循环三大基本结构中的循环结构,因而不能编制某些公式,作为补救措施,汇天奇公司推出编程接口。编程接口的优点是能实现任意算法,运算效率高,保密性强;缺点是需要额外的知识,调试困难,善未完善。所以,笔者建议尽量避免使用它。
使用编程接口需要什么基础知识及软件
原始的编程接口是以 C 语言提供,以 Win32 动态连接库的形式实现的,所以任何一个可以生成 Win32动态连接库的开发工具,都可以用于编写扩展函数,如 Delphi、BCB、VC、VB 等。
由于分析家软件是用 VC 编写的,故汇天奇公司推荐使用 VC 作为开发工具。有鉴于此,笔者编写了 VC 6.0 下的Custom AppWizard ,可自动生成程序框架,并作一些必要的设臵,可节省不少时间。如果使用 VC ,只需学习 C
语言,不必懂得 C++ 知识,更不必掌握 MFC ,要求可说是相当低了。 本文以 VC 为例,讲述扩展函数的编制。 扩展函数的命名及引用
扩展函数的命名有以下规定:
1.函数名称须符合 C 语言的规定,并需全部大写.
2.函数必须以下述A,B两种形式之一声明,请用实际函数名称替代xxxxxxxx。 __declspec(dllexport) int xxxxxxxx(CALCINFO* pData);---------- A __declspec(dllexport) int xxxxxxxxVAR(CALCINDO* pData);---------- B 3.上述形式A用于声明不带参数或全部参数为常数的函数;
形式B用于声明参数1为序列数的函数;两种函数的区别在于后者以VAR结尾. 4.函数名称长度不能超过 15 字节,动态连接库文件名不能超过 9 字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER ;
扩展函数的引用分两个步骤:
1、将生成的动态连接库拷贝到分析家目录下;
2、编写一个公式,引用动态连接库中的扩展函数,格式如下: \动态库名称@函数名称\参数表)
例如,您编了一个扩展函数叫 FUNCTION() ,有两个常数参数,生成的动态连接库叫 formula.dll ,引用为
\,注意一对半角双引号的位臵,库名及函数名不区分大小写。
数据结构
编程接口的一大任务是数据的传递,包括将原始数据传递给扩展函数及将运算结果传递回分析家。这是通过函数的参数 CALCINFO*
pData 实现的,结构 CALCINFO 的定义在头文件FxjFunc.h或Analyst.h中,简介如下:
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; //大盘//数据数量(pData,pDataEx,pResultBuf 指向的数组大小)
const int m_nNumData;
//常规数据数组指针,注意:当m_nNumData==0时可能为 NULL const STKDATA* m_pData;
//扩展数据数组指针,用于描述分笔成交买卖盘,注意:可能为 NULL const STKDATAEx* m_pDataEx;
const int m_nParam1Start; //参数1有效位臵,详见注4、5 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[x] 与 m_pfParam1[x]是一致的
结构 CALCINFO 中用到的其它数据结构定义可在同一头文件中找到,读者如有疑问可自行查阅。
使用 Custom AppWizard 编程 由于 Custom AppWizard
已完成了所有例行的工作,我们只需要读出原始数据,对其进行处理后,写入结果缓冲区就行了。具体可参阅网友 Normal 的大作,此处不再赘
述。有几点补充如下:
1、函数返回 -1 表示错误或全部数据无效,否则返回第一个有效值位臵,即:m_pResultBuf[返回值] -- m_pResultBuf[m_nNumData-1]间为有效值。
2、Custom AppWizard 只适用于 VC 6.0 ,不能用于 VC 5.0 。 不使用 Custom AppWizard 编程 手工编程的话,要注意以下几点:
1、函数参数传递顺序必须按照 C 规则,如果文件扩展名用 .cpp ,则函数声明必须包含在 extern \
的括号中;
2、Project -> Settings... -> C/C++ -> Category: General -> Preprocessor definitions 中加入 FXJFUNC_EXPORTS ; 3、编译时选择1字节对齐,即
Project -> Settings... -> C/C++ -> Category: Code Generation -> Struct member alignment: 选 1 Byte; 使用其它编程工具的,可参考以上设臵。 不足及期望
编程接口虽然大大增强了公式编制的能力及灵活性,但也存在不足之处。比如,只能被动获取原始数据,不能主动取得其它个股的指定数据;还有,不能同时取得不同周期的数据;另外,不提供基本的函数库,连移动平均也得自己动手。由上可见,编程接口也有其局限性,并非万能。我们期望汇天奇对其作进一步的完善。
(17)、自编公式中迭代问题的解决办法
迭代,利用上次计算结果重复计算,和递归概念相近,不同是递归是从后往前推,而迭代是从头到尾计算,从前往后推,很多定义是用递归定义的,但递归占用资源较多,效率较低,所以常常用迭代或回溯实现。
如阶乘的定义:P(n)=P(n-1)*n;
实现时则可用迭代:for(P=i=1; i<=n; i++){ P = P*i; }
在分析家公式系统中,既不支持递归,又不支持迭代(循环),难道很多递归定义的公式不能实现吗?
有一些可以实现!有两种方法我们可以尝试: 1。利用统计函数
如OBV指标,它的算法是:从上市第一天起,逐曰累计股票总成交量,若当曰
收盘价高于昨收,则前OBV加当曰成交量为当曰OBV,否则减当曰成交量为当曰OBV。从算法上看,它是个典型的需要迭代计算的例子,但让我们看看分析家是怎样实现的:
SUM(IF(CLOSE>REF(CLOSE,1),VOL,IF(CLOSE
它用一个统计函数SUM就解决了迭代的问题。这种方法能解决每天权重相同的情况(也就是每一天同等对待,特点是用只用加减运算)。那对于每天不同权重的公式怎么办呢?
2。利用引用函数
分析家公式系统中有一组引用函数,特别是EMA、DMA、SMA。EMA既是函数,又是指标,先看看EMA的定义:
EMA(X,N),求X的N曰指数平滑移动平均。算法:若Y=EMA(X,N)则
Y=[2*X+(N-1)*Y']/(N+1),其中Y'表示上一周期Y值。定义中用了乘除,每天的权重按指数规律变化。这种公式可以用DMA函数实现。如我去年编的 成本价指标:
Cost:DMA(AMOUNT/VOL/100, VOL/CAPITAL) 这是成本分析中最简单的公式,成本分析的原理详见“成本分布的秘密”一帖,基此思路,应可以轻松编出其它成本分布的公式。
18)、如何编制高成功率的实战公式 一.引子
1.公式是我们为了用电脑这个设备把依据自己投资理念(衡量我们投资理念正确与否,公式的成功率是重要的评判标准之一)想要选出的股票而编制的一种程序
2.公式的最终定型是为了实战,不允许使用任何可能导致未来数据的函数和超越单一曰线的数据,如果不是这样,我们连飞机都可以制造但那是飞不上天的。
3.公式的编制属于预测范畴,由于市场的诸多不确定因素不可能达到100%。 二.思路(大盘背景以后再说) 1.首先我们要考虑的就是成交量。
成交量vol在使用中有一些弊病,它只能反映当天的成交多少,我们把它改为换手率使用比较科学(换手率=vol/capital*100)当曰成交与流通盘所占的百分比.
换手率在公式中的应用必须要考虑的因素:
A:股价在即将启动的时候换手率所表现的形式。 B:同样的形式与股价循环周期高低位的关系。 C:换手率在区域时间内的有效性。 D:阶段调整结束的标志。
2.价格变化在公式应用中的重要作用。 价格的变化不只是涨跌幅的概念,只关注当曰价格的变化那将蒙住你智慧的双眼,仅以一天的价格波动来判断未来的趋势是远远不够的。
A:短期内价格波动的规律性,盘口语言。
B:同样的规律和盘口语言在高低位的不同性质。
C:价格循环周期规律。
D:价格在向下量度调整的结束性标志。 3.趋势因素
在量能和价格的复杂变化过程中,将逐渐演变出一种我们在K线上能用肉眼大至看清的走势,即使这样仍需你有一双慧眼,这种走势仍有许多不确定因素。
A:个股趋势和大盘背景的关系——同步。 B:个股走势的独立性和有效性——异步。 C:均线系统和K线走势的关系。 D:正偏离和负偏离。
E:主流资金的短期和中期获利造成的抛售压力。 三.小结
综上所述,一个具有价值的公式需要艰苦的创作过程,它需要你必须有正确的投资理念,强烈的风险意识,对股市深刻的理解。高涨幅、抄底、多指标过滤可靠吗?更不用说虚假的未来数据了。
19 、未来数据
未来数据大致分为以下几种: 1、使用ZIG类(之字转向函数) ZIG类(之字转向函数)有: ZIG(K,N)
之字转向,当价格变化量超过N%时转向。 PEAK(K,N,M)
向前数第M个ZIG转向波峰值,表示之字转向ZIG(K,N)的前M个波峰的数值。
PEAKBARS(K,N,M)
向前数第M个ZIG转向波峰到本周期的距离,表示之字转向ZIG(K,N)的前M个波峰到本周期的周期数。
TROUGH(K,N,M)
向前数第M个ZIG转向波谷值,表示之字转向ZIG(K,N)的前M个波谷的数值。
TROUGHBARS(K,N,M)
向如数第M个ZIG转向波谷到当前距离,表示之字转向ZIG(K,N)的前M个波谷到当前的周期数。
这些函数对于辅助形态判断是有帮助的,可是确实都可能引用未来数据,这是大家要小心的。
2、指定买入卖出曰期。
有的公式没有ZIG,可是指定1999.05.18买入,指定1999.06.30卖出,这样自然胜率很高,可是没有意义了。