曹昂虐吕布的卵蛋:《飞狐公式编写基础》和《通达信公式教程》(二)_风景的博客

来源:百度文库 编辑:中财网 时间:2024/04/29 21:55:06
《飞狐公式编写基础》和《通达信公式教程》(二)
2008-12-20 09:51:03

新增函数应用:如何遍历板块股票代码

PHP代码:--------------------------------------------------------------------------------
bk:='深圳A股';
variable:j=1,k=0,dm_len=0,lstr[6]='00000',blksum:=STKCOUNT(bk),dmstr[blksum]='';
lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
while j<=blksum do begin
  dm:=NumToStr(k,0);
  dm_len:=strlen(dm);
  dm:=lstr[dm_len]+dm;
  if stkinblock(dm,bk) then begin
    dmstr[j]:=dm;
    j:=j+1;
  end;

  k:=k+1;
end;

//以下是一些字符串函数及运算的综合应用
EXPLAIN(1,dmstr[1]);  //在解盘中,输出深圳A股第1只股票的代码
EXPLAIN(1,stknameex(dmstr[2]));//第2只股票的名称
EXPLAIN(1,dmstr[3]+stknameex(dmstr[3]));//第3只股票的代码及名称
EXPLAIN(1,'深圳A股第4只股票的代码是:'+dmstr[4]);
EXPLAIN(1,dmstr[5]+'最后收盘价:'+numtostr(close,2));
EXPLAIN(1,'深圳A股共有股票:'+numtostr(blksum,0)+'只');--------------------------------------------------------------------------------
  如果您有编程的功底,上面代码一看就明白,但对没有编程经验的狐友们来说就不容易了。下面尽量详细地对思路和公式代码做一些解说,并对代码进行适当扩展。
  1、所谓遍历股票代码,就是能够访问某板块中所有的股票代码,如果连访问都不能实现,怎么做一些更加强大的诸如横向统计、排序的功能?
  2、上面的公式代码是以深圳A股板块为例,我们看看深圳A股的股票代码,它们都是很有规律的,000001、000002、...、000999、001696、001896,请注意这些代码的特征:
  ①股票代码要理解成字符串,而不是数值,如果是数值的话,股票代码就成了1、2、...、999、1696、1896。
  ②这些代码如果转换成数值,大体集中在某个数的范围,如上面所示,深圳A股代码的数值目前都小于1896,代码的数值大多都是呈递增1的规律,少量有跳跃的情况,比如000040跳到000042,000041不存在。
  因此,我们初步可以设计一个循环


PHP代码:--------------------------------------------------------------------------------
j:=0;
while j<=1896 do
begin
  j:=j+1;
end;--------------------------------------------------------------------------------

  上面这段代码,是个循环,每次循环都执行一次由begin和end所包围起来的语句,这里只有一条语句即j:=j+1,目的让变量j从1每次循环都递增1,直到j=1896为止。
  j:=j+1这条赋值语句,初次接触的话不大好理解,大意是这样,右边的j比如现在等于2,这条语句是让右边的j现有的数值加上1,然后再送回到变量j之中,执行完这条语句后,j就由2递增1变成了等于3。
  j:=j+1,看起来有点象计数器的功能吧?每循环一次,计数器就增加1,因此也可以称变量j为计数器(变量)。
  好了,思路敏捷的狐友,马上就能想到,这个计数器会生成从0到1896总共1897个数值,如果进行转换,也就是把数值转换成字符串,则深圳A股所有的股票代码都包含在里面了。
  呵呵,的确是这样,因此我们设计下面一个稍加改进的循环,来逼近我们要完成的任务:

PHP代码:--------------------------------------------------------------------------------
j:=0;
while j<=1896 do
begin
  dm:=NumToStr(j,0);  //把数值j转换成字符串并赋值给变量dm,保留小数位数0
  j:=j+1;
end;
EXPLAIN(islastbar,dm); //当处在最后一根K线位置时,输出字符串dm的内容--------------------------------------------------------------------------------

  最后一行代码,是用解盘函数输出字符串变量dm的结果,我们可以在“解”中观察,不过这里由于dm是单值变量,不是序列变量,只能保存最后的一次结果,因此只能观察到结果是1896。

