练习1:
定义一个变量,名为AA,算出收盘价与开盘价的差,要求指标线以独立坐标方式显示,指定指标线颜色为红色。
AA..C-O,COLORRED;
练习2:
当根k线最高价是五个周期内最高价的最高值,在最低价的位置标注文字涨。
AA:HHV(H,5);
DRAWTEXT(AA,L,'涨');
练习3:
定位前一天最后一根k线,并在这根k线最高价的位置标记图标
DRAWICON(VALUEWHEN(ISLASTBAR=1,REF(H,1)),H,'ICO15');
批注:
题目中意思也就是说
要在每天的最后一根K线上都要画图标
除了当天。
ISLASTBAR,是用来判断是否是最后一根K线的,是所有数据的最后一根K线,并不能用来作为每天的最后一根K线。
Ref也是取前一根K线的值。
正确的写法:
DRAWICON(REFX(DATE<>REF(DATE,1),1),H,'ICO1');
日期不等于前一天日期,用来取前一天的值。
此处注意一下有夜盘合约的理解,理解不明白再来问我。
批注:
有夜盘的合约,当日21点以后算第二日。例如3日的21:00但是date取值是4.
难点
定位前一天最后一根k线:
REF(DATE,1)//判断当前k线是不是当日的第一根k线
DATE<>REF(DATE,1)//不是当日
REFX(X,N)//引用X在N个周期后的值。
REFX(DATE<>REF(DATE,1)//不是当日的最后一根k线
夜盘合约的理解体现在什么地方呢?
练习4:
在当前k线上返回昨日最高价
AA:REF(H,1);
批注:
Ref取的是上一根K线,K线不仅只有日周期,如果是小周期,就不能用REF来表示,。
需要用DATE<>REF(DATE,1),再重新理解一下,重新做答案。
修改
N:=BARSLAST(DATE<>REF(DATE,1))+1;//分钟周期,当日K线数。
//由于条件成立的当根K线上BARSLAST(COND)的返回值为0,所以“+1”才是当日K线根数。
AA:REF(HHV(H,N),N);//返回当前k线上的昨日最高价
练习5:
将满足当前k线的最高价是前后五个周期的最高点的k线,在最高价的位置标记图标
AA1:H>HV(H,5);//K线的最高价是前五个周期的最高点
AA2:H>REFX(HV(H,5),5);//K线的最高价是后五个周期的最高点
DRAWICON(VALUEWHEN(ISLASTBAR,AA1&&AA2)=1,H,'ICO1');
练习6:
编写一个指标AA,要求连续三根以上(包含3根)的k线不是阴线
AA:SUM(ISDOWN=0,3)=3;
批注:
题目里说的不是阴线,那就是阳线或者平线
Sum是求数值的和。不能这样来用
可以将题目转换为,当前K线不是阴线,上一次阴线的距离距离当前大于等于3来写。
再写一下。
修改
AA:EVERY(C>=O,3)=1;//连续3根以上的k线是平线或者阳线
练习7:
取倒数第二次阳线的最高价
//倒数第二次阳线是不是指当根阳线的上一根阳线?
AA:=REF(VALUEWHEN(ISUP,H),1);//如果上一根K线是阳线,取上一根阳线的最高价;
//只有当根是阳线的情况下,上一根阳线才算是倒数第二次阳线;
VALUEWHEN(ISUP,AA); //如果当根是阳线,取得上一根,也就是倒数第二次阳线的最高价
练习8:
最新一次满足5周期均线上穿10周期均线的k线最高价的位置标注金叉
MA5: =MA (C, 5);
MA10:=MA(C, 10);
金叉:CROSS(MA5,MA10);
DRAWTEXT(金叉,H,'金叉');
批注:
逗号位置是否用了中文。编写以后要用检测来检测一下。
MA5:MA(C,5);
MA10:MA(C,10);
AA:=CROSS(MA5,MA10);
BB:=BACKSET(ISLASTBAR,BARSLAST(AA)+1);
DRAWTEXT(CROSS(BB,0.5),H,'金叉');
理解
BACKSET(X,N),若X非0,则将包含当前位置在内的一共N周期的数值设为1。
BB:=BACKSET(ISLASTBAR,BARSLAST(AA)+1);//最新一次满足5周期均线上穿10周期均线
是因为由于条件成立的当根K线上BARSLAST(COND)的返回值为0,所以“+1”才是5周期均线上穿10周期均线吗?
BB的意思是如果是最后一根K线,则让5周期均线上穿10周期均线的条件成立吗?
是,需要在5周期周期均线上穿10周期均线的位置也标注为1.
可以将+1添加和去掉,加载一下,试试效果。
理解一下BACKSET的说明,是从最新一根K线的位置到满足5周期均线上穿10周期均线位置都设置为1,而满足条件前面的位置都是0.
BARSLAST(AA)+1是满足5周期均线上穿10周期均线的k线根数的意思吗?
是因为由于条件成立的当根K线上BARSLAST(COND)的返回值为0,所以“+1”才是5周期均线上穿10周期均线的K线根数吗?
CROSS(BB,0.5)的意思:
可以这样理解吗:BB是一个条件,返回1或0,BB上穿0.5,代表BB返回值由0变1,BB条件满足。
是不是不一定要写0.5,只要是0~1之间的值都有这种效果?
是的,前面满足0后面满足1.当前条件正好是上穿
练习9:
5周期均线和10周期均线,在金叉的位置用红色箭头标注,在死叉的位置用绿色箭头标注。
MA5: =MA (C, 5);
MA10:=MA(C, 10);
金叉:CROSS(MA5,MA10);
死叉:CROSS(MA10,MA5);
DRAWICON(金叉,L,'ICO4');
DRAWICON(死叉,H,'ICO5');
批注:
题目中是在金叉和死叉位置标注。重新作答
修改
MA5:MA(C,5);
MA10:MA(C,10);
JC:CROSS(MA5,MA10);
SC:CROSS(MA10,MA5);
DRAWICON(JC,MA5,'ICO4');
DRAWICON(SC,MA5,'ICO5');
练习10:
5周期均线,如果该均线连续2个周期向上,均线显示为红色;连续两个周期均线向下,显示为绿色。
MA5:MA (C, 5);
AA:MA(VOL,5)>REF(MA(VOL,5),1);
BB:COUNT(AA,2)=2;
DRAWCOLORKLINE(BB,COLORRED,COLORGREEN);
批注:
一定要加载到K线上看一下效果。
第一行是5周期均线,第二行变成成交量均线了。
DRAWCOLORKLINE是绘制K线的函数
这里用 PARTLINE ,来画线。
修改
MA5:MA(C,5);
AA:=EVERY(MA5>REF(MA5,1),2);//均线是否连续两个周期向上
//EVERY(COND,N),判断N周期内,是否一直满足COND条件。若满足函数返回值为1,不满足函数返回值为0;
PARTLINE(AA,MA5,COLORRED);//如果连续2个周期向上,5周期均线显示为红色
/*PARTLINE(COND, DATA, COLOR);
条件COND满足时,以COLOR颜色的直线连接DATA各点
该函数是将满足条件的DATA以线段形式连接起来,连线并不连续。*/
BB:=EVERY(MA5<REF(MA5,1),2);//均线是否连续两个周期向下
PARTLINE(BB,MA5,COLORGREEN);//如果连续两个周期均线向下,5周期均线显示为绿色
练习11:
如果K线实体部分在5周期均线之上,则K线显示为红色实心,如果K线实体部分在5周期均线之下,则K线显示为绿色实心,如果实体部分穿过该均线,则K线显示为黄色实心。
批注:
这里要用画K线的函数,DRAWCOLORLINE是画线函数,加载后是线型。题中是K线的颜色。
要用DRAWCOLORKLINE
一根K线,开盘价不一定小于收盘价。再看一下要怎么写。
修改
MA5:MA(C,5);//5周期均线
AA:=C>MA5&&O>MA5;//收盘价和开盘价同时大于5周期均线,说明K线实体部分在5周期均线之上
BB:=C<MA5&&O<MA5;//收盘价和开盘价同时小于5周期均线,说明K线实体部分在5周期均线之下
CC:=(C>MA5&&O<MA5)||(C<MA5&&O>MA5);//当开盘价小于收盘价时,开盘价小于5周期均线,并且收盘价大于5周期均线;当开盘价大于收盘价时,开盘价大于5周期均线,并且收盘价小于5周期均线,这两种情况有一种成立,则说明实体部分穿过该均线
DRAWCOLORKLINE(AA,COLORRED,0);//如果K线实体部分在5周期均线之上,则K线显示为红色实心
DRAWCOLORKLINE(BB,COLORGREEN,0);//如果K线实体部分在5周期均线之下,则K线显示为绿色实心
DRAWCOLORKLINE(CC,COLORYELLOW,0);//如果实体部分穿过该均线,则K线显示为黄色实心
对修改的批注
这样写没有问题,也可以考虑用min函数替代尝试编写。
另外,编写的时候 没有考虑开盘价或者收盘价=ma5的情况 ,这样加载的时候,会有K线没有变色的情况。
对修改批注的修改
/*MIN(A,B):取最小值。取A,B中较小者
例:
MIN(C,MIN(O,REF(C,1)));//求当前周期的开盘价,收盘价,以及上周期的收盘价间最小的数值*/
CC:=(C>MA5&&O<MA5)||(C<MA5&&O>MA5);//当开盘价小于收盘价时,开盘价小于5周期均线,并且收盘价大于5周期均线;当开盘价大于收盘价时,开盘价大于5周期均线,并且收盘价小于5周期均线,这两种情况有一种成立,则说明实体部分穿过该均线
CC:MIN(C,MIN(O,MA5))<>MA5;//可以这样用min函数来表示吗?
用MIN(C,O)>=MA5,
来代替AA表示开盘价和收盘价都是大于MA5的。
同理,可以用MAX(C,O)<=MA5,
来代替BB表示开盘价和收盘价都是小于MA5的
另外需要注意,加上=,这样每根K线都会变色
练习12:
有夜盘的合约,在夜盘K线上显示5周期均线,白盘K线不显示均线。K线根数不足5根的时候,按照实际的K线根数计算均线的数值。
合约有夜盘,说明不是股指期货和国债期货。
5周期均线表达方式:
MA5:(MA,5);
商品期货的白盘表达方式:(0900<TIME<1015||1030<TIME<1130||1330<TIME<1500);
棉花、白糖等的夜盘表达方式:(2100<TIME<2330);
批注
当日K线根数固定表达方式:
N:=BARSLAST(DATE<>REF(DATE,1))+1;
Ma(c,5);//5周期均线
Ma函数,在不满足5根的时候返回空,
我们不能直接用连续大于或小于的方式来写。
需要写成time>=2100||time<=2400的方式。
公式可以用IF来写
修改、理解
N:BARSLAST(DATE<>REF(DATE,1))+1;//当日实际K线根数
//IF(COND,A,B) 若COND条件成立,则返回A,否则返回B,
AA:=IF(N>=5,MA(C,5),MA(C,N));//若满足K线根数大于等于5,按照5计算均线的数值;若满足K线根数小于5,按照当日实际K线根数计算均线的数值
BB:=TIME<=2400&&TIME>=2100||TIME>=2400&&TIME<=0900;//夜盘时间
夜盘时间还需要加上24点到9点的部分。例如沪金夜盘结束时间是超过24点的
MA5或n:IF(BB,AA,NULL);//符合AA条件的均线只在夜盘显示
练习13:
在分钟周期上,画当日的黄金分割率线。分别取前一日的最高价、最低价作为黄金分割的两个基点,在这两个基点之间做黄金分割,分别画出比例为0.618、0.382、0.5的水平线,以及两个基点的水平线。
H1:=REF(H,1);
H2:=REF(L,1);
H3:=H1-(H1-H2)*0.382;
H4:=H1-(H1-H2)*0.5;
H5:=H1-(H1-H2)*0.618;
DRAWSL(ISLASTBAR,H1,0,1,1,COLORRED);
DRAWSL(ISLASTBAR,H2,0,1,1,COLORRED);
DRAWSL(ISLASTBAR,H3,0,1,1,COLORRED);
DRAWSL(ISLASTBAR,H4,0,1,1,COLORRED);
DRAWSL(ISLASTBAR,H5,0,1,1,COLORRED);
批注
当日K线根数固定表达方式:
N:=BARSLAST(DATE<>REF(DATE,1))+1;
前一日K线根数:
NN:=VALUEWHEN(N=1,REF(BARSLAST(DATE<>REF(DATE,1)),1))+1;
前一日的高低价,再重新思考一下。
另外思考一下,水平线后面标注数字,应该怎么写?
修改
N:=BARSLAST(DATE<>REF(DATE,1))+1;//当日K线根数固定表达方式
//前一日的高低价,再重新思考一下:
H1:=REF(HHV(H,N),N);//前一日的最高价
H2:=REF(LLV(L,N),N);//前一日的最低价
H3:=H1-(H1-H2)*0.382;//在前一日的最高价和前一日的最低价之间做比例为0.382的黄金分割
H4:=H1-(H1-H2)*0.5;//在前一日的最高价和前一日的最低价之间做比例为0.5的黄金分割
H5:=H1-(H1-H2)*0.618; //在前一日的最高价和前一日的最低价之间做比例为0.618的黄金分割
//DRAWSL(COND,DATA,SLOPE,LEN,EXPAND,COLOR);
//当条件COND满足时,在DATA数据处以每个周期相差SLOPE个价位作为斜率画LEN个周期长的线段。
//SLOPE,即每根K线与每根K线(每个周期)的纵向高度差,当SLOPE为0时画的是水平线
//EXPAND为画线延长方式0:不延伸;1:向左延伸;2:向右延伸;3:双向延伸。
DRAWSL(ISLASTBAR,H1,0,1,1,COLORRED);//向左延伸,画前一日的最高价的1个周期长的水平线
DRAWSL(ISLASTBAR,H2,0,1,1,COLORRED);//向左延伸,画前一日的最低价的1个周期长的水平线
DRAWSL(ISLASTBAR,H3,0,1,1,COLORRED);//向左延伸,画前一日的比例为0.382的1个周期长的水平线
DRAWSL(ISLASTBAR,H4,0,1,1,COLORRED);//向左延伸,画前一日的比例为0.5的1个周期长的水平线
DRAWSL(ISLASTBAR,H5,0,1,1,COLORRED);//向左延伸,画前一日的比例为0.618的1个周期长的水平线
//另外思考一下,水平线后面标注数字,应该怎么写?
//DRAWNUMBER(COND,DATA,NUMBER,PRECISION,COLOR);
//当条件满足时在DATA位置写数字NUMBER。PRECISION为精度(小数点后有几位数字)。COLOR为颜色。
DRAWNUMBER(ISLASTBAR,H3,0.382,3,COLORRED);//在前一日的比例为0.382的1个周期长的水平线后面标注数字0.382
DRAWNUMBER(ISLASTBAR,H4,0.5,3,COLORBLUE);//在前一日的比例为0.5的1个周期长的水平线后面标注数字0.5
DRAWNUMBER(ISLASTBAR,H5,0.618,3,COLORGREEN);//在前一日的比例为0.618的1个周期长的水平线后面标注数字0.618
练习14:
IF合约,30分钟周期上,把每日的最高价最低价框起来。
//练习14:IF合约,30分钟周期上,把每日的最高价最低价框起来。
PERIOD=6;//30分钟周期
N:=BARSLAST(DATE<>REF(DATE,1))+1;//定义当天的K线根数N
HH:=HHV(H,N);//最低点
LL:=LLV(L,N);//最高点
//画两条竖线:
DRAWLINE(,,,,COLORGREEN),LINETHICK1;
DRAWLINE(,,,,COLORGREEN),LINETHICK1;
//画两条水平横线
DRAWSL(,,,,,COLORGREEN),LINETHICK1;
DRAWSL(,,,,,COLORGREEN),LINETHICK1;
//如何定义最高价和最低价框框的四周横线?
批注
加载到30分钟周期上,是K线图上选择30分钟就可以了,不能用period来确定条件。
第一条竖线,条件是每天的第一根K线,画线的位置是当日的最高价到最低价。因为是是当日的第一根K线,所以用refx来向后引用。
第二条竖线,是每天的最后一根看线。
横线,条件是最后一根K线,向前画N-1斜率的横线。?
修改
N:=BARSLAST(DATE<>REF(DATE,1))+1;//分钟周期,当日K线数。
DRAWLINE(DAYBARPOS=1,REFX(HHV(H,N),18),DAYBARPOS=1,REFX(LLV(L,N),18),COLORBLUE),LINETHICK1;//第一条竖线,条件是每天的第一根K线,画线的位置是当日的最高价到最低价。
DRAWLINE(ISLASTKLINE=1,HHV(H,N),ISLASTKLINE=1,LLV(L,N),COLORBLUE),LINETHICK1;//第二条竖线,是每天的最后一根K线
DRAWSL(ISLASTKLINE=1,HHV(H,N),0,-(N-1),0,COLORBLUE),LINETHICK1;//第一条横线
DRAWSL(ISLASTKLINE=1,LLV(L,N),0,-(N-1),0,COLORBLUE),LINETHICK1;//第二条横线
练习:15
当MACD死叉后,
判断本次死叉到金叉之间DIFF的最大值、K线最高价,
和上次死叉到金叉之间的DIFF最大值、K线最高价作比较。
如果K线创新高,但是DIFF值没创新高,
那么认为顶背离条件成立。
//MACD
DIFF:EMA(CLOSE,12)-EMA(CLOSE,26);//短周期与长周期的收盘价的指数平滑移动平均值做差。
DEA:EMA(DIFF,9);//DIFF的M个周期指数平滑移动平均
MACD:2*(DIFF-DEA),NODRAW;//定义MACD,不画线
JC: CROSS(DIFF,DEA);//MACD金叉
SC:CROSSDOWN(DIFF,DEA);//MACD死叉
HDIFF1:=VALUEWHEN(JC,HHV(DIFF,BARSLAST(SC)));//本次死叉到金叉之间DIFF的最大值、
HH1:=VALUEWHEN(JC,HHV(H,BARSLAST(SC)));//本次死叉到金叉之间K线最高价
N:=BARSLAST(SC)+1;
HDIFF2:REF(HHV(DIFF,BARSLAST(JC)),N);//上次死叉到金叉之间的DIFF最大值
HH2:REF(HHV(H,BARSLAST(JC)),N);//上次死叉到金叉之间的K线最大值;
DBL:HDIFF1<=HDIFF2&&HH1>=HH2;//如果K线创新高,但是DIFF值没创新高,那么认为顶背离条件成立。
练习16:
当价格同时向上突破5周期均线、10周期均线、20周期均线并且这三条均线多头排列的时候,买开仓
当价格同时向下突破5周期均线、10周期均线、20周期均线并且这三条均线空头排列的时候,卖开仓
5周期均线下穿10周期均线,卖平仓
5周期均线上穿10周期均线,买平仓
MA5:MA(C,5);
MA10:MA(C,10);
MA20:MA(C,20);
AA:MA5>MA10 AND MA10>MA20;
BB:CROSSUP(C,MA5)&&CROSSUP(C,MA10)&&CROSSUP(C,MA20);
BB&&COUNT(AA,3)=3,BK('A',1);
CC:MA5<MA10 AND MA10<MA20;
DD:CROSSDOWN(C,MA5)&&CROSSDOWN(C,MA10)&&CROSSDOWN(C,MA20);
DD&&COUNT(CC,3)=3,SK('B',1);
CROSSUP(MA5,MA10),BP('C',1);
CROSSDOWN(MA5,MA10),SP('D',1);
批注
没有强调要 写几个组,写普通一个组就可以。
多头排列不是计数,用下面表示多头排列
MA5>MA10&&MA10>MA20
相反表示空头排列
修改
MA5:MA(C,5);
MA10:MA(C,10);
MA20:MA(C,20);
AA:MA5>MA10&&MA10>MA20;//多头排列
BB:CROSSUP(C,MA5)&&CROSSUP(C,MA10)&&CROSSUP(C,MA20);//价格同时向上突破5周期均线、10周期均线、20周期均线
AA&&BB,BK(1);//当价格同时向上突破5周期均线、10周期均线、20周期均线并且这三条均线多头排列的时候,买开仓
CC:MA5<MA10&&MA10<MA20;//空头排列
DD:CROSSDOWN(C,MA5)&&CROSSDOWN(C,MA10)&&CROSSDOWN(C,MA20);//价格同时向下突破5周期均线、10周期均线、20周期均线
CC&&DD,SK(1);//当价格同时向下突破5周期均线、10周期均线、20周期均线并且这三条均线空头排列的时候,卖开仓
CROSSDOWN(MA5,MA10),SP(1);//5周期均线下穿10周期均线,卖平仓
CROSSUP(MA5,MA10),BP(1);//5周期均线上穿10周期均线,买平仓
练习17:
K值在20以下,金叉开多。
K值突破65平仓,
K值在20到65之间不管金叉死叉都不平仓。
K在65以上,死叉开空仓,
K值到20,平仓。
在20到65之间,不管死叉金叉都不开平仓。
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:=SMA(RSV,3,1);
D:=SMA(K,3,1);
K>20&&CROSS(K,D),BK;
K>65,SP;
K>65&&CROSSDOWN(K,D),SK;
K<20,BP;
AUTOFILTER;
练习18:
5,10周期均线金叉,开仓1手多单
当前的5均线连续2周期上涨开多仓3手,
未平仓前
价格每上涨2个点加仓1手
5,10均线死叉同时KD死叉平仓
MA5: =MA (CLOSE, 5);
MA10:=MA(CLOSE, 10);
CROSS(MA5,MA10),BK(1);
5,10周期均线金叉,开仓1手多单:
MA5:(MA,5);
MA10:(MA,10);
CROSS(MA5,MA10),BK(1);
5,10均线死叉:CROSS(MA10,MA5);
KD死叉:CROSSDOWN(K,D);
5,10均线死叉同时KD死叉平仓:CROSS(MA10,MA5)&&CROSSDOWN(K,D),CLOSEOUT;
批注
第一次开仓是多头为0时开仓,
第二次开仓是多头为1时价差。
未平仓也用BKVOL来限制。
再将完整模型重新总结一下
连续上涨可以用every来写
这里可以用C>BKPRICE + MINPRICE * 2
需要定义K和D
修改
MA5:MA(C,5);
MA10:MA(C,10);
AA:CROSS(MA5,MA10);//5,10周期均线金叉
BKVOL=0&&AA,BK(1);//多头理论持仓为0并且5,10周期均线金叉时,开仓1手多单
BB:EVERY(MA5>REF(MA5,1),2)=1//当前的5均线连续2周期上涨
BKVOL=1&&BB,BK(3);//多头理论持仓为1并且当前的5均线连续2周期上涨时,开多仓3手
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;//未成熟随机值(RSV)=(收盘价-N日内最低价)/(N日内最高价-N日内最低价)*100
//SMA(X,N,M) 求X的N个周期内的扩展指数加权移动平均。M为权重。
K:SMA(RSV,3,1);//K=RSV的M1日加权移动平均
D:SMA(K,3,1);//.D=K的M2日加权移动平均
//参数N设置为9日,参数M1设置为3日,参数M2设置为3日。参数N、M1、M2还有其他设置方法吗?
BB:=CROSS(D,K);//KD死叉
//KD死叉
IF BKVOL=4 THEN//未平仓前
题目中想表达的,先有条件1开仓1手;然后条件2,开仓3手;
如果没有满足平仓条件,那么持仓是4手,就可以用BKVOL>1,来表示没有平仓,如果平仓了,会平掉所有持仓。
这里不需要IF,直接条件就行
BEGIN
C>BKPRICE+MINPRICE*2,BK(1);//价格每上涨2个点加仓1手
AA&&BB,CLOSEOUT;//5,10均线死叉同时KD死叉平仓
END
提示里面:
什么是加减仓模型?
加减仓模型,允许连续出开仓信号或者连续出平仓信号,可实现加仓、减仓。
对于需要进行加、减仓操作的交易者,在策略执行的时候希望开仓后的下一个动作依然可以是开仓,或者能够连续分批平仓。如果是开一平信号过滤模型,开仓后只能是与之对应的平仓操作,这样就无法实现加仓、减仓策略。加减仓模型允许连续出开仓信号或者连续出平仓信号,可解决这个问题。
过滤是筛选符合条件的合约的意思吗?
一开一平模型属于过滤模型。
回溯算法的理解:
即穷举法,从一条路往前走,能进则进,不能进则退回来,换一条路再试。
我们软件在K线图上计算,可以理解为想要计算当前位置的值,需要从第一根K线来计算值,表示有回溯性。例如SMA5
穷举法,类似我们软件的参数优化,把所有可能都列举出来。
练习19:
K线向上穿过120周期均线,并且当根k线开盘价小于收盘价,且均线向上,
当价格突破穿过均线的那根K线的最高价买入,开仓占可用资金的30%
多单:止损1%,止盈5%
K线向下穿过120周期均线,并且当根k线开盘价大于收盘价,且均线向上,
当价格突破穿过均线的那根K线的最低价卖出,开仓占可用资金的30%
空单:止损1%,止盈5%
MA120:=MA(C,120);//定义120周期均线,加载时不显示线
AA:=CROSSUP(C,MA120);//K线向上穿过120周期均线
BB:=OPEN<CLOSE;//当根K线开盘价小于收盘价
CC:=MA120>REF(MA120,1);//均线向上
AAA:=AA&&BB&&CC;//K线向上穿过120周期均线,并且当根K线开盘价小于收盘价,且均线向上,
HH:=VALUEWHEN(AA,H);穿过均线的那根K线的最高价
/*批注:HHV是取每根K线的最高价。
要想用满足条件的K线上的最高价
用VALUEWHEN来取*/
K:=MONEY*0.3/(C*MARGIN*UNIT+FEE);//模组子账户可用资金的30%可以开仓的手数
/*批注:模型编写后,要先检测是否能测试通过
SETDEALPERCENT(30);不能赋值给变量
MONEY用来取可用资金。试着用这个函数来计算手数*/
AAA&&C>HH,BK(K);//当价格突破穿过均线的那根K线的最高价买入,开仓占可用资金的30%
TMP1:=C<BKPRICE*(1-0.01),SP(BKVOL);//多单止损1%
TMP3:=C>BKPRICE*(1+0.05),SP(BKVOL);//多单止盈5%
//批注:平仓手数,是要平掉所有多头持仓,可以用BKVOL来写
DD:=CROSSDOWN(C,MA120);//K线向下穿过120周期均线
EE:OPEN>CLOSE;//当根K线开盘价大于收盘价
FF:MA120>REF(MA120,1);//均线向上,
DD&&EE&&FF;//K线向下穿过120周期均线,并且当根K线开盘价大于收盘价,且均线向上,
LL:=LLV(L,AA);//穿过均线的那根K线的最低价
C>LL,SK(Z);//当价格突破穿过均线的那根K线的最低价卖出,开仓占可用资金的30%
TMP2:=C>SKPRICE*(1+0.01),BP(BKVOL);//空单止损1%
TMP4:=C<SKPRICE*(1-0.05),BP(BKVOL);//空单止盈5%
批注
HHV是取每根K线的最高价。
要想用满足条件的K线上的最高价
用VALUEWHEN来取
模型编写后,要先检测是否能测试通过
SETDEALPERCENT(30);不能赋值给变量
MONEY用来取可用资金。试着用这个函数来计算手数
平仓手数,是要平掉所有多头持仓,可以用BKVOL来写
空头同理
练习20:
当工业品5日均线大于20日均线后,
5天内,
如果铜的5日均线大于10日均线,
则入场铜,
超过5天,
风险加大,就不入场了;
如果铜的5日均线大于10日均线先出现,
工业品5日均线大于20日均线就入场。
//批注:注意一下隐含条件,条件1到当前的位置要大于条件2到当前的位置
开仓后
上涨超过开仓价+开仓时2.5倍ATR为止赢条件,
下跌超过开仓价-开仓时1.5倍ATR为止损条件。
//可以这样分别编写工业品和铜的均线公式吗?(不可以!)
MA5铜:=MA(C,5);//铜的5日均线
MA10铜:=MA(C,10);//铜的10日均线
MA5工业品:=MA(C,5);//工业品的5日均线
MA20工业品:=MA(C,20);//工业品的20日均线
IF MA5工业品>MA20工业品 THEN//当工业品5日均线大于20日均线后
BEGIN
IF BARSLAST(MA5铜>MA10铜)<5 THEN
BK('铜',1);//5天内,如果铜的5日均线大于10日均线,则入场铜,
END
//超过5天,
//不入场了(不入场需要用公式表达吗?)
IF MA5铜>MA10铜 THEN//如果铜的5日均线大于10日均线先出现,
BEGIN
IF MA5工业品>MA20工业品 THEN
BK('铜',1);//工业品5日均线大于20日均线就入场。
END
IF BK('铜',1) THEN//开仓后
//上涨超过开仓价+开仓时2.5倍ATR为止赢条件,
//下跌超过开仓价-开仓时1.5倍ATR为止损条件。
批注
此处涉及到两个合约,需要考虑,跨合约模型。
重新考虑,用跨合约模型来编写
//不入场了(不入场需要用公式表达吗?)》这个和5天内,入场铜,一起表达就可以。
不用IF....THEN
跨合约周期重新编写一下。
ATR参考 摆动分析里ATR模型。
修改
//查到工业品的文华码是7193
//查到沪铜指数的文华码是2100
MA5:MA(C,5);
MA10:MA(C,10);
MA20:MA(C,20);
AA:CROSS(MA5,MA20);
BB:CROSS(MA5,MA10);
#CALL[7193,工业品] AS 工业品
#CALL[2100,铜] AS 铜
AA1:工业品.AA;//工业品的5日均线大于20日均线
AA2:铜.BB;//铜的5日均线大于10日均线
尽量用英文名来写。
变量命名规则支持汉字,但是平时编写尽量少用汉字,因为变量多的时候,用汉字一个是不好区分,还会显得很乱
IF DAY<=5 THEN//5天内
Wh8里,在全局变量中,才会用到IF....THEN...BEGIN...END
趋势模型,一般不会用到这个句式。
BEGIN
AA2,BK(1);//如果铜的5日均线大于10日均线,则入场铜(BK函数的括号内需要标明入场的是铜而不是工业品吗?如果需要,应该怎么表示呢?)
重新学习一下,跨周期、跨合约、跨指标模型。
END
IF AA2 THEN //如果铜的5日均线大于10日均线先出现,
BEGIN
AA1,BK(1);//工业品5日均线大于20日均线就入场。
END
//定义ATR(平均真实波动范围,这一指标主要用来衡量价格的波动)
TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//求最高价减去最低价,一个周期前的收盘价减去最高价的绝对值,一个周期前的收盘价减去最低价的绝对值,这三个值中的最大值
ATR:MA(TR,14);//求14个周期内的TR的简单移动平均
IF BKVOL>=1 THEN//开仓后(不用IF....THEN,跨合约周期应该怎么表示呢?)
//BKPRICE:返回数据合约最近一次买开信号价位
//BARSBK:取上一次买开信号位置
C>BKPRICE+2.5*REF(ATR,BARSBK),SP(1);//上涨超过开仓价+开仓时2.5倍ATR为止赢条件,
C<BKPRICE-1.5*REF(ATR,BARSBK),SP(1);//下跌超过开仓价-开仓时1.5倍ATR为止损条件。
重新学习
//定义ATR(平均真实波动范围,这一指标主要用来衡量价格的波动)
TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//求最高价减去最低价,一个周期前的收盘价减去最高价的绝对值,一个周期前的收盘价减去最低价的绝对值,这三个值中的最大值
ATR:MA(TR,14);//求14个周期内的TR的简单移动平均
//新建被引用指标JC,JC1
MA5:MA(C,5);
MA10:MA(C,10);
MA20:MA(C,20);
JC:=MA5>MA10;
JC1:=MA5>MA20;
//新建跨周期主模型
#IMPORT[DAY,5,DD] AS VAR1
//查到工业品的文华码是7193
//查到沪铜指数的文华码是2100
//新建跨合约模型
#CALL[7193,GYP] AS GYP
#CALL[2100,TON] AS TON
//批注:这里可以加载到铜K线上,就不用再引用铜合约指标了
JC:TON.JC
JC1:GYP.JC1
JC1&&VAR1.JC,BK;
JC&&JC1,BK;//如果铜的5日均线大于10日均线先出现,工业品5日均线大于20日均线就入场。
ISLASTBK&&C>BKPRICE+2.5*REF(ATR,BARSBK),SP;//上涨超过开仓价+开仓时2.5倍ATR为止赢条件,
ISLASTBK&&C<BKPRICE-1.5*REF(ATR,BARSBK),SP;//下跌超过开仓价-开仓时1.5倍ATR为止损条件。
当工业品5日均线大于20日均线后,
5天内,如果铜的5日均线大于10日均线,则入场铜,
超过5天,
风险加大,就不入场了;
如果铜的5日均线大于10日均线先出现,工业品5日均线大于20日均线就入场。
开仓后
上涨超过开仓价+开仓时2.5倍ATR为止赢条件,
下跌超过开仓价-开仓时1.5倍ATR为止损条件。
跨合约练习20:
当工业品5日均线大于20日均线后,
5天内,
如果铜的5日均线大于10日均线,
则入场铜,
超过5天,
风险加大,就不入场了;
如果铜的5日均线大于10日均线先出现,
工业品5日均线大于20日均线就入场。
开仓后
上涨超过开仓价+开仓时2.5倍ATR为止赢条件,
下跌超过开仓价-开仓时1.5倍ATR为止损条件。
//新建被引用指标JC,JC1
MA5:MA(C,5);
MA20:MA(C,20);
JC1:=MA5>MA20;
保存指标,命名为AA
//加载到铜k线上
//定义ATR(平均真实波动范围,这一指标主要用来衡量价格的波动)
TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//求最高价减去最低价,一个周期前的收盘价减去最高价的绝对值,一个周期前的收盘价减去最低价的绝对值,这三个值中的最大值
ATR:MA(TR,14);//求14个周期内的TR的简单移动平均
//查到工业品的文华码是7193
//查到沪铜指数的文华码是2100
//新建跨合约模型
#CALL[7193,AA] AS GYP
//批注:这里可以加载到铜K线上,就不用再引用铜合约指标了
MA5:MA(C,5);
MA10:MA(C,10);
JC1:GYP.JC1;
JC:=MA5>MA10;
NN:=BARSLAST(JC);
JC1&&NN<=5&&JC,BK;//当工业品5日均线大于20日均线后,5天内,如果铜的5日均线大于10日均线,则入场铜
VALUEWHEN(JC&&JC1,BARSLAST(JC1)<BARSLAST(JC))=1,BK;//如果铜的5日均线大于10日均线先出现,工业品5日均线大于20日均线就入场。
//批注:注意一下隐含条件,条件1到当前的位置要大于条件2到当前的位置
ISLASTBK&&C>BKPRICE+2.5*REF(ATR,BARSBK),SP;//上涨超过开仓价+开仓时2.5倍ATR为止赢条件,
ISLASTBK&&C<BKPRICE-1.5*REF(ATR,BARSBK),SP;//下跌超过开仓价-开仓时1.5倍ATR为止损条件。
AUTOFILTER;
//保存指标,命名为LX20
跨周期模型
练习21:
基于30分钟,
上一波红柱区域的最高价大于上上波红柱区域的最高价时,
只要满足3分钟均线粘合(5、10、20、60均线差值小于5),就反手做多;
30分钟上一波绿柱区域的最高价小于上上波绿柱区域的最低价时,
只要满足3分钟均线粘合就反手做空。
MA5:MA(C,5);
MA10:MA(C,10);
MA20:MA(C,20);
MA60:MA(C,60);
//ABS(X):取的X的绝对值。
/*AA1:=ABS( MA5-MA10)<5;
AA2:=ABS( MA5-MA20)<5;
AA3:=ABS( MA5-MA60)<5;
AA4:=ABS( MA10-MA20)<5;
AA5:=ABS( MA10-MA60)<5;
AA6:=ABS( MA20-MA60)<5;
AA:AA1&&AA2&&AA3&&AA4&&AA5&&AA6;//3分钟均线粘合*/
AA:MAX(MA60,MA20,MA10,MA5)-MIN(MA60,MA20,MA10,MA5)<5;//3分钟均线粘合
/*批注:这样写没有问题,就是比麻烦。
可以用这几个数的最大值-最小值<5.来表达*/
//分析MACD柱状线。
DIFF : (EMA(CLOSE,12) - EMA(CLOSE,26))*100;
DEA : EMA(DIFF,9);
MACD : 2*(DIFF-DEA);
JC: CROSS(DIFF,DEA);//MACD金叉
SC:CROSSDOWN(DIFF,DEA);//MACD死叉
//上一波红柱即上一次金叉到死叉;上一波绿柱即上一次死叉到金叉
N:=BARSLAST(JC)+1;
N1:=BARSLAST(SC)+1;
H1:=REF(HHV(H,N),N1);//上波绿柱最高价;
H2:=REF(HHV(H,N1),N);//上波红柱最高价;
H3:=REF(HHV(H2,N1),N);//上上波红柱最高价;
L1:=REF(LLV(L,N),N1);//上波绿柱最低价;
L2:=REF(LLV(L1,N),N1);//上上波绿柱最低价;
/*问题1:REF(MACD>0,1)不能直接用ref来取一波行情。Ref只能取前1根
问题2:HHV(REF(MACD>0,1),1)取1个周期最高价么*/
AA&&H2>H3,BPK;//上一波红柱区域的最高价大于上上波红柱区域的最高价时,只要满足3分钟均线粘合,就反手做多;
AA&&H1>L2,SPK;//30分钟上一波绿柱区域的最高价小于上上波绿柱区域的最低价时,只要满足3分钟均线粘合就反手做空
AUTOFILTER;
练习22:
在5分钟K线图上,
当时间大于9:15,价格大于分时图均价线20个点时买开,
低于分时图均价线20个点时候卖开,
开仓后,价格反向运行到均价线平仓,日内交易,不留仓。
/*SETTLE 取得K线图的结算价或者取得当日成交均价
注:
1、日线周期,盘中返回的是全天成交均价;收盘后返回交易所公布的结算价。
2、分钟周期,返回的是截止到当前k线的全天成交均价。*/
TIME>0915&&TIME<1459&&(C-SETTLE)*100>20,BK;//当时间大于9:15,价格大于分时图均价线20个点时买开,
TIME>0915&&TIME<1459&&(C-SETTLE)*100<20,SK;//当时间大于9:15,价格低于分时图均价线20个点时候卖开,
ISLASTBK&&(C-SETTLE)*100<=20,SP;//买开仓后,价格反向运行到均价线平仓
ISLASTSK&&(C-SETTLE)*100>20,SP;//卖开仓后,价格反向运行到均价线平仓
CLOSEMINUTE<=1,CLOSEOUT;//收盘前1分钟,清仓
练习22:
在5分钟K线图上,
当时间大于9:15,价格大于分时图均价线20个点时买开,
低于分时图均价线20个点时候卖开,
开仓后,价格反向运行到均价线平仓,日内交易,不留仓。
//批注:因为是当前的价格要满足一个条件,所以最好将C单独放一边,C>SETTLE+20*MINPRICE
TIME>0915&&TIME<1459&&C>SETTLE+20*MINPRICE,BK;//当时间大于9:15,价格大于分时图均价线20个点时买开,
TIME>0915&&TIME<1459&&C>SETTLE+20*MINPRICE,SK;//当时间大于9:15,价格低于分时图均价线20个点时候卖开,
///批注:一开一平模型,BK信号下一个信号一定是SP,SPK,所以这里不用写ISLASTBK
C>SETTLE+20*MINPRICE,SP;//买开仓后,价格反向运行到均价线平仓
C>SETTLE+20*MINPRICE,BP;//卖开仓后,价格反向运行到均价线平仓
CLOSEMINUTE<=1,CLOSEOUT;//收盘前1分钟,清仓
AUTOFILTER;
练习23:
10分钟连续两根的ADX向上,且5分钟均线呈多头排列,同时在1小时价格大于布林上轨时做多,10分钟连续两根的ADX向上,且5分钟均线呈空头排列,同时在1小时价格小于布林下轨时做空,开仓后做多下跌1%止损,上涨1%止盈,做空上涨1%止损,下跌1%止盈
//定义ADX
TR := SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),N);//最高价与最低价做差,最高价与前一周期收盘价做差,最低价与前一周期收盘价作差,在上述三个数据中取绝对值最大者,对该最大值做N周期累加求和。。
HD := HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD := REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),N);//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),N);//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI: DMP*100/TR;
MDI: DMM*100/TR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,M);//MDI与PDI差的绝对值与(MDI+PDI)*100做比值,取该比值的M个周期均值。
BB:EVERY(ADX>REF(ADX,1),2); //连续两根的ADX向上
MA5:MA(C,5);
MA10:MA(C,10);
MA20:MA(C,20);
MID:MA(CLOSE,26);//求N个周期的收盘价均线,称为布林通道中轨(N的缺省值为26)
TMP2:=STD(CLOSE,26);//求M个周期内的收盘价的标准差(M的缺省值为26)
TOP:MID+2*TMP2;//布林通道上轨(P的缺省值为2)
BOTTOM:MID-2*TMP2;//布林通道下轨(P的缺省值为2)
//跨周期模型
//如#IMPORT [MIN,2,MACD] AS VAR//引用两分钟周期MACD指标数值
#IMPORT[MIN,10,BB] AS BB10
BB1:=BB10.BB;//10分钟连续两根的ADX向上
#IMPORT[MIN,5,AA] AS AA5
MAA5:=AA5.MA5;
MAA10:=AA5.MA10;
MAA20:=AA5.MA20;
AA1:MAA5>MAA10&&MA10>MAA20;//5分钟均线呈多头排列
AA2:MAA5<MAA10&&MA10<MAA20;//5分钟均线呈空头排列
#IMPORT[HOUR,1,CC] AS CC1
TOP1:=CC1.TOP;
BOTTOM1:=CC1.BOTTOM;
CC2:=C>TOP1;//1小时价格大于布林上轨
CC3:=C<BOTTOM1;//1小时价格小于布林下轨
BB1&&AA1&&CC2,BK;
BB1&&AA2&&CC3,SK;
ISLASTBK && (C<BKPRICE*(1-0.01) || C>BKPRICE*(1+0.01)),SP;
ISLASTSK && (C>SKPRICE*(1+0.01) || C<SKPRICE*(1-0.01)),BP;
练习24:
MACD顶背离(上次MACD红柱期间合约最大值大于上上次MACD红柱期间合约最大值,而上次MACD红柱期间MACD最大值小于上上次MACD红柱期间MACD最大值),
或者KD顶背离(收盘价大于10个周期的最高收盘价并且KD小于10个周期的KD最大值)做多,
J下穿80,且KD或MACD死叉平多。
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26);//短周期与长周期的收盘价的指数平滑移动平均值做差。
DEA:=EMA(DIFF,9);//DIFF的M个周期指数平滑移动平均
MACD:2*(DIFF-DEA),NODRAW;//定义MACD,不画线
JC:CROSS(DIFF,DEA);//MACD金叉
SC:CROSSDOWN(DIFF,DEA);//MACD死叉
N1:BARSLAST(JC)+1;
N2:BARSLAST(SC)+1;
HH1:VALUEWHEN(SC,HHV(H,N1));//上次MACD红柱期间合约最大值
HH2:VALUEWHEN(SC,HHV(MACD,N1);//上次MACD红柱期间MACD最大值
HH3:VALUEWHEN(SC,REF(HH1,1));//上上次MACD红柱期间合约最大值
HH4:VALUEWHEN(SC,REF(HH2,1);//上上次MACD红柱期间MACD最大值
AA:HH1>HH3&&HH2<HH4//MACD顶背离
//KD指标
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:SMA(RSV,3,1);//RSV的移动平均值
D:SMA(K,3,1);//K的移动平均值
AA:C>HHV(C,10);//收盘价大于10个周期的最高收盘价
BB:K<HHV(K,10)&&D<HHV(D,10);//KD小于10个周期的KD最大值
AA&&BB,BK;
CC:CROSSDOWN(J,80);//J下穿80
SC2:CROSSDOWN(K,D);//KD死叉
DD:SC1||SC2;//KD或MACD死叉
EE:CC&&DD,SP;
练习25:
当日的开盘价加上0.5倍的ATR为上轨,减去0.5倍的ATR为下轨,
当价格上穿上轨并且瀑布线多头排列,反手做多;
当价格下穿下轨且瀑布线空头排列,反手做空。
TR : MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
//求最高价减去最低价,一个周期前的收盘价减去最高价的绝对值,一个周期前的收盘价减去最低价的绝对值,这三个值中的最大值
ATR : MA(TR,26);//求N个周期内的TR的简单移动平均(N的缺省值为26)
TOP:OPEN+0.5*ATR;//上轨
BOTTOM:OPEN-0.5*ATR;//下轨
PB1:=(EMA(CLOSE,4)+MA(CLOSE,4*2)+MA(CLOSE,4*4))/3;
PB2:=(EMA(CLOSE,6)+MA(CLOSE,6*2)+MA(CLOSE,6*4))/3;
PB3:=(EMA(CLOSE,9)+MA(CLOSE,9*2)+MA(CLOSE,9*4))/3;
PB4:=(EMA(CLOSE,13)+MA(CLOSE,13*2)+MA(CLOSE,13*4))/3;
PB5:=(EMA(CLOSE,18)+MA(CLOSE,18*2)+MA(CLOSE,18*4))/3;
PB6:=(EMA(CLOSE,24)+MA(CLOSE,24*2)+MA(CLOSE,24*4))/3; //用缺省值定义6条瀑布线
AA1:PB1>PB2&&PB2>PB3&&PB3>PB4&&PB4>PB5&&PB5>PB6;//瀑布线多头排列。
AA2:PB1<PB2&&PB2<PB3&&PB3<PB4&&PB4<PB5&&PB5<PB6;//瀑布线空头排列
BB1:CROSS(C,TOP);//价格上穿上轨
BB2:CROSSDOWN(C,BOTTOM);//价格下穿下轨
BB1&&AA1&&ISLASTSK,BPK;
BB2&&AA2&&ISLASTBK,SPK;
AUTOFILTER;
练习26:
价格大于KD或MACD金叉到死叉之间的最高价,并且价格上穿30周期最高价的EMA线反手;
价格小于KD或MACD死叉到金叉之间的最低价,并且价格下穿30周期最低价的EMA线反手。
//KD指标
RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
K:SMA(RSV,3,1);
D:SMA(K,3,1);
//MACD
DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26);//短周期与长周期的收盘价的指数平滑移动平均值做差。
DEA:=EMA(DIFF,9);//DIFF的M个周期指数平滑移动平均
MACD:2*(DIFF-DEA),NODRAW;//定义MACD,不画线
EMA30H:EMA(H,30);//30周期最高价的EMA线
EMA30L:EMA(L,30);//30周期最低价的EMA线
MACDJC:=CROSS(DIFF,DEA);//MACD金叉
MACDSC:=CROSSDOWN(DIFF,DEA);//MACD死叉
MACDHH:=VALUEWHEN(MACDSC,HHV(H,BARSLAST(MACDJC)+1));//MACD金叉到死叉之间的最高价
MACDLL:=VALUEWHEN(MACDJC,LLV(L,BARSLAST(MACDSC)+1));//MACD死叉到金叉之间的最低价
KDJC:=CROSS(K,D);//KD金叉
KDSC:=CROSSDOWN(K,D);///KD死叉
KDHH:=VALUEWHEN(KDSC,HHV(H,BARSLAST(KDJC)+1));//KD金叉到死叉之间的最高价
KDLL:=VALUEWHEN(KDJC,LLV(L,BARSLAST(KDSC)+1));//KD死叉到金叉之间的最低价
AA1:=C>KDHH||C>MACDHH;//价格大于KD或MACD金叉到死叉之间的最高价。
AA2:=C<KDLL||C<MACDLL;//价格小于KD或MACD死叉到金叉之间的最低价
BB1:=CROSS(C,EMA30H);//价格上穿30周期最高价的EMA线
BB2:=CROSSDOWN(C,EMA30L);//价格下穿30周期最低价的EMA线
AA1&&BB1&&ISLASTSK,BPK;
AA1&&BB1&&ISLASTBK,SPK;
AA2&&BB2&&ISLASTSK,BPK
AA2&&BB2&&ISLASTBK,SPK;
AUTOFILTER;
练习27:
SRA第一次出现红点的时候不做多,
价格再次突破第一个红点的K线最高价一个波动点的时候,并且布林中轨向上做多,
收盘价小于10均线平多;
SAR第一次出现绿点的时候不做空,
价格再次突破第一个绿点的K线最低价的一个波动单位时,并且布林中轨向下做空,
收盘价大10均线平空。
//定义SAR止损点
STEP1:=2/100;
MVALUE1:=20/100;
SARLINE:SAR(4,STEP1,MVALUE1),CIRCLEDOT;//N个周期的抛物转向,步长为STEP1,极限值为MVALUE1.(N的缺省值为4,STEP的缺省值为2,MVALU的缺省值为20)
//通过缺省值定义布林通道线
MID:MA(CLOSE,26);//求N个周期的收盘价均线,称为布林通道中轨
BLUP:MID>REF(MID,1);//布林中轨向上
BLDOWN:MID<REF(MID,1);//布林中轨向下
SARJC:CROSS(SARLINE,0);
SARSC:CROSSDOWN(SARLINE,0);
//IF(COND,A,B) 若COND条件成立,则返回A,否则返回B
//CIRCLEDOT 小圆点线
//例:MA5:MA(C,5),CIRCLEDOT,COLORCYAN;//用小圆点线画5周期均线,圆点线显示为青色。
IF(SARLINE>0||SARJC&&SARLINE=0,SARLINE,NULL),CIRCLEDOT,COLORRED;//SARLINE>0或者上穿0时画红色小圆点线
//ABS(X):取的X的绝对值。
IF(SARLINE<0||SARSC&&SARLINE=0,ABS(SARLINE),NULL),CIRCLEDOT,COLORGREEN;//SARLINE<0或者下穿0时画绿色小圆点线
HH:VALUEWHEN(SARJC,H);//第一个红点的K线最高价
LL:VALUEWHEN(SARSC,L);//第一个绿点的K线最低价
//SRA第一次出现红点的时候不做多,不做多需要用公式表达出来吗?
MA10:MA(C,10);
CROSS(C,HH+MINPRICE*1)&&BLUP,BK;//价格再次突破第一个红点的K线最高价一个波动点的时候,并且布林中轨向上做多
C<MA10,SP;//收盘价小于10均线平多
CROSSDOWN(C,LL-MINPRICE*1)&&BLDOWN,SK;//价格再次突破第一个绿点的K线最低价的一个波动单位时,并且布林中轨向下做空,
C>MA10,BP;//收盘价大10均线平空。
AUTOFILTER;
练习28(分组指令):
5日最高价和10日最高价的均线金叉,趋势上做多,相反做空;
价格低于买开以来5个最小变动价位或者收盘价小于5日最低价的均价,趋势上平仓,相反平空;
ASI指标向上突破前期高点,波段上做多;
ASI指标向下跌破前期低点,波段上做空;
创5根K线新低并且价格低于买开K线最低点,波段上平仓;平空相反;
MAHH5:MA(H,5);//5日最高价的均线
MAHH10:MA(H,10);//10日最高价的均线
MAHHJC:CROSS(MAHH5,MAHH10);//5日最高价和10日最高价的均线金叉
MAHHSC:CROSSDOWN(MAHH5,MAHH10);//5日最高价和10日最高价的均线死叉
MAHHJC,BK('A');
MAHHSC,SK('A');
AA1:C<BKPRICE-5*MINPRICE;//价格低于买开以来5个最小变动价位
AA2:C>BKPRICE-5*MINPRICE;//价格高于买开以来5个最小变动价位
MALL5:MA(L,5);//5日最低价的均价
BB1:C<MALL5;//收盘价小于5日最低价的均价
BB2:C>MALL5;//收盘价大于5日最低价的均价
AA1||BB1,SP('A');
AA2||BB2,BP('A');//价格低于买开以来5个最小变动价位或者收盘价小于5日最低价的均价,趋势上平仓,相反平空
//定义ASI震动升降指标
LC:=REF(CLOSE,1);//一个周期前的收盘价
AA:=ABS(HIGH-LC);//最高价与一个周期前的收盘价的差值的绝对值
BB:=ABS(LOW-LC);//最低价与一个周期前的收盘价的差值的绝对值
CC:=ABS(HIGH-REF(LOW,1));//最高价与一个周期前的最低价的差值的绝对值
DD:=ABS(LC-REF(OPEN,1));//一个周期前的收盘价与一个周期前的开盘价的差值的绝对值
R:=IFELSE(AA>BB&&AA>CC,AA+BB/2+DD/4,IFELSE(BB>CC&&BB>AA,BB+AA/2+DD/4,CC+DD/4));//如果AA>BB&&AA>CC,R取值为AA+BB/2+DD/4,如果BB>CC&&BB>AA,R取值为BB+AA/2+DD/4,否则R取值为CC+DD/4
X:=(CLOSE-LC+(CLOSE-OPEN)/2+LC-REF(OPEN,1));//最新价减去一个周期前的收盘价加上开盘价与最新价的二分之一,再加上一个周期前的收盘价与开盘价的差值
SI:=16*X/R*MAX(AA,BB);
ASI:SUM(SI,0);//从本地数据第一个数据开始求SI的总和
//BARPOS,返回从第一根K线开始到当前的周期数。
CROSS(ASI,HV(ASI,BARPOS)),BK('B');//ASI指标向上突破前期高点,波段上做多;
CROSSDOWN(ASI,LV(ASI,BARPOS)),SK('B');//ASI指标向下跌破前期低点,波段上做空;
LL1:L<=LLV(L,5);//K线创5天新低
LL2:C<REF(L,BARSBK);//价格低于买开K线最低点
//批注:REF不算当根,这里BARSBK不用加1
HH1:H>=HHV(H,5);//K线创5天新高
HH2:C>REF(H,BARSBK);//价格高于买开K线最高点
LL1&&LL2,SP('B');
HH1&&HH2,BP('B');//创5根K线新低并且价格低于买开K线最低点,波段上平仓;平空相反;
AUTOFILTER;
练习29(分组指令):
价格突破5日新低并且最低价小于布林通道线的下轨,趋势上做多;
满足5个最小变动价位止损或者最高价大于布林通道线的上轨,趋势上平仓;
RSI短线指标小于RSI长线指标并且RSI短线指标小于50,波段上做多;
RSI短线指标大于RSI长线指标并且RSI长线指标大于80,波段上平仓;
//通过缺省值定义布林通道线
MID:MA(CLOSE,26);//求N个周期的收盘价均线,称为布林通道中轨(N的缺省值为26)
TMP2:=STD(CLOSE,26);//求M个周期内的收盘价的标准差(M的缺省值为26)
TOP:MID+2*TMP2;//布林通道上轨(P的缺省值为2)
BOTTOM:MID-2*TMP2;//布林通道下轨(P的缺省值为2)
AA1:L<=LLV(L,5);//K线创5天新低
AA2:L<BOTTOM;//最低价小于布林通道线的下轨
AA1&&AA2,BK('A');//价格突破5日新低并且最低价小于布林通道线的下轨,趋势上做多
/*STOP(GROUP,TYPE,N),在TYPE基础上,N个最小变动单位对GROUP组别持仓止损止盈
TYPE取值为0-5,分别代表在以下价格的基础上止损止盈。
0代表数据合约最近一次买开信号价位
1代表交易合约最近一次买开信号价位
2代表模组子账户交易合约多头开仓均价
3代表数据合约最近一次卖开信号价位
4代表交易合约最近一次卖开信号价位
5代表模组子账户交易合约空头开仓均价
例:
CROSSUP(C,MA(C,5)),BK('A');//最新价上穿5周期均线,A组开多单;
STOP('A',0,-10);//亏损10个最小变动价位,A组多单止损;*/
BB:H>TOP;//最高价大于布林通道线的上轨
C>=BKPRICE+5*MINPRICE||BB,SP('A');//满足5个最小变动价位止损或者最高价大于布林通道线的上轨,趋势上平仓;
//批注:STOP也是指令,不能和SP指令一起使用
//用缺省值定义RSI相对强弱指标
LC := REF(CLOSE,1);//前一周期收盘价
RSI1:SMA(MAX(CLOSE-LC,0),7,1)/SMA(ABS(CLOSE-LC),7,1)*100;//当根K线收盘价与前一周期收盘价做差,在该差值与0之间取最大值,做N1周期移动平均。收盘价与前一周期收盘价做差值,取该差值的N1周期移动平均值,两平均值之间做比值。
RSI2:SMA(MAX(CLOSE-LC,0),14,1)/SMA(ABS(CLOSE-LC),14,1)*100;//当根K线收盘价与前一周期收盘价做差,在该差值与0之间取最大值,做N2周期移动平均。收盘价与前一周期收盘价做差值,取该差值的N2周期移动平均值,两平均值之间做比值。
BACKGROUNDSTYLE(0);
RSI1<RSI2&&RSI1<50,BK('B');//RSI短线指标小于RSI长线指标并且RSI短线指标小于50,波段上做多
RSI1>RSI2&&RSI2>80,SP('B');//RSI短线指标大于RSI长线指标并且RSI长线指标大于80,波段上平仓
AUTOFILTER;
练习30(分组指令):
DMI指标中,PDI上穿MDI指标,首次开仓1手,记为第一组开仓;
ADX大于50或者ADXR<25,第一次加仓2手,记为第一组加仓;
CDP指标中,价格上穿AH指标第二次加仓1手,记为第二组开仓;
对于第一次加仓,PDI下穿MDI指标,平掉对应组别持仓;
对于第二次加仓,价格下穿AL指标,平掉对应组别持仓;
//通过缺省值定义DMI趋向指标
TR := SUM(MAX(MAX(HIGH-LOW,ABS(HIGH-REF(CLOSE,1))),ABS(LOW-REF(CLOSE,1))),14);//最高价与最低价做差,最高价与前一周期收盘价做差,最低价与前一周期收盘价作差,在上述三个数据中取绝对值最大者,对该最大值做N周期累加求和。。
HD := HIGH-REF(HIGH,1);//最高价与前一周期最高价做差
LD := REF(LOW,1)-LOW;//前一周期最低价与最低价做差
DMP:= SUM(IFELSE(HD>0 && HD>LD,HD,0),14);//如果HD>0并且HD>LD,取HD否则取0,对取值做N周期累加求和。
DMM:= SUM(IFELSE(LD>0 && LD>HD,LD,0),14);//如果LD>0并且LD>HD,取LD否则取0,对取值做N周期累加求和。
PDI: DMP*100/TR;
MDI: DMM*100/TR;
ADX: MA(ABS(MDI-PDI)/(MDI+PDI)*100,6);//MDI与PDI差的绝对值与(MDI+PDI)*100做比值,取该比值的M个周期均值。
ADXR:(ADX+REF(ADX,6))/2;
BACKGROUNDSTYLE(1);
BKVOL=0&&CROSS(PDI,MDI),BK('A',1);//PDI上穿MDI指标,首次开仓1手,记为第一组开仓
//批注:注意一下加减仓条件有开仓先后顺序,需要用BKVOL来控制开仓顺序。
BKVOL>0&&ADX>50||ADXR<25,BK('A',2);//ADX大于50或者ADXR<25,第一次加仓2手,记为第一组加仓;
CDP:=(H+L+C*2)/4;//定义CDP 逆市操作指标
AH:=CDP+(H-L);//最高值
AL:=CDP-(H-L);//最低值
ISLASTSP&&CROSS(C,AH),BK('B',1);//CDP指标中,价格上穿AH指标第二次加仓1手,记为第二组开仓;
//批注:这里用islastSP,表示A组已经开仓结束,第二组开仓
//批注:需要注意条件中是第二次加仓,是在A组平仓以后再加仓,为第二组开仓。需要用条件控制一下这个顺序。
//BKVOL返回模型当前的多头理论持仓。
CROSSDOWN(PDI,MDI),SP('A',BKVOL);//对于第一次加仓,PDI下穿MDI指标,平掉对应组别持仓;
CROSSDOWN(C,AL),SP('B',BKVOL);//对于第二次加仓,价格下穿AL指标,平掉对应组别持仓;
练习31:
当100日均线穿越350日均线的时候买入或卖出;
限价5个点止损;
盈利超过20个点,回撤10个点止盈。
MA100:MA(C,100);
MA350:MA(C,350);
CROSS(MA100,MA350),BK;
STOP(1,-5);
/*批注:
止损可以用这个C<BKPRICE-5*MINPRICE
对比一下这两个的区别
Stop,type位置只能写1-5,这几种形式。
写入SKPRICE代表什么?*/
//或者用C<BKPRICE-5*MINPRICE,SP;
//对比:STOP指令默认平掉模型内所有持仓,不支持指定手数。但是C<BKPRICE-5*MINPRICE可以指定手数而不是全部平仓
CROSSDOWN(MA100,MA350),SK;
STOP(SKPRICE,5);
//STOP(GROUP,TYPE,N),在TYPE基础上,N个最小变动单位对GROUP组别持仓止损止盈
//GROUP取值为'A'-'I'或不写(即可以编写为STOP(TYPE,N),在TYPE基础上,N个最小变动单位对无组别持仓进行止损止盈)。
BKHIGH>BKPRICE+20*MINPRICE&&CROSSDOWN(C,BKHIGH-10*MINPRICE),SP;
SKLOW<SKPRICE-20*MINPRICE&&CROSS(C,SKLOW+10*MINPRICE),BP;
AUTOFILTER;
练习32:
收盘价连续5周期内保持上涨,开多单;
收盘价连续5周期内保持下跌,开空单;
出现光头阴线的k线形态,多单止损;
出现光头阳线的k线形态,空单止损。
//EVERY(COND,N),判断N周期内,是否一直满足COND条件。若满足函数返回值为1,不满足函数返回值为0;
EVERY(C>REF(C,1),5),BK;//收盘价连续5周期内保持上涨,开多单
EVERY(C<REF(C,1),5),SK;//收盘价连续5周期内保持下跌,开空单
/*什么是光头阴线:
光头阴线,只有下影线,没有上影线,一般代表趋势看淡,但多方稍有抵抗的局面。
光头阴线开盘价是当日最高价,一开盘卖方力量就特别大,股价一直处于下跌状态,但当跌到低位时,受到买盘力量的推升,股价得到支撑,由此股价可能会形成反弹。*/
/*K_STATE 判断k线形态
K_STATE('STATE');STATE为代表k线形态的字符串。加载到k线图后,符合该k线形态,返回1,否则返回0。
例:K_STATE('红三兵');//判断当前k线形态是否为红三兵*/
K_STATE('光头阴线')&& ISLASTBK,SP;//出现光头阴线的k线形态,多单止损;
//光头阳线是指没有上影线的K线.
K_STATE('光头阳线')&& ISLASTSK,BP;//出现光头阳线的k线形态,空单止损。
AUTOFILTER;
练习33:
前一根k线收盘价基础上,加上0.8倍ATR作为上轨;
前一根k线收盘价基础上,减去0.8倍ATR作为下轨;
最高价创10周期新高,且当前最高价在上轨之上,平空做多;
收盘价价格突破下轨,平仓出场。
最低价创10周期新低,且当前最低价在下轨之下,平多做空;
收盘价价格突破上轨,平仓出场。
//定义ATR(平均真实波动范围,这一指标主要用来衡量价格的波动)
TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//求最高价减去最低价,一个周期前的收盘价减去最高价的绝对值,一个周期前的收盘价减去最低价的绝对值,这三个值中的最大值
ATR:MA(TR,14);//求14个周期内的TR的简单移动平均
TOP:=REF(C,1)+0.8*ATR;//前一根k线收盘价基础上,加上0.8倍ATR作为上轨
BOTTOM:=REF(C,1)-0.8*ATR;//前一根k线收盘价基础上,减去0.8倍ATR作为下轨
H>=HHV(H,10)&&H>TOP,BPK;//最高价创10周期新高,且当前最高价在上轨之上,平空做多;
CROSSDOWN(C,BOTTOM),SP;//收盘价价格突破下轨,平仓出场。
L<=LLV(L,10)&&L<BOTTOM,SPK;//最低价创10周期新低,且当前最低价在下轨之下,平多做空;
CROSS(C,TOP),BP;//收盘价价格突破上轨,平仓出场
AUTOFILTER;
练习34:
威廉指标(LWR)的快速线上穿慢速线,平空做多;
威廉指标(LWR)的快速线下穿慢速线,平多做空;
以开仓价为基础,开仓时以M点为固定价差止损;
//批注:小于开仓价M个最小单位,收盘价变动X点,要求的止损价变动P个点。
当行情每朝着有利方向变动X点,止损价格也提高P点
//通过缺省值定义威廉指标(LWR)
RSV:= (CLOSE-HHV(HIGH,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;//收盘价与N周期最高值做差,N周期最高值与N周期最低值做差,两差值间做比值。
LWR1:SMA(RSV,3,1);//RSV的移动平均(快速线)
LWR2:SMA(LWR1,3,1);//LWR1的移动平均(慢速线)
CROSS(LWR1,LWR2),BPK;//威廉指标(LWR)的快速线上穿慢速线,平空做多
CROSSDOWN(LWR1,LWR2),SPK;//威廉指标(LWR)的快速线下穿慢速线,平多做空
/*STOP(GROUP,TYPE,N),在TYPE基础上,N个最小变动单位对GROUP组别持仓止损止盈
GROUP取值为'A'-'I'或不写(即可以编写为STOP(TYPE,N),在TYPE基础上,N个最小变动单位对无组别持仓进行止损止盈)。
TYPE取值为0-5,分别代表在以下价格的基础上止损止盈。
0代表数据合约最近一次买入信号价位
1代表交易合约最近一次买入信号价位
2代表模组子账户交易合约买入开仓均价
3代表数据合约最近一次卖出信号价位
4代表交易合约最近一次卖出信号价位
5代表模组子账户交易合约卖出开仓均价
N代表止损止盈参数为N个最小变动价位。止损卖出,N为负数;止盈卖出,N为正数。*/
//STOP(1,-M);
//STOP(4,M);//以开仓价为基础,开仓时以M点为固定价差止损
//LOOP2(COND,A,B);循环条件函数 若COND条件成立,则返回A,否则返回B
//LOOP2(ISLASTBPK&&C>REF(C,1)+X*MINPRICE,M+P,M);
//LOOP2(ISLASTSPK&&C<REF(C,1)-X*MINPRICE,M+P,M);
AA1:=C<BKPRICE-M*MINPRICE;//小于开仓价M个最小单位,
AA2:=C<BKPRICE-M*MINPRICE;//大于开仓价M个最小单位,
C1:=REF(C,1)-X*MINPRICE;收盘价向下变动X点
C2:=REF(C,1)+X*MINPRICE;收盘价向上变动X点
AA1&&C2&&C<BKPRICE-(M+P)*MINPRICE,SP;
AA2&&C1&&C>SKPRICE+(M+P)*MINPRICE,BP;//要求的止损价变动P个点。
//批注:模型不需要用LOOP,根据上一个批注修改一下
//批注的意思是这样修改吗,不确定?
/*批注:
C<BKPRICE-M*MINPRICE+INTPART((BKHIGH-BKPRICE)/(X*MINPRICE))*P*MINPRICE,SP;
C>SKPRICE+M*MINPRICE-INTPART((SKPRICE-SKLOW)/(X*MINPRICE))*P*MINPRICE,BP;
*/
练习35:
沪铜1分钟周期;
当天开盘价加上0.5倍的昨日振幅作为上轨;
当天开盘价减去0.5倍的昨日振幅作为下轨;
突破上轨,平空做多;
突破下轨,平多做空;
夜盘和当日收盘,收盘前10分钟清仓。
N:=BARSLAST(DATE<>REF(DATE,1))+1;
NN:=REF(N,N);
ZH:VALUEWHEN(DATE<>REF(DATE,1),HV(H,NN));//在分钟周期上,求昨天最高价。
ZL:VALUEWHEN(DATE<>REF(DATE,1),LV(L,NN));//在分钟周期上,求昨天最高价。
ZF:=ZH-ZL;//昨日振幅
//批注:1分钟周期,ref只能表示前一根K线上的H和L,不能代表1日的价格
//批注:昨日最高价-昨日最低价来取振幅
//批注:这里的O也不能直接用,直接用表示的是当根K线的O而不是当日的O
O1:=REF(O,N-1);
//批注:Ref不包括当根,N需要-1。
TOP:=O1+0.5*ZF;//当天开盘价加上0.5倍的昨日振幅作为上轨
BOTTOM:=O1-0.5*ZF;//当天开盘价减去0.5倍的昨日振幅作为下轨
//批注:这里要注意一下,收盘前10分钟清仓,那收盘前10分钟不能开仓要限制一下。
CLOSEMINUTE>10&&CROSS(C,TOP),BPK;//突破上轨,平空做多
CLOSEMINUTE>10&&CROSSDOWN(C,BOTTOM),SPK;//突破下轨,平多做空
//CLOSEMINUTE,返回K线开始时间距离收盘前的分钟数。
CLOSEMINUTE<=10||CLOSEMINUTEEVERY(1)<=10,CLOSEOUT;
/*批注:可以用CLOSEMINUTEEVERY(1)表示夜盘收盘时间
问题1:夜盘和收盘前10分钟清仓,表示的是收盘10分钟内清仓
CLOSEMINUTE<=10||CLOSEMINUTEEVERY(1)<=10,closeout;
问题2:一行不能连用两个指令。不能有这样的写法SP&&BP
*/
CLOSEMINUTE=10,CLOSEOUT;//收盘前10分钟清仓
AUTOFILTER;
//夜盘和当日收盘如何表示?
//批注:CLOSEMINUTEEVERY(1)可以用来表示夜盘收盘
练习36:
螺纹1分钟周期;
成交量创20周期新高,并且持仓量上涨,平空做多;
成交量创20周期新低,并且持仓量下跌,平多做空;
开仓后超过5根k线,盈利未达到3个点,止损出场;
夜盘和当日收盘前5分钟清仓;
只用当日数据计算;
AA1:VOL>=HHV(VOL,20);//成交量创20周期新高
AA2:OPI>=REF(OPI,1);//持仓量上涨。
AA1&&AA2,BPK;//成交量创20周期新高,并且持仓量上涨,平空做多
BB1:VOL<=LLV(VOL,20);//成交量创20周期新低
BB2:OPI<=REF(OPI,1);//持仓量下跌。
BB1&&BB2,SPK;//成交量创20周期新低,并且持仓量下跌,平多做空
//BARSBK返回上一次买开仓的K线距离当前K线的周期数(不包含出现BK信号的那根K线)取包含BK信号出现的那根K线到当前K线的周期数,则需要在此函数后+1,即BARSBK+1;
//不确定开仓后超过5根k线,盈利未达到3个点的写法
//ISLASTBK&&BARSBK>5&&C<BKPRICE+3*MINPRICE,SP;
//ISLASTSK&&BARSSK>5&&C>SKPRICE-3*MINPRICE,BP;//开仓后超过5根K线,盈利未达到3个点,止损出场;
BARSBK>5&&C<BKPRICE+3*MINPRICE,SP;
BARSSK>5&&C>SKPRICE-3*MINPRICE,BP;//开仓后超过5根K线,盈利未达到3个点,止损出场;
//批注:过滤模型不用写ISLASTBK,这个一般在加减仓里限制。因为过滤模型,SP上一个信号一定是开仓信号。而且上面是BPK信号,这里写ISLASTBK就不会平仓了
AUTOFILTER;//一开一平信号过滤模型
DAYTRADE;//只用日内数据进行计算
练习37:
1分钟周期,只在白天9:00~15:00进行交易,不做夜盘;
开盘半小时9:00到9:30不交易,记录这段时间收盘价的最高点HH和最低点LL;
从9:31开始,收盘价高于HH则开仓做多,低于LL开仓做空;
开仓后持仓超过10根k线,获利未达到0.5%,平仓出场;
当天不超过5次交易;
收盘前5分钟清仓。
TIME>0930&&TIME<1500
HH:=VALUEWHEN(TIME=0930,HHV(C,31);
LL:=VALUEWHEN(TIME=0930,LLV(C,31);//从9:00到9:30,在1分钟周期上,有31条k线
AA:COUNTSIG(BK,DAYBARPOS)+COUNTSIG(SK,DAYBARPOS)<=5;//当天不超过5次交易;
AA&&TIME>=0931&&TIME<1500&&C>HH,BK;
AA&&TIME>=0931&&TIME<1500&&C<LL,SK;
BKVOL>10&&C<BKPRICE*(1+0.005),SP;
SKVOL>10&&C>SKPRICE*(1-0.005),BP;//开仓后持仓超过10根k线,获利未达到0.5%,平仓出场;
CLOSEMINUTE<=5,CLOSEOUT;//收盘前5分钟清仓;
AUTOFILTER;
练习38:
沪金1分钟周期,开盘10分钟后开始入场;
突破当日均价线,平空做多;
跌破当日均价线,平多做空;
开仓后10根k线以内3个点止损,5个点止盈;
每天不超过3次交易;
夜盘和当日收盘前2分钟清仓;
只用当日数据计算
/*OPENMINUTE,返回开盘后经过的分钟数。
例:CROSS(C,MA(C,5))&&OPENMINUTE>5,BPK;//当天开盘后五分钟内不开仓*/
//SETTLE 取得图的结算价或者取得当日成交均价
//批注:题中是10分钟后开仓,这里用OPENMINUTE=10,正好10根很难满足条件
OPENMINUTE>=10&&CROSS(C,SETTLE),BPK;//开盘10分钟后,突破当日均价线,平空做多
OPENMINUTE>=10&&CROSSDOWN(C,SETTLE),SPK;//开盘10分钟后,跌破当日均价线,平多做空
//BARSBK返回上一次买开仓的K线距离当前K线的周期数(不包含出现BK信号的那根K线)
//ISLASTBK 上一个交易信号是BK则返回1(Yes),否则返回0(No)
ISLASTBK&&BARSBK<=10&&C<BKPRICE-3*MINPRICE,SP;
ISLASTSK&&BARSSK<=10&&C>=BKPRICE+3*MINPRICE,BP;//开仓后10根k线以内3个点止损
ISLASTBK&&BARSBK<=10&&C>=BKPRICE+5*MINPRICE,SP;
ISLASTSK&&BARSSK<=10&&C<=BKPRICE-5*MINPRICE,BP;//开仓后10根k线以内5个点止盈
//COUNTSIG(X,N); 统计N周期内,X信号的数量.(X可以为BK、SK、SP、BP、SPK、BPK、CLOSEOUT、STOP、STOP1)
//DAYBARPOS:返回当根k线是当天的第几根k线
//eg.VALUEWHEN(DAYBARPOS=1,C);//取当天第一根K线的收盘价
//一次交易是指买卖一个来回吗?
//批注:1次完整的交易是从开仓到持仓为0为止
COUNTSIG(SPK,DAYBARPOS)+COUNTSIG(BPK,DAYBARPOS)<=3;//每天不超过3次交易
CLOSEMINUTE=2,CLOSEOUT;//夜盘和当日收盘前2分钟清仓
AUTOFILTER;//一开一平信号过滤模型
DAYTRADE1;//只用日内数据进行计算
练习39:
60周期均线以上仅开多,
SAR绿点变红点开仓,红点变绿点平仓;
60周期均线以下仅开空,
SAR红点变绿点开仓,绿点变红点平仓,30%可用资金开仓
MA60:=MA(C,60);
//定义SAR止损点
STEP1:=2/100;
MVALUE1:=20/100;
SARLINE:SAR1(2,STEP1,MVALUE1),CIRCLEDOT;//N个周期的抛物转向,步长为STEP1,极限值为MVALUE1.
IF(SARLINE>0,SARLINE,NULL),CIRCLEDOT,COLORRED,NOTEXT;//SARLINE>0画红色小圆点线
IF(SARLINE>0,NULL,ABS(SARLINE)),CIRCLEDOT,COLORGREEN,NOTEXT;//SARLINE不大于0画绿色小圆点线
SARJC:CROSS(SARLINE,0);
SARSC:CROSSDOWN(SARLINE,0);
//不确定红绿点的定义方式
//批注:加载看一下SAR模型的效果,这里的红绿,是图上画出的红绿点线
//IF(SARLINE>0||SARJC&&SARLINE=0,SARLINE,NULL),CIRCLEDOT,COLORRED;//SARLINE>0或者上穿0时画红色小圆点线
//IF(SARLINE<0||SARSC&&SARLINE=0,ABS(SARLINE),NULL),CIRCLEDOT,COLORGREEN;//SARLINE<0或者下穿0时画绿色小圆点线
//批注:IF这里后面并没有用到,不写这两个IF就是正确的
/*MONEY 模组子账户可用资金
例:
K:=MONEY*0.2/(C*MARGIN*UNIT+FEE); //模组子账户可用资金的20%可以开仓的手数(此写法适用于按固定手数收取手续费的合约)*/
//KK:=MONEY*0.2/(C*MARGIN*UNIT+FEE);//模组子账户可用资金的30%可以开仓的手数
KK:=MONEY*0.3/(C*MARGIN*UNIT+FEE);//模组子账户可用资金的30%可以开仓的手数
//批注:K和KK想表达什么?题中是可用资金的0.3开仓
//k被我用/* */框起来了,是我做题时用来对照的学习例子,kk是可用资金的0.3开仓,我不小心把3打成2了
C>MA60&&SARJC,BK(KK);//60周期均线以上仅开多,SAR绿点变红点开仓
C>MA60&&SARSC,SP(KK);//60周期均线以上仅开多,红点变绿点平仓
C<MA60&&SARSC,SK(KK);//60周期均线以下仅开空,SAR红点变绿点开仓
C<MA60&&SARSC,BP(KK);//60周期均线以下仅开空,绿点变红点平仓
练习40:
红三兵开多仓,10周期内价格上涨未达到0.15%卖平仓,
连续盈利2次,开仓手数加1,
亏损后恢复默认下单手数2手
//K_STATE('STATE');STATE为代表k线形态的字符串。加载到k线图后,符合该k线形态,返回1,否则返回0。
K_STATE('红三兵')=1,BK(2);//红三兵开多仓
//BARSBK返回上一次买开仓的K线距离当前K线的周期数(不包含出现BK信号的那根K线)
//BKPRICE 返回数据合约最近一次买开信号发出时的行情的最新价。
//BARSBK<=10&&C<BKPRICE*(1+0.0015),SP(2);
//批注:100*(C-LLV(C,10))/LLV(C,10)<0.15,SP(BKVOL);
BARSBK<=10&&100*(C-LLV(C,10))/LLV(C,10)<0.15,SP(BKVOL);
//EVERY(COND,N),判断N周期内,是否一直满足COND条件。若满足函数返回值为1,不满足函数返回值为0;
/*OFFSETPROFIT 模组子账户的平仓盈亏
例:
OFFSETPROFIT<-5000&&C>O,BK(2);//平仓盈亏大于-5000,并且当前K线为阳线时,买开*/
BKVOL>0&&EVERY(OFFSETPROFIT>0,2)=1,BK(1);//连续盈利2次,开仓手数加1,
//批注:这里注意一下开仓手数+1需要满足BKVOL>0,第一次没有平仓的情况下加仓。
OFFSETPROFIT<0,SP(1);//亏损后恢复默认下单手数2手
练习41:
价格大于昨天最高价,平空做多;
价格小于于昨天最低价,平多做空;
开仓手数为资金的5% 与 当前合约1个ATR的波动对应;
3个ATR波动止赢止损;
盘中权益回撤超过百分之20,清仓,并且当周不在开仓
//定义ATR(平均真实波动范围,这一指标主要用来衡量价格的波动)
TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//求最高价减去最低价,一个周期前的收盘价减去最高价的绝对值,一个周期前的收盘价减去最低价的绝对值,这三个值中的最大值
ATR:MA(TR,14);//求14个周期内的TR的简单移动平均
/*MONEY 模组子账户可用资金
例:
K:=MONEY*0.2/(C*MARGIN*UNIT+FEE); //模组子账户可用资金的20%可以开仓的手数(此写法适用于按固定手数收取手续费的合约)*/
KK:MONEY*0.05/(UNIT*ATR); //模组子账户可用资金的5%可以开仓的手数,与当前合约1个ATR的波动对应(与当前合约1个ATR的波动对应是这样写吗?不确定。)
//批注:MONEY*0.05/(UNIT*ATR),还要除以交易单位
N:=BARSLAST(DATE<>REF(DATE,1))+1;
NN:=REF(N,N);
ZH:VALUEWHEN(DATE<>REF(DATE,1),HV(H,NN));//在分钟周期上,求昨天最高价。
ZL:VALUEWHEN(DATE<>REF(DATE,1),LV(L,NN));//在分钟周期上,求昨天最低价。
C>ZH,BPK(KK);//价格大于昨天最高价,平空做多
C<ZL,SPK(KK);//价格小于于昨天最低价,平多做空;
//批注:取昨日,一定要注意,不能用REF取H
//VALUEWHEN(REFX(DATE<>REF(DATE,1),H)//(这里不能用REFX)
/*权益最大回撤:从测试开始到结束,动态权益计算出来的波段从高点到低点回撤的最大值;
权益回撤比:权益最大回撤和权益最大回撤时的最大权益的比值*/
//MONEYTOT 模组子账户权益
N:=BARSLAST(DATE<>REF(DATE,1))+1;//分钟周期,日内k线根数
AA:(HHV(MONEYTOT,N)-LLV(MONEYTOT,N))/HHV(MONEYTOT,N);权益回撤比
AA>0.2,CLOSEOUT&&IDLE(WEEK<>REF(WEEK,1));//盘中权益回撤超过百分之20,清仓,并且当周不在开仓
//当周不在开仓怎么表示呢?不确定
//批注:这种一定条件不开仓问题,可以转换到满足相反条件,开仓来写。
//当周不再开仓相当于等到下周再开仓
//下周如何表示呢?
/*IDLE(COND) 限制开仓信号发出委托
用法:IDLE(COND),当开仓信号发出时,如果COND条件成立,该信号不委托。IDLE函数对平仓信号不起作用,有持仓时即使满足COND也可以平仓。*/
练习42:
开盘5个周期后,如果价格大于今日开盘价开多仓,价格小于今开开空仓;
持仓期间每根k线最大浮盈累计值高于1万平仓,最大浮亏累计值低于-5千平仓;
注:以做多为例,最大浮盈为最高价与开仓价的差值,差值为正即为当根k线最大浮盈,差值为负,则当根k线最大浮盈为0,同理,最大浮亏,为最低价与开仓价的差值,差值为负即为当根k线最大浮亏,差值为正,则当根k线最大浮亏为0
O1:VALUEWHEN(DATE<>REF(DATE,1),O);//今日开盘价
//DAYBARPOS:返回当根K线是当天的第几根K线
DAYBARPOS>5&&C>O1,BK;
DAYBARPOS>5&&C<O1,SK;
AA1:H-O;
HFY:IF(AA1>0,AA1,0);//最大浮盈
AA2:=L-O;
HFK:IF(AA2<0,AA2,0);//最大浮亏
BKVOL>0&&SUM(HFY,BARSBK)>10000||BKVOL>0&&SUM(HFK,BARSBK)<-5000,CLOSEOUT;//持仓期间每根K线最大浮盈累计值高于1万平仓,最大浮亏累计值低于-5千平仓;
AUTOFILTER;
//把参数修改为BARSBK可以吗 ?
//批注:Sum是N周期值的和。这里BKVOL>0返回值是0或1.不是每根K 线累计。重新修改一下SUM参数取值。另外,这个题可以用全局变量来编写,学习一下全局变量的编写。
/*试用全局变量编写:
VARIABLE:HFY:=0,HFK:=0;//全局变量的初始值应该如何设置呢?
IF BKVOL>0&&HFY<=10000&&HFK>-5000 THEN
BEGIN
HFY:=HFY+REF(HFY,1);
HFK:=HFK+REF(HFK,1);
END
IF(HFY>10000&||HFK<-5000,CLOSEOUT,NULL);*/
/*全局变量学习:
在历史第一根K线上定义变量的初始值,后续计算时始终调用上一次的计算结果
一般配合 IF THEN 语句使用
和VALUEWHEN相比,全局变量可以设空值NULL,而不是在不满足条件时取上一次条件成立时的x值。
用ISNULL(VAR)限制为首次满足条件*/
练习43:
在文华商品指数上指定PTA1905合约交易;
涨幅大于文华指数的涨幅平空做多;
跌幅大于文华指数的跌幅平多做空
为什么找不到PTA1905呢?
//批注:PTA1905,已经是历史合约了,现在已经是2105.可以用其他合约来替代。
//文华商品的文华码为7186
#CALL[7186,WH] AS WH
ZDF:=(C-REF(C,DAYBARPOS))/REF(C,DAYBARPOS);//涨跌幅
//批注:同样问题,REF不能直接引用前一日价格
ZDF>0&&ZDF>WH.ZDF,BK;//涨幅大于文华指数的涨幅平空做多;
ZDF<0&&ZDF<WH.ZDF,SK;//跌幅大于文华指数的跌幅平多做空
//批注:涨幅和跌幅要和0比较来区分
/*TRADE_OTHER('CODE') 指定CODE合约为交易合约,CODE为合约代码。
例:
CROSS(C,MA(C,5)),BK;//最新价上穿5周期均线做多
CROSS(MA(C,5),C),SP;//最新价下穿5周期均线平多
TRADE_OTHER('IF1912');//指定交易合约为股指1912
AUTOFILTER;*/
TRADE_OTHER('PTA1905');//指定交易合约为PTA1905
AUTOFILTER;
练习44:
在过去30根K线的高低点围绕中轴上下0.5%的范围内波动时;
上轨=过去30根K线的最高价;
下轨=过去30根K线的最低价;
价格突破上轨,平空做多;价格跌穿下轨,平多做空;并且消除跳空
//TRADE_SMOOTHING 消除隔日跳空函数
TOP:=REF(HHV(H,30),1);
BOTTOM:=REF(LLV(L,30),1);
MID:MV(HH,LL);
BD:(HH-MID)/MID<=0.005&&(MID-LL)/MID<=0.005;//过去30根K线的高低点围绕中轴上下0.5%的范围内波动
//TOP:=VALUEWHEN(BD,HH);//上轨=过去30根K线的最高价;
//批注:上面的HH和L就是高低点,不需要再取TOP和BOTTOM,另外,要注意
//BOTTOM:=VALUEWHEN(BD,LL);//下轨=过去30根K线的最低价;
//MV(A,...P) 取A到P的均值。
ZZ:=VALUEWHEN(BD,MV(TOP,BOTTOM));//中轴
BD&&CROSS(C,TOP),BPK;
BD&&CROSSDOWN(C,BOTTOM),SPK;
TRADE_SMOOTHING;//消除跳空
AUTOFILTER;
练习45:
MTR=最高价-最低价和最高价-1日前的收盘价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值的14日累和;
HD=最高价-1日前的最高价;
LD=1日前的最低价-最低价;
DMP=如果HD>0并且HD>LD,返回HD,否则返回0的14日累和;
DMM=如果LD>0并且LD>HD,返回LD,否则返回0的14日累和;
PDI=DMP*100/MTR;
MDI=DMM*100/MTR;
ADX= MDI-PDI的绝对值/(MDI+PDI)*100的6日简单移动平均;
ADXR=(ADX+6日前的ADX)/2;
PDI上穿MDI,买开;
PDI下穿MDI,卖平;
买开出信号立即下单,不复核;
卖平信号K线走完前10秒下单,不复核
AA:=MAX(H-L,ABS(H-REF(C,1)));//最高价-最低价和最高价-1日前的收盘价的绝对值的较大值
AA1:=MAX(AA,ABS(REF(C,1)-REF(L,1)));//最高价-最低价和最高价-1日前的收盘价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值
MTR:=SUM(AA1,14);//MTR=最高价-最低价和最高价-1日前的收盘价的绝对值的较大值和1日前的收盘价-最低价的绝对值的较大值的14日累和;
HD:=H-REF(H,1);//HD=最高价-1日前的最高价
LD:=REF(L,1)-L;//LD=1日前的最低价-最低价;
DMP:=SUM(IF(HD>0&&HD>LD,HD,0));//DMP=如果HD>0并且HD>LD,返回HD,否则返回0的14日累和;
DMM:=SUM(IF(LD>0&&LD>HD,LD,0));//DMM=如果LD>0并且LD>HD,返回LD,否则返回0的14日累和;
//批注:再学习一下SUM函数,是14日X的和,这样写,14日0的和依然是0.
//我断句错误了,还以为需要累和的就是0,现在发现需要累和的其实是DDM
PDI:=DMP*100/MTR;
MDI:=DMM*100/MTR;
ADX:=ABS(MDI-PDI)/MA((MDI+PDI)*100,6);
ADXR:=(ADX+REF(ADX,6))/2;
CROSS(PDI,MDI),BK;
CROSSDOWN(PDI,MDI),SP;
/*CHECKSIG 设置信号确认与复核的指令价方式(TICK逐笔回测,可设置回测精度)
CHECKSIG(SIG,MODE1,TIME1,MODE2,TIME2,INTERVAL);
*/
CHECKSIG(BK,'A',0,'C',0,0);//买开出信号立即下单,不复核;(MODE1为'A'时,当INTERVAL为0时,出信号TIME1秒后确认信号下单;MODE2为'C'时,当INTERVAL为0时,下单TIME2秒后进行信号复核,TIME2=0为不复核)
CHECKSIG(SP,'B',10,'C',0,0);//卖平信号K线走完前10秒下单,不复核(MODE1为'B'时,当INTERVAL为0时,K线走完前TIME1秒确认信号下单;MODE2为'C'时,当INTERVAL为0时,下单TIME2秒后进行信号复核,TIME2=0为不复核)
AUTOFILTER;
练习46:
VOLUME=成交量的14日简单移动平均/成交量;
MID=100*(最高价+最低价-1日前的最高价+最低价)/(最高价+最低价);
EMV=MID*VOLUME*(最高价-最低价)/最高价-最低价的14日简单移动平均的14日简单移动平均;
EMV上穿0,平空做多
EMV下穿0,平多做空
交易主力合约,自动换月移仓
VOLUME:=MA(VOL,14)/VOL;
N:=BARSLAST(DATE<>REF(DATE,1))+1;
NN:=REF(N,N);
ZH:VALUEWHEN(DATE<>REF(DATE,1),HV(H,NN));//在分钟周期上,求昨天最高价。
ZL:VALUEWHEN(DATE<>REF(DATE,1),LV(L,NN));//在分钟周期上,求昨天最高价。
MID:=100*(H+L-ZH+ZL)/(H+L);
//批注:题目是前一日的最高价和最低价。
EMV:=MA(MID*VOLUME*(H+L)/H-MA(L,14),14);
CROSS(EMV,0),BPK;
CROSSDOWN(EMV,0),SPK;
TRADE_OTHER('AUTO');
AUTOFILTER;
//TRADE_OTHER('CODE') 指定CODE合约为交易合约,CODE为合约代码。
//该函数写为TRADE_OTHER('AUTO')时,可以加载到指数、主连合约;该函数写为TRADE_OTHER('XX主连')时,可以加载到商品指数、中金所指数、股票指数上如:沪深300、上证50、中证500实现自动移仓换月。
//移仓换月,是在主力合约切换时,平掉旧主力合约,开新主力合约。回测时:在换月当天,旧主力以前一根K线的收盘价平仓,新主力以当前K线开盘价开新仓;模组运行时:可与SETMOVEOPIPRICE(PRICE)函数连用,设置模组换月移仓的委托方式。建议加载到指数合约使用,主连合约切换主力合约的接缝会有跳空,破坏合约趋势,可能导致出现不应该出现的信号。
练习47:
LOWV=9日内最低价的最低值;
HIGHV=9日内最高价的最高值;
RSV=(收盘价-LOWV)/(HIGHV-LOWV)*100的3日指数移动平均;
K=RSV的3日指数移动平均;
D=K的3日简单移动平均;
K上穿D时,平空做多;
K下穿D时,平多做空;
权益回撤10%停止交易
LOWV:=LLV(L,9);
HIGHV:=HHV(H,9);
//EMA(X,N):求N周期X值的指数加权移动平均(平滑移动平均)。
RSV:=EMA((C-LOWV)/(HIGHV-LOWV)*100,3);
K:=EMA(RSV,3);
D:=EMA(K,3);
CROSS(K,D),BPK;
CROSSDOWN(K,D),SPK;
//MONEYTOT 模组子账户权益
N:=BARSLAST(DATE<>REF(DATE,1))+1;//分钟周期,日内K线根数
HC:=(HHV(MONEYTOT,N)-LLV(MONEYTOT,N))/HHV(MONEYTOT,N);//权益回撤比
IDLE(CROSS(HC,0.1));
//批注:这里要考察的是IDEAL函数。满足一定条件不再开仓。
AUTOFILTER;
练习48:
WR1=100*(10日内最高价的最高值-收盘价)/(10日内最高价的最高值-10日内最低价的最低值);
WR2=100*(6日内最高价的最高值-收盘价)/(6日内最高价的最高值-6日内最低价的最低值)
WR1下穿20,卖平开;
WR1上穿80,买平开;
过滤掉盘整行情
WR1:=100*(HHV(H,10)-C)/(HHV(H,10)-LLV(L,10));
WR2:=100*(HHV(H,6)-C)/(HHV(H,6)-LLV(L,6));
CROSSDOWN(WR1,20)&&PANZHENG=0,SPK;
CROSS(WR1,80)&&PANZHENG=0,BPK;
/*PANZHENG 判断当前行情是否为盘整
例:
MA1:MA(CLOSE,5);
MA2:MA(CLOSE,10);
CROSS(MA1,MA2)&&PANZHENG=0,BK;//盘整行情不开新仓,减少模型在盘整阶段的资金回撤
CROSS(MA2,MA1),SP;
AUTOFILTER;*/
AUTOFILTER;
//过滤掉盘整行情如何表示?不确定
//批注:PANZHENG=0,表示在非盘整情况下开仓,也就是过滤掉了盘整情况。题中写法是正确的
练习49:
区间上下轨的确定:
上轨=开盘后30分钟高点;
下轨=开盘后30分钟低点;
当价格突破上轨,买入开仓;
当价格跌穿下轨,卖出平仓;
买开和卖平都是出信号立即下单不复核,1根K线一个信号
N:=BARSLAST(DATE<>REF(DATE,1))+1;//分钟周期,当日K线数。
HH:=HHV(H,N);
LL:=HHV(L,N);
//OPENMINUTE,返回开盘后经过的分钟数。
TOP:=IF(OPENMINUTE>30,HH,NULL);
//批注:这个H是老问题,不能直接取当根的H。要取当天的H
BOTTOM:=IF(OPENMINUTE>30,LL,NULL);
CROSS(C,TOP),BK;
CROSSDOWN(C,BOTTOM),SK;
//CHECKSIG 设置信号确认与复核的指令价方式(TICK逐笔回测,可设置回测精度)
CHECKSIG(SIG,MODE1,TIME1,MODE2,TIME2,INTERVAL);
CHECKSIG(BK,'A',0,'C',0,0);
CHECKSIG(SP,'A',0,'C',0,0);//(MODE1为'A'时,当INTERVAL为0时,出信号TIME1秒后确认信号下单;MODE2为'C'时,当INTERVAL为0时,下单TIME2秒后进行信号复核,TIME2=0为不复核)
//模型中写入该函数,一根K线只能有一个信号。
//1根K线一个信号还需要用公式表示吗?
//批注:不是每个条件都需要语句表达的。如果编写中已经能限制住这个条件,就不用重新表达了。Checksig模型写法已经是一个K线一个信号模型了
练习50:
日均ATR突破基于今日开盘价与过去26个交易日平均ATR的关系;
上轨=今日开盘价+26个交易日平均ATR*1/2;
下轨=今日开盘价-N个交易日平均ATR*1/2;
突破上轨,买入开仓做多;
当根K线做多固定上涨10跳止盈
//定义ATR(平均真实波动范围,这一指标主要用来衡量价格的波动)
TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//求最高价减去最低价,一个周期前的收盘价减去最高价的绝对值,一个周期前的收盘价减去最低价的绝对值,这三个值中的最大值
ATR:MA(TR,26);//求26个周期内的TR的简单移动平均
//日均ATR突破基于今日开盘价与过去26个交易日平均ATR的关系是什么意思?
/*批注:这个关系就是
上轨=今日开盘价+26个交易日平均ATR*1/2;
下轨=今日开盘价-N个交易日平均ATR*1/2;*/
OO:=VALUEWHEN(DATE<>REF(DATE,1),O);//今日开盘价
TOP:=OO+MA(ATR,26)*1/2;
BOTTOM:=OO-MA(ATR,26)*1/2;//题目要求的N没有定义,语法检测无法通过?
//批注:N没有定义,这里为什么要用N。一定是不能测试通过的。这个N就是26日,题目应该是笔误了吧。
CROSS(C,TOP),BK;
ISLASTBK&&CROSS(C,BKBRICE+10*MINPRICE),SP;
//上涨10跳是上涨10个点的意思吗?
//批注:这个理解是对的
AUTOFILTER;
内外盘
内盘有涨跌停价,软件中,是用涨跌停价发委托的。
外盘没有涨跌停价,是用市价发委托,最优的价格撮合成交的
知识点
1<0
这里不是逻辑错误。这时一个判断条件。加载到K线上是可以判断所写的关系是否符合。如果正确,返回值是1,如果不正确,返回值是0.
限制参数个数的原因?
6个参数对于客户已经足够了。如果模型编写需要的多,可以直接用数直接来写。参数优化比较占用资源。数值太多,占用资源也比较多。
//批注:顺便学习一下,TRADE_OTHER('AUTO');