金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
楼主: 102889

好像PEL调用C++信号不稳定

[复制链接]

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-6-29 15:38 | 显示全部楼层
老师,您看看我上面说的,不是DLL大小的问题了,我的写法也已经上传了啊,我自己认为写法没有问题,错误在int 转float 输出的问题上,还请老师下载附件看看吧,我自己认为是金字塔输出语句pData->m_pResultBuf[i]只能是float类型有关系,麻烦老师测试一下吧
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-6-30 06:40 | 显示全部楼层
老师:
    我昨天又考虑一天测试一天,我考虑到唯一有可能出现问题的语句是float *m2zd= new float[pData->m_nNumData];我把= new float[pData->m_nNumData]全部修改成= new float[pData->m_nNumData+1]了,但是问题还是不能解决,这样确定是int 转float 输出出问题了,就是出在pData->m_pResultBuf =(float)m3zds3;这条语句上,不信您可以随便把输出替换:pData->m_pResultBuf =ma1;或pData->m_pResultBuf =ma2;或pData->m_pResultBuf =ma3;或pData->m_pResultBuf =m2zd;或者使用开盘价、收盘价等数据,您怎么变换品种和周期都不会出错,唯有pData->m_pResultBuf =(float)m3zds3;这种输出整数的语句会出错。也就是金字塔里面需要修改一输出,不然我们客户无法解决这个问题。

补充内容 (2021-6-30 06:43):
只修改 case 148:的输出结果看看就知道,就是int转float输出出现了问题
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-6-30 07:00 | 显示全部楼层
老师您看看我输出的ma1\ma2\ma3\m3zds3共4个指标,在同一个周期上,变换周期情况下出现了不同数据,ma1 ma2 ma3是不会变化的,变化的仅仅是m3zds3这个数据,这样加上代码,足以说明是金字塔C++接口输出或接收出现了问题了
捕获01.PNG
捕获.PNG
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-6-30 07:05 | 显示全部楼层
老师看看这张图,我总算截到一个比较正确的图了,但是还是有一个地方周期出现了错误


补充内容 (2021-6-30 08:38):
我查看了交易日志:
2021-06-30 05:52:09.675    【系统】 软件已普通启动
2021-06-30 08:09:19.326    【系统】 软件已普通启动wei
未发现打开或刷新K线的手运行错误;查看了WIN10日志,也没有发现金字塔运行错误
捕获.PNG
回复

使用道具 举报

3

主题

2万

帖子

2万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-24
曾用名:
发表于 2021-6-30 10:21 | 显示全部楼层
如果你怀疑类型问题,那你用系统自带ma均线那个,输出结果去做类型转换试过没
也会有问题??
金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-6-30 10:25 | 显示全部楼层
好的,下午收盘后我按系统自带的那个做个给老师看看

补充内容 (2021-6-30 10:26):
按说应该是一样,我这个只是取前面的数据,相当于 ref(ma(c,n),1)
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-6-30 19:09 | 显示全部楼层
__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
        if ( pData->m_pfParam1 &&                                //参数1有效
                 pData->m_nParam1Start<0 &&                        //参数1为常数
                 pData->m_pfParam2==NULL )                        //仅有一个参数
        {     float fParam = *pData->m_pfParam1;
                        int nPeriod = (int)fParam;                        //参数1
                            float *ma1= new float[pData->m_nNumData+1];
                              float *ma2= new float[pData->m_nNumData+1];
                                float *ma3= new float[pData->m_nNumData+1];
                                int m3zds3;
                float fTotal, f1Total, f2Total;
                int i, j,nPeriodCyc,n1PeriodCyc,n2PeriodCyc;
                for (i=0; i<pData->m_nNumData; i++)
                {  
                        nPeriodCyc = 5;
                                                n1PeriodCyc = 10;
                                                n2PeriodCyc = 20;
                float fParam = *pData->m_pfParam1;
                int nPeriod = (int)fParam;        }                //参数1
                if(nPeriod>0)
                {
                        for ( i =0; i < pData->m_nNumData; i++ )//计算nPeriod周期的均线,数据从nPeriod-1开始有效
                        {    float *m2zd= new float[pData->m_nNumData+1];
                               
                        fTotal = 0.0f;
                                                f1Total = 0.0f;
                                                f2Total = 0.0f;
                                               
                                for ( j = 0; j < nPeriodCyc; j++ )                                //累加
                                        {fTotal += pData->m_pData[i-j].m_fClose;
                                   ma1 = fTotal/nPeriod;        //平均
                        }
                                                for ( j = 0; j < n1PeriodCyc; j++ )                                //累加
                                        {f1Total += pData->m_pData[i-j].m_fClose;
                                   ma2 = f1Total/n1PeriodCyc;        //平均
                        }
                for ( j = 0; j < n2PeriodCyc; j++ )                                //累加
                                {        f2Total += pData->m_pData[i-j].m_fClose;
                                   ma2 = f2Total/n2PeriodCyc;        //平均
                        }
                        m2zd=ma1>ma2?ma1:ma2;
                        if(i<5)
                           m3zds3=i;    //均线组合后的最大或最小值穿越均线的周期
                    else if(m2zd>ma3 && m2zd[i-1]<=ma3[i-1] && (m2zd[i-1]<ma3[i-1] || m2zd[i-2]<ma3[i-2] || m2zd[i-3]<ma3[i-3] || m2zd[i-4]<ma3[i-4] ||m2zd[i-5]<ma3[i-5]))
                                m3zds3=0;
                    else
                               m3zds3=m3zds3+1;
                        if(nPeriod==1)
                                pData->m_pResultBuf =ma1;
                        else if(nPeriod==2)
                                pData->m_pResultBuf =ma2;
                        else if(nPeriod==3)
                                pData->m_pResultBuf =ma3;
                        else
                          pData->m_pResultBuf =(float)m3zds3;
                    delete [] m2zd;
                        delete [] ma1;
                        delete [] ma2;
                        delete [] ma3;
                                         }
                        return 0;
                }
        }
        return -1;
}
老师,这次这个函数可是完全根据自带的系统写的,参数=1输出ma1;参数=2输出ma2;参数=3输出ma3;上面的情况一样会发生,老师可以自己去测试。这个函数我只是一个均线函数内生成了三个均线,计算方法完全是系统自带的。这样足以说明是数据类型转换引起的了吧