如果想观察其它的结果,只好改循环首语句,比如:
while j<=1 do

 大家可以发现这些结果,还有一点小问题,没有前导的0,即我们要的是000001、0001896,而不是1、1896这样的字符串,怎么办呢?
  给它们的前面加上0就可以了,但加上0的个数有讲究的,比如1在前面要加上5个0,1896前面只需加上2个0,很明显,要加的0的个数,等于6减字符串的字符个数。因此,设计公式代码如下:


PHP代码:--------------------------------------------------------------------------------
variable:lstr[6]='00000';//定义一个数组lstr[6],共6个元素,并让所有6个元素初始都等于字符串'00000'

//下面对字符串数组lstr[]第2至第6个元素重新进行赋值,以便巧妙应用
lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
j:=0;
while j<=1896 do
begin
  dm:=NumToStr(j,0);  //把数值j转换成字符串并赋值给变量dm,保留小数位数0
  dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len
  dm:=lstr[dm_len]+dm;  //由dm的长度,确定应该给dm的前面加上多少个字符0
  j:=j+1;
end;
EXPLAIN(islastbar,dm); //当处在最后一根K线位置时,输出字符串dm的内容--------------------------------------------------------------------------------  对这行代码稍加解释:dm:=lstr[dm_len]+dm,如果某次循环右边的dm等于'19',则它的字符串长度为dm_len等于2,则这行代码此时等价于dm:=lstr[2]+dm,而lstr[2]等于'0000',结果就是在'19'的前面加上4个字符'0'即成了'000019',然后再把'000019'赋值给dm,于是左边的dm就等于'000019'

  到此为止,我们只是实现了所生成的字符串,可以让深圳A股的代码全部被包含在其中,但还有大量的“废”字符串,我们要把没用的字符串过滤掉。取出我们真正需要的。  要用到的函数  ①stkinblock(dm,bk),函数注释:如果股票代码dm从属于板块bk,则函数返回数值1,否则返回数值0  ②条件控制语句IF cond THEN expr1 ELSE expr2,意思是:当满足 cond 条件的时候,执行语句 expr1,否则执行 expr2 语句  设计代码如下:PHP代码:--------------------------------------------------------------------------------
variable:lstr[6]='00000';
lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
j:=0;
bk:='深圳A股'; //bk赋值为字符串'深圳A股'
while j<=1896 do
begin
  dm:=NumToStr(j,0);  //把数值j转换成字符串并赋值给变量dm,保留小数位数0
  dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len
  dm:=lstr[dm_len]+dm;  //由dm的长度,确定应该给dm的前面加上多少个字符0
  if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句
  begin
    dm1:=dm;  //真正需要的股票代码是这里的dm1
  end;
  j:=j+1;
end;
EXPLAIN(islastbar,dm1); //当处在最后一根K线位置时,输出字符串dm1的内容--------------------------------------------------------------------------------

公式代码设计到这里似乎可以结束了,因为我们要的结果都可以生成了。其实还有改进的余地:  ①dm1只是个单值的字符串变量,它只能保存最后的结果,而不能保存所有的结果。这里考虑使用数组,数组可以自行定义很多个元素,让每个元素保存一个结果。  ②循环首的j<1896总觉得不对劲,不够智能化,比如将来“深圳A股”板块最后的代码不是0001896,则这段公式代码的结果就不对了。  针对以上问题,设计公式代码如下: PHP代码:--------------------------------------------------------------------------------
variable:lstr[6]='00000';
lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
j:=0;  //记录循环次数的计数器
k:=1;  //记录股票代码的个数的计数器
bk:='深圳A股'; //bk赋值为字符串'深圳A股'
blksum:=STKCOUNT(bk); //板块所包含证券数量
variable:dmstr[blksum]='';  //定义一个字符串数组用于记录股票代码,元素个数为blksum,初始值为空
while k<=blksum do  //当计数器k<=blksum时,执行以下循环
begin
  dm:=NumToStr(j,0);  //把数值j转换成字符串并赋值给变量dm,保留小数位数0
  dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len
  dm:=lstr[dm_len]+dm;  //由dm的长度,确定应该给dm的前面加上多少个字符0
  if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句
  begin
    dmstr[k]:=dm;  //真正需要的股票代码,记录到字符串数组dmstr的第k个元素中
    k:=k+1;  //记录找到的股票代码的个数
  end;
  j:=j+1;  //记录循环的次数
