KDPK1:=REF(KDPK0&&MA1<C,1);
KKPD1:=REF(KKPD0&&MA1>=C,1);
KDPK2:=KDPK1;
KKPD2:=KKPD1;
KDPK3:=REF(KDPK0,1);
KKPD3:=REF(KKPD0,1);
//-------------金字塔BPK书写------------------------------------------------------
if KDPK1 then begin//当收盘价上穿下轨且有空仓或无仓时
KCN:=1;
end
if KKPD1 then begin //当收盘价下穿上轨且有多仓或无仓时
KCN:=-1;
end
if barslast(KDPK0)=1 and ((O+MINDIFF)>=L&&(O+MINDIFF)<=H) then begin
if holding<=0 then begin
sellshort(KCN<>-1,EXTGBDATA(Z1H),limitR,(O+MINDIFF));/
mHolding:=0;
EXTGBDATASET(Z1H,0);
end
end
if barslast(KKPD0)=1 and ((O-MINDIFF)>=L&&(O-MINDIFF)<=H) then begin
if holding>=0 then begin
sell(KCN<>1,EXTGBDATA(Z1H),limitR,(O-MINDIFF));//平多
mHolding:=0;
EXTGBDATASET(Z1H,0);
end
end
//------EXTGBDATA(G5H)>=Lots确保最多开Lots手仓---EXTGBDATA(G5B)=BARPOS确保当根K线只开Lots手仓一次---------------------------------------------------
IF (EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots) THEN GOTO CONTINUELINE;// and mHOLDING>0 and StrBS<=BARPOS
//-------------金字塔开仓------------------------------------------------------
BKCN:=KCN,LINETHICK0,COLORWHITE;
if KCN=1 and ((O+MINDIFF)>=L&&(O+MINDIFF)<=H) and not(KDPK0) then begin/
if abs(holding)< 1 then begin
buy(Holding=0,Lots,limitR,O+MINDIFF);//开多,IGNORECHECKPRICE;
mHolding:=mHolding+1;
EXTGBDATASET(Z1H,EXTGBDATA(Z1H)+Lots);
EXTGBDATASET(Z1B,BARPOS);
end
end
if KCN=-1 and ((O-MINDIFF)>=L&&(O-MINDIFF)<=H) and not(KKPD0) then begin
if abs(holding)<1 then begin
buyshort(mHolding=0,Lots,limitR,O-MINDIFF);//开空,IGNORECHECKPRICE;
mHolding:=mHolding-1;
EXTGBDATASET(Z1H,EXTGBDATA(Z1H)+Lots);
EXTGBDATASET(Z1B,BARPOS);
end
end
实盘发生的问题:
1:开仓的时间与信号出现的位置不一样,见图
此主题相关图片如下:屏幕截图 2020-12-10 074554.png

2:全局变量G5H)记录的是实际开仓的数量,EXTGBDATA(G5H)读取记载的开仓数量,语句IF (EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots) THEN GOTO CONTINUELINE;本因该在实际开仓Lots手后EXTGBDATA(Z1H)>=Lots成立,从而执行GOTO CONTINUELINE,跳过开仓语句执行ONTINUELINE,实际上经常开仓数超出Lots,重复开仓。