灵客

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 70|回复: 1

[探讨] 通达信指标公式编写高级教程

[复制链接]

345

主题

740

帖子

2589

积分

金牌会员

Rank: 6Rank: 6

积分
2589

优秀版主

发表于 2018-11-1 10:24:54 | 显示全部楼层 |阅读模式
本帖最后由 周杰伦 于 2018-11-1 10:26 编辑

公式系统(高级)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线的时间得来的。
1.2 跨周期引用数据在同一个公式脚本中,所有变量的数据周期都是相同的,就是调用公式时设置的周期。在公式脚本中要用其它周期的数据,共有两种方式:
  • 对变量用变周期符号(#),改变其周期。这种方式有局限性,只能在小周期公式中得到大周期数据,且仅适用于一些基本数据,如close,high,low,open等。
示例脚本:
日最高价:H;
周最高价:H#WEEK;
运行示例:
  • 在公式脚本中调用其它公式以取得其它周期的数据。调用其它公式,并用#设置其周期。如,公式脚本在日线下运行时,可用kdj.k#week;来获得kdj在周线下的k值,另属于于同一周线的日线将获得相同的K值。
示例脚本:
公式1:
公式名称:JBSJ
公式描述:基本数据
公式脚本:
JC:C;{当前周期收盘价}
JH:H{当前周期最高价}
JLL{当前周期最低价}
JO:O;{当前周期开盘价}
JYC:REF(C,1);{前一个周期收盘价}

公式2:
公式名称:TEST049
公式脚本:
日线开盘价:JBSJ.JO#DAY;
周线开盘价:O;
月线开盘价:JBSJ.JO#MONTH;


运行示例:

使用跨周期引用数据时要注意:
  
  1.可供引用的周期类型有:
  
  MIN1,MIN5,MIN15,MIN30,MIN60,DAY,WEEK,MONTH
分别表示将1,5,15,30,60分钟K线数据,以及日,周,月K线数据,代入被引用的公式,进行运算。
  
  2.意义:
  
  可将大周期内跑的数据,引用到小周期内来跑;也可将小周期内跑的数据,引用到大周期内来跑。

3.切勿对开高低收以外的数据直接使用变周期转换!

4.切勿对大周期内跑的数据使用小周期转换!无论是开高低收等基本数据、还是自定义变量,都无法从大周期数据直接转换成小周期数据,只能通过公式引用来获得小周期数据。
1.3 对某个时间段统计1)某绝对时间段最高价
此脚本段求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日间的最高价}

2)某相对时间段最高价
60天前到40天前之间的最高价
  REF(HHV(H,60-40),40);
1.4 在某个时间段内某条件满足TT:=C/REF(C,1)>1.095;{是否涨停}
COUNT(TT,20)>0;{二十个交易日内时候涨停过}
上面的脚本配合1.3中示例可以写出历史某绝对时间段,或相对时间内是否涨停过的选股公式。


上图中的效果还可以借助Filter这个函数来实现。
1.5 K线绘制示例公式:博弈K线
公式名称:博弈K线
公式脚本:
BKO:WINNER(O),NODRAW;
BKH:WINNER(H),NODRAW;
BKL:WINNER(L),NODRAW;
BKC:WINNER(C),NODRAW;
DRAWKLINE(BKH,BKO,BKL,BKC);
运行示例:
1.6 创新高周期数成交量创新高周期数脚本:
FV:=IF(BARSCOUNT(C)=0,9999999999,VOL);
量创新高周期数:SUMBARS(REF(FV,1)-FV,0);
{这里的关键是 REF(FV,1)-FV ,想想看写成 FV-REF(FV,1) 行不行?};

1.7脚本控制在通达信的公式脚本中没有专门的控制语句,一切都是变量(仅有输出与不输出的区别),所以要实现应用于多种情况的脚本也要依靠变量来控制。
系统函数中有几个重要的函数就是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;

DJ C(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);

4

主题

224

帖子

765

积分

高级会员

Rank: 4

积分
765
发表于 2018-11-3 20:13:24 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

!open!

手机版|小黑屋|灵客社区
灵客外汇论坛-全国最大的外汇ea论坛交流社区

GMT+8, 2019-1-22 20:06 , Processed in 1.101534 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表