end;
EXPLAIN(islastbar,dmstr[1]); //当处在最后一根K线位置时,输出深圳A股第1只股票的代码--------------------------------------------------------------------------------

  有了以上公式,我们就可以把范围扩大,比如遍历'A股板块'的所有股票代码,很简单,只需改一条语句,即把 bk:='深圳A股' 改成 bk:='A股板块'。  公式代码如下(且慢执行,等下面的解说):PHP代码:--------------------------------------------------------------------------------
variable:lstr[6]='00000';
lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
j:=0;  //记录循环次数的计数器
k:=1;  //记录股票代码的个数的计数器
bk:='A股板块'; //bk赋值为字符串'深圳A股'
blksum:=STKCOUNT(bk); //板块所包含证券数量
variable:dmstr[blksum]='';  //定义一个字符串数组用于记录股票代码,元素个数为blksum,初始值为空
while k<=blksum do  //当计数器k<=blksum时,执行以下循环
begin
  dm:=NumToStr(j,0);  //把数值j转换成字符串并赋值给变量dm,保留小数位数0
  dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len
  dm:=lstr[dm_len]+dm;  //由dm的长度,确定应该给dm的前面加上多少个字符0
  if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句
  begin
    dmstr[k]:=dm;  //真正需要的股票代码,记录到字符串数组dmstr的第k个元素中
    k:=k+1;  //记录找到的股票代码的个数
  end;
  j:=j+1;  //记录循环的次数
end;
EXPLAIN(islastbar,dmstr[1]); //当处在最后一根K线位置时,输出字符串深圳A股第1只股票的代码--------------------------------------------------------------------------------  假如你试图执行这段代码,你会发现好慢哦~~  为何会这样?因为从深圳A股切换到上海A股的股票代码时,是从1896跳跃到600000,中间有508104次空循环,这中间没有一个代码是真正的股票代码,因此可以这样来提高循环的执行效率,在公式代码中插入如下几行代码:if j=1896 then j:=599999;if j=600999 then break;  优化后的代码如下: PHP代码:--------------------------------------------------------------------------------
variable:lstr[6]='00000';
lstr[2]:='0000';lstr[3]:='000';lstr[4]:='00';lstr[5]:='0';lstr[6]:='';
j:=0;  //记录循环次数的计数器
k:=1;  //记录股票代码的个数的计数器
bk:='A股板块'; //bk赋值为字符串'深圳A股'
blksum:=STKCOUNT(bk); //板块所包含证券数量
variable:dmstr[blksum]='';  //定义一个字符串数组用于记录股票代码,元素个数为blksum,初始值为空
while k<=blksum do  //当计数器k<=blksum时,执行以下循环
begin
  dm:=NumToStr(j,0);  //把数值j转换成字符串并赋值给变量dm,保留小数位数0
  dm_len:=strlen(dm); //求出dm的长度,并赋值给变量dm_len
  dm:=lstr[dm_len]+dm;  //由dm的长度,确定应该给dm的前面加上多少个字符0
  if stkinblock(dm,bk) then //如果股票代码dm属于bk,则执行下面由begin、end包含的语句
  begin
    dmstr[k]:=dm;  //真正需要的股票代码,记录到字符串数组dmstr的第k个元素中
    k:=k+1;  //记录找到的股票代码的个数
  end;
  if j=1896 then j:=599999;  //计数器j直接跳到到上海A股对应的最小代码
  if j=600999 then break;  //如果记录到这个代码则跳出循环
  j:=j+1;  //记录循环的次数
end;

