金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 3959|回复: 9

为何会偶尔多开一手?

[复制链接]

57

主题

213

帖子

223

积分

Rank: 4

等级: 专业版

注册:
2022-1-11
曾用名:
发表于 2022-8-16 11:00 | 显示全部楼层 |阅读模式
如题:股票池运行检测holding,写入注册文件,后台读取。股票池运行1秒,后台500或1000间隔扫描执行。
出现多开一手现象。请老师帮忙找找原因。

GZ:=(STKNAME='50股指连续')||(STKNAME='300股指连续')||(STKNAME='500股指连续'),NODRAW;//为股指
nGZ:=not(GZ),NODRAW;//非股指

TbuyHT:=TBUYHOLDINGEX('','',0);//今多仓  
TbuyHY:=TBUYHOLDINGEX('','',2)-TbuyHT;//老多仓
TSellHT:=TSELLHOLDINGEX('','',0);//今空仓  
TSellHY:=TSELLHOLDINGEX('','',2)-TSellHT;//老空仓
   {
   mswitch0:= STKNAME() & 'ZSBS';
   mswitch1:= STKNAME() & 'ZSSS';       
   mhold0:= STKNAME() & 'ZSBh';
   mhold1:= STKNAME() & 'ZSSh';

                switch0:EXTGBDATA(mswitch0),NODRAW,COLORWHITE;//获取《某一股票已开多仓数量》
                switch1:EXTGBDATA(mswitch1),NODRAW,COLORWHITE;//获取《某一股票已开空仓数量》
                hold0:EXTGBDATA(mhold0),NODRAW,COLORWHITE;
                hold1:EXTGBDATA(mhold1),NODRAW,COLORWHITE;               
                Dhd00:hold0-switch0,NODRAW,COLORWHITE;//《某一股票拟平开多仓数量与已有多仓数之差》——开平仓进行与否的开关
                Dhd11:hold1-switch1,NODRAW,COLORWHITE;//《某一股票拟平开空仓数量与已有空仓数之差》——开平仓进行与否的开关
                }
                switch0:=GETINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBS'),NODRAW,COLORWHITE;//获取《某一股票已开多仓数量》
                switch1:=GETINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSS'),NODRAW,COLORWHITE;//获取《某一股票已开空仓数量》
                hold0:=GETINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBh'),NODRAW,COLORWHITE;
                hold1:=GETINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSh'),NODRAW,COLORWHITE;               
                Dhd00:=hold0-switch0,NODRAW,COLORWHITE;//《某一股票拟平开多仓数量与已有多仓数之差》——开平仓进行与否的开关
                Dhd11:=hold1-switch1,NODRAW,COLORWHITE;//《某一股票拟平开空仓数量与已有空仓数之差》——开平仓进行与否的开关               

