金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 825|回复: 11

后台并行问题测试结果

[复制链接]

95

主题

196

帖子

196

积分

等级: 免费版

注册:
2021-11-18
曾用名:
发表于 2025-3-20 22:37 | 显示全部楼层 |阅读模式
机器配置 13900KF ,测试结果如下
金字塔版本操作系统运行条件结果具体情况
7.02WIN10 未激活  电源模式均试过9个自定义 固定5秒刷新, 22个预警条件(TICK刷新)异常运行8,9分钟正常, 10分钟左右出现只有2核心工作,其他围观,导致后台输出时间戳大大慢于本机时间
7.10WIN11 24H2  电源模式 平衡9个自定义 固定5秒刷新, 22个预警条件(TICK刷新)异常运行8,9分钟正常, 10分钟左右出现只有少量核心工作,其他围观,导致后台输出时间戳大大慢于本机时间
7.10WIN11 24H29个自定义 固定5秒刷新正常运行15分钟肉眼观察正常,因为自定义数据没有输出,观察CPU始终保持80%占用,保持计算
7.10WIN11 24H2 电源模式 最佳性能9个自定义 固定5秒刷新, 22个预警条件(TICK刷新)异常运行8,9分钟正常, 10分钟左右出现只有少量核心工作,其他围观,导致后台输出时间戳大大慢于本机时间
7.10WIN11 24H2 电源模式 最佳性能9个自定义 固定1秒刷新正常运行20分钟肉眼观察正常,因为自定义数据没有输出,观察CPU始终保持80%占用,保持计算
7.10WIN11 24H2 电源模式 最佳性能只运行22个预警条件(TICK刷新)异常前8分钟运行正常,占用9%,然后到11分钟时,时间戳从领先本地1秒到落后本地1秒(其实已经慢两秒了),占用12-14%。
到14分钟,输出时间戳已落后10秒,证明从11分钟左右开始,CPU计算能力慢慢跟不上公式所需要的量。但CPU整个过程占用均在15%以内。

截图202503202159273376.png
回复

使用道具 举报

0

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
gxx978
发表于 2025-3-21 09:17 | 显示全部楼层
刚开启启动计算,因为要先算历史K线,所以刚开始计算量都是很大的,后面只会在最新的K线上计算,那计算量会降低。至于核数资源的调用分配,前面也回复过,这个软件没法控制的,单靠肉眼观察,也很难准确判断核数的工作情况的,CPU的工作状态并不是只有工作和空闲2种状态的。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

37

主题

9872

帖子

5万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
wenarm
发表于 2025-3-21 09:24 | 显示全部楼层
你这种情况有可能是主进程占用资源过高,造成行情接收出现卡顿。你可以尝试在工具--选项--内存中【数据接收线程优先级】调到最高。


计算频率过高,是会影响到行情接收效率的。你可以取消双路数据接收后,打开K线图查看分笔跳动状态。
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

95

主题

196

帖子

196

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2025-3-21 09:55 | 显示全部楼层
技术006 发表于 2025-3-21 09:24
你这种情况有可能是主进程占用资源过高,造成行情接收出现卡顿。你可以尝试在工具--选项--内存中【数据接收 ...

按这个逻辑,意思是 我后台策略输出的时间戳变慢,不一定是因为CPU计算慢了,而是数据接收出现延迟了,导致策略只能延后的计算吗
回复

使用道具 举报

95

主题

196

帖子

196

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2025-3-21 10:10 | 显示全部楼层
技术006 发表于 2025-3-21 09:24
你这种情况有可能是主进程占用资源过高,造成行情接收出现卡顿。你可以尝试在工具--选项--内存中【数据接收 ...

这个试过了也不行,一样的问题。 前面CPU有负载,正常工作,是能HOLD住行情运算和接收的,后面CPU没负载了,速度才掉下来
回复

使用道具 举报

3

主题

730

帖子

771

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-10
曾用名:
发表于 2025-3-21 14:07 | 显示全部楼层
pan 发表于 2025-3-21 10:10
这个试过了也不行,一样的问题。 前面CPU有负载,正常工作,是能HOLD住行情运算和接收的,后面CPU没负载 ...