//以下是一些字符串函数及运算的综合应用
EXPLAIN(1,dmstr[1]);  //在解盘中,输出深圳A股第1只股票的代码
EXPLAIN(1,stknameex(dmstr[2]));//第2只股票的名称
EXPLAIN(1,dmstr[3]+stknameex(dmstr[3]));//第3只股票的代码及名称
EXPLAIN(1,'深圳A股第4只股票的代码是:'+dmstr[4]);
EXPLAIN(1,dmstr[5]+'最后收盘价:'+numtostr(close,2));
EXPLAIN(1,'深圳A股共有股票:'+numtostr(blksum,0)+'只');--------------------------------------------------------------------------------  这行代码 if j=600999 then break 有什么用?以防万一,如果有人改了市场规则,把500001之类的股票计入上海A股的话,这里的循环会出不来的,会造成电脑死循环,飞狐长时间没有响应。 以上公式代码,只是个示例,效率不太高,如果能有个方法,直接给出板块中所有的股票代码,那就不需要这段公式代码。  给出这个示例,是想通过大致解剖整个公式代码的设计过程,让大家对循环、条件语句有个初步的认识。  最后,给大家个练习的机会:  1、修改上述代码,计算“A股板块”的成交量(这就是横向统计了)  2、以上公式代码,使用的是while循环,有办法改成fox循环吗?(当心,在修改代码的过程中,如果不慎的话,有可能造成死循环,对于win9x操作系统,也许很难退出,对于NT以上操作系统,可以强行退出)  3、高级问题:通过以上代码,可以做出横向排序,不过建议不要用代码本身来实现排序(会很慢的),应使用今天发布的新函数SORTPOS(X,D,N1,N2)来实现。  4、借用论坛的一个问题:ff:=barslast(date=1030107);周期:=5;VERTLInE(ff=0 or ff=周期*1 or ff=周期*2 or ff=周期*3 or ff=周期*4 or ff=周期*5or ff=周期*6 or ff=周期*7 or ff=周期*8 or ff=周期*9 or ff=周期*10or ff=周期*11 or ff=周期*12 or ff=周期*13 or ff=周期*14 or ff=周期*15or ff=周期*16 or ff=周期*17 or ff=周期*18 or ff=周期*19 or ff=周期*20or ff=周期*21 or ff=周期*22 or ff=周期*23 or ff=周期*24 or ff=周期*25or ff=周期*26 or ff=周期*27 or ff=周期*28 or ff=周期*29 or ff=周期*30or ff=周期*31 or ff=周期*32 or ff=周期*33 or ff=周期*34 or ff=周期*35or ff=周期*36 or ff=周期*37 or ff=周期*38 or ff=周期*39 or ff=周期*40),POInTDOT;  把以上代码,改成用循环表示。  5、一个数列定义如下:f[1]=1,f[2]=1,f[n]=f[n-1]+f[n-2],你能用循环计算出f[10]等于多少吗?这个数列是很有名的,许多股票预测都会用到它。  呵呵,具体我也记不住了,谁能告诉我它叫什么?

VBS入门续:条件语句

VBS入门续:条件语句

条件语句是程序中的最基本、最重要的语句之一,今天通过一个简单实例学习条件语句。

问题:设计一个指标,除首日外,如果当日涨停(设10%为涨停),则公式输出1,否则输出0。

公式代码:
fc:=c;
n=1.099;
<%
vc=ffl.vardata("fc")
vn=ffl.vardata("n")
vs=ffl.vardata("js")

last=ubound(vc)

vc(0)=0
for i=last to 1 step -1
if vc(i)>=vn*vc(i-1) then
  vc(i)=1
else
  vc(i)=0
end if
next
ffl.vardata("fc")=vc
%>
fc




VBS程序条件语句部分解释,参阅VBS帮助文件,如下代码为条件语句:

if vc(i)>=vn*vc(i-1) then  ----如果...则,这里的条件是判断当日涨停否
    vc(i)=1                             ----vc(i)赋值1
else                                      ----否则
    vc(i)=0                             ----vc(i)赋值0
end if                                   ----条件语句结束 

飞狐基本函数简介之指标线形描述函数

这一组中的函数,全部不能单独使用,一定要和其它指标一起用才能发挥效力,因为它们都是描述其它指标的。

指标在主图或副图中的显示,主要分为棒状(柱状)和线状两种。这一组中的函数,全部是为了指挥指标的显示而设计的。

掌握好这组函数,可以使指标输出显示丰富多彩,色彩缤纷。