{ IF ISLASTBAR THEN
BEGIN
  DEBUGFILE('D:\TEST1.TXT','当前资产为%.2f',1234);
END; }              
//------------------------------------------开平仓:Dhd00<>0/Dhd11<>0。新老仓数量不一------------------------------------------
//--------------复位:EXTGBDATASET(mhold0,hold1),老仓标识记录新仓数量。Dhd10=0新老仓数量一致。---------------------
if Dhd00<>0 then BEGIN
   //------------------------------------------平多:优先平老仓后/老仓不足则平今仓转为开空仓对锁下单程序-------------------------------------------------
   if hold0=0&&switch0>0 then begin//hold0=0获取《某一股票开多仓信号标识》的持仓数量=0——平仓;switch0=0——开关状态为《只可平》状态
      if TbuyHY>=abs(Dhd00) then BEGIN//老仓数量>=可平数量————优先平老多仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBS',hold0);  
                //EXTGBDATASET(mswitch0,hold0);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('平多:======1、老多足够,先平。价格'&NUMTOSTR(CLOSE,2),1);                  
                //DEBUGFILE('C:\TEST\TEST3.TXT','平多:======1、老多足够,先平。',1);           
                tsell(1,abs(Dhd00),mkt);     
                GOTO CONTINUELINE;                 
      end
      if TbuyHY<abs(Dhd00)&&TbuyHY>0 then BEGIN//老多仓数量<可平数量————优先平老多仓,不足补开空对锁
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBS',hold0);   
                //EXTGBDATASET(mswitch0,hold0);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('平多:===2、老多不够,先平;开空对锁补足不够。价格'&NUMTOSTR(CLOSE,2),1);                  
                //DEBUGFILE('C:\TEST\TEST3.TXT','平多:===2、老多不够,先平;开空对锁补足不够。',2);   
                tsell(1,TbuyHY,mkt);//优先平老多仓
                if nGZ=1 then tbuyshort(1,abs(Dhd00)-TbuyHY,mkt);//不足补开空对锁
                if GZ=1 then tbuyshort(1,abs(Dhd00)-TbuyHY,LMT,CLOSE,0);//不足补开空对锁                   
                GOTO CONTINUELINE;      
      end
      if TbuyHY=0 then BEGIN//没有老多仓————直接开空仓对锁今多仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBS',hold0);  
                //EXTGBDATASET(mswitch0,hold0);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('平多:===3、没有老多;开空对锁。价格'&NUMTOSTR(CLOSE,2),1);                  
                //DEBUGFILE('C:\TEST\TEST3.TXT','平多:===3、没有老多;开空对锁。',3);      
                if nGZ=1 then tbuyshort(1,abs(Dhd00),mkt);//不足补开空对锁
                if GZ=1 then tbuyshort(1,abs(Dhd00),LMT,CLOSE,0);//不足补开空对锁  
                GOTO CONTINUELINE;                               
      end
   end

   //------------------------------------------开多:优先平老空仓对锁下单程序/老空仓不足则开多仓-------------------------------------------------
   if hold0>0 then begin//hold0=1获取《某一股票开多仓信号标识》的持仓数量=1——开仓;switch0=0——开关状态为《只可开》状态
      if TSellHY>=abs(Dhd00) then BEGIN//老空仓数量>=可平数量————优先平老空仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBS',hold0);  
                //EXTGBDATASET(mswitch0,hold0);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('开多:======1、老空足够,先平。价格'&NUMTOSTR(CLOSE,2),1);                  
                //DEBUGFILE('C:\TEST\TEST3.TXT','开多:======1、老空足够,先平。',4);   
                tsellshort(1,abs(Dhd00),mkt);        
                GOTO CONTINUELINE;                          
      end
      if TSellHY<abs(Dhd00)&&TSellHY>0 then BEGIN//老空仓数量<可平数量————优先平老空仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBS',hold0);  
                //EXTGBDATASET(mswitch0,hold0);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('开多:===2、老空不够,先平;开多补足。价格'&NUMTOSTR(CLOSE,2),1);               
                //DEBUGFILE('C:\TEST\TEST3.TXT','开多:===2、老空不够,先平;开多补足。',5);     
                tsellshort(1,TSellHY,mkt);//优先平老空仓
                if nGZ=1 then tbuy(1,abs(Dhd00)-TSellHY,mkt);//不足补开多
                if GZ=1 then tbuy(1,abs(Dhd00)-TSellHY,LMT,CLOSE,0);//不足补开多
                GOTO CONTINUELINE;                                  
      end
      if TSellHY=0 then BEGIN//没有老空仓————直接开多仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSBS',hold0);  
                //EXTGBDATASET(mswitch0,hold0);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('开多:===3、没有老空,直接开多。价格'&NUMTOSTR(CLOSE,2),1);               
                //DEBUGFILE('C:\TEST\TEST3.TXT','开多:===3、没有老空,直接开多。',6);   
                if nGZ=1 then tbuy(1,abs(Dhd00),mkt);//不足补开多
                if GZ=1 then tbuy(1,abs(Dhd00),LMT,CLOSE,0);//不足补开多  
                GOTO CONTINUELINE;                          
      end
   end
