金字塔决策交易系统

用户名  找回密码
 

微信登录

微信扫一扫,快速登录

帖子
查看: 2087|回复: 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

主题

1万

帖子

6万

积分

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

主题

819

帖子

860

积分

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] 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// 单策略监控品种的所有周期
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

主题

819

帖子

860

积分

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

主题

819

帖子

860

积分

Rank: 9Rank: 9Rank: 9

等级: 管理员

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

举报

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

本版积分规则

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

GMT+8, 2025-7-24 19:27 , Processed in 0.113091 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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