使用的一般形式:

指标,描述函数1,描述函数2,...;

一、

函数: STICK

参数: 无

返回: 无

说明: 画棒状线

示例:   

STICK的英文是棍、棒的意思。

一般指标的显示,在软件中默认是线状的。即如果不加指标线形描述函数,则指标以线状的形式输出显示。

如公式:

0.98*L;{主图叠加}

如加上棒状线的描述,则变成这样了:

0.98*L,STICK;{主图叠加}

一般的信号,不加描述函数,会成箭头状。加了STICK之后,就成棒状了。

副图1公式:  C>REF(C,1) AND C>REF(C,2);

副图2公式:  C>REF(C,1) AND C>REF(C,2),STICK;

我个人调试公式的体会,还是副图1的显示清楚,因为可以看到连续信号的出现。

二、

函数: COLORSTICK

参数: 无

返回: 无

说明: 以零轴为中心画彩色棒状线,零轴下为阴线颜色,零轴上为阳线颜色

示例:

这样零轴就如楚汉交界,泾渭分明了。

C-REF(C,1),COLORSTICK;{副图指标}

三、

函数: LINESTICK

参数: 无

返回: 无

说明: 同时画棒状线与指标线。

示例:   

LINE是线,STICK是棒,LINESTICK自然是线棒一起显示了。

A:=C-REF(C,1);

A,LINESTICK;{不作说明,都认为是副图指标}

那么,即想显示指标线和棒状线,又想以零轴为中心显示彩色棒状线,怎么写公式呢?这样行吗?

A:=C-REF(C,1);

A,LINESTICK,COLORSTICK;

各位可以自己试一下,结论是否定的。结果是只有彩色柱,没有指标线了。

这样我们初步可以得出一个结论:在同一个指标中,有多个相同性质的描述函数时,软件只认最后一个描述函数。

即想显示指标线和棒状线,又想以零轴为中心显示彩色棒状线,可以用分开的两句语句来达成目标:

A:=C-REF(C,1);

A,LINESTICK;

A,COLORSTICK;

四、

函数: VOLSTICK

参数: 无

返回: 无

说明: 画成交量柱状线。

示例:   

这是专门为显示成交量设计的。

股票软件不同,显示成交量的阴阳线是很不同的。总的来说,是根据价来定的,具体方法各有不同,很难说哪种方法就好了,哪种方法就不好了。

飞狐中的方法是这样的:今天的收盘价大于昨天的收盘价,显示阳柱;小于等于则显示阴柱。

五、

函数: CROSSDOT

参数: 无

返回: 无

说明: 画叉状线或x状线。

示例:   

呵呵,叉状线和X状线有什么区别?应该是一样的吧。

CROSS是交叉,DOT是点。

当指标线连续性较好时,显示交叉点比较顺眼。连续性不好时,看起来比较凌乱。

0.98*L,CROSSDOT;

MA(C,30),CROSSDOT;{主图叠加}

六、

函数: CIRCLEDOT

参数: 无

返回: 无

说明: 画小圆圈线

示例:   

CIRCLE,圆圈。把CROSSDOT的X显示换成圆圈的样子。如果结合后面的COLOR函数一起用,可以画出不同颜色的圈圈,有时也比较实用。

七、

函数: POINTDOT

参数: 无

返回: 无

说明: 画点状线

示例:   

POINT是点、加点的意思。这个点状线,在K线显示数不多的情况下,看起来太小了。正因如此,在K线显示数较多的情况下,就可以弥补CIRCLEDOT显示太大的缺陷。

0.98*L,CIRCLEDOT;

MA(C,30),POINTDOT;{主图叠加}

八、

函数: SHIFT

参数: 1--127

返回: 无

说明: 指标线向后(向右)偏移x个周期

示例: ma1:ma(close,5),shift3;将MA1指标线向后偏移3个周期

SHIFT,移位。这是个飞狐比较有特色的的特色函数。

以以下公式为例子:

MA(C,30);

MA(C,30),POINTDOT,SHIFT5;{主图叠加}

要注意两个问题:

1、移位后的指标显示数值和不移位时的数值是不一样了。移位了五个时间单位,就显示五个时间单位之前的原数值。