END
if Dhd11<>0 then BEGIN      
   //------------------------------------------平空:优先平老空仓后/老空仓不足则平今空仓转为开多仓对锁下单程序-------------------------------------------------
   if hold1=0&&switch1<0 then begin//hold0=0获取《某一股票开空仓信号标识》的持仓数量=0——平仓;switch0=0——开关状态为《只可平》状态
      if TSellHY>=abs(Dhd11) then BEGIN//老空仓数量>=可平数量————优先平老空仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSS',hold1);  
                //EXTGBDATASET(mswitch1,hold1);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('平空:======1、老空足够,先平。价格'&NUMTOSTR(CLOSE,2),1);               
                //DEBUGFILE('C:\TEST\TEST3.TXT','平空:======1、老空足够,先平。',7);      
                tsellshort(1,abs(Dhd11),mkt);
                GOTO CONTINUELINE;                           
      end
      if TSellHY<abs(Dhd11)&&TSellHY>0 then BEGIN//老空仓数量<可平数量————优先平老空仓,不足补开多对锁
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSS',hold1);
                //EXTGBDATASET(mswitch1,hold1);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('平空:===2、老空不够,先平;开多补足。价格'&NUMTOSTR(CLOSE,2),1);               
                //DEBUGFILE('C:\TEST\TEST3.TXT','平空:===2、老空不够,先平;开多补足。',8);      
                tsellshort(1,TSellHY,mkt);//优先平老空仓
                if nGZ=1 then tbuy(1,abs(Dhd11)-TSellHY,mkt);//不足补开多对锁
                if GZ=1 then tbuy(1,abs(Dhd11)-TSellHY,LMT,CLOSE,0);//不足补开多对锁
                GOTO CONTINUELINE;                         
      end
      if TSellHY=0 then BEGIN//没有老空仓————直接开多仓对锁今空仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSS',hold1);
                //EXTGBDATASET(mswitch1,hold1);//--------------复位:EXTGBDATASET(mhold0,hold1)  
                SENDPHONEMSG('平空:===3、没有老空,直接开多。价格'&NUMTOSTR(CLOSE,2),1);            
                //DEBUGFILE('C:\TEST\TEST3.TXT','平空:===3、没有老空,直接开多。',9);   
                if nGZ=1 then tbuy(1,abs(Dhd11),mkt);//不足补开多对锁
                if GZ=1 then tbuy(1,abs(Dhd11),LMT,CLOSE,0);//不足补开多对锁   
                GOTO CONTINUELINE;                     
      end
   end

   //------------------------------------------开空:优先平老多仓对锁下单程序/老多仓不足则开空仓-------------------------------------------------
   if hold1<0 then begin//hold0=1获取《某一股票开空仓信号标识》的持仓数量=1——开仓;switch0=0——开关状态为《只可开》状态
      if TbuyHY>=abs(Dhd11) then BEGIN//老多仓数量>=可平数量————优先平老多仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSS',hold1);
                //EXTGBDATASET(mswitch1,hold1);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('开空:===1、老多足够,先平。价格'&NUMTOSTR(CLOSE,2),1);            
                //DEBUGFILE('C:\TEST\TEST3.TXT','开空:===1、老多足够,先平。',10);     
                tsell(1,abs(Dhd11),mkt);
                GOTO CONTINUELINE;                           
      end
      if TbuyHY<abs(Dhd11)&&TbuyHY>0 then BEGIN//老多仓数量<可平数量————优先平老多仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSS',hold1);
                //EXTGBDATASET(mswitch1,hold1);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('开空:===2、老多不够,先平;开空补足不够。价格'&NUMTOSTR(CLOSE,2),1);            
                //DEBUGFILE('C:\TEST\TEST3.TXT','开空:===2、老多不够,先平;开空补足不够。',11);      
                tsell(1,TbuyHY,mkt);//优先平老多仓
                if nGZ=1 then tbuyshort(1,abs(Dhd11)-TbuyHY,mkt);//不足补开空
                if GZ=1 then tbuyshort(1,abs(Dhd11)-TbuyHY,LMT,CLOSE,0);//不足补开空  
                GOTO CONTINUELINE;                          
      end
      if TbuyHY=0 then BEGIN//没有老多仓————直接开空仓
                WRITEINIFILE('C:\MCNINFILE.INI',STKNAME,'ZSSS',hold1);
                //EXTGBDATASET(mswitch1,hold1);//--------------复位:EXTGBDATASET(mhold0,hold1)
                SENDPHONEMSG('开空:===3、没有老多;直接开空。价格'&NUMTOSTR(CLOSE,2),1);           
                //DEBUGFILE('C:\TEST\TEST3.TXT','开空:===3、没有老多;直接开空。',12);      
                if nGZ=1 then tbuyshort(1,abs(Dhd11),mkt);//不足补开空
                if GZ=1 then tbuyshort(1,abs(Dhd11),LMT,CLOSE,0);//不足补开空
                GOTO CONTINUELINE;                      
      end
   end
end
CONTINUELINE@ HD:1,COLORYELLOW,LINETHICK0;   

回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-8-16 11:08 | 显示全部楼层
你现在情况 是你写到文件里的手数 和实际持仓手数不一样?

你监控的品种是什么品种,因为你代码里区分了老仓,今仓。但是只有期货上期或者股票品种才能实际区分今仓老仓。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

57

主题

213

帖子

223

积分

Rank: 4

等级: 专业版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2022-8-16 12:14 | 显示全部楼层
是的,我监控的是所有品种,都是这样写的
TbuyHT:=TBUYHOLDINGEX('','',0);//今多仓  
TbuyHY:=TBUYHOLDINGEX('','',2)-TbuyHT;//老多仓
TSellHT:=TSELLHOLDINGEX('','',0);//今空仓  
TSellHY:=TSELLHOLDINGEX('','',2)-TSellHT;//老空仓
如果要按交易所区分,我要如何写优先平老仓或对所。

