>股票书籍 >分析家公式编写教程>正文内容 自编公式实现Winner函数

自编公式实现Winner函数

专题:

 

 自编公式实现Winner函数

CC := DYNAINFO(7); { 今日收盘 }
ww := IF(L>CC, 0, IF(H<CC, 1, (CC-L+0.01)/(H-L+0.01))); { 每日获利盘 }
Winner: DMA(ww, VOL/CAPITAL)*100; { 获利盘 }

感谢胡呵的WINNER算法(作者:girlkiller)

感谢胡呵提供WINNER算法,对照分析家WINNER和胡呵的WINNER(简称HUWIN)有以下微小区别;

1,HUWIN中的价格加减幅度对20元以下的股票设置为0.05时与WINNER实际值接近,按0.01HUWIN的数据一般<WINNER数据.

2,由于参考动态价格,使得HUWIN无法对历史的HUWIN保留当时的真实数据,具体可对照600608等股票,只能保持当天的HUWIN.因此,选股测试是用WINNER较好,因为WINNER对历史保留.

但HUWIN能在分时线中表达,WINNER则不能,这是HUWIN的优点.

另外,从HUWIN可见筹码移动的基本算法,指南针用户如盲目相信筹码分布,谨防在筹码分布变粉色是庄家出逃(据说粉色是底部的征兆),因此,HUWIN给我们提供的不仅仅是算法....

WINNER提供的是参考数,即在特定算法下的筹码表达式,并不是真实的筹码变动,但此种方法的确有很好的参考价值,我作过实验,将股本CAPITAL定在2亿,每日的VOL/CAPITAL恒定不便,在恒生指数和NASDAQ等市场居然一样有效.

(11)、我用分析家公式
很久以来,我幻想着用一种什么软件或公式亦或招数之类.在证券市场上捞他一大笔天上掉下来的横财!
可事实给了我一个响亮的耳光......

自从我用了分析家,似乎是我看到点亮光.分析家软件就其本身来讲,给了大家一个有很大自由的好工具----仅仅是工具而已!!!工具是什么?是提高效率的东西;是本身功能,能力等等的延伸.而非克敌制胜的法宝.分析家公式也不可能也不应该是印钱的机器!(我在这里并不是散布"公式无用论",问题恰恰相反).这就自然使我们想到"用"的问题.

首先最重要的前提应是(公式)有没有用的问题?其实这个问题就是战争与武器的关系问题,大家可能都非常清楚了,用不着我废话了.我今天想谈一谈人与武器的问题即"用"的问题,这里有网友说了,你给我一个100%的公式,我肯定赚钱.我说不但赚不上,还可能赔!!!本人这些天来五战五捷,获利30%强.就不完全凭公式,当然也绝对离不开公式,应公式可自动预警;可帮我快速选股;可帮我快速界定条件进行决策......

想必大家都看过青木先生的<<战胜庄家>>吧?!在那本书的结尾讲的"手指与明月"的典故.表面看应该是个距离问题吧!进一步是否可理解为思想方法问题呢?由于本人打字速度的原因,没看过的朋友到书摊找一找吧.我一直是很崇拜这套书的,可不是看到那300万呀?!

最赞成的就是曾先生黑马摇篮的广告词50%公式+50%智慧=100%财富,对我来说我想改一下将"智慧"改成看盘经验,看盘功夫等等笨招,因为我很笨,不是聪明人谈不到智慧二字-----大实话

谈一谈近几日用公式"快速赚钱"的经验:
买股之前目标的客观公正的条件(因夹杂着贪婪和恐惧的买股票感觉是不可靠的)要靠公式去寻找(最大限度的发挥公式的优势;工具的优势!这时分析家公式发挥了前所未有的功能)

这里给大家一个公式.仅供参考,赚钱与否,与本人,本站,曾先生无关等等等......
c/L>=1.099 (太简单了吧!记得fxj008先生说过:凶狠的能一招治敌的招数能有能有多少套路呢?)
在应用时坚决遵循:
1.不求赚钱,但决不能赔钱;(要求找好买入点,力争当日收盘赚1.5%以上)
2.见利就走,决不恋战; (强度不够,靠感觉即经验)
3.发现强庄,一跟到底; (不赚白不赚!白赚谁不赚!)

说心里话,看了1.2.3.总觉得还没说清,有一种到不出来的感觉?! 在操作上尤其在短线上操盘策略和盘中捕捉法应是大有讲究的,可能就是曾先生指的智慧吧?!

