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); //当处在{zh1}一根K线位置时,输出字符串dm1的内容-------------------------------------------------------------------------------- 公式代码设计到这里似乎可以结束了,因为我们要的结果都可以生成了。其实还有改进的余地: ①dm1只是个单值的字符串变量,它只能保存{zh1}的结果,而不能保存所有的结果。这里考虑使用数组,数组可以自行定义很多个元素,让每个元素保存一个结果。 ②循环首的j<1896总觉得不对劲,不够智能化,比如将来“深圳A股”板块{zh1}的代码不是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]); //当处在{zh1}一根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]); //当处在{zh1}一根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]+'{zh1}收盘价:'+numtostr(close,2)); EXPLAIN(1,'深圳A股共有股票:'+numtostr(blksum,0)+'只');-------------------------------------------------------------------------------- 这行代码 if j=600999 then break 有什么用?以防万一,如果有人改了市场规则,把500001之类的股票计入上海A股的话,这里的循环会出不来的,会造成电脑死循环,飞狐长时间没有响应。 以上公式代码,只是个示例,效率不太高,如果能有个方法,直接给出板块中所有的股票代码,那就不需要这段公式代码。 给出这个示例,是想通过大致解剖整个公式代码的设计过程,让大家对循环、条件语句有个初步的认识。 {zh1},给大家个练习的机会: 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入门续:条件语句 条件语句是程序中的最基本、最重要的语句之一,今天通过一个简单实例学习条件语句。 问题:设计一个指标,除首日外,如果当日涨停(设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; 各位可以自己试一下,结论是否定的。结果是只有彩色柱,没有指标线了。 这样我们初步可以得出一个结论:在同一个指标中,有多个相同性质的描述函数时,软件只认{zh1}一个描述函数。 即想显示指标线和棒状线,又想以零轴为中心显示彩色棒状线,可以用分开的两句语句来达成目标: 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、所移位的周期数,不能设为参数来调整。移位的{zd0}周期数是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 说明: 取得该周期{zg}价,也可简写为 H. 函数: LOW 说明: 取得该周期{zd1}价,也可简写为 L. 函数: CLOSE 说明: 取得该周期收盘价,也可简写为 C. OPEN,打开。HIGH,高度。LOW,低的。CLOSE,关闭、结束。 常言道,巧妇难为无米之炊。此四者,就是我们做价格指标的“米”了。不同周期的K线,均由此四者为原材料画出。 (有人说,家里的米没有味道,于是去割野菜,采野花,日子一长,又说还是家里的米能填饱肚子。) 有人说,价、量、时、人是技术分析的四大要素,那么O、H、L、C便构成了“价”的四大要素。 道氏理论,主要关注的是长期趋势,所以,一般以CLOSE线为主要参考指标。所取前期高、低点,也是CLOSE线的高、低点。 人的心理,常以成败论英雄。所以CLOSE作为一根K线中的“结局”,被视为价格四大要素中的最关键因素。此论似成通论,但有些短线炒手认为,OPEN要比CLOSE更重要。股市本是无定论的地方,仁者见仁,智者见智,故不敢多作妄论。 这里随便谈些本人对未来函数和未来数据的看法。关于未来也者,在较为经典的书上很少直接见到这种说法,只是在网上见得多了,便有了些想法,说出与大家共同探讨。 如图,一般带公式平台的股票软件,有“公式检测”这一项,用来判断公式中是否含有未来函数。 目前的信号的产生和保持,如果全依赖于之前的数据,则可认为产生信号的公式中,不含有未来函数和未来数据。 目前的信号的产生和保持,如果部分依赖于之后的数据,则可认为产生信号的公式中,含有未来函数和未来数据。 换句话说,如果公式中产生的信号,随着行情的发展,信号永远不变,则此公式就绝无“未来”之嫌疑;信号可能要逃、要变,则此公式中就有“未来”。 如果此定义成立,则可将“未来”分为两种情况: 1、在一根K线(即时行情)中; 2、在多根K线(盘后)中。 在{dy}种情况中,以即时行情中的当前日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的高点卖出,则是全世界{zh0}的交易系统了--可惜是马后炮,因为当时谁也做不到这一点。但也不能说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 |