补充内容 (2021-6-30 19:10):
其它参数输出m3zds3,均线是不会有问题的,出问题的就是这个周期
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-6-30 19:20 | 显示全部楼层
102889 发表于 2021-6-30 19:09
__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
        if ( pData->m_pfParam1 &&                                //参数 ...

此函数4个输出,3个没有问题,一个int有问题,这样应该可以说明问题了吧
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-7-1 08:20 | 显示全部楼层
老师再等一下,上面的代码不知道哪里变动了

补充内容 (2021-7-1 08:21):
我继续编译竟然不能通过了,我修改好了再发上来
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
 楼主| 发表于 2021-7-1 12:59 | 显示全部楼层
老师您好,我测试出来了,代码如下:
__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
        if ( pData->m_pfParam1 &&                                //参数1有效
                 pData->m_nParam1Start<0 &&                        //参数1为常数
       
         pData->m_pfParam2==NULL )                        //仅有一个参数
        {
                float fParam = *pData->m_pfParam1;
                int nPeriod = (int)fParam;                        //参数1
                float *ma1= new float[pData->m_nNumData+1];
        float *ma2= new float[pData->m_nNumData+1];
        float *ma3= new float[pData->m_nNumData+1];
        int m3zds3;
                float fTotal, f1Total, f2Total;
        int i, j,nPeriodCyc=5,n1PeriodCyc=10,n2PeriodCyc=20;
                if(n1PeriodCyc>0)
                {  
                        for ( i = nPeriodCyc-1; i < pData->m_nNumData; i++ )//计算nPeriod周期的均线,数据从nPeriod-1开始有效
                        {
                                fTotal = 0.0f;
                                for ( j = 0; j < nPeriodCyc; j++ )                                //累加
                                        fTotal += pData->m_pData[i-j].m_fClose;
                                    ma1=fTotal/nPeriodCyc;
                                //pData->m_pResultBuf = ma1;        //平均
                        }
                }
                if(n1PeriodCyc>0)
                {  
                        for ( i = n1PeriodCyc-1; i < pData->m_nNumData; i++ )//计算nPeriod周期的均线,数据从nPeriod-1开始有效
                        {
                                f1Total = 0.0f;
                                for ( j = 0; j < n1PeriodCyc; j++ )                                //累加
                                        f1Total += pData->m_pData[i-j].m_fClose;
                                    ma2=f1Total/n1PeriodCyc;
                                //pData->m_pResultBuf = ma2;        //平均
                        }
                        }
                if(n2PeriodCyc>0)
                {  
                        for ( i = n2PeriodCyc-1; i < pData->m_nNumData; i++ )//计算nPeriod周期的均线,数据从nPeriod-1开始有效
                        {
                                f2Total = 0.0f;
                                for ( j = 0; j < n2PeriodCyc; j++ )                                //累加
                                        f2Total += pData->m_pData[i-j].m_fClose;
                                    ma2=f2Total/n2PeriodCyc;
                                //pData->m_pResultBuf = ma3;        //平均
                        }
                        for ( i = 0; i < pData->m_nNumData; i++ )
                        {     
                 if(nPeriod==1)
                                        pData->m_pResultBuf = ma1;
                                 else if(nPeriod==2)
                                        pData->m_pResultBuf = ma2;
                                 else
                                        pData->m_pResultBuf = ma3;
                                 
                        }

         delete [] ma1;
     delete [] ma2;
     delete [] ma3;
       
                        return nPeriodCyc-1;
                }
                 
         
        }
         
        return -1;
}
调用方法:
ma1:"STOCKFUNC@MYMACLOSE"(1);
ma2:"STOCKFUNC@MYMACLOSE"(3);
ma3:"STOCKFUNC@MYMACLOSE"(3);
问题出在loat *ma1= new float[pData->m_nNumData+1];这个定义上,因为这个定义导致了均线也是不稳定的,不知道老师有没有更好的方法,我看看去掉new,直接定义成loat *ma1t[pData->m_nNumData+1]怎么样吧

补充内容 (2021-7-1 13:08):
老师,好像无法float  ma1[pData->m_nNumData+1]这样定义,[]里面也不能定义一个数据=pData->m_nNumData+1,这样编译报错,请老师给予帮助。

补充内容 (2021-7-1 15:11):
网上粘贴, for ( i = 0; i < pData->m_nNumData; i++ )
                        {     
                                 if(nPeriod==1)
                                        pData->m_pResultBuf = ...

补充内容 (2021-7-1 15:11):
网上粘贴没有了,我给老师补上
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 19:37 , Processed in 0.230222 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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