以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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
实盘发生的问题:
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,重复开仓。

--  作者: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成立,为何会导致闪烁?