补充内容 (2022-8-16 12:14):
对锁不是对所
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-8-16 13:23 | 显示全部楼层
本帖最后由 技术009 于 2022-8-16 14:16 编辑

你说的开多了一手 是对锁过程中的还是增减仓过程中造成的。给出具体交易日志中对应的语句,我要明确是到底哪里的语句多下了。是一条语句多个K上重复触发了开仓导致的,还是一条语句上某次开仓开的数量多了。 你前面给的细节太少了,不是很好判断你本地的情况。


另外非上期品种,你没办法做实质上的今老仓区分的。默认都是优先平老仓,只能是把平仓量设置为最大=老仓量。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

57

主题

213

帖子

223

积分

Rank: 4

等级: 专业版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2022-8-16 14:26 | 显示全部楼层
技术009 发表于 2022-8-16 13:23
你说的开多了一手 是对锁过程中的还是增减仓过程中造成的。给出具体交易日志中对应的语句,我要明确是到底 ...

老师好,1、我如何用PEL语言表述区分除开上期以外的市场(包括期指)?2、您提供的日志查找语句,给我了指引。晚上我回家核对。
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-8-16 14:32 | 显示全部楼层
本帖最后由 技术009 于 2022-8-16 14:34 编辑

“1、我如何用PEL语言表述区分除开上期以外的市场(包括期指)?”这个应该不需要额外处理了。我看了你代码,应该已经是处理过了。就是限制了平仓数量不超过老仓数量(超过了的话,今仓也是会被平的)。这个我再细看下。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

57

主题

213

帖子

223

积分

Rank: 4

等级: 专业版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2022-8-16 20:51 | 显示全部楼层
按照老师提示,核对日志与成交:图中为后台公式名,实际成交公式图2与图3,其中图2的公式formula不知从何而来!
截图202208162045245870.png
截图202208162050079637.png
截图202208162051034637.png
回复

使用道具 举报

57

主题

213

帖子

223

积分

Rank: 4

等级: 专业版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2022-8-16 20:57 | 显示全部楼层
2022-08-16 14:39:39.518    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.530    【后台】IC00 TBuyShort 第 62 行 策略:<ZFStockB期货> 出现信号
2022-08-16 14:39:39.543    【后台】IC00 TBuyShort 已成功触发下单操作 价格:0.000000 数量:1 类型:1 账户: 品种:IC00
2022-08-16 14:39:39.555    【后台】下单已发送
2022-08-16 14:39:39.567    【后台】IC00 运行结束
2022-08-16 14:39:39.577    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.588    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.600    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.611    【后台】IF00 运行结束
2022-08-16 14:39:39.623    【指令】收到回报指令 ID = 888888888 RefID = 1348 品种:IC2208 账户:855555555
2022-08-16 14:39:39.635    【后台】IH00 运行结束
2022-08-16 14:39:39.646    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.657    【回报】855555555 : IC2208 - 已报单 1 价格:6447.2 开 卖
2022-08-16 14:39:39.668    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.680    【指令】收到回报指令 ID = 58888888 RefID = 1348 品种:IC2208 账户:855555555
2022-08-16 14:39:39.692    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.704    【指令】收到成交回报指令 REFID = 1348 vol = 1 Account = 855555555
2022-08-16 14:39:39.716    【回报】855555555 : IC2208 - 已成交 1 价格:6447.8 开 卖
2022-08-16 14:39:39.727    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.744    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.749    【股票池】共有 1 个品种进入状态池 STOCKB_TSSK
2022-08-16 14:39:39.761    【下单】IC08 价0.000000 量1 买卖1 类型1 开平0 账户855555555Formula 1
2022-08-16 14:39:39.772    【下单】确认报单已发送 ID=5555555549 RefID = 1348
回复

使用道具 举报

21

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2022-8-17 09:04 | 显示全部楼层
你是勾选了股票池的下单了吧。
这种 Formula 1 触发的下单 一般在手工或者一些单独的下单功能上会体现,股票池下单也是这样记录的。

截图202208170904436418.png

你看下是不是某个股票池这里有勾选这个。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

57

主题

213

帖子

223

积分

Rank: 4

等级: 专业版

注册:
2022-1-11
曾用名:
 楼主| 发表于 2022-8-18 06:26 | 显示全部楼层
我调整了时间间隔,问题目前消失了。不是又股票池设置引起,可能是硬盘写入与读取的时间差导致。我继续观察。


补充内容 (2022-8-18 06:27):
谢谢
截图202208180625073487.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2025-6-7 06:38 , Processed in 0.157710 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表