以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 金字塔软件问题提交 (http://weistock.com/bbs/list.asp?boardid=2) ---- 请问为何信号与实际成交发生的K线位置不一样? (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=183391) |
-- 作者:sword8586 -- 发布时间:2020/12/10 8:00:26 -- 请问为何信号与实际成交发生的K线位置不一样? 信号执行方式,固定轮询+tick;交易条件如下: 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 实盘发生的问题: 2:全局变量G5H)记录的是实际开仓的数量,EXTGBDATA(G5H)读取记载的开仓数量,语句IF (EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots) THEN GOTO CONTINUELINE;本因该在实际开仓Lots手后EXTGBDATA(Z1H)>=Lots成立,从而执行GOTO CONTINUELINE,跳过开仓语句执行ONTINUELINE,实际上经常开仓数超出Lots,重复开仓。 |
-- 作者:sword8586 -- 发布时间:2020/12/10 9:56:00 -- 不好意思: 2:全局变量G5H)记录的是实际开仓的数量,EXTGBDATA(G5H)读取记载的开仓数量,语句IF (EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots) THEN GOTO CONTINUELINE;本因该在实际开仓Lots手后EXTGBDATA(Z1H)>=Lots成立,从而执行GOTO CONTINUELINE,跳过开仓语句执行ONTINUELINE,实际上经常开仓数超出Lots,重复开仓。 中的EXTGBDATA(G5H),是笔误,实际是EXTGBDATA(Z1H)。
|
-- 作者:FireScript -- 发布时间:2020/12/10 9:56:25 -- 你这个代码存在很大问题的啊。你用了EXTGBDATA 。这个全局变量是没有历史值的,你历史K上涉及到这个的代码和最新K位置的,它读取的值都会是一样的。你试图用这个做记录,实际上它始终只能记录最近一次写操作的值。历史上的就是被覆盖了,这种情况会直接影响历史信号的。 你还用到了Tholding。 总之你这个代码要么你就全改写成后台的代码,在后台上运行。要么就重构,不要使用读取实际账号和超全局变量了。 |
-- 作者:sword8586 -- 发布时间:2020/12/10 10:26:04 -- FireScript版主老师好: 实际上: 1、EXTGBDATA(Z1H)它不会影响任何历史信号的,实盘中也从未发现历史信号闪烁——相对应的是发现了最新的信号闪烁!因为我用的是IF (EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots) THEN GOTO CONTINUELINE; 这句话不会判断任何holding,而且Tholding本就无用,就是应为holding在固定轮询不能真实的记载开仓数量才采用EXTGBDATASET(Z1H,EXTGBDATA(Z1H)+Lots);来记录开仓数量,可以忽略||Tholding的作用。理论上,goto应该跳过该句下的语句到达GOTO CONTINUELINE,从而不再开仓。由于固定轮询,理论上没有if XXX then GOTO CONTINUELINE就可能多开,但实际上发生了多开。 2、if KCN=1 and ((O+MINDIFF)>=L&&(O+MINDIFF)<=H) and not(KDPK0) then begin。该句的目的就是为了只要KCN=1,及O+MINDIFF出现就开仓。这为何会发生信号闪烁呢?不解的是KCN=1一直满足,((O+MINDIFF)>=L&&(O+MINDIFF)<=H) and not(KDPK0) 也是恒满足,理论上不应该信号闪烁才对!
|
-- 作者:sword8586 -- 发布时间:2020/12/10 10:35:46 -- 3、由于holging不能真实的记载开仓数量我才将平仓语句中平仓数量0(为保证全平)改为EXTGBDATA(Z1H) 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 这样的改动不会影响历史信号,只是换种方式去平仓。 4、去掉IF (EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots) THEN GOTO CONTINUELINE; 该holding<lots and holding>0 限制开仓,图表显示的信号与采用IF (EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots) THEN GOTO CONTINUELINE;限制开仓的历史信号完全一致,实盘也一致!实盘历史信号那种方式都不闪烁的 |
-- 作者:FireScript -- 发布时间:2020/12/10 11:07:05 -- 你把 “(EXTGBDATA(Z1H)>=Lots||EXTGBDATA(Z1B)=BARPOS||Tholding>=Lots”这部分单独定义到一个变量里,你输出看下。 另外你这个代码的目的有点奇怪: “EXTGBDATA(G5H)>=Lots确保最多开Lots手仓---EXTGBDATA(G5B)=BARPOS确保当根K线只开Lots手仓一次” 图表上一个K,同一个下单语句不会触发2次下单的。计算信号闪烁了,也不会导致重复下单的。只有在不同K上 才能多次下单。
|
-- 作者:FireScript -- 发布时间:2020/12/10 11:19:31 -- 开仓位置和记录位置不一样,就是信号闪烁了: 条件里面这个从你给的代码来看,不清楚是否会闪烁“ barslast(KDPK0)=1” 你排查看下是不是这个变量本身导致的呢。
|
-- 作者:sword8586 -- 发布时间:2020/12/10 11:19:39 -- 请教老师一个问题,图表逐K线能不能使用数组呢?我想在固定轮询模式下记录开平仓的数量。 |
-- 作者:FireScript -- 发布时间:2020/12/10 11:28:35 -- 这个记录不了的。数组只能使用在一些简单的场景里。你这里的这种,无法使用的。用数组记录的思路以前也有客户提过,但是实际操作中会出很多问题,基本是无法实现的。 |
-- 作者:sword8586 -- 发布时间:2020/12/10 11:30:34 -- 条件里面这个从你给的代码来看,不清楚是否会闪烁“ barslast(KDPK0)=1” 你排查看下是不是这个变量本身导致的呢。 老师:我不明白barslast(KDPK0)=1实际只能是某根K线下(走完K)的KDPK0满足后的第二根K成立,为何会导致闪烁?
|