1.软件界面在主线程,如果主线程在资源占用较高的核心中,就会导致界面卡顿。
2.多个预警条件,是由操作系统动态分配到其他核心下执行,cpu开始计算时计算量高是因为一开始会计算一定的历史k线。之后下来计算量降低是因为,很对计算已经缓存好了,cpu只需要少量计算就可以完成。
3. 图中msgout是在主线线程中还行的,主线程所在核资源过高,会造成相关的输出缓慢,并不代表预警条件所在的核有问题。可以直接看交易日志中的运行解释的时间去判定。(日志输出是和预警条件在同一个核中执行的)
回复

使用道具 举报

95

主题

196

帖子

196

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2025-3-21 15:23 | 显示全部楼层
1 那为什么 到某个时间点,主线程所在的核心 就开始负载变高了呢? 如果说是操作系统自动调整的,也实在想不通,昨晚到现在 ,我是重装了系统,啥软件也没装,就一个金字塔,根据跑的预警数量不同,每次都是7-20分钟之间,出现了msgout输出缓慢同时界面卡死。
2 现在不管其他核心执行的预警条件是不是正常, 关键是为什么在7-20分钟之间的某个时点, 主线程所在的核心的负载急剧升高了
3 这个问题是否跟预警代码有关? 例如代码中如果哪些变量或者全局变量没有释放,造成随着时间积累越来越多,可能导致计算量在每个时间步是递增的?到某个时点就HOLD不住了
下面贴出了代码,请老师排查一下。 该预警代码运行在TICK周期 TICK刷新

[PEL] 复制代码
// 单策略监控品种的所有周期
QBX3_1M:SELFDATA('QBX3_1M');
QBX3_3M:SELFDATA('QBX3_3M');
QBX3_5M:SELFDATA('QBX3_5M');
QBX3_10M:SELFDATA('QBX3_10M');
QBX3_15M:SELFDATA('QBX3_15M');
QBX3_30M:SELFDATA('QBX3_30M');
QBX3_1H:SELFDATA('QBX3_1H');

VARIABLE:QBX3[7]:=(QBX3_1M,QBX3_3M,QBX3_5M,QBX3_10M,QBX3_15M,QBX3_30M,QBX3_1H);
VARIABLE:QBX3_DURATION[7]:=(60,180,300,600,900,1800,3600);

VARIABLE:SIG_PERIOD1[7]:=(22,22,22,22,22,22,22);
VARIABLE:SIG_NUM1[7]:=(3,5,5,10,10,15,30);
VARIABLE:SIG_DURATION1[7]:=(3,5,5,10,10,15,30);


VARIABLE:SIG_PERIOD2[7]:=(22,22,22,22,22,22,1);
VARIABLE:SIG_NUM2[7]:=(5,10,10,15,15,30,0);
VARIABLE:SIG_DURATION2[7]:=(5,10,10,15,15,30,60);


VARIABLE:SIG_PERIOD3[7]:=(22,22,22,22,22,1,3);
VARIABLE:SIG_NUM3[7]:=(10,15,15,30,30,0,0);
VARIABLE:SIG_DURATION3[7]:=(10,15,15,30,30,60,180);

SW5S_RANK:SELFDATA('SW5S_RANK');
SW1M_RANK:SELFDATA('SW1M_RANK');



SS:=1;
GLOBALVARIABLE:ORDER_DURATION:=0;
GLOBALVARIABLE:ZS:=C;
GLOBALVARIABLE:GBG:=C,GBD:=C;



 
平多条件:= DYNAINFO(34)=ZS;    
平空条件:= DYNAINFO(28)=ZS;     


IF GBD>ZS AND TBUYHOLDING(1)>0 THEN BEGIN
    ZS:=GBD;    
END
 
IF GBG<ZS AND TSELLHOLDING(1)>0 THEN BEGIN
    ZS:=GBG;    
END
 

IF 平多条件 AND TBUYHOLDING(1)>0  THEN TSELL(1,TBUYHOLDING(1),MKT);    
IF 平空条件 AND TSELLHOLDING(1)>0 THEN TSELLSHORT(1,TSELLHOLDING(1),MKT); 



