以文本方式查看主题
- 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp)
-- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4)
---- variable问题:后面怎么无法保存上一个k线的全局变量 (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=140338)
|
-- 作者:misshuanghm1
-- 发布时间:2016/9/30 15:48:57
-- variable问题:后面怎么无法保存上一个k线的全局变量
RUNMODE:0; VARIABLE:FLAG=0,HL=0;// IF HOLDING<>0 THEN FLAG:=1; //VARIABLE:FLAG=3;// //中间变量 INPUT:N(40,1,100,10),SS(1,1,10000,1); CYC:=BARSLAST(DATE<>REF(DATE,1))+1; 手数:=SS;
MA1:REF(MA(((H+L+C)/3,N)),1);//三价平均线 浮动区间:=REF(MA(TR,N),1);//真实振幅的移动平均线 上轨:MA1+浮动区间; 下轨:MA1-浮动区间;
//交易条件 开多条件:=MA1>REF(MA1,1) AND C>上轨; 开空条件:=MA1<REF(MA1,1) AND C<下轨; 平多条件:=C<MA1; 平空条件:=C>MA1;
//////平仓信号:1、止盈2、止损3、中轨平仓 //1、最大获利点数 开多最大盈利:=HHV(H,ENTERBARS)-ENTERPRICE; 开空最大盈利:=ENTERPRICE-LLV(L,ENTERBARS); IF HOLDING<0 AND ENTERPRICE-C>=ENTERPRICE*0.3 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING>0 AND C-ENTERPRICE>=ENTERPRICE*0.3 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING<0 AND ENTERPRICE-C<ENTERPRICE*0.3 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈 IF HOLDING>0 AND C-ENTERPRICE<ENTERPRICE*0.3 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈
//2、计算跟踪止盈价位,向价格不利方向取p% 开多止盈点位:=ENTERPRICE+FLOOR(开多最大盈利*(1-P/100)); 开空止盈点位:=ENTERPRICE-CEILING(开空最大盈利*(1-P/100));
IF HOLDING<0 AND ENTERBARS>0 AND 开空最大盈利>0 AND C>开空止盈点位 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN //开空止盈 BEGIN //HL:=HOLDING; 空头止盈:SELLSHORT(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING<0 AND (C-ENTERPRICE>ENTERPRICE*0.05) THEN //止损 BEGIN //HL:=HOLDING; 平空止损:SELLSHORT(1,手数,THISCLOSE); FLAG:=0; END ELSE BEGIN //HL:=HOLDING; 平空:SELLSHORT(平空条件 AND HOLDING<0,手数,THISCLOSE); FLAG:=0; END IF HOLDING>0 AND ENTERBARS>0 AND 开多最大盈利>0 AND C<开多止盈点位 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN //开多止盈 BEGIN 多头止盈:SELL(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING>0 AND (C-ENTERPRICE<-ENTERPRICE*0.05) THEN //止损 BEGIN 平多止损:SELL(1,手数,THISCLOSE); FLAG:=0; END ELSE BEGIN 平多:SELL(平多条件 AND HOLDING>0,手数,THISCLOSE); FLAG:=0; END
平多止盈最低:=LLV(L,EXITBARS); 平空止盈最高:=HHV(H,EXITBARS); IF CROSS(EXITPRICE,C) AND FLAG=1 AND EXITBARS>2 AND 平空止盈最高<下轨 AND HOLDING>=0 THEN 突破止盈位开空:BUYSHORT(1,手数,THISCLOSE); ELSE IF 平空止盈最高>下轨 AND EXITBARS>2 AND 开空条件=1 AND HOLDING>=0 THEN 止盈突破下轨开空: BUY(1,手数,THISCLOSE); ELSE 开空:BUYSHORT(开空条件 AND HOLDING>=0 AND FLAG=0,手数,THISCLOSE);
IF CROSS(C,EXITPRICE) AND FLAG=1 AND EXITBARS>2 AND 平多止盈最低>上轨 AND HOLDING<=0 THEN 突破止盈位开多:BUY(1,手数,THISCLOSE); ELSE IF 平多止盈最低<上轨 AND EXITBARS>2 AND 开多条件=1 AND HOLDING<=0 THEN 止盈突破上轨开多: BUY(1,手数,THISCLOSE); ELSE 开多:BUY(开多条件 AND HOLDING<=0 AND FLAG=0,手数,THISCLOSE);
//msgout(1,\'FLAG=\' & numtostr(FLAG,0) & \' HL=\' & numtostr(HL,0)); //HLD:HL,NODRAW; 信号:FLAG,NODRAW; 当前持仓:HOLDING,COLORGRAY,LINETHICK0; 当前资产:ASSET,NOAXIS,COLORGRAY;//输出当前资产,但不影响坐标最高最低值
明明用的已经是定义了的全局变量flag,每次在平仓的时候都会说明这次平仓信号是因为什么原因平仓的,但是输出的flag却一直都是0.这是什么原因呢,因为后面紫色部分是要根据前面平仓信号是什么样的选择性的开仓,所以,必须要设置这样一个全局变量。
|
-- 作者:misshuanghm1
-- 发布时间:2016/9/30 16:00:41
--
麻烦高手们们帮忙看看,不想到节后再解决这个问题了,指点一下吧,感谢!
以下是引用misshuanghm1在2016-9-30 15:48:57的发言:
RUNMODE:0; VARIABLE:FLAG=0,HL=0;// IF HOLDING<>0 THEN FLAG:=1; //VARIABLE:FLAG=3;// //中间变量 INPUT:N(40,1,100,10),SS(1,1,10000,1); CYC:=BARSLAST(DATE<>REF(DATE,1))+1; 手数:=SS;
MA1:REF(MA(((H+L+C)/3,N)),1);//三价平均线 浮动区间:=REF(MA(TR,N),1);//真实振幅的移动平均线 上轨:MA1+浮动区间; 下轨:MA1-浮动区间;
//交易条件 开多条件:=MA1>REF(MA1,1) AND C>上轨; 开空条件:=MA1<REF(MA1,1) AND C<下轨; 平多条件:=C<MA1; 平空条件:=C>MA1;
//////平仓信号:1、止盈2、止损3、中轨平仓 //1、最大获利点数 开多最大盈利:=HHV(H,ENTERBARS)-ENTERPRICE; 开空最大盈利:=ENTERPRICE-LLV(L,ENTERBARS); IF HOLDING<0 AND ENTERPRICE-C>=ENTERPRICE*0.3 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING>0 AND C-ENTERPRICE>=ENTERPRICE*0.3 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING<0 AND ENTERPRICE-C<ENTERPRICE*0.3 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈 IF HOLDING>0 AND C-ENTERPRICE<ENTERPRICE*0.3 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈
//2、计算跟踪止盈价位,向价格不利方向取p% 开多止盈点位:=ENTERPRICE+FLOOR(开多最大盈利*(1-P/100)); 开空止盈点位:=ENTERPRICE-CEILING(开空最大盈利*(1-P/100));
IF HOLDING<0 AND ENTERBARS>0 AND 开空最大盈利>0 AND C>开空止盈点位 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN //开空止盈 BEGIN //HL:=HOLDING; 空头止盈:SELLSHORT(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING<0 AND (C-ENTERPRICE>ENTERPRICE*0.05) THEN //止损 BEGIN //HL:=HOLDING; 平空止损:SELLSHORT(1,手数,THISCLOSE); FLAG:=0; END ELSE BEGIN //HL:=HOLDING; 平空:SELLSHORT(平空条件 AND HOLDING<0,手数,THISCLOSE); FLAG:=0; END IF HOLDING>0 AND ENTERBARS>0 AND 开多最大盈利>0 AND C<开多止盈点位 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN //开多止盈 BEGIN 多头止盈:SELL(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING>0 AND (C-ENTERPRICE<-ENTERPRICE*0.05) THEN //止损 BEGIN 平多止损:SELL(1,手数,THISCLOSE); FLAG:=0; END ELSE BEGIN 平多:SELL(平多条件 AND HOLDING>0,手数,THISCLOSE); FLAG:=0; END
平多止盈最低:=LLV(L,EXITBARS); 平空止盈最高:=HHV(H,EXITBARS); IF CROSS(EXITPRICE,C) AND FLAG=1 AND EXITBARS>2 AND 平空止盈最高<下轨 AND HOLDING>=0 THEN 突破止盈位开空:BUYSHORT(1,手数,THISCLOSE); ELSE IF 平空止盈最高>下轨 AND EXITBARS>2 AND 开空条件=1 AND HOLDING>=0 THEN 止盈突破下轨开空: BUY(1,手数,THISCLOSE); ELSE 开空:BUYSHORT(开空条件 AND HOLDING>=0 AND FLAG=0,手数,THISCLOSE);
IF CROSS(C,EXITPRICE) AND FLAG=1 AND EXITBARS>2 AND 平多止盈最低>上轨 AND HOLDING<=0 THEN 突破止盈位开多:BUY(1,手数,THISCLOSE); ELSE IF 平多止盈最低<上轨 AND EXITBARS>2 AND 开多条件=1 AND HOLDING<=0 THEN 止盈突破上轨开多: BUY(1,手数,THISCLOSE); ELSE 开多:BUY(开多条件 AND HOLDING<=0 AND FLAG=0,手数,THISCLOSE);
//msgout(1,\'FLAG=\' & numtostr(FLAG,0) & \' HL=\' & numtostr(HL,0)); //HLD:HL,NODRAW; 信号:FLAG,NODRAW; 当前持仓:HOLDING,COLORGRAY,LINETHICK0; 当前资产:ASSET,NOAXIS,COLORGRAY;//输出当前资产,但不影响坐标最高最低值
明明用的已经是定义了的全局变量flag,每次在平仓的时候都会说明这次平仓信号是因为什么原因平仓的,但是输出的flag却一直都是0.这是什么原因呢,因为后面紫色部分是要根据前面平仓信号是什么样的选择性的开仓,所以,必须要设置这样一个全局变量。
|
-- 作者:jinzhe
-- 发布时间:2016/9/30 16:12:21
--
只有在空头止盈和多头止盈的情况下FLAG才是1,你那边有这两个平仓信号吗?
|
-- 作者:misshuanghm1
-- 发布时间:2016/9/30 16:25:24
--
以下是引用jinzhe在2016-9-30 16:12:21的发言: 只有在空头止盈和多头止盈的情况下FLAG才是1,你那边有这两个平仓信号吗?
是的,还有止损的,和正常平仓的,这两个都是直接设置flag=0,就是止盈的时候后面的开仓跟这两个情况不太一样,想区别开来。
|
-- 作者:jinzhe
-- 发布时间:2016/9/30 16:29:31
--
[此贴子已经被作者于2016-9-30 16:30:04编辑过]
|
-- 作者:jinzhe
-- 发布时间:2016/9/30 16:34:52
--
BEGIN //HL:=HOLDING; 平空:SELLSHORT(平空条件 AND HOLDING<0,手数,THISCLOSE); FLAG:=0; END
这句把你的flag置为0,在前面两个平仓条件都不满足的情况下,这个会直接置FLAG为0
后面的平多语句也是一样的
[此贴子已经被作者于2016-9-30 16:35:39编辑过]
|
-- 作者:misshuanghm1
-- 发布时间:2016/9/30 16:36:16
--
以下是引用jinzhe在2016-9-30 16:34:52的发言:
BEGIN //HL:=HOLDING; 平空:SELLSHORT(平空条件 AND HOLDING<0,手数,THISCLOSE); FLAG:=0; END
这句把你的flag置为0
但是我没有触发这个条件啊,这样也会吗?也就是我这次只是空头止盈,并没有触发这个平空的条件
|
-- 作者:misshuanghm1
-- 发布时间:2016/9/30 16:48:00
--
以下是引用jinzhe在2016-9-30 16:34:52的发言:
BEGIN //HL:=HOLDING; 平空:SELLSHORT(平空条件 AND HOLDING<0,手数,THISCLOSE); FLAG:=0; END
这句把你的flag置为0,在前面两个平仓条件都不满足的情况下,这个会直接置FLAG为0
后面的平多语句也是一样的
[此贴子已经被作者于2016-9-30 16:35:39编辑过]
感谢,知道我错在哪里了,这个问题解决了,但是还有p这个,明明我每次在持仓的时候都会计算一次,为什么第一次开仓之后的每次都是30了呢?
RUNMODE:0; VARIABLE:FLAG=0,HL=0;// IF HOLDING<>0 THEN FLAG:=1; //VARIABLE:FLAG=3;// //中间变量 INPUT:N(40,1,100,10),SS(1,1,10000,1); CYC:=BARSLAST(DATE<>REF(DATE,1))+1; 手数:=SS;
MA1:REF(MA(((H+L+C+O)/4,N)),1);//三价平均线 浮动区间:=REF(MA(TR,N),1);//真实振幅的移动平均线 上轨:MA1+浮动区间; 下轨:MA1-浮动区间;
//交易条件 开多条件:=MA1>REF(MA1,1) AND C>上轨; 开空条件:=MA1<REF(MA1,1) AND C<下轨; 平多条件:=C<MA1; 平空条件:=C>MA1;
//////平仓信号:1、止盈2、止损3、中轨平仓 //1、最大获利点数 开多最大盈利:=HHV(H,ENTERBARS)-ENTERPRICE; 开空最大盈利:=ENTERPRICE-LLV(L,ENTERBARS); IF HOLDING<0 AND ENTERPRICE-C>=ENTERPRICE*0.2 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING>0 AND C-ENTERPRICE>=ENTERPRICE*0.2 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING<0 AND ENTERPRICE-C<ENTERPRICE*0.2 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈 IF HOLDING>0 AND C-ENTERPRICE<ENTERPRICE*0.2 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈
//2、计算跟踪止盈价位,向价格不利方向取p% 开多止盈点位:=ENTERPRICE+FLOOR(开多最大盈利*(1-P/100)); 开空止盈点位:=ENTERPRICE-CEILING(开空最大盈利*(1-P/100));
IF HOLDING<0 AND ENTERBARS>0 AND 开空最大盈利>0 AND C>开空止盈点位 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN //开空止盈 BEGIN //HL:=HOLDING; 空头止盈:SELLSHORT(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING<0 AND (C-ENTERPRICE>ENTERPRICE*0.05) THEN //止损 BEGIN //HL:=HOLDING; 空头止损:SELLSHORT(1,手数,THISCLOSE); FLAG:=0; END ELSE IF C>MA1 AND HOLDING<0 THEN //中轨平多 BEGIN //HL:=HOLDING; 中轨平空:SELLSHORT(1,手数,THISCLOSE); FLAG:=0; END IF HOLDING>0 AND ENTERBARS>0 AND 开多最大盈利>0 AND C<开多止盈点位 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN //开多止盈 BEGIN 多头止盈:SELL(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING>0 AND (C-ENTERPRICE<-ENTERPRICE*0.05) THEN //止损 BEGIN 多头止损:SELL(1,手数,THISCLOSE); FLAG:=0; END ELSE IF C<MA1 AND HOLDING>0 THEN //中轨平多 BEGIN 中轨平多:SELL(1,手数,THISCLOSE); FLAG:=0; END
平多止盈最低:=LLV(L,EXITBARS); 平空止盈最高:=HHV(H,EXITBARS); IF CROSS(EXITPRICE,C) AND FLAG=1 AND EXITBARS>2 AND 平空止盈最高<下轨 AND HOLDING>=0 THEN 突破止盈位开空:BUYSHORT(1,手数,THISCLOSE); ELSE IF 平空止盈最高>下轨 AND EXITBARS>2 AND 开空条件=1 AND HOLDING>=0 AND FLAG=1 THEN 止盈突破下轨开空: BUY(1,手数,THISCLOSE); ELSE 开空:BUYSHORT(开空条件 AND HOLDING>=0 AND FLAG=0,手数,THISCLOSE);
IF CROSS(C,EXITPRICE) AND FLAG=1 AND EXITBARS>2 AND 平多止盈最低>上轨 AND HOLDING<=0 THEN 突破止盈位开多:BUY(1,手数,THISCLOSE); ELSE IF 平多止盈最低<上轨 AND EXITBARS>2 AND 开多条件=1 AND HOLDING<=0 AND FLAG=1 THEN 止盈突破上轨开多: BUY(1,手数,THISCLOSE); ELSE 开多:BUY(开多条件 AND HOLDING<=0 AND FLAG=0,手数,THISCLOSE);
//msgout(1,\'FLAG=\' & numtostr(FLAG,0) & \' HL=\' & numtostr(HL,0)); PP:P,NODRAW; 信号:FLAG,NODRAW; 当前持仓:HOLDING,COLORGRAY,LINETHICK0; 当前资产:ASSET,NOAXIS,COLORGRAY;//输出当前资产,但不影响坐标最高最低值
|
-- 作者:misshuanghm1
-- 发布时间:2016/9/30 16:48:28
--
RUNMODE:0; VARIABLE:FLAG=0,HL=0;// IF HOLDING<>0 THEN FLAG:=1; //VARIABLE:FLAG=3;// //中间变量 INPUT:N(40,1,100,10),SS(1,1,10000,1); CYC:=BARSLAST(DATE<>REF(DATE,1))+1; 手数:=SS;
MA1:REF(MA(((H+L+C+O)/4,N)),1);//三价平均线 浮动区间:=REF(MA(TR,N),1);//真实振幅的移动平均线 上轨:MA1+浮动区间; 下轨:MA1-浮动区间;
//交易条件 开多条件:=MA1>REF(MA1,1) AND C>上轨; 开空条件:=MA1<REF(MA1,1) AND C<下轨; 平多条件:=C<MA1; 平空条件:=C>MA1;
//////平仓信号:1、止盈2、止损3、中轨平仓 //1、最大获利点数 开多最大盈利:=HHV(H,ENTERBARS)-ENTERPRICE; 开空最大盈利:=ENTERPRICE-LLV(L,ENTERBARS); IF HOLDING<0 AND ENTERPRICE-C>=ENTERPRICE*0.2 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING>0 AND C-ENTERPRICE>=ENTERPRICE*0.2 THEN P:=30; //如果盈利30%以上回撤30%止盈 IF HOLDING<0 AND ENTERPRICE-C<ENTERPRICE*0.2 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈 IF HOLDING>0 AND C-ENTERPRICE<ENTERPRICE*0.2 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN P:=15; //如果盈利10%~30%以上回撤15%止盈
//2、计算跟踪止盈价位,向价格不利方向取p% 开多止盈点位:=ENTERPRICE+FLOOR(开多最大盈利*(1-P/100)); 开空止盈点位:=ENTERPRICE-CEILING(开空最大盈利*(1-P/100));
IF HOLDING<0 AND ENTERBARS>0 AND 开空最大盈利>0 AND C>开空止盈点位 AND ENTERPRICE-C>ENTERPRICE*0.1 THEN //开空止盈 BEGIN //HL:=HOLDING; 空头止盈:SELLSHORT(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING<0 AND (C-ENTERPRICE>ENTERPRICE*0.05) THEN //止损 BEGIN //HL:=HOLDING; 空头止损:SELLSHORT(1,手数,THISCLOSE); FLAG:=0; END ELSE IF C>MA1 AND HOLDING<0 THEN //中轨平多 BEGIN //HL:=HOLDING; 中轨平空:SELLSHORT(1,手数,THISCLOSE); FLAG:=0; END IF HOLDING>0 AND ENTERBARS>0 AND 开多最大盈利>0 AND C<开多止盈点位 AND C-ENTERPRICE>ENTERPRICE*0.1 THEN //开多止盈 BEGIN 多头止盈:SELL(1,手数,THISCLOSE); FLAG:=1; END ELSE IF HOLDING>0 AND (C-ENTERPRICE<-ENTERPRICE*0.05) THEN //止损 BEGIN 多头止损:SELL(1,手数,THISCLOSE); FLAG:=0; END ELSE IF C<MA1 AND HOLDING>0 THEN //中轨平多 BEGIN 中轨平多:SELL(1,手数,THISCLOSE); FLAG:=0; END
平多止盈最低:=LLV(L,EXITBARS); 平空止盈最高:=HHV(H,EXITBARS); IF CROSS(EXITPRICE,C) AND FLAG=1 AND EXITBARS>2 AND 平空止盈最高<下轨 AND HOLDING>=0 THEN 突破止盈位开空:BUYSHORT(1,手数,THISCLOSE); ELSE IF 平空止盈最高>下轨 AND EXITBARS>2 AND 开空条件=1 AND HOLDING>=0 AND FLAG=1 THEN 止盈突破下轨开空: BUY(1,手数,THISCLOSE); ELSE 开空:BUYSHORT(开空条件 AND HOLDING>=0 AND FLAG=0,手数,THISCLOSE);
IF CROSS(C,EXITPRICE) AND FLAG=1 AND EXITBARS>2 AND 平多止盈最低>上轨 AND HOLDING<=0 THEN 突破止盈位开多:BUY(1,手数,THISCLOSE); ELSE IF 平多止盈最低<上轨 AND EXITBARS>2 AND 开多条件=1 AND HOLDING<=0 AND FLAG=1 THEN 止盈突破上轨开多: BUY(1,手数,THISCLOSE); ELSE 开多:BUY(开多条件 AND HOLDING<=0 AND FLAG=0,手数,THISCLOSE);
//msgout(1,\'FLAG=\' & numtostr(FLAG,0) & \' HL=\' & numtostr(HL,0)); PP:P,NODRAW; 信号:FLAG,NODRAW; 当前持仓:HOLDING,COLORGRAY,LINETHICK0; 当前资产:ASSET,NOAXIS,COLORGRAY;//输出当前资产,但不影响坐标最高最低值
|
-- 作者:misshuanghm1
-- 发布时间:2016/9/30 16:51:19
--
以下是引用misshuanghm1在2016-9-30 16:36:16的发言:
但是我没有触发这个条件啊,这样也会吗?也就是我这次只是空头止盈,并没有触发这个平空的条件
我明白了,感谢回答!知道P这个问题在哪里了!
|