2、所移位的周期数,不能设为参数来调整。移位的最大周期数是127。如果写成SHIFT666,调试公式也能通过,不过软件自动取了127来移位。

另外说点题外话。

用SHIFT10之后,当前日的指标显示的就是原10天前的指标数值。也就是说,把最近十天的K线数据,置之不理了。

从人的记忆的特征来看,越近发生的事,对目前的影响力就越大。这样看,用SHIFT就一无是处了,因为它抛弃了最近的数据,而去找较早的数据。

从混沌学牵一发就能动全身的观点看,SHIFT就大有道理了。佛教中说前世的因,后世的果,相差时间就长得不好说了。

这些讨论一般难得见到。易股论坛中有位台--湾的老兄,发了两帖,来讨论K线左移(或者说是指标线右移),我才留心了一下。巫山的朋友有体会的,不妨说说。

九、

函数: LINETHICK

参数: 0--7

返回: 无

说明: 改变指标线粗细,LINETHICK0 表示不画出指标线,不影响坐标,但可在顶部显示数值。  

示例: ma1:ma(close,5),linethick3;

ma1:ma(close,5),linethick0;表示不画出ma1指标线,不影响坐标,但可在顶部显示ma1数值

THICK,厚的。LINETHICK就可以理解为线(棒)的粗细了。

V,STICK,LINETHICKN;

N分别取1、2、3、4、5、6、7,做七个副图公式。

这个N也不能做成参数调整的。

LINETHICK0是非常常用的,因为一个公式中指标一多,显示会很乱,把有些显示去掉,就用这一招。

有时会碰到相反的情况,指标线(柱)显示不多,而顶部数值的显示太多了,那么怎么画出指标线,而又在顶部不显示数值呢?

一般用STICKLINE(画柱),PARTLINE(画线)等绘图函数来解决。

PARTLINE(1,MA(C,30));{主图叠加}

十、

函数: COLOR

参数: 000000--FFFFFF

返回: 无

说明: 改变指标线颜色。

常用: 黑色:colorblack 红色:colorred  绿色:colorgreen 蓝色:colorblue

    白色:colorwhite 灰色:colorgray 黄色:coloryellow 青色:colorcyan

    晶红色:colormagenta 棕色:colorbrown

示例: ma1:ma(close,5),coloryellow; 或 ma1:ma(close,5),colorff0000;

附录: 238种常用颜色代码速查表

COLOR,颜色,色彩。是这组函数中最常用的一个。不但能定义指标线(柱)的颜色,而且能定义顶部指标文字的颜色--用LINETHICK0时也一样。

颜色的种类应该够用了。至于各指标线(柱)之间的颜色搭配,实在是一种很艺术性的事。既要有美感,又要不触目惊心,我只能凭感觉挑选,其它也没有什么招数了。要是有学过美术的人来指点几招就好了。

枫叶秋雨兄提供的“飞狐色彩值吸取器”,实在是好东西,给我们挑选颜色提供了很大的方便。  

飞狐基本函数简介之行情函数

这些行情函数所取得的数据,是我们所编写的公式的原材料。

如果说公式是衣服,这些行情函数就是布。

有人会说做衣服不一定要布,野草树皮也可以做。对,一个公式中不一定非有行情函数不可,但总感觉透风,缺点什么。

一、

函数: OPEN

说明: 取得该周期开盘价,也可简写为 O.

函数: HIGH

说明: 取得该周期最高价,也可简写为 H.

函数: LOW

说明: 取得该周期最低价,也可简写为 L.

函数: CLOSE

说明: 取得该周期收盘价,也可简写为 C.

OPEN,打开。HIGH,高度。LOW,低的。CLOSE,关闭、结束。

常言道,巧妇难为无米之炊。此四者,就是我们做价格指标的“米”了。不同周期的K线,均由此四者为原材料画出。

(有人说,家里的米没有味道,于是去割野菜,采野花,日子一长,又说还是家里的米能填饱肚子。)

有人说,价、量、时、人是技术分析的四大要素,那么O、H、L、C便构成了“价”的四大要素。