FOR N=7 DOWNTO 1 DO
BEGIN
	// X3>0
	IF QBX3[N]>0 AND TBUYHOLDING(1)=0 THEN
	BEGIN
		// ----
		SIG1:=#TICK_SIG.PULSE_2ND(SIG_DURATION3[N]*2,QBX3[N])#;
		IF SIG1 THEN 
		BEGIN
			TBUY(1,SS,LMT,DYNAINFO(28)+MINDIFF,0);
			ZS:=CALLSTOCK('',VTLOW,SIG_PERIOD3[N],SIG_NUM3[N]);
			ORDER_DURATION:=SIG_DURATION3[N];
			GBD:=STKINDIEX('','GBDSX.GBD',0,SIG_PERIOD3[N],SIG_NUM3[N],300);
			GBG:=STKINDIEX('','GBDSX.GBG',0,SIG_PERIOD3[N],SIG_NUM3[N],300);
			BREAK;
		END
	
		// ----
		SIG1:=#TICK_SIG.PULSE_2ND(SIG_DURATION2[N]*2,QBX3[N])#;
		IF SIG1>0 AND SIG1*(QBX3_DURATION[N]/SIG_DURATION2[N])/QBX3[N]>2 THEN 
		BEGIN
			TBUY(1,SS,LMT,DYNAINFO(28)+MINDIFF,0);
			ZS:=CALLSTOCK('',VTLOW,SIG_PERIOD2[N],SIG_NUM2[N]);
			ORDER_DURATION:=SIG_DURATION2[N];
			GBD:=STKINDIEX('','GBDSX.GBD',0,SIG_PERIOD2[N],SIG_NUM1[N],300);
			GBG:=STKINDIEX('','GBDSX.GBG',0,SIG_PERIOD2[N],SIG_NUM1[N],300);
			BREAK;
		END
	
		// ----
		SIG1:=#TICK_SIG.PULSE_2ND(SIG_DURATION1[N]*2,QBX3[N])#;
		IF SIG1>0 AND SIG1*(QBX3_DURATION[N]/SIG_DURATION1[N])/QBX3[N]>2 THEN 
		BEGIN
			TBUY(1,SS,LMT,DYNAINFO(28)+MINDIFF,0);
			ZS:=CALLSTOCK('',VTLOW,SIG_PERIOD1[N],SIG_NUM1[N]);
			ORDER_DURATION:=SIG_DURATION1[N];
			GBD:=STKINDIEX('','GBDSX.GBD',0,SIG_PERIOD1[N],SIG_NUM1[N],300);
			GBG:=STKINDIEX('','GBDSX.GBG',0,SIG_PERIOD1[N],SIG_NUM1[N],300);
			BREAK;
		END		
	
	END

	
	// X3<0
	IF QBX3[N]<0  AND TSELLHOLDING(1)=0 THEN
	BEGIN
		// ----
		SIG1:=#TICK_SIG.PULSE_2ND(SIG_DURATION3[N]*3,ABS(QBX3[N]))#;
		IF SIG1 THEN 
		BEGIN
			TBUYSHORT(1,SS,LMT,DYNAINFO(34)-MINDIFF,0);
			ZS:=CALLSTOCK('',VTHIGH,SIG_PERIOD3[N],SIG_NUM3[N]);
			ORDER_DURATION:=SIG_DURATION3[N];
			GBD:=STKINDIEX('','GBDSX.GBD',0,SIG_PERIOD3[N],SIG_NUM3[N],300);
			GBG:=STKINDIEX('','GBDSX.GBG',0,SIG_PERIOD3[N],SIG_NUM3[N],300);
			BREAK;
		END
	
		// ----
		SIG1:=#TICK_SIG.PULSE_2ND(SIG_DURATION3[N]*2,ABS(QBX3[N]))#;
		IF SIG1 THEN 
		BEGIN
			TBUYSHORT(1,SS,LMT,DYNAINFO(34)-MINDIFF,0);
			ZS:=CALLSTOCK('',VTHIGH,SIG_PERIOD2[N],SIG_NUM2[N]);
			ORDER_DURATION:=SIG_DURATION2[N];
			GBD:=STKINDIEX('','GBDSX.GBD',0,SIG_PERIOD2[N],SIG_NUM2[N],300);
			GBG:=STKINDIEX('','GBDSX.GBG',0,SIG_PERIOD2[N],SIG_NUM2[N],300);
			BREAK;
		END
	
		// ----
		SIG1:=#TICK_SIG.PULSE_2ND(SIG_DURATION1[N]*2,ABS(QBX3[N]))#;
		IF SIG1 THEN 
		BEGIN
			TBUYSHORT(1,SS,LMT,DYNAINFO(34)-MINDIFF,0);
			ZS:=CALLSTOCK('',VTHIGH,SIG_PERIOD1[N],SIG_NUM1[N]);
			ORDER_DURATION:=SIG_DURATION1[N];
			GBD:=STKINDIEX('','GBDSX.GBD',0,SIG_PERIOD1[N],SIG_NUM1[N],300);
			GBG:=STKINDIEX('','GBDSX.GBG',0,SIG_PERIOD1[N],SIG_NUM1[N],300);
			BREAK;
		END	
	END		

