VARIABLE:DayCount=1,positionCount=0,dk=0; //DayCount是计算第几个周期,positionCount是计算头寸数量,dk为-1开空1开多
VARIABLE:EntPoint=0,ExitPoint=0,sellSign=0; //sellSign为0不可平仓,为1则可以;EntPoint用于判定本周期有没有开仓;sellSign为1时表示可以平仓
M:=MA(TR,20); //计算20天内的TR值的简单平均
BUYHHV:=HHV(H,20); //20天最高价的最高价
BUYLLV:=LLV(L,20); //20天最低价的最低价
SELLHHV:=HHV(H,10); //10日最高价
SELLLLV:=LLV(L,10); //10日最低价
IF BARPOS>=21 THEN BEGIN
IF BARPOS=21 THEN
N:=M;
IF DayCount=6 OR BARPOS=21 THEN BEGIN{5天调整N值}
N:=(19*N+TR)/20;{计算N值}
DayCount:=2;
END
DayCount:=DayCount+1;
EntPoint:=ENTERBARS+1;
IF EntPoint=1 THEN BEGIN //本周期有开仓操作(上周期的信号)
sellSign:=1; //可以平仓了
positionCount:=positionCount+1; //头寸加1
END
IF positionCount=0 THEN BEGIN //第一头寸
HOW:=CASH(0)*0.01/N; //头寸规模
IF HIGH>=BUYHHV THEN BEGIN
开多1:BUY(1,HOW,MARKET);
dk:=1;
END
IF LOW<=BUYLLV THEN BEGIN
开空1:BUYSHORT(1,HOW,MARKET);
dk:=-1;
END
END
IF positionCount=1 THEN BEGIN //第二头寸
HOW:=CASH(0)*0.01/N; //头寸规模
IF dk=1 THEN
开多2:BUY(HIGH>=ENTERPRICE+0.5*N,HOW,MARKET);
IF dk=-1 THEN
开空2:BUYSHORT(LOW<=ENTERPRICE-0.5*N,HOW,MARKET);
END
IF positionCount=2 THEN BEGIN //第三头寸
HOW:=CASH(0)*0.01/N; //头寸规模
IF dk=1 THEN
开多3:BUY(HIGH>=ENTERPRICE+0.5*N,HOW,MARKET);
IF dk=-1 THEN
开空3:BUYSHORT(LOW<=ENTERPRICE-0.5*N,HOW,MARKET);
END
ExitPoint:=EXITBARS+1;
IF ExitPoint=1 THEN BEGIN //本周期有平仓(上周期的信号)
positionCount:=0; //头寸复原
sellSign:=0;
dk:=0;
END
IF sellSign=1 THEN BEGIN
IF dk=1 THEN
IF ENTERPRICE-2*N then SELL(LOW<=SELLLLV,100%,MARKET);//退出离盈利头寸
ELSE SELL(L<=ENTERPRICE-2*N,0,MARKET); //退出亏损头寸
IF dk=-1 THEN
IF ENTERPRICE+2*N then SELLSHORT(LOW<=SELLHHV,100%,MARKET);//退出离盈利头寸
ELSE SELLSHORT(H>=ENTERPRICE+2*N,0,MARKET); //退出亏损头寸
END
END