高级教程
在分钟周期下划分交易日¶
-
均线(分钟): 指标名称:均线(分钟) 指标原理:均价=累加自当日开市到当前K线时间内的成交金额/累加自当日开市到当前K线时间内的成交量。
-
确定交易日内第一根K线的位置(难点);
-
自1中确定的位置累加成交金额、成交量(由系统函数SUM实现);
-
由成交金额、成交量求均价(由除法操作符实现)。
-
公式脚本:
FIRST:=IF(PERIOD=0,HOUR=9 AND MINUTE=31,
IF(PERIOD=1,HOUR=9 AND MINUTE=35,
IF(PERIOD=2,HOUR=9 AND MINUTE=45,
IF(PERIOD=3,HOUR=10 AND MINUTE=0,
IF(PERIOD=4,HOUR=10 AND MINUTE=30,0) ) ) ) ) ;
SUM(AMO,BARSLAST(FIRST) +1) /SUM(VOL,BARSLAST(FIRST) +1) ;
上面的公式适用于1分钟,5分钟,15分钟,30分钟,60分钟等五个周期下。将给出每个交易日中各周期下均线的走势。公式脚本编写中的重点就是First变量的确定,这也是这段脚本的亮点。First变量表示的是当日当前周期的第一根K线位置,是通过IF函数的嵌套使用结合各分钟周期的第一根K线的时间得来的。
跨周期引用数据¶
在同一个公式脚本中,所有变量的数据周期都是相同的,就是调用公式时设置的周期。在公式脚本中要用其它周期的数据,共有两种方式:
- 对变量用变周期符号(#),改变其周期。这种方式有局限性,只能在小周期公式中得到大周期数据,且仅适用于一些基本数据,如close,high,low,open等。
示例脚本:
日最高价:H;
周最高价:H#WEEK;
运行示例:
- 在公式脚本中调用其它公式以取得其它周期的数据。调用其它公式,并用#设置其周期。
比如,公式脚本在日线下运行时,可用Kdj.k#week;来获得kdj在周线下的k值,另属于于同一周线的日线将获得相同的K值。
示例脚本:
公式1:
公式名称:JBSJ
公式描述:基本数据
公式脚本:
JC:C;{当前周期收盘价}
JH:H;{当前周期最高价}
JL:L;{当前周期最低价}
JO:O;{当前周期开盘价}
JYC:REF(C,1) ;{前一个周期收盘价}
公式2:
公式名称:TEST049
公式脚本:
日线开盘价:JBSJ.JO#DAY;
周线开盘价:O;
月线开盘价:JBSJ.JO#MONTH;
运行示例:
公式3:
E:=CURRBARSCOUNT;
E1:=DAY!=REF(DAY,1) ;
E2:=BARSLAST(E1) +1;
E3:=MA(C,E2) ;
E4:=SUM(AMO,E2) /SUM(VOL,E2) /100;
E5:=IF(CAPITAL>0,E4,E3) ;
昨开:IF(E<=CONST(E2) ,TMP#DAY,DRAWNULL) ,COLORCYAN,LINETHICK3;
TMP的指标源码如下:
REF(OPEN,1) ;
此指标用于分钟周期线,同时在昨开盘价的位置上画一根线。
运行示例:
使用跨周期引用数据时注意点: 可供引用的周期类型有 MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH 分别表示将1,5,15,30,60分钟K线数据,以及日,周,月K线数据,代入被引用的公式,进行运算。
{非指标引用时只可用于OPEN,HIGH,LOW,CLOSE,VOL,AMOUNT,VOLINSTK等,当前周期不支持多秒线,多分钟线和多日线,并且引用周期必须要高于当前周期,5秒线只支持引用1分钟线和5分钟线,周期数据转换得到}
TMP2:=KDJ.K#WEEK;
{跨周期指标引用,引用品种的对应周期的数据必须要先下载到本地}
跨周期指标引用不支持带参数
提示:跨周期时,可能会引用到未来数据
对某个时间段统计¶
某绝对时间段最高价¶
1998年8月3日到1998年12月20日间的最高价
HH:=IF(YEAR=1998 AND (MONTH>8 OR (MONTH=8 AND DAY>=3) ) AND (MONTH<12 OR (MONTH=12 AND DAY<=20) ) ,H,0) ;{HH变量在该时间段内等于H,其他时间为0}
HHV(HH,0) ;{此例求1998年8月3日到1998年12月20日间的最高价}
60天前到40天前之间的最高价
REF(HHV(H,60-40) ,40);
#### 在某个时间段内某条件满足
TT:=C/REF(C,1) >1.095;{是否涨停} COUNT(TT,20) >0;{二十个交易日内时候涨停过}
上面的脚本配合1.3中示例可以写出历史某绝对时间段,或相对时间内是否涨停过的选股公式。
上图中的效果还可以借助Filter这个函数来实现。
K线绘制¶
示例公式:博弈K线
公式名称:博弈K线
公式脚本:
BKO:WINNER(O) ,NODRAW;
BKH:WINNER(H) ,NODRAW;
BKL:WINNER(L) ,NODRAW;
BKC:WINNER(C) ,NODRAW;
DRAWKLINE(BKH,BKO,BKL,BKC) ;
运行示例:
#### 创新高周期数
成交量创新高周期数脚本:
FV:=IF(BARSCOUNT(C) =0,9999999999,VOL) ;
量创新高周期数:
SUMBARS(REF(FV,1) -FV,0) ;
{这里的关键是 REF(FV,1) -FV ,想想看写成 FV-REF(FV,1) 行不行?};
脚本控制¶
在通达信的公式脚本中没有专门的控制语句,一切都是变量(仅有输出与不输出的区别),所以要实现应用于多种情况的脚本也要依靠变量来控制。
系统函数中有几个重要的函数就是IF,IFF,IFN,TESTSKIP.请大家注意的是通达信的函数的参数都是先计算出结果然后将参数传给函数的。因此对于TESTSKIP,最好作为一条单独的语句来使用。
公式脚本1:同1.2中的JBSJ公式。
{用于引用股票的基本数据。}
公式脚本2:FZMN分钟模拟
{用于通过几种分钟周期的数据模拟出当天对应于改周期的各项数据}
N:=IF(PERIOD=0,1,
IF(PERIOD=1,5,
IF(PERIOD=2,15,
IF(PERIOD=3,30,
IF(PERIOD=4,60,0)
)
)
)
);
CTRL:=TESTSKIP(N=0) ;{仅用于分钟周期}
TTIME1:=(TIME/100) ;
TTIME2:=IF(TTIME1<1000,TTIME1-930,
IF(TTIME1<1100,TTIME1-1000+30,
IF(TTIME1<1131,TTIME1-1100+90,
IF(TTIME1<1300,120,
IF(TTIME1<1400,TTIME1-1300+120,
IF(TTIME1<1500,TTIME1-1400+180,240)
)
)
)
)
) ;
TTIME:=TTIME2/N;
YTC:="JBSJ.JYC#DAY";
YTDPC:="399300$CLOSE#DAY";
ZFS:=(C*1000/YTC) -1000;
AC:="399300$CLOSE";
ZFA:=(AC*1000/YTDPC) -1000;
DJC:(ZFS-ZFA) *YTC/1000+YTC;
DJH:IF(TTIME<2,DJC,HHV(DJC,TTIME-1) ) ;
DJL:IF(TTIME<2,DJC,LLV(DJC,TTIME-1) ) ;
DJO:REFV(DJC,TTIME-1) ;
{DRAWKLINE(DJH,DJO,DJL,DJC) ;};
公式脚本3:
在日线周期下,引用公式2中的数据(通过引用指标设置周期的方法来获得分钟周期的数据),通过K线绘制的函数就可以画出模拟 的K线了。
JH:="FZMN.DJH#MIN5";
JO:=" FZMN.DJO#MIN5";
JLC:=" FZMN.DJL#MIN5";
JC:=" FZMN.DJC#MIN5";
DRAWKLINE(JH,JO,JLC,JC) ;
横向统计函数¶
横向统计类函数是板块中所有股票都参与计算的函数,有:BLOCKSETNUM,HORCALC,INSORT,INSUM等四个。
其中INSUM是新加入的函数,其用法如下:
INSUM(板块名称,指标名称,指标线,计算类型) ,
返回板块各成分该指标相应输出安计算类型得到的计算值.计算类型:0-累加,1-平均数,2-最大值,3-最小值.
现在用INSUM计算出个股所在行业中最大和最小的涨跌幅:
指标ZDF,用于计算个股的涨跌幅。¶
示例公式:ZDF
公式名称:涨跌幅
公式脚本:
(C-REF(C,1) ) /REF(C,1) ;
指标TJZDF,通过INSUM函数调用ZDF指标计算出该个股所在板块成分股最大最小涨跌幅。¶
示例公式:TJZDF
公式名称:统计涨跌幅
公式脚本:
INSUM(HYBLOCK,'ZDF',1,2) ;{ZDF指标第一个输出的最大值}
INSUM(HYBLOCK,'ZDF',1,3) ;{ZDF指标第一个输出的最大值};
注释: 指标TJZDF中HYBLOCK函数用来取当前成份股所在板块
指标窗口定点输出函数¶
在新版本的公式编辑器中新加了两个绘图函数,用于定点输出文字或数字。他们就是DRAWTEXT_FIX,DRAWNUMBER_FIX。
RAWTEXT_FIX¶
固定位置显示文字.
用法:DRAWTEXT_FIX(COND,X,Y,TYPE,TEXT) ,当COND条件满足时,在当前指标窗口内(X,Y) 位置书写文字TEXT,X,Y为书写点在窗口中相对于左上角的百分比,TYPE:0为左对齐,1为右对齐。
例如:DRAWTEXT_FIX(CURRBARSCOUNT=1 AND CLOSE/OPEN>1.08,0.5,0.5,0,'大阳线') 表示最后一个交易日涨幅大于8%时在窗口中间位置显示'大阳线'字样。
DRAWNUMBER_FIX¶
固定位置显示数字.
用法:DRAWNUMBER_FIX(COND,X,Y,TYPE,NUMBER) ,当COND条件满足时,在当前指标窗口内(X,Y) 位置书写数字NUMBER,X,Y为书写点在窗口中相对于左上角的百分比,TYPE:0为左对齐,1为右对齐。
例如:DRAWNUMBER_FIX(CURRBARSCOUNT=1 AND CLOSE/OPEN>1.08,0.5,0.5,0,C) 表示最后一个交易日涨幅大于8%时在窗口中间位置显示收盘价。
现在我们举例说明这两个函数的用法:
示例公式:DRAWFIX
公式名称:DRAWFIX
公式脚本:
DRAWTEXT\_FIX(ISLASTBAR,0.5,0,0,HYBLOCK) ,COLORYELLOW;
DRAWTEXT\_FIX(ISLASTBAR,0,0,0,'股本结构:') ,COLORRED;
DRAWTEXT\_FIX(ISLASTBAR,0,0.1,0,'总股本:') ,COLORRED;
DRAWNUMBER\_FIX(ISLASTBAR,0,0.2,0,FINANCE(1) ) ,COLORMAGENTA;
DRAWTEXT\_FIX(ISLASTBAR,0.3,0.1,0,'流通A股:') ,COLORGREEN;
DRAWNUMBER\_FIX(ISLASTBAR,0.3,0.2,0,FINANCE(7) ) ,COLORYELLOW;
DRAWTEXT\_FIX(ISLASTBAR,0.5,0.1,0,'今日换手率:') ,COLORGREEN;
DRAWNUMBER\_FIX(ISLASTBAR,0.5,0.2,0,V*100/CAPITAL) ,COLORYELLOW;
效果图:
注意: * 当窗口大小改变时,DRAWFIX各输出文字或数字的相对位置不变; * 通过方向键等方式改变分析图中K线个数时,DRAWFIX窗口内的文字或数字位置不随之改变;
字符串函数¶
新加入公式管理器的字符串函数有:HYBLOCK、DYBLOCK、INBLOCK、NAMELIKE、CODELIKE、CON2STR、STR2CON、STRCAT、STRCMP、FINSTR;在公式管理器的插入函数列表中有它们的介绍。
注:字符串中含百分号时,2个百分号代表一个。如’%%’ 显示时为一个%
示例公式:DRAWFIX2
公式名称: DRAWFIX2
公式脚本:
ST股:=NAMELIKE('S') OR NAMELIKE('*') ;
BE显示:=INBLOCK('上证A股') AND NOT(ST股) AND CODELIKE('600') ;
DRAWTEXT\_FIX(NOT(BE显示) ,0,0,0,'本公式不适用该品种!适用品种:上证A股 且 不是ST股 且 品种代码以600开头!') ,COLORYELLOW;
DRAWTEXT\_FIX(BE显示,0,0,0,STRCAT('品种行业:',HYBLOCK) ) ,COLORYELLOW;
DRAWTEXT\_FIX(BE显示,0.5,0,0,STRCAT('品种地域:',DYBLOCK) ) ,COLORYELLOW;
DRAWTEXT\_FIX(BE显示,0,0.1,0,'股本结构:') ,COLORRED;
DRAWTEXT\_FIX(BE显示,0,0.2,0,STRCAT('总股本:',STRCAT(CON2STR(FINANCE(1) /10000,0) ,'万股') ) ) ,COLORRED;
DRAWTEXT\_FIX(BE显示,0.3,0.2,0,STRCAT('流通A股:',STRCAT(CON2STR(FINANCE(7) /10000,1) ,'万股') ) ) ,COLORGREEN;
DRAWTEXT\_FIX(BE显示,0.5,0.2,0,STRCAT('今日换手率:',STRCAT(CON2STR(V*100/CAPITAL,2) ,'%%') ) ) ,COLORGREEN;
公式演示截图:
600600 青岛啤酒
000001 深发展A