道氏理论,主要关注的是长期趋势,所以,一般以CLOSE线为主要参考指标。所取前期高、低点,也是CLOSE线的高、低点。

人的心理,常以成败论英雄。所以CLOSE作为一根K线中的“结局”,被视为价格四大要素中的最关键因素。此论似成通论,但有些短线炒手认为,OPEN要比CLOSE更重要。股市本是无定论的地方,仁者见仁,智者见智,故不敢多作妄论。

这里随便谈些本人对未来函数和未来数据的看法。关于未来也者,在较为经典的书上很少直接见到这种说法,只是在网上见得多了,便有了些想法,说出与大家共同探讨。

如图,一般带公式平台的股票软件,有“公式检测”这一项,用来判断公式中是否含有未来函数。

目前的信号的产生和保持,如果全依赖于之前的数据,则可认为产生信号的公式中,不含有未来函数和未来数据。

目前的信号的产生和保持,如果部分依赖于之后的数据,则可认为产生信号的公式中,含有未来函数和未来数据。

换句话说,如果公式中产生的信号,随着行情的发展,信号永远不变,则此公式就绝无“未来”之嫌疑;信号可能要逃、要变,则此公式中就有“未来”。

如果此定义成立,则可将“未来”分为两种情况:

1、在一根K线(即时行情)中;

2、在多根K线(盘后)中。

在第一种情况中,以即时行情中的当前日K线为例,除了O之外,其它H、L、C全有未来之嫌。因为在收盘之前,拉高、打压是司空见惯的事,谁也不能保证H、L不会创出当天的新高和新低,更不用说C了。比如日线周期公式“C>REF(C,1);”,前一分钟信号成立,后一分钟可能信号就不成立了。这样说的话,在日K中包括H、L、C的指标,就全有“未来”之嫌疑了。

还有就是引用进来的信号,比如引用了周K和月K指标,因为当前周K和月K还在变动之中,所以也是未来数据。

在第二种情况中,因为在盘后,日K中的四大要素就没有未来之可能了。在多K线中,典型的未来函数有两个:BACKSET、ZIG。这两个未来函数到底未来到什么程度,到以后介绍时再说。就算在盘后,除了周五之外,引用的周K指标也是未来数据;除了在月末,引用的月K指标也是未来数据。



这样说的话,到处是“未来”,我们何处适从?

实际上未来也者,并不是新问题,而是老问题,从有技术分析之日起,这个问题就存在了,只是在经典著作中,并不是以“未来”的字眼出现。

“我们所采取的交易风格越保守,那么,耐心地等待趋势反转的验证信号就越为重要。到底需要等待多久呢?这就得从风险与报偿两个方面来权衡。如果我们选择较为保守的交易风格,宁愿等待趋势反转的验证信号,那么,确实可能承担较少的风险;但是另一方面,我们从交易中取得的报偿也可能减少了。等到趋势反转信号得到确认的时候,获利的空间也许已经缩小了。”

(<日本蜡烛图技术>P.159)

所以说即时行情中的“未来”也一样,体现的是技术分析中最古老的一个问题。

而多K线中的未来数据,是要好好注意的。如果在ZIG的低点买进,在ZIG的高点卖出,则是全世界最好的交易系统了--可惜是马后炮,因为当时谁也做不到这一点。但也不能说BACKSET、ZIG就一无是处了,有时甚至是不可或缺的。刀剑可能自伤,也可用于杀敌。只要我们熟悉了BACKSET和ZIG的本质,就可以了解它们“未来”到什么程度,拿来用也是不妨的。至于不熟悉的,还是少用为妙。

二、

函数: VOL

参数: 无

说明: 取得该周期成交量,也可简写为 V.

函数: AMOUNT

参数: 无

说明: 取得该周期成交额

VOLUME,量。AMOUNT,数量、总计。

成交量系统默认单位是手(一百股)。成交额系统默认单位是元(A股和基金是人民币、沪B股是美元、深B股是港元)。

成交量是仅次于价格的技术分析要素。成交额因为里面有价量因素,有些高手应用时喜欢用之代替成交量。

成交金额万元:AMOUNT/10000,LINETHICK0;

成交量手:VOL,VOLSTICK;