有关本公式的详细使用方法请不要来信询问,在此仅想举例说明我怎么"用"分析家公式的问题!在此仅想抛砖引玉,告诉网友们友好公式是赚钱的前提,

(12)、正确判断涨跌停的公式写法
“如何找出自最近一次涨停以出现过跌停的股票呢?”

首先必须指出:用C*1.0和C*0.9计算涨跌停价是错误的,没有考虑到四舍五入的因素,因此按此思路写出的公式也是错误的。如果正确判断一只股票是否涨停或跌停,是许多朋友不会写的,因此这是一个普遍性的问题。
下面是判断涨停和跌停的正确写法:
=======================================
WS:=MOD(REF(C,1)*100,10)/100; { 昨收价的分数位 }
FD:=REF(C,1)/10-IF(WS<0.05,WS,WS-0.10)/10; { 涨停或跌停的幅度 }
涨停: C=REF(C,1)+FD; { 是否涨停 }
跌停: C=REF(C,1)-FD; { 是否跌停 }
{ 注: 不适用ST,PT,和以0.001元为最小计价单位的上海B股}
=======================================
要找出自最近一次涨停以出现过跌停的股票,只要加入下面的句子就行了。
=======================================
BARSLAST(涨停)>BARSLAST(跌停) { 自上次涨停以来有无跌停 }


(13)、由MACD指标想到了公式的客观性
大家请看:
DIFF := EMA(CLOSE,12) - EMA(CLOSE,26);
DEA := EMA(DIFF,9);
MACD := 2*(DIFF-DEA);
m1:=macd>ref(macd,1) and diff<dea;
m1 and count(m1,10)=1 and c>ma(c,55) {and abs(macd)>0.2 }and count(macd<0,5)>=5

稍懂点分析家公式的朋友们一看便知,是macd绿色柱状线,由最长刚变短而给出买点的公式......

事情是这样的:近几天我的一个朋友经过对某只股票进行了所谓"认真观察""反复研究"得出结论:一只股票的macd指标的绿色柱状线一但最长(这有点说不清,因为长了还可以再长,是相对的,这里大家注意到了公式中加了abs(macd)>0.2可我遗憾的告诉您,不加还好,有了这条成功率不升反降!)变短就准有一波行情.打进了****股,就等着赚钱哪!

有兴趣的朋友可对以上公式进行测试,会发现结果一般,不应具有一般意义上的操作价值,可为什么我的那个朋友却把这一所谓"规律"当成金科玉律了哪?我觉得深究其原因,应该是人的潜意识中那个"贪"字吧.这就需要在这个市场中进行艰苦的磨练了,估计也练成了,手里的钱也练没了!但这不等于说我们就束手无策了吗?

回头看一下开头的公式,对!分析家----虽然它有这样或那样的不足,但编个公式简单验证一下,一个客观的,明确的尺子量完的结果就展现在我们面前了.

固执与灵活,主观与客观.用分析家公式完美的统一了.机器会在瞬间找出不合格的股票的,骨子里的"贪心"能不受一点震动吗?一场面红耳赤的争论不复存在了......

(14)、 我编分析家公式-可用的未来数据
朋友们一看文题,就得问:"含未来数据的公式还能应用?"回答是肯定的.能!请大家看一下的测试结果:


1997年1月1日-2001年4月7日 5天5% 中价计算:默认即(高+低+收)/3

测试股票数:1097 共发出指示:807 成功指示:802 失败指示:5 未完成指示:0 平均成功率:99.38%, 成功率达到50%的股票有:43.2% 利润1总平均:13.93% 利润1最大值:41.84% 利润1最小值:4.55% 利润2总平均:10.12% 利润2最大值:41.84% 利润2最小值:-14.16%


1997年1月1日-2001年4月7日 5天5% 中价计算:收

测试股票数:1097 共发出指示:807 成功指示:620 失败指示:187 未完成指示:0 平均成功率:76.83%, 成功率达到50%的股票有:35.5% 利润1总平均:10.47% 利润1最大值:37.23% 利润1最小值:0.57% 利润2总平均:6.20% 利润2最大值:37.23% 利润2最小值:-16.85%


一旦你知道这是由于未来数据造成的就会很失望吧.不过我读了一下公式的内容发现,是可以变通使用的,而且没有未来数据了,实践效果也较好.
请看公式内容:


CLOSE/OPEN>=1.099 AND BACKSET(L>REF(H,1),2)


现在要变通了......假如,所选的股票5日内没有5%的涨幅,而且今日的最低价在<第一天>收盘价附近,依公式测试结果在至少<第四天>,至多<第五天>就应赚5%,也就是说本公式仅在两日内就赚5%!!!但这里有三个小问题需要考虑:1.分析家软件的测试方法;2.买点;3.卖点.
首先,分析家的测试方法是依<中价计算>,在测试中中价计算应该为依<收盘价>.
其次,买价就可选在C/O>=1.099这一天的收盘了,但要在第三天用这个买价买(如果能买到的话,不防提高个1%-1.5%----少赚点吗,别太贪心了!).
最后,卖出价请到测试结果中去找5日内最高价有几次没赚5%,即最高利润小于5%的股票有几家?重算一下成功率:
86家最高价(利润1)小于5% 共发指示807 (807-86)/807=89.34% 成功率高达89.34% 就把这个条件定为"美好未来1" 吧.


现在就简单的设想一下几个结果可能不全面,还得请网友们共同研究)
一种可能,在买价买入股票,只要在明后天的两日内把卖单埋在买价加5%的位置,就去守株待兔吧,精确点说2天赚2%(扣除印花税和佣金1.5%+买入时多给的1.5%);
二种可能,其实对这种强势股来说,买入的当天收盘就有很大可能已经涨很高了
这样的例子很多,不一一列举了,请大家用我给的公式(美好未来1)好好研究一下,有心得别忘了我;
三种可能,买入的当天,这支股票打一长上影线7-8%,两天内随不一定不上影,但上影线的一半的地方的利润也不只2%吧;
第四种可能......止损!!!!!!


这样一来公式转变成(美好未来1):
BARSLAST(ref(c,1)/ref(o,1)>=1.099 and l>ref(h,1))=1
结论:用"原始公式"搞测试;"美好未来1"实际操作.好了,汽车上太颠簸,就写这些吧.

(15)、短线RSI选股指标设计
站长按:HP朋友设计的这个指标,从短线角度胜率不俗,且分布十分均匀,有很好的实战意义!

由于此公式选出的股票涨幅不是很大,所以目标利润定为5%
首先从分析家自带的RSI开始,当股价从低位开始上涨时6日RSI
会上穿24日RSI,初始公式为:
cross(rsi1,rsi3)
此时此公式所发出的指示有一部分出现在高位,甚至顶部,通
过观察,可以发现在低位发出的指示有一些共同点,即12日RSI
小于40,6日RSI小于50,并且最近5天内RSI曾低于20,所以在
公式中加入以下限制:
rsi2<40 and count(rsi1<20,5)>=1 and rsi1<50
经过测试(99.1.1-00.7.7),发现此公式的失败指示主要发出在
99年9-12月,此时大盘不景气,于是加入以下限制:
c/ref(c,1)<indexc/ref(indexc,1)
以下测试条件均为20日5%(请注意目标利润为5%)
-------------------------------------------------------
99.1.1-00.7.7
测试股票数:984
共发出指示:250 成功指示:202 失败指示:48 未完成指示:0
平均成功率:80.80%, 成功率达到50%的股票有:18.8%
利润1总平均:15.30% 利润1最大值:88.51% 利润1最小值:0.00%
利润2总平均:11.19% 利润2最大值:88.51% 利润2最小值:-13.41%
-------------------------------------------------------
97.1.1-00.7.7
测试股票数:984
共发出指示:443 成功指示:345 失败指示:98 未完成指示:0
平均成功率:77.88%, 成功率达到50%的股票有:29.3%
利润1总平均:13.94% 利润1最大值:88.51% 利润1最小值:0.00%
利润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 ,引用为
"formula@Fuction"(16,8) ,注意一对半角双引号的位置,库名及函数名不区分大小写。
数据结构
编程接口的一大任务是数据的传递,包括将原始数据传递给扩展函数及将运算结果传递回分析家。这是通过函数的参数 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 "C" {}
的括号中;
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<REF(CLOSE,1),-VOL,0)),0)

它用一个统计函数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函数实现。如我去年编的 成本价指标:

CostMA(AMOUNT/VOL/100, VOL/CAPITAL)

这是成本分析中最简单的公式,成本分析的原理详见“成本分布的秘密”一帖,基此思路,应可以轻松编出其它成本分布的公式。