END

MSGOUT(ISLASTBAR=1,STKLABEL &' ' &NUMTOSTR(TBUYHOLDING(1),0)&' ' &NUMTOSTR(TBUYHOLDING(1),0));

回复

使用道具 举报

3

主题

730

帖子

771

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-10
曾用名:
发表于 2025-3-21 16:17 | 显示全部楼层
pan 发表于 2025-3-21 15:23
1 那为什么 到某个时间点,主线程所在的核心 就开始负载变高了呢? 如果说是操作系统自动调整的,也实在想 ...

1.所有的msgout输出都在主界面进程中,你tick级别不断执行,只会让主线程所在的核一直处于疯狂打印过程中,自然是可能造成主界面没有平时顺畅。
注:注释msgout函数,策略是否执行,是否存在延迟可以直接通过交易日志+debugfile判断。
2.策略执行中要输出内容都堆积在主进程中,一定会越来越卡。3.你的代码的循环体,相当于一笔行情需要执行7遍策略。而且这个循环体根本没有意义,7遍中的每一遍之间都没有关系。最终在k线上看,只是N=7的一遍结果,其余6遍相对于K线都是没有意义的。


回复

使用道具 举报

95

主题

196

帖子

196

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2025-3-21 16:30 | 显示全部楼层
1 请问把msgout改成debugfile, 这个debugfile是由预警条件所在的核去执行的吗(不占用主线程)?
交易日志是不是 截图202503211627386255.png 这里面的?

内容全都是
2025-03-19 14:35:16.492    【后台】SA00 运行结束
2025-03-19 14:35:16.492    【后台】SN00 运行结束
2025-03-19 14:35:16.495    【后台】RM00 运行结束
2025-03-19 14:35:16.497    【后台】MA00 运行结束
2025-03-19 14:35:16.500    【后台】P00 运行结束
2025-03-19 14:35:16.502    【后台】SP00 运行结束
2025-03-19 14:35:16.504    【后台】SH00 运行结束
2025-03-19 14:35:16.506    【后台】I00 运行结束
2025-03-19 14:35:16.509    【后台】RU00 运行结束
2025-03-19 14:35:16.511    【后台】FU00 运行结束
2025-03-19 14:35:16.513    【后台】TA00 运行结束

是什么意思呢

2 我的代码7个循环实际想检测不同的7大周期 与3个不同的小周期之间是否组合触发信号, 以便能及时开仓用的
回复

使用道具 举报

3

主题

730

帖子

771

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

注册:
2021-5-10
曾用名:
发表于 2025-3-21 16:42 | 显示全部楼层
1. 是。每个品种执行一次,这里就会打印输出一次记录。
2.你这个循环逻辑我已经解释了,没有意义的执行过程.软件的下单语句在循环体中也只会有效下单一次。循环体在k线时间维度上看,只有最后一次的执行结果存在。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 16:23 , Processed in 0.142247 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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