c++ 编写函数返回两个值最小值_两周编写练习总结

练习1:

定义一个变量,名为AA,算出收盘价与开盘价的差,要求指标线以独立坐标方式显示,指定指标线颜色为红色。

4559ce5b4a8ead5a5c9f76dc0164520c.png

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线显示为黄色实心。

ab58180bda8d90746b9e629c94fd9eff.png

批注:

这里要用画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线显示为黄色实心

对修改的批注

b67fb0a827e8770ddb66fb233cf83570.png

这样写没有问题,也可以考虑用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

9ca854665c526fba95bd7f5ea82d4123.png

提示里面:

什么是加减仓模型?

加减仓模型,允许连续出开仓信号或者连续出平仓信号,可实现加仓、减仓。

对于需要进行加、减仓操作的交易者,在策略执行的时候希望开仓后的下一个动作依然可以是开仓,或者能够连续分批平仓。如果是开一平信号过滤模型,开仓后只能是与之对应的平仓操作,这样就无法实现加仓、减仓策略。加减仓模型允许连续出开仓信号或者连续出平仓信号,可解决这个问题。

过滤是筛选符合条件的合约的意思吗?

一开一平模型属于过滤模型。

回溯算法的理解:

即穷举法,从一条路往前走,能进则进,不能进则退回来,换一条路再试。

我们软件在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%


批注

b2493820d45815bf22c9d6c7aeec5283.png

HHV是取每根K线的最高价。

要想用满足条件的K线上的最高价

用VALUEWHEN来取

v2-a331d38bb36f528e4c22090fccf7972b_b.jpg

模型编写后,要先检测是否能测试通过

SETDEALPERCENT(30);不能赋值给变量

MONEY用来取可用资金。试着用这个函数来计算手数

f43933305df088586e8d3abcd8d5e00b.png

平仓手数,是要平掉所有多头持仓,可以用BKVOL来写

3a8a89ef2d8f53ea1130cc5b91e208a0.png

空头同理

练习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为止损条件。

174bac00d0950307711bf0d8dd9bb860.png

批注

此处涉及到两个合约,需要考虑,跨合约模型。

重新考虑,用跨合约模型来编写

//不入场了(不入场需要用公式表达吗?)》这个和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

07bfe1824f20085f609b9638e05f9113.png

//加载到铜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 语句使用

1a69c21289efabd0c4c32a65bfd5081f.png

f7ed2c52b1e3f98f2863a1b8e01edd0c.png

和VALUEWHEN相比,全局变量可以设空值NULL,而不是在不满足条件时取上一次条件成立时的x值。

用ISNULL(VAR)限制为首次满足条件*/

练习43:

在文华商品指数上指定PTA1905合约交易;

涨幅大于文华指数的涨幅平空做多;

跌幅大于文华指数的跌幅平多做空

7c9230e2a337398245f6f21a4473281d.png

为什么找不到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');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值