南客 2004-8-4 21:11
给大家出一道题
1、设计一个指标,计算当日成交量即vol,是几天内的最高大成交量?
2、设计一个指标,计算当日最高价即high是几天内的最高价?
提示:直接用hhv()函数无法得到正确结果。
如下图所示,天科股份,2004/05/27,该日成交量是3日内的最大成交量,要求指标计算结果为3。该日的最高价high刚好也是3日内的最高价,要求第2个指标计算结果为3(2个指标计算结果一般来说是不一样的)。
南客 2004-8-4 21:11
大家可以试着用飞狐的循环来写。
也可以想想办法,用飞狐的基本函数来写。
bajatje 2004-8-4 22:54
应考
用循环函数能实现任意位置但我不会用;做一个只能用于最后周期的 滥竽充数
vv:=v;
wv:=barslast(cross(v,vv[datacount]));
wv*ISLASTBAR;
hh:=h;
wh:=barslast(cross(h,hh[datacount]));
wh*ISLASTBAR;
错了 改一下
vv:=v;
wv:=barslast(v>vv[datacount]);
wv*ISLASTBAR;
hh:=h;
wh:=barslast(h>hh[datacount]);
wh*ISLASTBAR;
[color=Teal][align=right] 本贴由 bajatje 于 2004-8-4 23:19 最后编辑 [/align][/color]
chenlinm 2004-8-4 23:11
我要花大力气想一下!等一等我哟!
bajatje 2004-8-4 23:16
如果用光标应该可以实现任意位置
vv:=hhv((BARPOS=SYSPARAM(1))*v,0);
wv:barslast(v>vv[datacount]);
hh:=hhv((BARPOS=SYSPARAM(1))*h,0);
wh:barslast(h>hh[datacount]);
也改一下
vv:=hhv((BARPOS=SYSPARAM(1))*v,0);
wv:barslast(v>vv[datacount])*(BARPOS=SYSPARAM(1));
hh:=hhv((BARPOS=SYSPARAM(1))*h,0);
wh:barslast(h>hh[datacount])*(BARPOS=SYSPARAM(1));
[color=Teal][align=right] 本贴由 bajatje 于 2004-8-4 23:29 最后编辑 [/align][/color]
南客 2004-8-4 23:30
[quote][i]bajatje[/i] 于 2004-8-4 11:16 PM 写道:
如果用光标应该可以实现任意位置
vv:=hhv((BARPOS=SYSPARAM(1))*v,0);
wv:barslast(v>vv[datacount]);
hh:=hhv((BARPOS=SYSPARAM(1))*h,0);
wh:barslast(h>hh[datacount]);
也改一下
vv:=hhv ... [/quote]
不错
:cool:
chenlinm 2004-8-4 23:34
var1=vol;
VAR2:=ref(vol,1);
VAR3:=ref(vol,2);
三日最大成交量:(VAR3<VAR2 and VAR2<var1) or (VAR3>VAR2 and VAR2<var1 and VAR3<VAR1) ;
其他几种写法不知道!
求最高价是一样的!
chenlinm 2004-8-4 23:41
我来看看我不明白的函数是什么意思!
chenlinm 2004-8-5 00:14
BARPOS----函数返回当前是第几根K线。
这里没有用过!!!
SYSPARAM(1)------系统参数:画面上光标位置(K线序号)
注意:该函数仅K线图形分析且打开十字光标时有效,否则返回值不确定
没用过!!!
barslast------BARSLAST(X):上一次X不为0到现在的天数
先取得光标处K线序号内最高成交量,当前成交量大于到光标处内最大成交量!
[color=Teal][align=right] 本贴由 chenlinm 于 2004-8-5 00:15 最后编辑 [/align][/color]
chenlinm 2004-8-5 00:20
[datacount]------?
南客 2004-8-5 00:31
[quote][i]chenlinm[/i] 于 2004-8-5 12:20 AM 写道:
[datacount]------? [/quote]
返回K线的数量,即总共有多少根K线
chenlinm 2004-8-5 00:51
谢谢!明天再来看看,再见!!!
王庆 2004-8-5 08:22
我非常想知道用飞狐的基本函数来实现。
我一直再想,头都大了。看到此帖我非常高兴。
严重关注!!!
王庆 2004-8-5 08:24
望版主将此帖顶置
索龙居士趋势猫 2004-8-5 09:27
有那末复杂吗?
只一句就可以了!
HHV(v,3)=v and HHV(h,3)=h;
lwh315 2004-8-5 09:57
[quote][i]索龙居士趋势猫[/i] 于 2004-8-5 01:27 写道:
有那末复杂吗?
只一句就可以了!
HHV(v,3)=v and HHV(h,3)=h; [/quote]
您未切题。
“HHV(v,N)”是固定时段的,而题意是动态的,或者称“智能”的。
我一直想学而不得,今天能学到了,如能将循环函数也学会那更好了。
在此谢谢南客老师出的题目。
老实和尚 2004-8-5 10:39
呵呵,参考chenlinm的写了一个,算不算数?
[code]
V1:=v;
V2:=ref(v,1);
V3:=ref(v,2);
V4:=V3<V2 and V2<v1{v1最大}
or V3>V2 and V2>v1{v3最大}
or v2>v3 and V3<V1;{v2最大}
信号:if(v4=1,3,0);
[/code]
南客 2004-8-5 10:47
[quote][i]老实和尚[/i] 于 2004-8-5 10:39 AM 写道:
呵呵,参考chenlinm的写了一个,算不算数?
[code]
V1:=v;
V2:=ref(v,1);
V3:=ref(v,2);
V4:=V3<V2 and V2<v1{v1最大}
or V3>V2 and V2>v1{v3最大}
or v2>v3 and V3<V1;{v2最大}
信号:i ... [/quote]
3日内?看来题意还没理解:po:
老实和尚 2004-8-5 10:58
看来后面的IF那里还要改一下才行,不过不如何如何改,教材我才看到入门五
在那边高级会员区已经提问了
索龙居士趋势猫 2004-8-5 11:53
[quote][i]lwh315[/i] 于 2004-8-5 09:57 AM 写道:
您未切题。
“HHV(v,N)”是固定时段的,而题意是动态的,或者称“智能”的。
我一直想学而不得,今天能学到了,如能将循环函数也学会那更好了。
在此谢谢南客老师出的题目。 [/quote]
您好!请问这个周期动态的,或者称“智能”的周期有何意义?
yngs 2004-8-5 14:54
[quote][i]索龙居士趋势猫[/i] 于 2004-8-5 11:53 写道:
您好!请问这个周期动态的,或者称“智能”的周期有何意义? [/quote]
“智能”的周期意义可大了,它能有效的消除指标周期与个股实际周期不同步的误判。比如kd指标的默认周期是9,而我们要看的股票的最近最高-最低周期是20,就会造成指标表明是底部了股价还在继续下跌。
索龙居士趋势猫 2004-8-5 16:47
[quote][i]yngs[/i] 于 2004-8-5 02:54 PM 写道:
“智能”的周期意义可大了,它能有效的消除指标周期与个股实际周期不同步的误判。比如kd指标的默认周期是9,而我们要看的股票的最近最高-最低周期是20,就会造成指标表明是底部了股价还在继续下跌。 [/quote]
谢谢您的解答!
(h)
不知道我这样理解是否正确,“智能”的周期就是让指标自己判断用一个多长的周期作为变量,以适应当前市场的波段频率,达到最优化!
chenlinm 2004-8-5 20:47
[quote][i]南客[/i] 于 2004-8-5 10:47 写道:
3日内?看来题意还没理解:po: [/quote]
不是没理解题意,是根本不知道N天如何表达,但我写的全部人看得懂哟!
老师写的----用循环再写给我们看看,谢谢!!!:clap:
南客 2004-8-5 21:09
循环肯定没问题,VBS当然也可以。
用基本函数,就多给点提示:巧妙使用sumbars()函数。
lwh315 2004-8-6 12:59
[quote][i]索龙居士趋势猫[/i] 于 2004-8-5 03:53 写道:
您好!请问这个周期动态的,或者称“智能”的周期有何意义? [/quote]
它本身并无实质意义,是一个帮助你达到另一个目的的工具。说白了它就是一个“自动的测量”工具。举个例:今成交量创近期新高,“近期”是一个模糊的概念,究竟“近期”是多少,用它就能精确的实现。
lwh315 2004-8-6 13:35
再举一个例,一般选大黑马的一个基本要素是:在一定的Y幅度内横盘X周期,这里的YX都是固定的。这个要素简单实用,但不能排序,如用南客老师的题意改编YX中的一个为动态数,那就可排序了。个人管见,望大家指正。
joneslee 2004-8-6 18:20
难度大。。。。。。。。
bajatje 2004-8-6 19:26
转帖一个
b:=hhv(h,0);
a:=if(BARPOS=1,9999,h);
z:SUMBARS(REF(a,1)-a,0);
DRAWNUMBER(BARPOS=SYSPARAM(1),1,z,0)ALIGN4,colorwhite;
u:=hhv(v,0);
s:=if(BARPOS=1,999999999999,v)
y:SUMBARS(REF(s,1)-s,0);
DRAWNUMBER(BARPOS=SYSPARAM(1),1,y,0)ALIGN3,coloryellow;
王庆 2004-8-6 20:28
[quote][i]bajatje[/i] 于 2004-8-6 19:26 写道:
转帖一个
b:=hhv(h,0);
a:=if(BARPOS=1,9999,h);
z:SUMBARS(REF(a,1)-a,0);
DRAWNUMBER(BARPOS=SYSPARAM(1),1,z,0)ALIGN4,colorwhite;
u:=hhv(v,0);
s:=if(BARPOS=1,999999999999,v)
y:SUMBARS(REF(s, ... [/quote]
好像还是不太对题
:thinking:
白郎 2004-8-6 21:39
试了试用循环函数写:
VARIABLE:A=2,B=2,AA=VOL,BB=H;
WHILE AA[1]>AA[A] DO A=A+1;
WHILE BB[1]>BB[B] DO B=B+1;
南客 2004-8-6 21:49
呵呵,终于用基本函数有了符合要求的代码,最后的参考结果如下:
[code]
b:=hhv(h,0);
a:=if(BARPOS=1,b[datacount],h);
价:SUMBARS(REF(a,1)-a,0);
u:=hhv(v,0);
s:=if(BARPOS=1,u[datacount],v);
量:SUMBARS(REF(s,1)-s,0);
[/code]
南客 2004-8-6 21:52
[quote][i]白郎[/i] 于 2004-8-6 09:39 PM 写道:
试了试用循环函数写:
VARIABLE:A=2,B=2,AA=VOL,BB=H;
WHILE AA[1]>AA[A] DO A=A+1;
WHILE BB[1]>BB[B] DO B=B+1; [/quote]
要用二重循环才有办法实现:)
南客 2004-8-6 22:06
使用飞狐循环的公式代码,参考如下:
[code]
fv:=vol;
p:0*vol;
if datacount>1 then
for i=2 to datacount do begin
for j=i downto 1 do begin
if fv[j]>fv[i] then begin
p[i]:=i-j; break;
end;
end;
if p[i]=0 then p[i]:=i;
end;
p[1]:=1;
[/code]
南客 2004-8-6 22:14
附加说明,飞狐中,sumbars()函数起始有效周期有点小问题,新的测试版已经修正。
jshmhys 2004-8-6 22:21
3q
joneslee 2004-8-6 22:38
第一天显示还有点问题,
是飞狐的BUG引起的。谢谢老师!
[color=Teal][align=right] 本贴由 joneslee 于 2004-8-6 22:58 最后编辑 [/align][/color]
joneslee 2004-8-6 22:38
谢谢南客老师!
南客 2004-8-6 22:51
第1个周期,正常情况下,是不会显示数值的,飞狐的sumbars()函数有BUG,在新版中已经修正了。
cwy 2004-8-6 23:35
请教南客朋友:
b:=hhv(h,0);
a:=if(BARPOS=1,b[datacount],h);
价:SUMBARS(REF(a,1)-a,0);
u:=hhv(v,0);
s:=if(BARPOS=1,u[datacount],v);
量:SUMBARS(REF(s,1)-s,0);
同样的公式,为什么价能显示,量不能显示?
把“量:SUMBARS(REF(s,1)-s+1,0)”中的“S”加1
或把“s:=if(BARPOS=1,u[datacount]+1,v)”中的“u[datacount]”加1才能显示,是何原因?
南客 2004-8-7 01:10
u[datacount],实际上就是历史最大成交量,有可能由于成交量太大,导致的浮点数转换误差,造成u[datacount]并没有最大。
此时,可把u[datacount]换成u[datacount]+10000,单是加1是不够的。数值太大时,转换误差也越大。
比如,观察上证指数的年线。
至于价格,一般数值都不会太大,出现误差的可能性小。
王庆 2004-8-7 03:23
请问南客公式粘贴后出现一下现象,为何?:thinking:
王庆 2004-8-7 03:24
?:thinking:
南客 2004-8-7 08:15
哦,原来是遇到最大值时,会有这个现象,看来最大值还不行,要比最大值稍大一点。有时遇到最大值时,又不会有这个现象,是因为累加误差的缘故。
代码修正如下:
[code]
b:=hhv(h,0);
a:=if(BARPOS=1,b[datacount]*1.2,h);
价:SUMBARS(REF(a,1)-a,0);
u:=hhv(v,0);
s:=if(BARPOS=1,u[datacount]*1.2,v);
量:SUMBARS(REF(s,1)-s,0);
[/code]
南客 2004-8-7 08:22
代码的另一种写法,参考如下:
[code]
VH:=HHV(VOL,0);
FV:=VOL;
FV[1]:=VH[DATACOUNT]*1.2; //VH[DATACOUNT]是历史最高成交量
量创新高周期数:SUMBARS(REF(FV,1)-FV,0);
[/code]
王庆 2004-8-7 08:30
问题已解决
:D好东西:cool:
非常感谢南客!!!
南客 2004-8-7 12:58
代码已经成功了,原理是什么呢?
假设某是成交量是vol,是3日内的最大成交量,则必有:
ref(vol,3)-vol>=0
等价于
(ref(vol,3)-ref(vol,2)) + (ref(vol,2)-ref(vol,1)) + (ref(vol,1)-vol) >=0
意思就是说,“昨成交量与今成交量之差”逐日累加,直到某日累加和大于等于0,则这之间的天数,就是所要求的日数。
我们再来看看sumbars()函数的含义
SUMBARS(X,A):将X向前累加直到大于等于A,返回这个区间的周期数
显然上面的式子
(ref(vol,3)-ref(vol,2)) + (ref(vol,2)-ref(vol,1)) + (ref(vol,1)-vol) >=0
可以写成
sumbars(ref(vol,1)-vol, 0);
为何第1周期的成交量要替换成比所有成交量都大的数值?请大家自己思考。