第00节 教程简介 公式是对价格、成交量、时间、周期等原始数据的比较判断或者运算变化,说通俗一点,就是我们告诉股票软件做什么、怎么做的命令。
第一,公式可以提高我们的操作效率。
第二,公式可以帮助我们直观地检验操作理念。
第三,使用公式构建自己的交易系统。
虽然现在到处可以找到各种各样的公式,但却很少刚好符合自己要求的,很多时候我们要对现成公式进行修改或者重新编写。
即使你只使用现成的公式,也需要掌握一些公式编写知识。因为要使用好一条公式,必须了解公式的设计理念、前提条件、影响因素、变化规律、可靠性等等,而要了解这些,就得分析公式的算法。
本教程一共十节,详细讲解与公式编写相关的各种知识,绝大多数知识在飞狐、金狐、分析家、大智慧新一代、大智慧网络版、通达信、同花顺、操盘手、博易大师、文华等主流软件上都是通用的,也就是说,认真学完本教程,就可以在这些软件上编写自己需要的常用公式。每一节的内容:
第一节,公式管理器——详细讲解公式管理器的每个功能,以及技术指标、条件选股、交易系统和五彩k线这四种不同类型公式的特点。
第二节,添加现成公式——详细讲解如何添加现成公式,以及在添加公式时常见问题的处理方法。
第三节,公式语句规则——详细讲解编写公式需要遵守的规则。
第四节,函数详解——把函数按照实际功能进行重新分类,并结合实际应用对常用函数进行详细地讲解。
第五节,公式转换——详细讲解如何把技术指标变成选股公式、交易系统或者五彩K线等,并顺带讲解如何给公式加上时间限制和如何解除公式的时间限制。
第六节,公式进阶——对如何进行横向统计、如何建立和使用扩展数据、如何建立和使用自定义数据、如何采集f10数据、如何建立板块指数、如何编写分时图公式等进行详细地演示。
第七节,公式测试——详细讲解如何对公式进行测试、测试需要注意的事项以及如何正确看待测试的结果。
第八节,公式使用——详细讲解如何使用公式进行选股和预警等。
第九节,公式解读——详细讲解正确解读公式的方法。
第十节,学习建议——推荐一些经过实战检验、个人认为真正能够帮助大家实现稳定盈利的操作理念。
第01节 公式管理器
打开公式管理器的方式:菜单栏中的功能——专家系统——公式管理器;工具栏中的公式管理器按钮;键盘上的快捷键ctrl+f。
按照不同使用类型分为技术指标、条件选股、交易系统和五彩K线这四大类,一个大类里面又分为很多小类。全部——把某一类型的公式完全展开。系统——只显示系统自带的公式,前面有一个蓝色小方块。用户——只显示用户添加的公式,前面有一个粉红色小方块。方块前面有一个小锁标志的是加密公式。
新建、修改(系统公式在关闭软件后会自动还原)、删除、恢复、用户配置、导出公式(密码保护)、导入公式、临时导入(关闭软件后会自动清除)、关闭。
公式名称(如果公式名称是汉字,快捷键是每个汉字的第一个拼音字母)、密码保护、公式描述、公式类型(自己编写的公式,最好选择其它类型)、画线方法(副图、主图叠加、副图(叠加K线)、叠加美国线、叠加收盘站线)、坐标线位置(自动)、额外Y轴分界、引入指标公式、插入函数(把鼠标停留在函数上面,也可以看到它的说明和用法)、测试公式、测试结果、参数栏、公式编辑区、动态翻译、参数精灵(Param #参数序号)、用法注释。
技术指标调出方式:键盘上输入技术指标名称;工具栏中的选择指标按钮;工具栏中的财经资讯树。可以输出线条、数字、图形和文字,可以选股(需要指明条件)、不能预警、只有软件自带的一部分技术指标才能进行系统测试。
条件选股公式在通达信中不能输出显示(要观察它的信号,最好改成技术指标),只有一个输出,可以选股、预警和系统测试。
交易系统公式调出方式:主图上按右键——专家指示——交易系统指示;工具栏中的财经资讯树。成对输出提示买卖的上下箭头,可以选股(需要指明条件)、不能预警,可以系统测试。不想显示交易系统指示:在箭头上按右键——删除交易系统指示。
五彩K线公式调出和删除方法与交易系统一样,通过不同颜色来区分满足条件的K线和不满足条件的K线,可以选股,不能预警和系统测试。
四种类型的公式可以相互转换,也可以组合使用。
第02节 添加现成公式
以文件形式显示的是公式文件,可以看到函数和算法的是公式源码。
Tni 通达信(新)Tnc通达信(老)
alg 飞狐、金狐
exp 大智慧网络版
fnc 大智慧新一代、分析家
hxf 同花顺
源码:
INPUT:N(5,1,100),M(10,1,100);
N 1,100,5 M 1,100,10
N 5 M 10
{参数申明——中间(数字大小关系)数值为缺省值}
均线
MA1:MA(C,5);十日均线
MA2:MA(C,10),,COLORRED
{名称、语句说明处理,逗号少多、缺少分号}
MA3:MA(C,20);
{标点符号要英文样式}
MA4:MA(MA(C,5),10;
{括号不匹配}
MA5:MA(C,30),COLORFF,LINEDASH;
{语句中有软件不认识的函数}
MA5:=MA(MA7,5),CIRCLEDOT,COLORGREEN;
{公式不完整,中间语句不带线型和颜色函数}
{主图公式——画线方法改成主图叠加,条件选股公式——建立在条件选股类别}
第03节 公式语句规则
MA1:MA(C,5),LINETHICK2,COLORRED;
{C:MA(C,5),LINETHICK2,COLORRED;}
{MA(C,5),LINETHICK2,COLORRED;}
指标线格式——指标线名称:函数(数据,参数),线形,颜色;
指标线名称不能是c、o、h、l、v等系统保留字,同一公式中名称不能相同,也可没有名称,如果没有名称,冒号不用写,冒号、括号、逗号、分号等标点符号必须是英文的。
MA2: MA(MA1,5);
MA3:=MA(MA(C,5),10);{五日均线的十日简单移动平均线}
空格和回车不影响公式计算,函数或者指标线名称不能被空格和回车分开。冒号后面加上等号,把语句变成中间语句,中间语句不会输出显示,以免图表凌乱、加快运算速度。括号从里到外运算、成对工作的,注释部分用大括号括起来(飞狐可用//代替)。
Ma1:ma(c,5);
Ma2:ma(c,10);
Ma3:ma(c,20);
……
Man:ma(c,n);
Spj:=c;
Ma1:ma(spj,5);
Ma2:ma(spj,10);
Ma3:ma(spj,20);
……
Man:ma(spj,n);
引用其它公式指标线格式——"指标名称.指标线名称"(参数表)
每个参数之间用逗号分开,双引号可要可不要;参数表可以不写。
K:"kdj.K"(9,3,3);
{K:kdJ.K;}
跨周期引用格式——"指标名称.指标线名称#周期"(参数表)
每个参数之间用逗号分开,双引号和参数表可以不写。小周期可以引用大周期,大周期不能引用小周期。通达信跨周期引用有时会计算错误,最好在飞狐上使用。
日K:"KDJ.K";
周K:"KDJ.K#WEEK"(9,3,3);
三十分钟K:KDJ.K#MIN30;
三十分钟K:"KDJ.K";
日K:"KDJ.K#DAY";
周K:"KDJ.K#WEEK";
引用其它品种行情数据格式——"品种代码代码$行情函数"
双引号一定要写。引用与当前股票相对应的大盘的数据,可用大盘行情函数。
万科A收盘价:"000002$C";
综艺股份收盘价:"600770$C";
大盘收盘价:INDEXC;
算术运算符:*/+-
比较运算符:=等于,!=不等于(飞狐<>),>大于,=大于等于,<=小于等于
逻辑运算符:AND / &&与(并且),OR / ||或(或者)
运算顺序从左到右、从上到下。
第04节 函数详解
要有信心,不怕辛苦,要有方法。
主要函数——获取数据、比较判断、运算变化,辅助函数——修饰美化、形态描述。
K线数据,可以只写开头第一个字母。
开盘价:OPEN;{O}
收盘价:CLOSE;{C}
最高价:HIGH;{H}
最低价:LOW;{L}
大盘K线数据,必须下载完整盘后数据。Drawkline——画K线,数据顺序——最高价、开盘价、最低价、收盘价。
DRAWKLINE(INDEXH,INDEXO,INDEXL,INDEXC);
{H、O、L、C}
上涨家数和下跌家数,第一组只在大盘窗口才有数据,第二组哪个窗口都有数据。
涨家1:ADVANCE;
跌家1:DECLINE;
涨家2:INDEXADV;
跌家2:INDEXDEC;
在一定周期内某项数据的最大值——hhv,在一定周期内某项数据的最小值——llv。
HH:HHV(H,10);
LL:LLV(L,10);
MA1:MA(C,5);
HHMA:HHV(MA1,10);
LLMA:LLV(MA1,10);
创新高或者创新低。
创新高:H=HHV(H,60);
创新低:L=LLV(L,60);
当前位置取得以前位置数据——ref,取得指定日期数据——refdate,注意日期的格式。
以前数据:REF(C,1);
{以前数据:REF(H,2);}
指定日期数据:REFDATE(C,1090508);
{1998年5月25日——980525、2011年12月8日——1111208}
成交量——vol,可写成V,单位是手。成交金额——amount,单位是元。Indexv——大盘成交量, indexa——大盘成交金额。BuyVOL——外盘, sellvol——内盘,只能取得与最后一根K线相对应的数据。
成交量:VOL;{V}
成交金额:=AMOUNT;
大盘成交量:=INDEXV;
大盘成交金额:=INDEXA;
外盘:BUYVOL;
内盘:SELLVOL;
涨幅、振幅、均价,成交量复权:工具——系统设置——设置1——勾选“分析图成交量复权”——按确定——再按确定——退出k线图——重新进入K线图。
涨幅:=(C-REF(C,1))/REF(C,1)*100;
振幅:=(H-L)/L*100;
均价1:(H+L+O+C)/4;
均价2:AMOUNT/(V*100);
即时行情函数只取得与最后一根K线相对应的数据。
振幅1:DYNAINFO(13)*100;
振幅2:(H-L)/L*100;
finance(7)的单位是股,根据流通盘变化而变化。capital的单位是手,只取得最新流通盘。
流通盘1:FINANCE(7);
流通盘2:CAPITAL;
换手率,finance(7)写的换手率更合理。
换手率1:V*100/FINANCE(7)*100;
换手率2:V/CAPITAL*100;
FINANCE(42)——上市日期,date——日期,date加19六个0,一号的日为0, year——年份,month——月份,day——日,weekday——星期。
上市日期:FINANCE(42);
日期1:DATE;
日期2:DATE+19000000;
年:YEAR;
月:MONTH;
日:DAY;
日期3:YEAR*10000+MONTH*100+DAY;
星期:WEEKDAY;
Time——时间,hour——小时,MINUTE——分钟,只在日线以下周期有效。FROMOPEN——当前时刻距离开盘分钟数。
时间:TIME;
小时:HOUR;
分钟:MINUTE;
距开盘分钟数:FROMOPEN;
BARSCOUNT——某数据从第一个有效值到现在的周期数,TOTALBARSCOUNT——总周期数,下载完整盘后数据、不连接行情使用。CURRBARSCOUNT——当前K线到最后交易日周期数。
有效数据周期数:BARSCOUNT(C);
总周期数:TOTALBARSCOUNT;
到最后周期数:CURRBARSCOUNT;
cross——是否发生交叉,两条指标线不一定全是变化的曲线。Barslast——上一次条件成立到当前的周期数,BARSSINCE——第一次条件成立到当前的周期数,count——统计在一定周期内满足条件的周期数。
K1:KDJ.K;
D1:KDJ.D;
金叉:CROSS(K1,D1)*10;
死叉:CROSS(D1,K1)*-10;
{K1上穿60:CROSS(K1,60);
K1下穿20:CROSS(20,K1);}
上次到现周期数:BARSLAST(金叉);
首次到现周期数:BARSSINCE(金叉),NODRAW;
统计{N周期内满足条件}次数:COUNT(金叉=10,20);
Hhvbars——某数据在一定周期内的最大值到当前的周期数,llvbars——某数据在一定周期内的最小值到当前的周期数。
上一高点{到现在}周期:HHVBARS(H,20);
上一低点{到现在}周期:LLVBARS(L,20);
某数据是近多少周期内的最大值——TOPRANGE,某数据是近多少周期内的最小值——LOwrANGE。
多少周期的最大:TOPRANGE(H);
多少周期的最小:LOWRANGE(L);
BARSLASTCOUNT——统计连续满足条件的周期数,sumbars——某数据向前累加到指定值到当前的周期数。
统计{连续满足条件}周期数:BARSLASTCOUNT(C>REF(C,1));
加到指定值周期:SUMBARS(V,CAPITAL);
PERIOD——当前窗口的周期类型。
窗口周期类型:PERIOD;
在不同周期类型使用不同参数。
参数:=IF(PERIOD=5,20,IF(PERIOD=6,10,0));
MA1:MA(C,参数);
最基本的比较判断是用大于、小于、等于等等。某数据是否在某个范围之内——RANGE,某数据是否在某个范围——BETWEEN。
宽幅震荡:(H-L)/L*100>12;
是否在某个范围1:RANGE(C,8,10);{X>A AND A
是否在某个范围2:BETWEEN(C,10,13);{X>=A AND X<=B};
是否发生交叉——cross,LONGCROSS——是否维持一定周期后发生交叉。
上穿:CROSS(MA(C,5),MA(C,10));
{持续}一段时间后上穿:LONGCROSS(MA(C,5),MA(C,10),10)*2;
UPNDAY——某数据在一定周期内是否连涨,DOWNNDAY——某数据在一定周期内是否连跌,NDAY——是否在一定周期内前面的数据都大于后面的数据,ISLASTBAR——当前周期是否是最后一个周期。
连涨:UPNDAY(C,5);
连跌:DOWNNDAY(C,5);
连大:NDAY(C,O,5);
是否最后周期:ISLASTBAR;
EXIST——是否在一定周期内存在符合某种条件的情况,EVERY——是否在一定周期内一直存在符合条件的情况,LAST——是否在某一段周期内一直存在符合某种条件的情况,not——是否不符合条件。
存在:EXIST(C>REF(C,1)*1.099,10);
一直存在:EVERY(C>O,5);
持续存在:LAST(C>O,10,5);
并非:NOT(C>O);
If——是否符合条件,符合条件输出前面的数据,不符合条件输出后面的数据, max——哪个更大输出哪个,min——哪个更小输出哪个。
条件:=CROSS(MA(C,5),MA(C,10));
如果:IF(条件,5,-5);
较大者:MAX(C,O);
较小者:MIN(C,O);
FILTER——过滤连续出现的信号。
J大于80:"KDJ.J">80;
过滤:FILTER(J大于80,10)*2;
Abs——取得数据的绝对值,sum——求的数据在一定周期内的总和。
涨幅:(C-REF(C,1))/REF(C,1)*100;
零轴:0;
绝对值:ABS(涨幅);
求和:SUM(涨幅,5);
Ma——简单移动平均值,ema——指数移动平均值,sma——加权移动平均值(前面参数大于后面参数),dma——动态移动平均值(参数小于1),后面三个函数降低本周期的权重、减少波动性而使输出变得相对平滑稳定,同时也降低了灵敏度。
简单移动平均:MA(C,5);{(C0+C1+C2+…+C(N-1))/N}
指数移动平均:EMA(C,5);{Y=2*X/(N+1)+(N-1)/(N+1)*Y',Y'上一周期Y}
加权移动平均:SMA(C,5{N},1{M});{Y=(M*X+(N-M)*Y')/N, Y'上一周期Y,N必须大于M}
动态移动平均:DMA(C,0.5);{Y=N*X+(1-N)*Y',Y'上一周期Y,N必须小于1};
LINETHICK——粗细,color——颜色,stick——柱状线,CROSSDOT——小交叉线,CIRCLEDOT——小圆圈线,POINTDOT——小圆点线。
MA1:MA(C,5);
MA2:MA(C,20),LINETHICK3,COLORRED;
均线差值1:(MA1-MA2)*1,STICK;
均线差值2:(MA1-MA2)*3,CROSSDOT;
均线差值3:(MA1-MA2)*6,CIRCLEDOT;
均线差值4:(MA1-MA2)*9,POINTDOT;
LINESTICK——指标线加柱状线。
MA1:=MA(C,5);
MA2:=MA(C,10);
均线差值:MA1-MA2,LINESTICK;
COLORSTICK——彩色柱状线。
MA1:=MA(C,5);
MA2:=MA(C,10);
均线差值:MA1-MA2,COLORSTICK;
VOLSTICK——成交量柱状线。
MA1:=MA(C,5);
MA2:=MA(C,10);
均线差值:MA1-MA2,VOLSTICK;
DRAWTEXT——写文字(必须写在一对单引号内),DRAWICON——画图标。
MA1:MA(C,5);
MA2:MA(C,10);
金叉:=CROSS(MA1,MA2);
写文字:DRAWTEXT(金叉,MA1,'金叉');
画图标:DRAWICON(金叉,MA2,1);
STICKLINE——画柱线,0实心柱,-1虚线空心柱,1实线空心柱。后面的输出会遮挡住前面的输出。
MA5:MA(C,5);
画柱线1:STICKLINE(C>O,C,O,2,0);
画柱线2:STICKLINE(C>O,H,L,0,0),COLORBLUE;
画柱线3:STICKLINE(C
画柱线4:STICKLINE(C
MA10:MA(C,10),COLORGREEN;
DRAWLINE——绘制直线段,0不延长,1向右延长。PLOYLINE——绘制折线。
画直线:DRAWLINE(L=LLV(L,10),L,H=HHV(H,10),H,0);
画折线:PLOYLINE(H=HHV(H,30),H);
均线变色,DRAWNULL——返回无效值。nodraw——只输出数值、不输出线条,不影响公式坐标。LINETHICK0——只输出数值、不输出线条,在其它软件中不影响公式坐标,在通达信中影响公式坐标。
MA1:MA(C,5);
MA2:MA(C,10);
变色:IF(MA1>REF(MA1,1),MA1,DRAWNULL),LINETHICK2,COLORRED;
成交量:V,NODRAW;
MA1:MA(C,5);
MA2:MA(C,10);
变色:IF(MA1>MA2,MA1,DRAWNULL),LINETHICK2,COLORRED;
成交量:V,LINETHICK0;
Winner——获利盘,cost——成本分布情况。
获利盘:WINNER(C)*100;
成本分布:COST(80);
Zig——之字转向,1最高价、2最低价、3收盘价。PEAK——波峰价格,1最高价、2最低价、3收盘价。TROUGH——波谷价格,1最高价、2最低价、3收盘价。
之字转向:ZIG(3,10);
波峰:PEAK(3,10,1);
波谷:TROUGH(3,10,1);
波峰到现在的周期数——PEAKBARS,波谷到现在的周期数——TROUGHBARS。
波峰到现在周期:PEAKBARS(3,10,1);
波谷到现在周期:TROUGHBARS(3,10,1);
BACKSET——回设,马后炮。
MA10:MA(C,10);
回设:=BACKSET(C/REF(C,1)>1.09,2);
A:=IF(REF(回设,1)=0 AND 回设=1,1,0);
DRAWICON(A,L*0.98,1);
跨周期引用的公式也具有未来性质。
周J:"KDJ.J#WEEK";
周D:"KDJ.D#WEEK";
金叉:CROSS(周J,周D)*30;
还有一种作弊手法——将公式信号限制在有行情的时段发出。
另外一种作弊:O
建议暂时关闭本教程,把讲义中这一节的内容挨个复制到你自己的软件中,按照这一节开始时所讲的函数学习方法复习一遍。
要将自己的思路用公式去表达出来,首先是确定需要哪些数据,然后观察这些数据之间的关系,再按语句规则的要求用函数去定义观察到的关系。
{K线形态}
阴线:C
阳线:C>O;
上涨:C>REF(C,1);
下跌:C
平盘:C=REF(C,1);
大阳线:C/REF(C,1)>1.05;
大阴线:C/REF(C,1)<0.95;
高开:O>REF(C,1);
低开:O
高开高走:O>REF(C,1) AND C>O;
高开低走:O>REF(C,1) AND C
低开低走:O
低开高走:OO;
上跳空:L>REF(H,1);
下跳空:H
长上影:H/MAX(O,C)>1.03;
长下影:MIN(O,C)/L>1.03;
十字星:MAX(O,C)/MIN(O,C)1.01 AND MIN(O,C)/L>1.01;
正T字:O=C AND C=H AND L
倒T字:O=C AND C=L AND H>L;
一字涨停:O=C AND C=H AND L=H AND C>REF(C,1);
一字跌停:O=C AND C=L AND L=H AND C
横盘:HHV(H,20)/LLV(L,20)<1.15;
均线状况——金叉和死叉。
MA1:MA(C,5);
MA2:MA(C,10);
金叉:CROSS(MA1,MA2);
死叉:CROSS(MA2,MA1);
均线上拐、下拐、将死未死。
MA1:MA(C,5);
MA2:MA(C,10);
上拐:=REF(MA1,1)REF(MA1,1);
下拐:=REF(MA1,1)>REF(MA1,2) AND MA1
将死未死:=COUNT(MA1>MA2,5)=5 AND 上拐;
DRAWICON(上拐,MA1*0.98,1);
DRAWICON(下拐,MA1*1.01,2);
DRAWICON(将死未死,MA1*0.96,11);
多头排列、空头排列。
MA1:MA(C,5);
MA2:MA(C,10);
MA3:MA(C,20);
多头排列:=MA1>MA2 AND MA2>MA3;
空头排列:=MA1
STICKLINE(多头排列,MA1,MA3,0,0),COLORRED;
STICKLINE(空头排列,MA1,MA3,0,0),COLORGREEN;
均线粘合、粘合一段时间。
MA1:MA(C,5);
MA2:MA(C,10);
MA3:MA(C,20);
粘合:=MAX(MAX(MA1,MA2),MA3)/MIN(MIN(MA1,MA2),MA3)<1.02;
粘合一段时间:=COUNT(粘合,10)=10;
STICKLINE(粘合,MAX(MAX(MA1,MA2),MIN(MIN(MA1,MA2),MA3)),MA3,1,0),COLORRED;
DRAWICON(粘合一段时间,MA3*0.98,1);
三金叉。
DIF2:"macd.DIF";
DEA2:"MACD.DEA";
单金叉:CROSS(DIF2,DEA2);
三金叉:(单金叉 AND COUNT(单金叉,10)>=3)*2;
成交量状况——主要观察成交量之间、成交量与均量线之间以及换手率之间的关系。放量、历史天量。
放量1:V>REF(V,1)*2;
放量2:V>MA(V,60);
放量3:V*100/FINANCE(7)*100>8;
历史天量:V=HHV(V,0);
连续放量。
连续放量1:COUNT(V>REF(V,1),5)=5;
连续放量2:(COUNT(V>MA(V,60),5)=5)*2;
连续放量3:(COUNT(V*100/FINANCE(7)*100>8,5)=5)*3;
缩量、历史地量。
缩量1:V
缩量2:V
缩量3:V*100/FINANCE(7)*100<1;
历史地量:V=LLV(V,0);
连续缩量。
连续缩量1:COUNT(V
连续缩量2:(COUNT(V
连续缩量3:(COUNT(V*100/FINANCE(7)*100<1,5)=5)*3;
筹码低位密集。
筹码密集:=(WINNER(C*1.1)-WINNER(C*0.9))*100>50;
相对低位:=(C-COST(0.01))/(COST(99.99)-COST(0.01))*100<10;
低位密集:筹码密集 AND 相对低位;
第05节 公式转换
技术指标转换为条件选股公式:第一步,确定我们想要的信号;第二步,从下到上寻找信号的关联语句;第三步,删除无用语句;第四步,将信号以外的语句变成中间语句,并删除修饰美化函数;第五步,将公式建立在条件选股类别。
{改造前}
LC:=REF(C,1);
rsi1:SMA(MAX(C-LC,0),6,1)/SMA(ABS(C-LC),6,1)*100;
RSV:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100;
K:SMA(RSV,3,1);
D:SMA(K,3,1);
J:3*K-2*D,LINETHICK2;
MJ:=CROSS(J,D);
MC:=CROSS(D,J);
DRAWICON(MJ,J,1);
DRAWICON(MC,J,2);
{改造后}
RSV:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
J:=3*K-2*D;
CROSS(J,D);
技术指标转换为交易系统公式:第一步,确定我们想要的信号;第二步,从下到上寻找信号的关联语句;第三步,删除无用语句;第四步,将信号以外的语句变成中间语句,并删除修饰美化函数;第五步,将买进信号取名为ENTERLONG,将卖出信号取名为EXITLONG;第六步,将公式建立在交易系统类别。
{改造前}
{ ENTERLONG EXITLONG }
DIF:EMA(C,12)-EMA(C,26),LINETHICK2,COLORRED;
DIF下降:IF(DIF<=REF(DIF,1),DIF,DRAWNULL),LINETHICK2,COLORGREEN;
DEA:EMA(DIF,9),LINETHICK2,COLORBLUE;
MACD:(DIF-DEA)*2,COLORSTICK;
JCH:=CROSS(DIF,DEA);
SCH:=CROSS(DEA,DIF);
DRAWICON(JCH,DIF,1);
DRAWICON(SCH,DIF,2);
A:=MACD>REF(MACD,1) AND MACD<=0;
B:=MACD0;
DRAWTEXT(A AND REF(A,1)=0,MACD*0.98,'☆'),COLORRED;
DRAWTEXT(B AND REF(B,1)=0,MACD*1.02,'☆'),COLORBLUE;
STICKLINE(MACD>REF(MACD,1) AND MACD>0,0,MACD,1,0),COLORRED;
STICKLINE(MACD0,0,MACD,1,0),COLORYELLOW;
STICKLINE(MACD>REF(MACD,1) AND MACD<=0,0,MACD,1,0),COLORBLUE;
STICKLINE(MACD<=REF(MACD,1) AND MACD<=0,0,MACD,1,0),COLORGREEN;
{改造后}
DIF:=EMA(C,12)-EMA(C,26);
DEA:=EMA(DIF,9);
ENTERLONG:CROSS(DIF,DEA);
EXITLONG:CROSS(DEA,DIF);
技术指标转换为五彩K线公式:第一步,确定我们想要的信号;第二步,从下到上寻找信号的关联语句;第三步,删除无用语句;第四步,将信号以外的语句变成中间语句,并删除修饰美化函数;第五步,将公式建立在五彩K线类别。
{改造前}
MA10:MA(C,10),linethick2,;
MA20:MA(C,20);
MA30:MA(C,30);
多头排列:=MA10>MA20 AND MA20>MA30;
空头排列:=MA10
STICKLINE(多头排列,MA10,MA30,0,0),COLORRED;
STICKLINE(空头排列,MA10,MA30,0,0),COLORGREEN;
DRAWICON(REF(多头排列,1)=0 AND 多头排列,MA30,1);
DRAWICON(REF(多头排列,1)=1 AND 多头排列=0,MA10,2);
{改造后}
MA10:=MA(C,10);
MA20:=MA(C,20);
MA30:=MA(C,30);
多头排列:MA10>MA20 AND MA20>MA30,COLORRED;
空头排列:MA10
给公式加上时间限制——写一条日期判断语句,从下往上寻找关键语句,在关键语句后面乘上日期判断语句。
{改造前}
RSV:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100;
K:SMA(RSV,3,1);
D:SMA(K,3,1);
J:3*K-2*D;
{改造后1}
A:=IF(DATE>1090101,0,1);
RSV:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100*A;
K:SMA(RSV,3,1);
D:SMA(K,3,1);
J:3*K-2*D;
{改造后2}
A:=IF(DATE>1090101,0,1);
RSV:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100*A;
K:SMA(RSV,3,1)*A;
D:SMA(K,3,1)*A;
J:(3*K-2*D)*A;
解除公式时间限制——把日期改长或直接删除日期限制语句以及相关语句后面的乘上运算。
第06节 公式进阶
管理——横向统计管理——新增——选中公式——设置范围——按确定——再按确定——弹出询问我们【是否要立即计算数据】的对话框,如果你需要建立多个横向统计数据,可以点否,等全部建立完再点击全部刷新,如果你只需要建立一个横向统计数据,一般点是——等软件计算完,记住数据序号——关闭。
调用横向统计数据——ESTDATA。
{KDJ金叉}
RSV:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
金叉:cross(k,d)
{KDJ金叉数量}
金叉数量:ESTDATA(N);
管理——扩展数据管理——双击其中一个扩展数据——选中公式——勾上生成横向排名数据——设置范围——按确定——再按确定——弹出询问我们【是否要立即计算数据】的对话框——我们点是——等软件计算完,记住数据序号——关闭。
调用扩展数据——EXTDATA。
{J值排名}
排名:EXTDATA(N);
管理——扩展数据管理——双击其中一个扩展数据——选中公式——不要勾上生成横向排名数据——设置范围——按确定——再按确定——弹出询问我们【是否要立即计算数据】的对话框——选择否——点击全部刷新——等软件计算完,记住数据序号——关闭。
EXTDATA——调用扩展数据,只有分笔数据完整准确,计算结果才准确。
{内外盘引用}
内盘:DYNAINFO(22);
外盘:DYNAINFO(23);
{内外盘}
内盘:EXTDATA(2);
外盘:EXTDATA(3);
管理——自定义数据管理——新建——名称——描述——属性——确定——点击保存、退出,不能点击关闭。
F10资料下载地址:http://www.chcj.net/thread-1188029-1-1.html,上海巨灵F10和深圳巨灵F10。把上海F10解压缩到——飞狐\DATA\SH\F10这个文件夹,把深圳F10解压缩到——飞狐\DATA\SZ\F10这个文件夹,然后重新启动飞狐。一定要选择资料库1。
管理——F10数据采集——弹出数据采集管理对话框——添加——进行设置——确定。名称、描述、前导关键字(每个股票都相同、并且都有)、倍数、查找起始点和查找结束点(前导关键字前后不远处每个股票都相同、并且都有)、数据存储类型(自定义数据)、测试、测试下一个、采集、保存。
调用自定义数据——selfdata。
{采集数据1}
每股收益:SELFDATA(1)/100;
使用数据采集函数采集F10数据,数字、标点符号和空格占一个字符,中文字占两个字符。
{采集数据2}
a1:=F10FIND('2008-12-31│',1);
a2:=F10TEXT(a1+20,8);
八四每股净资产:STRTONUM(a2);
a3:=F10FIND('2009-03-31│',1);
a4:=F10TEXT(a3+20,8);
九一每股净资产:STRTONUM(a4);
{采集数据2}
a1:=F10FIND('◇机构持仓统计◇',1);
a2:=F10FIND('持仓总计',a1);
a3:=F10TEXT(a2+16,10);
机构持仓总计:STRTONUM(a3);
建立板块指数:选择版块指数——空白区右键——新建板块指数——弹出自定义指数对话框——进行设置(指数成分股票——新增或者勾上版块)——勾上实时刷新——确定——选中新建的版块指数——右键——刷新板块指数。
批量建立板块指数:实盘猎庄——版块分析——选中版块分类——全部版块——右键——选择批量创建版块指数——进行设置,勾上实时刷新——确定——关掉版块分析——右键——刷新所有。
K线图中的主图公式,都可以叠加到分时图。
把副图公式叠加到分时图主图——对副图公式进行缩放,使指标线的变化范围等于分时图上面从最高价到最低价的范围,然后移动副图公式,使副图公式的指标线与分时图的价格线对齐。
需要叠加其它公式,只需修改第二句、第三句和最后一句。一定要把主图叠加勾上, YY1一定要引用变化较大的指标线。
{分时主图叠加MACD}
IF DATATYPE>0 THEN EXIT;{只在分时图运行此公式}
YY1:="MACD.DIFF";{引用变化大的指标线}
YY2:="MACD.DEA";{引用变化小的指标线}
ZQS:=DATACOUNT;{分时图周期总数}
ZGJ:=DYNAINFO(5);{最高价}
ZDJ:=DYNAINFO(6);{最低价}
YY1ZDZ:=HHV(YY1,0);{YY1最大值}
ZHZDZ:=YY1ZDZ[ZQS];{YY1最大值最新数值}
YY1ZXZ:=LLV(YY1,0);{YY1最小值}
ZHZXZ:=YY1ZXZ[ZQS];{YY1最小值最新数值}
SFBL:=(ZGJ-ZDJ)/(ZHZDZ-ZHZXZ);{缩放比例}
PLJL:=ZGJ-ZHZDZ*SFBL;{偏移距离}
YY1*SFBL+PLJL,COLORRED;{缩放和移动后的DIFF}
YY2*SFBL+PLJL,COLORBLUE;{缩放和移动后的DEA}
0*SFBL+PLJL,POINTDOT;{缩放和移动后的0轴}
{分时主图叠加KDJ}
IF DATATYPE>0 THEN EXIT;{只在分时图运行此公式}
YY1:="KDJ.K";{引用变化大的指标线}
YY2:="KDJ.D";{引用变化小的指标线}
ZQS:=DATACOUNT;{分时图周期总数}
ZGJ:=DYNAINFO(5);{最高价}
ZDJ:=DYNAINFO(6);{最低价}
YY1ZDZ:=HHV(YY1,0);{YY1最大值}
ZHZDZ:=YY1ZDZ[ZQS];{YY1最大值最新数值}
YY1ZXZ:=LLV(YY1,0);{YY1最小值}
ZHZXZ:=YY1ZXZ[ZQS];{YY1最小值最新数值}
SFBL:=(ZGJ-ZDJ)/(ZHZDZ-ZHZXZ);{缩放比例}
PLJL:=ZGJ-ZHZDZ*SFBL;{偏移距离}
YY1*SFBL+PLJL,COLORRED;{缩放和移动后的K}
YY2*SFBL+PLJL,COLORBLUE;{缩放和移动后的D}
50*SFBL+PLJL,POINTDOT;{缩放和移动后的50轴}
把副图公式叠加到分时图副图——计算出副图的最高位置和最低位置,把这个区域填充成黑色,重新画六条坐标线,然后缩放副图公式,使公式指标线的变化范围等于副图区域从最高位置到最低位置的范围,最后移动副图公式,使公式的指标线与副图的最高位置对齐。
需要叠加其它公式,只需修改YY这一句和最后三句。一定要把主图叠加勾上, YY这一句一定要引用变化较大的指标线。
按小键盘上的乘号键,分时图副图变成了两个,可以在两个副图上面叠加两个不同的公式。
{分时副图1叠加RSI}
ZSH:=DYNAINFO(3);{昨收}
ZQS:=DATACOUNT;{分时图周期总数}
ZGJ:=DYNAINFO(5);{最高价}
ZDJ:=DYNAINFO(6);{最低价}
BZF:=MAX(ZGJ-ZSH,ZSH-ZDJ);{最大振幅的一半}
F1H:=ZSH-BZF*1.02;{分时副图1最高位置}
F1L:=ZSH-2*BZF*1.005;{分时副图1最低位置,同时也是分时副图2最高位置}
FILLRGN(1,F1H,F1L),COLORBLACK;{清除原始副图的指标线}
LDF:=(F1H-F1L)/6;{将分时副图1六等分}
F1H+1*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+2*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+3*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+4*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+5*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
YY:="RSI.RSI1";{引用变化最大的指标线}
ZD:=HHV(YY,0);{引用的指标线的最大值}
ZX:=LLV(YY,0);{引用的指标线的最小值}
SFBL:=(F1H-F1L)/(ZD[ZQS]-ZX[ZQS]);{缩放比例}
PYJL:=(F1H+F1L-SFBL*(ZD[ZQS]+ZX[ZQS]))/2;{偏移距离}
YY*SFBL+PYJL,COLORRED;{在分时副图1,显示缩放和移动后的RSI1}
"RSI.RSI2"*SFBL+PYJL,COLORYELLOW;{在分时副图1,显示缩放和移动后的RSI2}
"RSI.RSI3"*SFBL+PYJL,COLORBLUE;{在分时副图1,显示缩放和移动后的RSI3}
{分时副图1叠加KDJ}
ZSH:=DYNAINFO(3);{昨收}
ZQS:=DATACOUNT;{分时图周期总数}
ZGJ:=DYNAINFO(5);{最高价}
ZDJ:=DYNAINFO(6);{最低价}
BZF:=MAX(ZGJ-ZSH,ZSH-ZDJ);{最大振幅的一半}
F1H:=ZSH-BZF*1.02;{分时副图1最高位置}
F1L:=ZSH-2*BZF*1.005;{分时副图1最低位置,同时也是分时副图2最高位置}
FILLRGN(1,F1H,F1L),COLORBLACK;{清除原始副图的指标线}
LDF:=(F1H-F1L)/6;{将分时副图1六等分}
F1H+1*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+2*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+3*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+4*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+5*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
YY:="KDJ.J";{引用变化最大的指标线}
ZD:=HHV(YY,0);{引用的指标线的最大值}
ZX:=LLV(YY,0);{引用的指标线的最小值}
SFBL:=(F1H-F1L)/(ZD[ZQS]-ZX[ZQS]);{缩放比例}
PYJL:=(F1H+F1L-SFBL*(ZD[ZQS]+ZX[ZQS]))/2;{偏移距离}
YY*SFBL+PYJL,COLORRED;{在分时副图1,显示缩放和移动后的J}
"KDJ.K"*SFBL+PYJL,COLORYELLOW;{在分时副图1,显示缩放和移动后的K}
"KDJ.D"*SFBL+PYJL,COLORBLUE;{在分时副图1,显示缩放和移动后的D}
{分时副图叠加两个指标}
ZSH:=DYNAINFO(3);{昨收}
ZQS:=DATACOUNT;{分时图周期总数}
ZGJ:=DYNAINFO(5);{最高价}
ZDJ:=DYNAINFO(6);{最低价}
BZF:=MAX(ZGJ-ZSH,ZSH-ZDJ);{最大振幅的一半}
F1H:=ZSH-BZF*1.02;{分时副图1最高位置}
F1L:=ZSH-2*BZF*1.005;{分时副图1最低位置,同时也是分时副图2最高位置}
FILLRGN(1,F1H,F1L),COLORBLACK;{清除原始副图的指标线}
LDF:=(F1H-F1L)/6;{将分时副图1六等分}
F1H+1*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+2*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+3*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+4*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F1L+5*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
YY:="RSI.RSI1";{引用变化最大的指标线}
ZD:=HHV(YY,0);{引用的指标线的最大值}
ZX:=LLV(YY,0);{引用的指标线的最小值}
SFBL:=(F1H-F1L)/(ZD[ZQS]-ZX[ZQS]);{缩放比例}
PYJL:=(F1H+F1L-SFBL*(ZD[ZQS]+ZX[ZQS]))/2;{偏移距离}
YY*SFBL+PYJL,COLORRED;{在分时副图1,显示缩放和移动后的RSI1}
"RSI.RSI2"*SFBL+PYJL,COLORYELLOW;{在分时副图1,显示缩放和移动后的RSI2}
"RSI.RSI3"*SFBL+PYJL,COLORBLUE;{在分时副图1,显示缩放和移动后的RSI3}
F2H:=ZSH-2*BZF*1.01;{分时副图2最高位置}
F2L:=ZSH-3*BZF*1.005;{分时副图2最低位置}
FILLRGN(1,F2H,F2L),COLORBLACK;{清除原始副图的指标线}
LDF:=(F2H-F2L)/6;{将分时副图1六等分}
F2H+1*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F2L+2*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F2L+3*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F2L+4*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
F2L+5*LDF,POINTDOT,COLOR0000CC;{画横坐标线}
YY2:="KDJ.J";{引用变化最大的指标线}
ZD2:=HHV(YY2,0);{引用的指标线的最大值}
ZX2:=LLV(YY2,0);{引用的指标线的最小值}
SFBL2:=(F2H-F2L)/(ZD2[ZQS]-ZX2[ZQS]);{缩放比例}
PYJL2:=(F2H+F2L-SFBL2*(ZD2[ZQS]+ZX2[ZQS]))/2;{偏移距离}
YY2*SFBL2+PYJL2,COLORRED;{在分时副图1,显示缩放和移动后的J}
"KDJ.K"*SFBL2+PYJL2,COLORYELLOW;{在分时副图1,显示缩放和移动后的K}
第07节 公式测试
程式化交易——条件选股——弹出条件选股对话框——选择公式——成功率测试——弹出信号成功率测试对话框——设置测试时段、目标周期、目标利润——先选多头——测试,看共发出指示、平均成功率、利润1总平均和利润2总平均。
选中空头再测试一次,这次主要看平均成功率。统计列表——哪些股票曾经发出信号、信号成功率和相关利润。双击有信号的股票,看信号在什么时候发出(红箭头成功信号,绿箭头失败信号)。分布图,看信号分布与指数之间关系。
1996年12月26日之前没有涨跌停限制。
对公式进行必要的测试是可以的,但没有必要太过在意测试的结果:
第一, 电脑计算的东西,不一定就是准确的。
第二, 国内股票软件的测试功能都还很不完善。
第三, 测试结果只能代表过去,未来不一定如此。
第四, 无法做到跟测试结果一样。
除了对公式进行必要的测试,我们更应该认真分析公式源码,搞清楚公式的前提条件、影响因素、变化规律,并判断公式是否具有明确的市场含义、是否符合人性操作的逻辑、是否能够及时反映多空力量的变化等等。要搞清楚这些东西,除了需要掌握公式编写知识,还得具有丰富的市场知识和市场实战经验,这些都需要大家自己去慢慢积累。
第08节 公式使用
选股(条件选股公式)——功能——选股器——条件选股——弹出条件选股对话框——选择公式——设置周期——加入条件(保存方案、引入方案)——设置范围(历史阶段选股要有完整盘后数据)——选股入板块或者执行选股。
选股(技术指标公式)——功能——选股器——综合选股——弹出选股方案对话框——选择公式——设置参数——条件设置——加入条件(保存方案、引入方案)——设置选股范围和选股周期——选股入板块或者执行选股。
预警(只有条件选股公式才能用来预警)——功能——预警系统——打开条件预警开关——功能——预警系统——条件预警设置——弹出条件预警设置对话框——添加股票——公式设置——添加公式——其它设置。
第09节 公式解读
现在关于经典公式的流行用法,基本上都是基于观察公式表现的总结,要想真正用好经典公式,单靠观察总结肯定是不够的,还得彻底分析清楚公式的源码才行,我们现在来看如何解读公式。
解读公式步骤:第一步简化;第二步拆散;第三步分析(产生原因、变化规律以及相互关系)。
详见视频
RSI1:SMA(MAX(C-REF(C,1),0),14,1)/SMA(ABS(C-REF(C,1)),14,1);
A1:MAX(C-REF(C,1),0);
A2:SMA(A1,14,1);
B1:ABS(C-REF(C,1));
B2:SMA(B1,14,1);
RSI2:A2/B2;
详见视频
RSV:=(C-LLV(L,9))/(HHV(H,9)-LLV(L,9))*100;
K:SMA(RSV,3,1);
D:SMA(K,3,1);
J:3*K-2*D;
HH:HHV(H,9);
LL:LLV(L,9);
SP:C;
J0:2*(K-D)+K;