我想实现的功能是,当前一次的平仓操作是止损操作,这次开仓如果先满足短开仓的条件就开短,如果满足长开仓的条件就开长的;如果前一次的平仓操作是正常条件的平仓,那这次开仓即使满足短开仓条件也不开,只有满足长开仓的条件才开;
我的思路是用一个全局变量来控制,初始该变量为假,然后在止损平仓后让该变量值为真, 在短开的条件上加上 该变量为真的条件, 按道理说是能实现的,可是不知道为什么 在图表上出现止损指令后,下一次的开仓仍然是长开仓,在长开仓之前有满足短开仓的条件 却没有开,难道是我的指标编写有错吗? 管理员帮忙看看,我把代码贴出来,求指正,谢谢
VARIABLE:dayCount=1,PositionCount=1,SellSign=0,ZS=0,dK=0;//加多空标志,1:多,-1:空 0:空仓
VARIABLE:EntAndExitSign=1,EntPoint=0,ExitPoint=0;
VARIABLE:N=0;
M:=MA(TR,20);
N:=REF(M,1);
DHi: HHV(REF(HIGH,1),20);//短周期
DLo: LLV(REF(Low,1),20);
fsHi: HHV(REF(HIGH,1),55);//长周期
fsLo: LLV(REF(LOW,1),55);
EHPrice:HHV(REF(HIGH,1),10);//离市周期
ELPrice:LLV(REF(LOW,1),10);
DayCount:=DayCount+1;
EntPoint:=ENTERBARS+1;
IF EntPoint=EntAndExitSign THEN
BEGIN{说明STOP指令买进头寸成功}
PositionCount:=PositionCount+1;{头寸计数}
SellSign:=True;{可以平仓信号,如果达到指定的价格}
//ZS:=FALSE;
END
IF PositionCount=1 THEN BEGIN{第一头寸}
if ZS=TRUE THEN BEGIN
HOW:=CASH(0)*0.01/N;{波动性百分比决定头寸规模}
if high>=DHi then
BEGIN
dk:=1;
短多开1:BUY(high>=DHi,HOW,MARKET);{在20日新高STOP指令买进}
END
if low<=DLo then
begin
dk:=-1;
短空开1:buyshort(low<=DLo,HOW,MARKET);{在20日新低STOP指令空开}
end
END
END
IF PositionCount=1 AND ZS=FALSE THEN BEGIN{第一头寸}
HOW:=CASH(0)*0.01/N;{波动性百分比决定头寸规模}
if high>=fsHi then
BEGIN
dk:=1;
长多开1:BUY(high>=fsHi,HOW,MARKET);{在20日新高STOP指令买进}
END
if low<=fsLo then
begin
dk:=-1;
长空开1:buyshort(low<=fsLo,HOW,MARKET);{在20日新低STOP指令空开}
end
END
IF SellSign=True THEN
BEGIN
ExitPoint:=EXITBARS+1;
if dk=1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN {说明卖出成功}
PositionCount:=1;{头寸计算复原}
SellSign:=false;
dk:=0;
END
IF L<ELPrice then
SELL(L<ELPrice,0,MARKET);{退出离盈利头寸}
end
if dk=1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN {说明卖出成功}
PositionCount:=1;{头寸计算复原}
SellSign:=False;
dk:=0;
ZS:=TRUE;
END
IF LOW<=ENTERPRICE-2*N THEN
止多: SELL(LOW<=ENTERPRICE-2*N,0,MARKET);{退出亏损头寸}
end
if dk=-1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN
PositionCount:=1;
SellSign:=False;
dk:=0;
END
IF H>EHPrice then
sellSHORT(H>EHPrice,0,MARKET);
end
if dk=-1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN {说明卖出成功}
PositionCount:=1;{头寸计算复原}
SellSign:=False;
dk:=0;
ZS:=TRUE;
END
IF high>=ENTERPRICE+2*N THEN
止空:sellSHORT( high>=ENTERPRICE+2*N,0,MARKET);
end
END
我想实现的功能是,当前一次的平仓操作是止损操作,这次开仓如果先满足短开仓的条件就开短,如果满足长开仓的条件就开长的;如果前一次的平仓操作是正常条件的平仓,那这次开仓即使满足短开仓条件也不开,只有满足长开仓的条件才开; |
把空仓的注释掉了,空仓的与多仓雷同,请您尝试着实现
以下代码可以实现楼主说的多仓时的开平仓条件.
VARIABLE:dayCount=1,PositionCount=1,SellSign=0,ZS=0,dK=0;//加多空标志,1:多,-1:空 0:空仓
VARIABLE:EntAndExitSign=1,EntPoint=0,ExitPoint=0;
VARIABLE:N=0;
M:=MA(TR,20);
N:=REF(M,1);
DHi:= HHV(REF(HIGH,1),20);//短周期
DLo:= LLV(REF(Low,1),20);
fsHi:= HHV(REF(HIGH,1),55);//长周期
fsLo:= LLV(REF(LOW,1),55);
EHPrice:=HHV(REF(HIGH,1),10);//离市周期
ELPrice:=LLV(REF(LOW,1),10);
DayCount:=DayCount+1;
EntPoint:=ENTERBARS+1;
IF EntPoint=EntAndExitSign THEN
BEGIN{说明STOP指令买进头寸成功}
PositionCount:=PositionCount+1;{头寸计数}
SellSign:=True;{可以平仓信号,如果达到指定的价格}
//ZS:=FALSE;
END
IF PositionCount=1 THEN BEGIN{第一头寸}
if ZS<>1 THEN BEGIN //-----------在ZS不等于1的时候,才开短多
HOW:=CASH(0)*0.01/N;{波动性百分比决定头寸规模}
if high>=DHi then
BEGIN
dk:=1;
短多开1:BUY(high>=DHi,HOW,MARKET);{在20日新高STOP指令买进}
END
// if low<=DLo then
// begin
// dk:=-1;
// 短空开1:buyshort(low<=DLo,HOW,MARKET);{在20日新低STOP指令空开}
// end
END
END
IF PositionCount=1THEN BEGIN{第一头寸} //--------去掉 AND ZS=FALSE
HOW:=CASH(0)*0.01/N;{波动性百分比决定头寸规模}
if high>=fsHi then
BEGIN
dk:=1;
长多开1:BUY(high>=fsHi,HOW,MARKET);{在20日新高STOP指令买进}
END
//if low<=fsLo then
// begin
// dk:=-1;
// 长空开1:buyshort(low<=fsLo,HOW,MARKET);{在20日新低STOP指令空开}
// end
END
IF SellSign=True THEN
BEGIN
ExitPoint:=EXITBARS+1;
if dk=1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN {说明卖出成功}
PositionCount:=1;{头寸计算复原}
SellSign:=false;
dk:=0;
END
IF L<ELPrice then
begin
SELL(L<ELPrice,0,MARKET);{退出离盈利头寸}
ZS:=1; // -----正常平多,ZS为1
end
end
if dk=1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN {说明卖出成功}
PositionCount:=1;{头寸计算复原}
SellSign:=False;
dk:=0;
END
IF LOW<=ENTERPRICE-2*N THEN
止多: SELL(LOW<=ENTERPRICE-2*N,0,MARKET);{退出亏损头寸}
end
if dk=-1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN
PositionCount:=1;
SellSign:=False;
dk:=0;
END
// IF H>EHPrice then
// sellSHORT(H>EHPrice,0,MARKET);
//end
//if dk=-1 then
// begin
// IF ExitPoint=EntAndExitSign THEN
// BEGIN {说明卖出成功}
// PositionCount:=1;{头寸计算复原}
// SellSign:=False;
// dk:=0;
// ZS:=TRUE;
// END
// IF high>=ENTERPRICE+2*N THEN
// 止空:sellSHORT( high>=ENTERPRICE+2*N,0,MARKET);
end
END
谢谢啊, 对了 我忘记说了 我想第一次开仓是长开仓,按照你所说的方法去改的话变成短先开了,我的意思是 第一次开仓是长开仓,还有哦 同时满足长开仓和短开仓,如果前一次平仓是止损的话只考虑短开仓,麻烦再帮忙看看哈
需求比较混乱,请先把需求描述清楚.
3楼实现的,主要是针对1楼的需求
即:
当前一次的平仓操作是止损操作,这次开仓如果先满足短开仓的条件就开短,如果满足长开仓的条件就开长的;如果前一次的平仓操作是正常条件的平仓,那这次开仓即使满足短开仓条件也不开,只有满足长开仓的条件才开;
你的短开和长开条件如果有时候真的会一样,那只用把长开的条件写在短开的代码前面,按照代码的前后执行顺序,就会先长开仓.
先说1楼的吧,您改的也没有实现1楼的要求啊,我复制到软件上运行后,在图上就只有第一次开仓是短周期开仓,后面即使前一次平仓是止损平仓,也没有看到有短开仓的信号(满足短开仓条件的点) 我的要求是 只要前一次的平仓操作是止损操作,满足短开仓条件才开仓,前一次平仓不是止损平仓的 即使满足短开仓的条件也不开仓;
我看懂您的意思了,同时我也是那样去弄,用全局变量来控制,可出来的信号不是按原理走的
在IF08的5分钟K线上,看的
请在止损条件处加上
IF LOW<=ENTERPRICE-2*N THEN
begin
止多: SELL(LOW<=ENTERPRICE-2*N,0,MARKET);{退出亏损头寸}
ZS:=2;
end
end
大哥,还是老问题哦, 我刚才在测试信号的时候,发现 全局变量ZS的值的变化不是根据平仓与止损平仓来变化的, 而是根据平仓条件的满足来变化的, 于是 就会有这种情况发生, 平仓后还没有满足开仓的条件下又有满足平仓的条件,那么此时ZS的值就会发生变化,从而影响到下一次开仓的判断了, 举个例子来说 这个K线上满足开仓条件后平仓了,那么ZS=1;然后下一根K线的满足止损平仓条件,那么ZS=2;可是并没有止损平仓的操作(因为没有持仓) 那么在下一次满足开仓条件的地方就会实行短开的操作了,这样就违背了原来的意思了 我想了想,要ZS的值跟着平仓指令的执行成功与否来变化才行, 但是不知道怎么来表示平仓成功, 大哥 您再帮忙改下吧, 就再以多头的坐例子吧,劳驾啦,