因为MULTSIG函数要求的数据太多计算太慢,所有我用日K线判断当日应该开、加的仓位后一次性操作。使用了全局变量,结果进不去循环,模型无法出信号,请老师指教,改怎么改,谢谢!
-----------------------------------------------
//根据WH8自带的海龟改写。全局变量开多仓次数KAIDUOCANGCISHU,DATR,DTC,DMTC,DZHENFU,DHH。
//不管加仓几次,按浮亏2N止损平仓
//仅仅是做多的模型。
VARIABLE:KAIDUOCANGCISHU:=0,DATR:=0,DTC:=0,DMTC:=0,DHH:=0;//定义全局变量。
TR:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//真实波幅
ATR:=MA(TR,25); //求20个周期内真实波幅的简单移动平均
TC..INTPART((MONEYTOT*0.01/(UNIT*ATR)));//根据权益的1%计算下单手数
MTC..4*TC; //总的持仓头寸,其实没用到
//MA246:=MA(C,60);//246天均线,年线过滤用。测试效果很差。
//ZZ:=(MA246-REF(MA246,10))/REF(MA246,10)*100;//246日线,当日值比10个交易日前大百分之几。测试效果很差。
ZHENFU:=ATR/C*100;//振幅
HH:=HV(H,33);
IF CROSSUP(H,HH)&&ISLASTBK=0&&ISLASTSK=0&&BARPOS>=26&&ZHENFU<10 THEN//最高价突破HH日最高点,且未开过仓,振幅小于限定,开始所有操作的循环,直到平所有仓才退出循环。
BEGIN
DHH:=HH;//固定突破点的价位
DATR:=ATR;//固定突破点ATR
DTC:=TC;//固定1单位头寸手数
DMTC:=MTC;//固定总最大持仓头寸,其实没用到
IF KAIDUOCANGCISHU=0 THEN//没开过仓的循环开始
BEGIN
IF H<=0.5*DATR+DHH THEN//当日只能开1仓
BEGIN
BK(DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+1;
END
IF H<=DATR+DHH THEN//当日开2仓
BEGIN
BK(2*DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+2;
END
IF H<=1.5*DATR+DHH THEN//当日开3仓
BEGIN
BK(3*DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+3;
END
IF H>1.5*DATR+DHH THEN//当日开4仓
BEGIN
BK(4*DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+4;
END
END//没开过仓的循环结束
IF KAIDUOCANGCISHU=1 THEN//开过1仓的循环开始
BEGIN
IF H>0.5*DATR&&H<=DATR+DHH THEN//加开1仓
BEGIN
BK(DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+1;
END
IF H>DATR+DHH&&H<=1.5*DATR+DHH THEN//加开2仓
BEGIN
BK(2*DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+2;
END
IF H>1.5*DATR+DHH THEN//加开3仓
BEGIN
BK(3*DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+3;
END
END//开过1仓的循环结束
IF KAIDUOCANGCISHU=2 THEN//开过2仓的循环开始
BEGIN
IF H>DATR+DHH&&H<=1.5*DATR+DHH THEN//加开1仓
BEGIN
BK(DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+1;
END
IF H>1.5*DATR+DHH THEN//加开2仓
BEGIN
BK(2*DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+2;
END
END//开过2仓的循环结束
IF KAIDUOCANGCISHU=2 THEN//开过3仓的循环开始
BEGIN
IF H>1.5*DATR+DHH THEN//加开1仓
BEGIN
BK(DTC);
KAIDUOCANGCISHU:=KAIDUOCANGCISHU+1;
END
END//开过3仓的循环结束
//开仓语句结束,下面是平仓语句。
IF L<BKPRICEAV-2*DATR/KAIDUOCANGCISHU&&BKVOL>0 THEN
BEGIN
SP(BKVOL);//持仓浮亏大于2N,止损平仓
KAIDUOCANGCISHU:=0;
END
IF CROSSDOWN(L,LV(L,10))&&BKVOL>0 THEN
BEGIN
SP(BKVOL); //最低价下穿10周期的最低价,平仓
KAIDUOCANGCISHU:=0;
END//平仓语句结束
END//开平仓循环结束
期盼中
时不时的按F5
老师,还是有问题。测试后,发现只有第一个循环即“没开过仓的循环”能出信号。
通过把语句"KAIDUOCANGCISHU:=KAIDUOCANGCISHU+N"改成“KAIDUOCANGCISHU..KAIDUOCANGCISHU+N”查看第一个循环后开多仓的次数,发现第一个循环后,开多仓次数要吗是5要吗是6,很是奇怪!所以根本不可能进入下面的加仓循环了。而按照设想,次数只能是0 1 2 3 4这几个值的。能再帮忙看一下怎么改吗?
我把KAIDUOCANGCISHU..KAIDUOCANGCISHU+N改成了KAIDUOCANGCISHU.."开多仓数",结果是,“开多仓数”是数字“1”的,KAIDUOCANGCISHU输出的竟然是3.
我还有一个考虑是,循环的时候,把能开4仓的if写在前面,然后依次是能开3仓的,能开2仓的,能开1仓的
我们研究下,预计周五前回复 |
老师,我按照我7楼说的,改了一下,kaiduocangcishu和真正的开多仓次数一致了。然而还是只能进入第一个“没开过仓的循环”而进不了之后的循环
---------------------------
//根据WH8自带的海龟改写。全局变量开多仓次数KAIDUOCANGCISHU,DATR,DTC,DMTC,DZHENFU,DHH。
//不管加仓几次,按浮亏2N止损平仓
//仅仅是做多的模型。
VARIABLE:KAIDUOCANGCISHU:=0,DATR:=0,DTC:=0,DMTC:=0,DHH:=0;//定义全局变量。
TR:=MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));//真实波幅
ATR:=MA(TR,25); //求20个周期内真实波幅的简单移动平均
TC:=INTPART((MONEYTOT*0.01/(UNIT*ATR)));//根据权益的1%计算下单手数
MTC:=4*TC; //总的持仓头寸,其实没用到
//MA246:=MA(C,60);//246天均线,年线过滤用。测试效果很差。
//ZZ:=(MA246-REF(MA246,10))/REF(MA246,10)*100;//246日线,当日值比10个交易日前大百分之几。测试效果很差。
ZHENFU:ATR/C*100;//振幅
HH:=HV(H,20);
N1:=BARSLAST(CROSSUP(H,HH))+1;
N2:=BARSLAST(CROSSDOWN(H,HH))+1;
//最高价突破HH日最高点,且未开过仓,振幅小于限定,开始所有操作的循环,直到平所有仓才退出循环。
MN:=BARSLAST(CROSSUP(H,HH)&&ISLASTBK=0&&ISLASTSK=0&&BARPOS>=76&&KAIDUOCANGCISHU=0&&ZHENFU<10)+1;
DHH:=REF(HH,MN);//固定突破点的价位
DATR:=REF(ATR,MN);//固定突破点ATR
DTC:=REF(TC,MN);//固定1单位头寸手数
DMTC:=REF(MTC,MN);//固定总最大持仓头寸,其实没用到
IF ISLASTBK=0&&ISLASTSK=0&&BARPOS>=76&&CROSSUP(H,DHH) THEN
BEGIN
IF KAIDUOCANGCISHU=0 THEN//没开过仓的循环开始------这个循环都出信号了
BEGIN
IF CROSSUP(H,DHH+1.5*DATR) THEN
BEGIN
1,BK(4*DTC);
KAIDUOCANGCISHU..4;
END
IF CROSSUP(H,DHH+DATR) THEN
BEGIN
1,BK(3*DTC);
KAIDUOCANGCISHU..3;
END
IF CROSSUP(H,DHH+0.5*DATR) THEN
BEGIN
1,BK(2*DTC);
KAIDUOCANGCISHU..2;
END
IF CROSSUP(H,DHH) THEN
BEGIN
1,BK(DTC);
KAIDUOCANGCISHU..1;
END
IF BKVOL>0 THEN
BEGIN
KAIDUOCANGCISHU:=KAIDUOCANGCISHU;
END
END//没开过仓的循环结束
IF KAIDUOCANGCISHU=1 THEN//开过1仓的循环开始
BEGIN
IF CROSSUP(H,DHH+1.5*DATR) THEN
BEGIN
1,BK(3*DTC);
KAIDUOCANGCISHU..4;
END
IF CROSSUP(H,DHH+DATR) THEN
BEGIN
1,BK(2*DTC);
KAIDUOCANGCISHU..3;
END
IF CROSSUP(H,DHH+0.5*DATR) THEN
BEGIN
1,BK(DTC);
KAIDUOCANGCISHU..2;
END
KAIDUOCANGCISHU..KAIDUOCANGCISHU;
END//开过1仓的循环结束
IF KAIDUOCANGCISHU=2 THEN//开过2仓的循环开始
BEGIN
IF CROSSUP(H,DHH+1.5*DATR) THEN
BEGIN
1,BK(2*DTC);
KAIDUOCANGCISHU..4;
END
IF CROSSUP(H,DHH+DATR) THEN
BEGIN
1,BK(DTC);
KAIDUOCANGCISHU..3;
END
KAIDUOCANGCISHU..KAIDUOCANGCISHU;
END//开过2仓的循环结束
IF KAIDUOCANGCISHU=3 THEN//开过3仓的循环开始
BEGIN
IF CROSSUP(H,DHH+1.5*DATR) THEN
BEGIN
1,BK(1*DTC);
KAIDUOCANGCISHU..4;
END
KAIDUOCANGCISHU..KAIDUOCANGCISHU;
END//开过3仓的循环结束
//开仓语句结束,下面是平仓语句。*/
END//开平仓循环结束
IF L<BKPRICEAV-2*DATR/KAIDUOCANGCISHU && BKVOL>0 THEN
BEGIN
1,SP(BKVOL);//持仓浮亏大于2N,止损平仓
KAIDUOCANGCISHU:=0;
END
IF CROSSDOWN(L,LV(L,10))&& BKVOL>0 THEN
BEGIN
1,SP(BKVOL); //最低价下穿10周期的最低价,平仓
KAIDUOCANGCISHU:=0;
END//平仓语句结束
