金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2621|回复: 8

STOCKFUNC的逐K模式,PEL调用2次这个函数,就会出异常

[复制链接]

55

主题

179

帖子

179

积分

等级: 免费版

注册:
2021-11-18
曾用名:
发表于 2022-5-25 13:18 | 显示全部楼层 |阅读模式
我用STOCKFUNC的逐K模式,就用范例里面的逐K计算移动平均值MA。我发现一个现象:
(1)如果PEL公式中只调用DLL公式一次,那么是正常的。
MA1:"STOCKFUNC@MYZK"(CLOSE,5);
显示正常;

(2)如果PEL公式中调用DLL公式2次,数据就明显异常
MA1:"STOCKFUNC@MYZK"(CLOSE,5);
MA2:"STOCKFUNC@MYZK"(CLOSE,10);
所有显示就错了,数据从4770偏移到了4600

这个可能是由里面的static vector调用导致的吗?


截图202205251317376348.png
截图202205251315236397.png
回复

使用道具 举报

1

主题

843

帖子

853

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2022-5-25 13:42 | 显示全部楼层
这个只能你自己日志调试看看了,我们是不知道你代码里具体是什么逻辑的
回复

使用道具 举报

55

主题

179

帖子

179

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2022-5-25 14:21 | 显示全部楼层
代码就是下面啊,官方提供的范例来的,将你们注释掉的逐K那个代码取消注释,我一行都没有自己写啊。

__declspec( dllexport ) int WINAPI MYZK( CALCINFO* pData )
{
            //对于逐K线模式,的处理方式的示范代码
                if(pData->m_pfParam1 && pData->m_pfParam2)
                {
                        //对于逐K线模式,由于传递数据都是数值,因此需要一个数组用来保存传递过来的参数,用来计算.
                        //本例只是简单演示这个用法,如果用户在公式多次调用了接口,则会出现重复使用该变量导致计算出错
                        //因此要根据情况做几个这种全局静态变量用于保存各种数据。
                        static std::vector<double> arMaData;

                        //第一个周期初始化数据
                        if(pData->m_dwBarpos == 0)
                        {
                                arMaData.clear();
                        }

                        double dbData = *pData->m_pfParam1;

                        //防止使用仅刷最后K线的反复刷新问题
                        if(arMaData.size() >= pData->m_nNumData)
                                arMaData[arMaData.size()-1] = dbData; //仅仅更新最后一个数据
                        else
                                arMaData.push_back(dbData);

                        DWORD dwCyc = (DWORD) *pData->m_pfParam2;

                        if(pData->m_dwBarpos < dwCyc-1)
                        {
                                //对于未到计算周期,返回无效数据
                                return -1;
                        }

                        //先累加
                        float fAdd = 0;
                        for(DWORD i = pData->m_dwBarpos-(dwCyc-1); i <= pData->m_dwBarpos; i++)
                        {
                                fAdd += arMaData[i];
                        }

                        *pData->m_pResultBuf = fAdd / dwCyc;
                }
                return 1;
}
回复

使用道具 举报

55

主题

179

帖子

179

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2022-5-25 14:24 | 显示全部楼层
你们这个注释:
//本例只是简单演示这个用法,如果用户在公式多次调用了接口,则会出现重复使用该变量导致计算出错
//因此要根据情况做几个这种全局静态变量用于保存各种数据。

多次调用接口,就是指“在PEL公式里面多次调用”?我原来以为这行的意思是说,一个PEL公式在不同K线上被多次刷新(刷新就相当于多次调用接口)
回复

使用道具 举报

1

主题

843

帖子

853

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2022-5-25 14:48 | 显示全部楼层
那应该就是多次调用干扰到了,如果你模型里有多次调用的,建议你更换不同的DLL名称来规避吧
回复

使用道具 举报

55

主题

179

帖子

179

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2022-5-25 15:47 | 显示全部楼层
我发现,在逐K模式里面,也能像序列模式那样,直接访问 pData->m_pData[ i ].m_fClose来获得收盘价,不需要使用static变量储存了

避免使用static,的确简化很多。

PEL连续调用2次逐K模式DLL,现在都正常了
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
发表于 2022-5-26 09:42 | 显示全部楼层
这不是金字塔的问题,也不是vector的问题,是自己的代码问题。就跟我去年总解决不了new数组问题一样,几个月后才知道是自己代码的问题,二次调用之间缺少数据刷新造成的
截图202205260939457995.png
捕获.PNG
回复

使用道具 举报

55

主题

179

帖子

179

积分

等级: 免费版

注册:
2021-11-18
曾用名:
 楼主| 发表于 2022-5-26 17:32 | 显示全部楼层
您好,能具体说下二次调用之间缺少数据刷新,具体是怎么做吗?我光看这个截图还看不懂代码应该怎么写啊
STOCKFUNC的传入参数和传出参数怎么使用吗?(能够参数修改后传出?)
回复

使用道具 举报

36

主题

136

帖子

146

积分

Rank: 4

等级: 专业版

注册:
2021-5-20
曾用名:
永杰
发表于 2022-5-29 07:07 | 显示全部楼层
图上是new数组的,容器的加上类似功能
捕获.PNG
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 13:24 , Processed in 0.310441 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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