编写指标公式技巧全集
2008-03-01 22:48:06 / 个人分类:股票知识
公式技巧(0001)
0001--主图显示代码及板块
一、显示板块
例一:
drawtext(barpos=sysparam(2),h,'\n所属板块:' blkname),align4,coloryellow;
例二:
drawtext(sysparam(2)=barpos,c,'所属板块:' blkname),align4,coloryellow;
例三:
drawtext(sysparam(2)=barscount(c),h,'[所属版块]:' blkname),align4,coloryellow;
二、显示代码及板块
s:=stklabel;
drawtext(sysparam(2)=barpos,c,s),align4,coloryellow;
drawtext(barpos=sysparam(2),h,'\n 所属板块:' blkname),align4,coloryellow;{n与所属板块之间空六格,以显示代码}
0031--均线多头排列
a1:=ma(c,n1);
a2:=ma(c,n2);
a3:=ma(c,n3);
a4:=ma(c,n4);
count(a1>a2 and a2>a3 and a3>a4,3);
0032--均线空头排列
a1:=ma(c,n1);
a2:=ma(c,n2);
a3:=ma(c,n3);
a4:=ma(c,n4);
count(a1< a2 and a2< a3 and a3< a4,3);
0033--n日均线向下
aa:=ma(c,n);
bb:=ref(aa,1);
aa< bb
0034--n日均线向上
aa:=ma(c,n);
bb:=ref(aa,1);
aa>bb
0035--n日均线走平
aa:=ma(c,n);
bb:=ref(aa,1);
aa=bb
0036--向前n日至m日出现过均线死叉(p1< p2)
aa:=ma(c,p1);
bb:=ma(c,p2);
cc:=ref(cross(bb,aa),n);
count(cc,m);
0037--今日成交量大于n日以来的均量
vol>ma(vol,n);
0038--低位密集
a1:=cost(85);
a2:=cost(15);
a3:=a1-a2;
a4:=(a1 a2)/2;
a5:=a3/a4*100<10;
b1:=hhv(h,120);
b2:=llv(l,120);
b3:=b1-b2;
b4:=(a4-b2)< b3/2;
a5 and b4;
0039--换手率
vol/capital*100;
0040--n日盈亏
v1:=vol/sum(vol,n);
v2:=dma(close,v1);
v3:(close-v2)/v2*100;
0041--曲线叠加
指标线的叠加,是为了方便观看和比较,没什么其他的意义。
一、对指标曲线的变化幅度放大
此法,一线变形,另一线不变,但变形线的走势与原线完全相似。
举例:c叠加v
bc:=hhv(c,n)-llv(c,n);//n一般取常用主图上的k线数量
bv:=hhv(v,n);
bi:=bc/bv;//叠加比
b:=bi[datacount];//最后一根k线的叠加比,保证叠加比前后统一
成交量:v,volstick;
f:=c/ref(c,1);
jc:=ref(c,1)*(1 a*f)*b/a;//a-放大倍数,将c的涨跌幅度f放大
jl:=llv(jc,n);//平移量。请去掉jc句的=看jl的作用
收盘价:c,linethick0,coloryellow;//只显示数值,不画线
partline(c>0,jc-jl[datacount]),coloryellow;//收盘价趋势线,只画线,不显示数值
通式:
曲线x叠加曲线y
bx:=hhv(x,n)-llv(x,n);
by:=hhv(y,n)-llv(y,n);
bi:=bx/by;
b:=bi[datacount];
fx:=x/ref(x,1);
jx:=ref(x,1)*(1 a*fx)*b/a;
xl:=llv(jx,n);
曲线y:y;
曲线x:x,linethick0;//曲线x的值
partline(c,jx-xl[datacount]);//曲线x的线
二、百分比叠加
把两曲线的波动幅度划成百分比进行叠加
此法,两线都变形,但走势都与原线完全相似。
举例:c叠加v
hv:=hhv(v,n);
dv:=hv[datacount];
bv:=100/dv;
v*bv,volstick;
hc:=hhv(c,n);
lc:=llv(c,n);
bc:=100/(hc[datacount]-lc[datacount]);
(c-lc[datacount])*bc;
通式一:
曲线x,曲线y
xh:=hhv(x,n);
xl:=llv(x,n);
xdh:=xh[datacount];
xdl:=xl[datacount];
bx:=100/(xdh-xdl);
曲线x:(x-xdl)*bx;
yh:=hhv(y,n);
yl:=llv(y,n);
ydh:=yh[datacount];
ydl:=yl[datacount];
by:=100/(ydh-ydl);
曲线y:(y-ydl)*by;
通式二:
x曲线 y曲线
n:=sysparam(3)-sysparam(2);
x:=.........; {.........为x曲线定义}
xh:=hhv(x,n);
xl:=llv(x,n);
xdh:=xh[sysparam(3)];
xdl:=xl[sysparam(3)];
bx:=100/(xdh-xdl);
曲线x:(x-xdl)*bx;
y:=.........;{.........为y曲线定义}
yh:=hhv(y,n);
yl:=llv(y,n);
ydh:=yh[sysparam(3)];
ydl:=yl[sysparam(3)];
by:=100/(ydh-ydl);
曲线y:(y-ydl)*by;
三、固定位置叠加
此法应用不多,仅举例。
例一:
主图成交量(v叠加c)
{m:960,1,2000}
r0:=m/1000;r:=(l-r0*sysparam(5))/v;
r1:=llv(r,sysparam(3)-sysparam(2));r2:=r1[sysparam(3)];
r3:=llv(l-r2*v,sysparam(3)-sysparam(2));
r4:=r3[sysparam(3)];r5:=(r2*v r4)*0.995;
stickline(c>=ref(c,1),r5,r0*sysparam(5),6,1)colorred;
stickline(c< ref(c,1),r5,r0*sysparam(5),6,0)colorcyan;
partline(v>=0,r0*sysparam(5)) colorwhite;
partline(r5>0,ma(r5,5));
partline(r5>0,ma(r5,10));
partline(r5>0,ma(r5,20));
例二:
input:n(10,2,999);
m:=sysparam(3)-sysparam(2);
x:=c;
y:=sum(if(close>ref(close,1),vol/capital,if(close< ref(close,1),-vol/capital,0)),0);
xh:=hhv(x,m); xl:=llv(x,m); xdh:=xh[sysparam(3)]; xdl:=xl[sysparam(3)];
bx:=100/(xdh-xdl);
收盘:c,linethick0,;
收盘↑:partline(x>ref(x,1),(x-xdl)*bx),colorred;
收盘↓:partline(x< ref(x,1),(x-xdl)*bx),colorcyan;
yh:=hhv(y,m); yl:=llv(y,m); ydh:=yh[sysparam(3)]; ydl:=yl[sysparam(3)];
by:=100/(ydh-ydl);
ty:=(y-ydl)*by;
obv值:y*1000,linethick0,color007bff;
obv线↑:partline(y>ref(y,1),(y-ydl)*by),coloryellow;
obv线↓:partline(y< ref(y,1),(y-ydl)*by),color009f00;
a1:=ref(ty,n)=hhv(ty,2*n 1); b1:=filter(a1,n); c1:=backset(b1,n 1); hd:=filter(c1,n);
a2:=ref(ty,n)=llv(ty,2*n 1); b2:=filter(a2,n); c2:=backset(b2,n 1); ld:=filter(c2,n);
aa:=ref(ty,barslast(hd)); bb:=ref(ty,barslast(ld));a1:=ref(y,barslast(hd))*1000; b1:=ref(y,barslast(ld))*1000;
t1:=barslast(hd)< barslast(ld) and not(hd) ;
t2:=barslast(hd)>barslast(ld) and not(ld);
partline(t1,aa),colormagenta,linethick2;
partline(t2,bb),colorgreen,linethick2;
drawnumber(t1=0 and ref(t1,1)>0,ref(aa,1) 0.1,a1,2);
drawnumber(t2=0 and ref(t2,1)>0,ref(bb,1) 0.1,b1,2);
drawnumber(islastbar and t1>0,ref(aa,1) 0.1,a1,2),coloryellow;
drawnumber(islastbar and t2>0,ref(bb,1) 0.1,b1,2),colormagenta;
0042--均线变色
ma05:ma(close,5);
ma30:ma(close,30);
if(ma05< ma30,ma05,ma30),colorgreen;
if(ma05< ma30,ma30,ma05),colorred;
if(ma05>ma30,ma30,ma30),colorblue;
drawicon(cross(ma05,ma30),l*0.98,4);
drawicon(cross(ma30,ma05),h*1.02,5);
0055--底背离
llv(l,60)=l) and not(llv(dea,60)=dea);
0056--顶背离
hhv(h,60)=h) and not(hhv(dea,60)=dea);
0057--n次金叉、死叉
0轴上二次金叉
count(cross(dif,dea) and dea>0,20)=2 and cross(dif,dea) and
dea>0;
0轴上三次金叉
count(cross(dif,dea) and dea>0,20)=3 and cross(dif,dea) and
dea>0;
0轴上四次金叉
count(cross(dif,dea) and dea>0,20)=4 and cross(dif,dea) and dea>0;
二次金叉
explain(count(cross(dif,dea),20)=2 and cross(dif,dea);
二次死叉
count(cross(dea,dif),20)=2 and cross(dea,dif);
0058--5分钟副图显示15分钟k线
建公式:0015
c15:close;
o15:open;
h15:high;
l15:low;
建公式:十五k线
c15:="0015.c15#min15";
o15:="0015.o15#min15";
h15:="0015.h15#min15";
l15:="0015.l15#min15";
ti:=openminutes(time)=10 or openminutes(time)=25 or openminutes(time)=40 or openminutes(time)=55 or openminutes(time)=70 or openminutes(time)=85 or openminutes(time)=100 or openminutes(time)=115 or openminutes(time)=130 or openminutes(time)=145 or openminutes(time)=160 or openminutes(time)=175 or openminutes(time)=190 or openminutes(time)=205 or openminutes(time)=220 or openminutes(time)=235;
hh15:=if(ti,h15,c15);
ll15:=if(ti,l15,c15);
stickline(c15>o15,c15,o15,10,0),colorred;
stickline(c15>o15 and h15>c15,hh15,c15,0.1,0),colorred;
stickline(c15>o15 and o15>l15,o15,ll15,0.1,0),colorred;
stickline(c15<=o15,c15,o15,10,0),colorgreen;
stickline(c15<=o15 and c15>l15,c15,ll15,0.1,0),colorgreen;
stickline(c15<=o15 and h15>o15,hh15,o15,0.1,0),colorgreen;
注:以大陆股市为例,四小时,其他市场如超过四小时,可在中间语句“ti:=”中以15为系数顺序加足,如:or 250 or 265……等等。
0059--移动成本
不知道函数算法,计算误差在所难免。调整参数“%”可看到不同的移动成本。
///筹码%
input:%(90,1,100);
a:=amount/v/100;
成本:floor(cost(50-%/2)*100)/100,coloryellow,linethick0;
~:ceiling(cost(50 %/2)*100)/100,coloryellow,linethick0;
集中度:intpart((~-成本)/(~ 成本)*1000)/10,colorgreen;
平均成本:round(cost(50)*100)/100,linethick0;
穿透力:(winner(c)-ref(winner(c),1))/v*capital,linethick0;//计算误差大
//穿透力2:(winner(c)-winner(o))/v*capital,linethick0;//这一写法还是误差大
获利比例:round(winner(c)*1000)/10,linethick0;
0059--移动成本
不知道函数算法,计算误差在所难免。调整参数“%”可看到不同的移动成本。
///筹码%
input:%(90,1,100);
a:=amount/v/100;
成本:floor(cost(50-%/2)*100)/100,coloryellow,linethick0;
~:ceiling(cost(50 %/2)*100)/100,coloryellow,linethick0;
集中度:intpart((~-成本)/(~ 成本)*1000)/10,colorgreen;
平均成本:round(cost(50)*100)/100,linethick0;
穿透力:(winner(c)-ref(winner(c),1))/v*capital,linethick0;//计算误差大
//穿透力2:(winner(c)-winner(o))/v*capital,linethick0;//这一写法还是误差大
获利比例:round(winner(c)*1000)/10,linethick0;
0060--妙用sumbars()函数
sumbars(x,n)
函数的用法如下:
向前累加到指定值到现在的周期数。
用法:
sumbars(x,a)
将x向前累加直到大于等于a,返回这个区间的周期数
例如:
sumbars(vol,capital)
1、设计一个指标,计算当日成交量是几天内的最高成交量?
2、设计一个指标,计算当日最高价是几天内的最高价?
提示:直接用hhv()函数无法得到正确结果。
例一:
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);
或:
vh:=hhv(vol,0);
fv:=if(barpos=1,vh[datacount]*1.2,vol); //vh[datacount]是历史最高成交量
量创新高周期数:sumbars(ref(fv,1)-fv,0);
{这里的关键是 ref(fv,1)-fv ,想想看写成 fv-ref(fv,1) 行不行?}
另一种写法:
vh:=hhv(vol,0);
fv:=vol;
fv[1]:=vh[datacount]*1.2; //vh[datacount]是历史最高成交量
量创新高周期数:sumbars(ref(fv,1)-fv,0);
{这里的关键是 ref(fv,1)-fv ,想想看写成 fv-ref(fv,1) 行不行?}
代码已经成功了,原理是什么呢?
假设某日成交量是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周期的成交量要替换成比所有成交量都大的数值?最后,再来思考一个问题,把题目中的求“最大”,改成求“最小”,即多少天内是最小的?
例二:
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;
例三:
hh:=if(barscount(c)=1,9999,h);
zh:sumbars(ref(hh,1)-hh,0);//价创了n周期新高
vh:=if(barscount(c)=1,99999999,v);
hv:sumbars(ref(vh,1)-vh,0);//量创了n周期新高
ll:=if(barscount(c)=1,0,l);
zl:sumbars(ll-ref(ll,1),0);//价创了n周期新低
vl:=if(barscount(c)=1,0,v);
lv:sumbars(vl-ref(vl,1),0);//量创了n周期新低
附注:
用99999999等具体数值,最好是尽可能大的数值(比如单精数的上限),否则仍有可能无法全部完成计算,比如上证指数的年线,成交量最大时,仍然超过了99999999。
倒数第6天的最高价格怎么表示?
fh:=high;
fh[datacount-5]; //倒数第6天的最高价格。
[datacount]
返回k线的数量,即总共有多少根k线。
0061--取得k线的序号
取得k线的序号,正序有下面几种方法:(从1数起)
barpos;
sx:barscount(close);
sy:sum(1,0);
datacount;{不随光标变动,只显示最后k线序号}
逆序可用下列方法取得:(从1数起)
(datacount-barpos) 1;
(datacount-barscount(close)) 1;
(datacount-sum(1,0)) 1;
0062--变量宣告
指定叙述:经过指定宣告后,飞狐才认识aa、bb、cc,否则会出现"未定义的标示符号"。所谓"定义",程序语言的用语,就叫做"变量宣告"。
aa:open;{宣告open,指定给aa→输出的表达式}
bb:high,linethick0;{宣告high,指定给bb→输出的表达式→秀数值但不秀线图}
cc:=close;{宣告close,指定给cc→不输出的表达式→不秀数值也不秀线图}
dd:(aa bb cc)/3;{;分号,告诉程序要换行执行了}
ee:=(aa cc)/2;
partline(close>0,ee);{秀线图但不秀数值}
注:{ }大括号内或在//后面,可用来输入公式批注。
0063--跨周期引用数据
(一)指针线公式的运算,大部份都是代入开、高、低、收、量等数据去运算的。
(二)开、高、低、收、量又分成下面四种型式出现:
开、高、低、收、量(基本的日k线数据)
开、高、低、收、量(周k线数据)
开、高、低、收、量(月k线数据)
开、高、低、收、量(年k线数据)
(三)所以当指针线公式运算,要代入下面数据时:
开、高、低、收、量(周k线数据)
开、高、低、收、量(月k线数据)
#week 和 #month 就会派上用场。
(四)举例:
公式a.建立一个专门被用来引用(quote)的公式区。
公式名称:qu
a1:(open high low close)/4;
说明:上面公式的运算,是代入开、高、低、收(当前周期k线数据)运算的。
公式b.
公式名称:aa
aa:"qu.a1#week";
说明:将下面公式的运算,代入开、高、低、收(周k线数据)运算。
(open high low close) / 4
公式c.
公式名称:bb
bb:"qu.a1#month";
说明:将下面公式的运算,代入开、高、低、收(月k线数据)运算。
(open high low close)/4
附注:
可供引用的周期类型有:
min1,min5,min15,min30,min60,day,week,month
分别表示将1,5,15,30,60分钟k线数据,以及日,周,月k线数据,代入被引用的公式,进行运算。
意义:
可将大周期内跑的数据,引用到小周期内来跑。将小周期内跑的数据,引用到大周期内来跑,就会有问题,因为时间横坐标不一样了。
公式(1):先建立即将被引用的表达式
将公式建立在:技术指针 ( ●主图叠加 ○主图 )
公式名称:nh
aa:=high< ref(high,1);{不输出的表达式,如果被引用还是会变成不输出的表达式}
bb:=barslast(aa=1);
cc:ref(high,bb); {输出的表达式,如果被引用还是会变成输出的表达式}
说明:
上面公式的运算,是以当周期时间数列数据运算的。
公式(2):
将公式建立在:技术指针 ( ●主图叠加 ○主图 )
公式名称:nhh
aa:"nh.aa#week";{不输出的表达式}
bb:"nh.bb#week";
cc:"www.eastmoney.com#week";{输出的表达式}
drawnumber(islastbar,cc,cc,2);
说明:上面公式的运算,是以周周期时间数列数据运算的。
0064--未来数据、未知数据
写公式,首先要对已知数据(过去式)、未知数据(未完成式、现在进行式)有通盘的认知。
可将"未来"分为两种情况:
1、实时行情中:在一根k线。
以实时行情中的当前日k线为例。除了o之外,其它h、l、c全有未来之嫌。因为在收盘之前,拉高、打压是司空见惯的事,谁也不能保证h、l不会创出当天的新高和新低,更不用说c了。又如日线周期公式"c>ref(c,1);",前一分钟信号成立,后一分钟可能信号就不成立了。另外,如引用了周k和月k数据,因为当前周k和月k还在变动之中,所以也是未来资料。
2、盘后中:在多根k线。
因为在盘后,日k中的四大要素o、h、l、c就没有未来之可能了。在盘后,除了周五之外,引用的周k指针也是未来数据。除了在月末,引用的月k指针也是未来数据。
总而言之,指针公式就分这两种:
线图信号的确定→全都用已知数据(过去式)来决定。
线图信号的确定→有用到未知数据(未完成式、现在进行式)来决定。
zig函数
zx:zig(close,8);
最近这次峰点、谷点的确定,也常处在未完成式的状态中。
打个比喻,线图信号的确定→有用到未知数据(未完成式、现在进行式),例如,在实时盘中一根日k线的收盘价变来变去,指针线图当然随之而起舞。
zig函数只是把格局放大,n的日k组合而成的一根多日k线,这一根多日k线的收盘价变来变去,指针线图当然随之而起舞。
0065--主图kd
在主图上,坐标是以k线的价格为主。如何将在0与100中游走的kd指针附加上去,这是写作指针的基本逻辑观念的运用。
param#1( n,9,2,100 )
param#2( m1,3,1,40 )
param#3( m2,3,1,40 )
rsv:=(close-llv(low,9))/(hhv(high,9)-llv(low,9))*100 linethick0;{:=运算过程不显示值与图}
k:sma(rsv,3,1),linethick0,colorwhite;{linethick0只显值不显图}
d:sma(k,3,1),linethick0,coloryellow;
hh:=sysparam(4);{主图可见k线最高价}
ll:=sysparam(5);{主图可见k线最低价}
kk:=k/100*(hh-ll) ll;
dd:=d/100*(hh-ll) ll;
partline(1=1,kk),colorwhite; {条件成立时,则显示图线形}
partline(c>0,dd),coloryellow;
c;{显示收盘价的值与图线形}
partline(c>=ref(c,1),c),colorred;{显示收盘价的图改成涨红跌绿联机图}
partline(c< ref(c,1),c),colorgreen;
0066--描绘k线
例一:普通
将下列公式建立在:技术指针 ( ○主图叠加 ●主图 )
公式名称:kl
stickline( isup , high , low , 0.1 , 0 ) , colorred ;
stickline( isup , close , open , 8 , 1 ) , colorred ;
stickline( isdown , high , low , 0.1 , 0 ) , colorcyan ;
stickline( isdown , close , open , 8 , 0 ) , colorcyan ;
stickline( isequal and c>ref( c , 1 ) , high , low , 0.1 , 0 ) , colorred ;
stickline( isequal and c>ref( c , 1 ) , close , open , 8 , 0 ) , colorred ;
stickline( isequal and c<=ref( c , 1 ) , high , low , 0.1 , 0 ) , colorcyan ;
stickline( isequal and c<=ref( c , 1 ) , close , open , 8 , 0 ) , colorcyan ;
x:=barscount( close ) ;
{以下是描绘第一个交易日的k线,以补前面含盖的不足}
stickline( isequal and x = 1 , high, low, 0.1, 0 ) , colorred ;
stickline( isequal and x = 1 , close , open , 8 , 0 ) , colorred ;
说明:
isup函数:相当于 if( close>open , 1 , 0 )。
isequal函数:相当于 if( close=open , 1 , 0 )。
isdown函数:相当于 if( close < open , 1 , 0 )。
stickline函数,画出来的对象有重叠覆盖性:→后画的对象可覆盖先画的对象。
例二:配色
stickline( isup , high , low , 0.1 , 0 ),color04fefc ;
stickline( isup , close , open , 8 , 0 ),color0466fc ;
stickline( isup , close , open , 3 , 0 ),color04fefc ;
stickline( isdown , high , low , 0.1 , 0 ),colorfcfe04 ;
stickline( isdown , close , open , 8 , 0 ),colorfc6604 ;
stickline( isdown , close , open , 3 , 0 ),colorfcfe04 ;
stickline( isequal and c>ref( c , 1 ) , high , low , 0.1 , 0 ),color04fefc ;
stickline( isequal and c>ref( c , 1 ) , close , open , 8 , 0 ),color0466fc ;
stickline( isequal and c>ref( c , 1 ) , close , open , 3 , 0 ),color04fefc ;
stickline( isequal and c<=ref( c , 1 ) , high , low , 0.1 , 0 ),colorfcfe04 ;
stickline( isequal and c<=ref( c , 1 ) , close , open , 8 , 0 ),colorfc6604 ;
stickline( isequal and c<=ref( c , 1 ) , close , open , 3 , 0 ),colorfcfe04 ;
x:=barscount( close ) ;
{以下是描绘第一个交易日的k线,以补前面含盖的不足}
stickline( isequal and x = 1 , high, low, 0.1, 0 ),color04fefc ;
stickline( isequal and x = 1 , close , open , 8 , 1 ),color0466fc ;
stickline( isequal and x = 1 , close , open , 3 , 1 ),color04fefc ;
0067--分时k线当天k线序号
范例:开盘第一根分时k线,指定一个值=1给它,其它为0。
xa:ref(date,1)<>date, stick;
范例:每天的分时k线,指定它的当天k线序号给它
xa:=ref(date,1)<>date, stick;
xb:barslast(xa=1) 1 ,stick;
应用:每天在分时k线,累计成交张数
xa:=ref(date,1)<>date , stick;
xb:=barslast(xa=1) 1 ,stick;
sv:sum( vol , xb ) ;
范例:标记今天分时k线的今天k线序号。过了午夜12点,就又要等早盘开盘后序号数字才会出现
xa:=currentdate=date ;
xb:=ref(xa , 1)<>xa ;
xc:hhvbars(xb , 0) xa ;
应用:13均线今天当下最后数值向后延申,画平台线。
xa:=currentdate=date ;
xb:=ref(xa , 1)<>xa ;
xc:=hhvbars(xb , 0) xa ;
xd:=ma(c,13);
xe:=refx(xd , 300);
xf:if(xc>=0 , xe , 0) ,linethick0,color99ffff;
partline(xc>=1 , xf) ,color99ffff;
0068--系统参数函数
这组函数,应用在取得当前可视主图区内的一些数字信息,如下所示:
1.当前十字光标所在位置,那根k线的序号;
2.当前可视主图区,最初那根k线的序号;
3.当前可视主图区,最后那根k线的序号;
4.当前可视主图区,最高价;
5.当前可视主图区,最低价。
注:但须调出十字光标后,这组函数才能发生作用。否则回传的值是不确定的。
sysparam(1)
sysparam(2)
sysparam(3)
sysparam(4)
sysparam(5)
函数:sysparam(1)
说明: 回传当前 十字光标所在位置那根k线的序号
函数:sysparam(2)
说明: 回传当前可视主图区 最初那根k线的序号
函数:sysparam(3)
说明: 回传当前可视主图区 最后那根k线的序号
函数:sysparam(4)
说明: 回传当前可视主图区 最高价
函数:sysparam(5)
说明: 回传当前可视主图区 最低价
范例:
将公式建立在:技术指针 ( ●主图叠加 ○主图 )
ss:=sysparam( 1 ) ;
dd:=sum( 1 , 0 ) ;
cc:close * 1.07 , linethick0 , coloryellow ;
partline( ss>=dd , cc ) , coloryellow ;
注:
dd:sum( 1 , 0 ) ;
ss:sysparam( 1 ) ;
上面两者,显然有明显的不同之处。
1.dd是一组变量型时间数列,代表k线的序号。
2.ss是隐含有n组常数型时间数列(n=这支股票的k线总数)。
dd:sum(1,0)
以数学的二维空间f(x)=y表示:y=x
ss:sysparam(1)
以数学的二维空间f(x)=y表示,其中a属正整数:y=a
sum(1,0)=sysparam(1)意指,下面两条线交叉成立的那一点:
y=x
y=a
范例:
ma1:=ma(close,5);
ma2:=ma(close,13);
xa:=cross(ma1,ma2) ;
xb:if(xa=1,sum(1,0),0);{条件成立时回传它的k线序号}
0059--移动成本
不知道函数算法,计算误差在所难免。调整参数“%”可看到不同的移动成本。
///筹码%
input:%(90,1,100);
a:=amount/v/100;
成本:floor(cost(50-%/2)*100)/100,coloryellow,linethick0;
~:ceiling(cost(50 %/2)*100)/100,coloryellow,linethick0;
集中度:intpart((~-成本)/(~ 成本)*1000)/10,colorgreen;
平均成本:round(cost(50)*100)/100,linethick0;
穿透力:(winner(c)-ref(winner(c),1))/v*capital,linethick0;//计算误差大
//穿透力2:(winner(c)-winner(o))/v*capital,linethick0;//这一写法还是误差大
获利比例:round(winner(c)*1000)/10,linethick0;
0060--妙用sumbars()函数
sumbars(x,n)
函数的用法如下:
向前累加到指定值到现在的周期数。
用法:
sumbars(x,a)
将x向前累加直到大于等于a,返回这个区间的周期数
例如:
sumbars(vol,capital)
1、设计一个指标,计算当日成交量是几天内的最高成交量?
2、设计一个指标,计算当日最高价是几天内的最高价?
提示:直接用hhv()函数无法得到正确结果。
例一:
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);
或:
vh:=hhv(vol,0);
fv:=if(barpos=1,vh[datacount]*1.2,vol); //vh[datacount]是历史最高成交量
量创新高周期数:sumbars(ref(fv,1)-fv,0);
{这里的关键是 ref(fv,1)-fv ,想想看写成 fv-ref(fv,1) 行不行?}
另一种写法:
vh:=hhv(vol,0);
fv:=vol;
fv[1]:=vh[datacount]*1.2; //vh[datacount]是历史最高成交量
量创新高周期数:sumbars(ref(fv,1)-fv,0);
{这里的关键是 ref(fv,1)-fv ,想想看写成 fv-ref(fv,1) 行不行?}
代码已经成功了,原理是什么呢?
假设某日成交量是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周期的成交量要替换成比所有成交量都大的数值?最后,再来思考一个问题,把题目中的求“最大”,改成求“最小”,即多少天内是最小的?
例二:
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;
例三:
hh:=if(barscount(c)=1,9999,h);
zh:sumbars(ref(hh,1)-hh,0);//价创了n周期新高
vh:=if(barscount(c)=1,99999999,v);
hv:sumbars(ref(vh,1)-vh,0);//量创了n周期新高
ll:=if(barscount(c)=1,0,l);
zl:sumbars(ll-ref(ll,1),0);//价创了n周期新低
vl:=if(barscount(c)=1,0,v);
lv:sumbars(vl-ref(vl,1),0);//量创了n周期新低
附注:
用99999999等具体数值,最好是尽可能大的数值(比如单精数的上限),否则仍有可能无法全部完成计算,比如上证指数的年线,成交量最大时,仍然超过了99999999。
倒数第6天的最高价格怎么表示?
fh:=high;
fh[datacount-5]; //倒数第6天的最高价格。
[datacount]
返回k线的数量,即总共有多少根k线。
0061--取得k线的序号
取得k线的序号,正序有下面几种方法:(从1数起)
barpos;
sx:barscount(close);
sy:sum(1,0);
datacount;{不随光标变动,只显示最后k线序号}
逆序可用下列方法取得:(从1数起)
(datacount-barpos) 1;
(datacount-barscount(close)) 1;
(datacount-sum(1,0)) 1;
0062--变量宣告
指定叙述:经过指定宣告后,飞狐才认识aa、bb、cc,否则会出现"未定义的标示符号"。所谓"定义",程序语言的用语,就叫做"变量宣告"。
aa:open;{宣告open,指定给aa→输出的表达式}
bb:high,linethick0;{宣告high,指定给bb→输出的表达式→秀数值但不秀线图}
cc:=close;{宣告close,指定给cc→不输出的表达式→不秀数值也不秀线图}
dd:(aa bb cc)/3;{;分号,告诉程序要换行执行了}
ee:=(aa cc)/2;
partline(close>0,ee);{秀线图但不秀数值}
注:{ }大括号内或在//后面,可用来输入公式批注。
0063--跨周期引用数据
(一)指针线公式的运算,大部份都是代入开、高、低、收、量等数据去运%c
0069--概率统计
count,计数。sum,总数、和。
当数组为逻辑运算判断的结果时,count和sum的返回值是一样的。一般习惯上,对于逻辑运算信号,用count统计,返回其它数值的,用sum统计。
当count统计一般数值时,数组大于等于1时,计入;小于1时,不计入。这两个函数,主要用于统计。
用count(cross(ma(c,5),ma(c,10)),0);就可以统计出全部的五天均线上穿十天均线的金叉数。
用sum(cross(ma(c,5),ma(c,10)),0);和以上得出的结果应该是一样的。
股市的不随机规律,隐藏在统计概率之中。用这两个函数,可以统计很多概率性的规律。
比如,以两天的收盘价相比,昨天是下跌的,今天的下跌的概率是多少?
a:=c< ref(c,1);
b:=ref(a,1) and c>ref(c,1);{昨天下跌,今天上涨}
d:=ref(a,1) and c=ref(c,1);{昨天下跌,今天平盘}
e:=ref(a,1) and c< ref(c,1);{昨天下跌,今天下跌}
f:=count(b,0) count(d,0) count(e,0);
上升概率:100*count(b,0)/f;
下跌概率:100*count(e,0)/f;
平盘概率:100*count(d,0)/f;
从两市指数看,昨天下跌,今天下跌的概率始终大于50%。那么连跌两天之后,第三天收盘的各种概率是多少?
a:=c< ref(c,1) and ref(c,1)< ref(c,2);
b:=ref(a,1) and c>ref(c,1);{前两天下跌,今天上涨}
d:=ref(a,1) and c=ref(c,1);{前两天下跌,今天平盘}
e:=ref(a,1) and c< ref(c,1);{前两天下跌,今天下跌}
f:=count(b,0) count(d,0) count(e,0);
上升概率:100*count(b,0)/f;
下跌概率:100*count(e,0)/f;
平盘概率:100*count(d,0)/f;
从指数的输出看,概率更明显了。连跌三天之后呢?
a:=c< ref(c,1) and ref(c,1)< ref(c,2) and ref(c,2)< ref(c,3);
b:=ref(a,1) and c>ref(c,1);{前三天下跌,今天上涨}
d:=ref(a,1) and c=ref(c,1);{前三天下跌,今天平盘}
e:=ref(a,1) and c< ref(c,1);{前三天下跌,今天下跌}
f:=count(b,0) count(d,0) count(e,0);
上升概率:100*count(b,0)/f;
下跌概率:100*count(e,0)/f;
平盘概率:100*count(d,0)/f;
规律就更明显了。
不要小看这些数据。虽然没有有些“高手”做出的成功率达百分之九十左右的公式那么夸张,但很有意义的。要知道股市中的随机因素太多,平衡性很强,稍稍的统计偏向,足可作为有用的参考。
这只是简单的例子,用这两个函数,可以做出很多的有用的统计数据。多数的交易系统的"胜率",可以由此统计出来。
统计:
a:=cross(c,ma(c,3));
b:=cross(ma(c,3),c);
d:b*(c-ref(c,barslast(a)));
月:sum(d,20);
季:sum(d,60);
半:sum(d,120);
年:sum(d,250);
总和:sum(d,0);
0070--五彩k线常用颜色
黑色 colorblack 蓝色 colorblue
棕色 colorbrown 青色 colorcyan
灰色 colorgray 绿色 colorgreen
晶红 colormagenta 红色 colorred
白色 colorwhite 黄色 coloryellow
0071--分析家公式设定注意事项
参数 最多四个参数,每个有最大和最小及缺省值,须有自己名称
注释 用大括号括起来放在被注释语句之后
公式名称 由字母或数字组成,在同类公式中必须唯一,最多九个字符
中间公式 使用":="来定义名字,不能与系统提供的函数同名
param#1-4 对应于参数1-4,大小写敏感
坐标线位置 最多七个,用分号分隔
组合公式设置 小公式间用分号隔开
绘图参数使用 将其插入到指标公式的后面,用逗号分隔开
区分多条指标线 在指标公式前写上名称并加上一个冒号
指标线名字的使用 可以当函数名用
指标线绘制的极限 可同图显示16条指标线
五彩颜色参数使用 将其插入到指标公式的后面,用逗号分隔开