流通盘万股:CAPITAL/100,LINETHICK0;

换手率:100*V/CAPITAL,LINETHICK0;



三、

函数: ADVANCE

参数: 无

说明: 取得该周期上涨家数。(本函数仅对大盘有效)。

参数: DECLINE

参数: 无

说明: 取得该周期下跌家数。(本函数仅对大盘有效)。

ADVANCE,前进。DECLINE,下降。

用于上证指数和深圳成指。

A:=ADVANCE-DECLINE;

SUM(A,50);

这个线形状与指数C线有些不同,反映的是不加权的情况。



四、

函数: BUYVOL

参数: 无

说明: 取得主动性买单量。 当本笔成交为主动性买盘时,其数值等于成交量,否则为0. (本函数仅个股在分笔成交分析周期有效)  

函数: SELLVOL

参数: 无

说明: 取得主动性卖单量。当本笔成交为主动性卖盘时,其数值等于成交量,否则为0. (本函数仅个股在分笔成交分析周期有效)  

BUY,买。SELL,卖。VOL,VOLUME,量。

在分笔成交分析周期中看:

主动性买单量:BUYVOL;

主动性卖单量:SELLVOL;

之和:BUYVOL+SELLVOL;

总成交量:V;

两者之和必然为总成交量。所以说每笔之成交量,不是主动性买单量,就是主动性之卖单量。

主动性买单量代表多方的力量,主动将挂在卖盘档位的单子吃进,主动性卖单量则反之,代表的是空方的力量。

至于庄家对倒诱空诱多之动作,长期看另当别论,但在当时,确实也代表了多空之一方。

每日之SUM(BUYVOL,0)之类的数据,不能在其它周期中引用,要做成扩展数据才可。



五、

函数: ISBUYORDER

参数: 无

说明: 取得该成交是否为主动性买单。当本笔成交为主动性买盘时,返回1,否则为0. (本函数仅个股在分笔成交分析周期有效)  

ORDER,定单。BUYORDER,买单(不是请客吃饭后的买单!)。

在分笔成交分析周期中可以看到,任一笔成交的单子,不是主动买单,就是主动卖单。

主动买单:ISBUYORDER;

主动卖单:NOT(ISBUYORDER)*0.5;

这也就是没有ISSELLORDER函数的原因,因为用NOT(ISBUYORDER)就可以取得相同功能。



六、

函数: BIDPRICE(N)

参数: N取1--3,表示买盘档位。

说明: 取得委买1--委买3价格。(本函数仅个股在分笔成交分析周期有效)

示例: BIDPRICE(1)

    表示最高叫买价。

函数: BIDVOL(N)

参数: N取1--3,表示买盘档位。

说明: 取得委买1--委买3量。(本函数仅个股在分笔成交分析周期有效)

示例: BIDVOL(1)

    表示最高叫买量。

BID,出价、投标,这里是买进报价的意思。PRICE,价格。

有人可能会说:图中不是有委买8的单子么?呵呵,那是推算出来的,撤单了亦未可知。



七、

函数: ASKPRICE(N)

参数: N取1--3,表示卖盘档位。

说明: 取得委卖1--委卖3价格。(本函数仅个股在分笔成交分析周期有效)

示例: ASKPRICE(1)

      表示最低叫卖价。

函数: ASKVOL(N)

参数: N取1--3,表示卖盘档位。

说明: 取得委买1--委买3量。(本函数仅个股在分笔成交分析周期有效)

示例: ASKVOL(1)+ASKVOL(2)+ASKVOL(3)

      表示三档卖盘量总和。  

ASK,询问、要求,这里是卖出报价的意思。

副图公式一:

委买总量:BIDVOL(1)+BIDVOL(2)+BIDVOL(3);

委卖总量:ASKVOL(1)+ASKVOL(2)+ASKVOL(3);

副图公式二:

卖一买一空档:ASKPRICE(1)-BIDPRICE(1);



编仅个股在分笔成交分析周期有效的公式时要注意,编好了之后,公式的“禁用周期”就自动设置为如图的样子。

如果以后要把这个公式修改为其它周期的公式时,不可忘记把“禁用周期”中的设置改过来,否则公式指标输出会没有显示