欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件金字塔软件问题提交 → 请问为何信号与实际成交发生的K线位置不一样?

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有2844人关注过本帖树形打印复制链接

主题:请问为何信号与实际成交发生的K线位置不一样?

帅哥哟,离线,有人找我吗?
sword8586
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
请问为何信号与实际成交发生的K线位置不一样?  发帖心情 Post By:2020/12/10 8:00:26 [只看该作者]

信号执行方式,固定轮询+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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/12/10 9:56:25 [只看该作者]

 你这个代码存在很大问题的啊。你用了EXTGBDATA 。这个全局变量是没有历史值的,你历史K上涉及到这个的代码和最新K位置的,它读取的值都会是一样的。你试图用这个做记录,实际上它始终只能记录最近一次写操作的值。历史上的就是被覆盖了,这种情况会直接影响历史信号的。 你还用到了Tholding。  总之你这个代码要么你就全改写成后台的代码,在后台上运行。要么就重构,不要使用读取实际账号和超全局变量了。




命数如织,当如磐石。
 回到顶部
帅哥哟,离线,有人找我吗?
sword8586
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/12/10 11:19:31 [只看该作者]

开仓位置和记录位置不一样,就是信号闪烁了:
条件里面这个从你给的代码来看,不清楚是否会闪烁“ barslast(KDPK0)=1” 你排查看下是不是这个变量本身导致的呢。


命数如织,当如磐石。
 回到顶部
帅哥哟,离线,有人找我吗?
sword8586
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By:2020/12/10 11:19:39 [只看该作者]

请教老师一个问题,图表逐K线能不能使用数组呢?我想在固定轮询模式下记录开平仓的数量。

 回到顶部
帅哥哟,离线,有人找我吗?
FireScript
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:14496 积分:0 威望:0 精华:0 注册:2017/7/4 13:40:18
  发帖心情 Post By:2020/12/10 11:28:35 [只看该作者]

 这个记录不了的。数组只能使用在一些简单的场景里。你这里的这种,无法使用的。用数组记录的思路以前也有客户提过,但是实际操作中会出很多问题,基本是无法实现的。


命数如织,当如磐石。
 回到顶部
帅哥哟,离线,有人找我吗?
sword8586
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By:2020/12/10 11:30:34 [只看该作者]

条件里面这个从你给的代码来看,不清楚是否会闪烁“ barslast(KDPK0)=1” 你排查看下是不是这个变量本身导致的呢。
老师:我不明白barslast(KDPK0)=1实际只能是某根K线下(走完K)的KDPK0满足后的第二根K成立,为何会导致闪烁?

 回到顶部
总数 14 1 2 下一页