以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  C++开发的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=158332)

--  作者:qq代人发帖
--  发布时间:2017/9/28 16:03:43
--  C++开发的问题
c++开发问题:
基于逐K线模式,修改示例程序MYMAVAR如下:
if(pData->m_pfParam1 && pData->m_pfParam2)
{
//对于逐K线模式,由于传递数据都是数值,因此需要一个数组用来保存传递过来的参数,用来计算.
//本例只是简单演示这个用法,如果用户在公式多次调用了接口,则会出现重复使用该变量导致计算出错
//因此要根据情况做几个这种全局静态变量用于保存各种数据。


log_info("MA in");
*pData->m_pResultBuf = pData->m_dwBarpos;
log_info("MA out");
}
return 1;

计算日志显示中间会有一秒的延迟,日志如下:
2017-09-28 15:50:55.4144345.08 MA out
[200] 2017-09-28 15:50:56.4144345.10 MA in

请问是什么问题?


--  作者:无为剑
--  发布时间:2017/9/28 16:22:54
--  
建议你查查你自己的日志代码是不是记录的有问题
[此贴子已经被作者于2017/9/28 16:23:05编辑过]

--  作者:李润Rex
--  发布时间:2017/9/28 16:42:11
--  
就是因为发现卡,所以才用日志系统查看的呀。
--  作者:无为剑
--  发布时间:2017/9/28 16:43:49
--  

逐K线模式这里就只执行一句话而已,不会耗时一秒的

并且逐k线会在每根K线执行时都调用,因此你应该有很多条日志记录才对


--  作者:李润Rex
--  发布时间:2017/9/28 17:04:52
--  
是的,日志有很多,我只贴了突变的那个节点。我把完整的贴下来吧:


--  作者:李润Rex
--  发布时间:2017/9/28 17:05:45
--  
代码:
__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData)
{
if(pData->m_pfParam1 && pData->m_pfParam2)
{
log_info("MA in");
static std::vector<double> arMaData(30000,0);
//第一个周期初始化数据
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;
log_info("MA out");
}
return 1;
}

--  作者:李润Rex
--  发布时间:2017/9/28 17:08:52
--  
日志:行数44824

正常情况如下:
[200]
			2017-09-28
			17:02:31.8439827.79
			MA
			in
[200]
			2017-09-28
			17:02:31.8439827.80
			MA
			out
[200]
			2017-09-28
			17:02:31.8439827.84
			MA
			in
[200]
			2017-09-28
			17:02:31.8439827.85
			MA
			out
[200]
			2017-09-28
			17:02:31.8439827.88
			MA
			in
[200]
			2017-09-28
			17:02:31.8439827.90
			MA
			out
[200]
			2017-09-28
			17:02:31.8439827.93
			MA
			in
[200]
			2017-09-28
			17:02:31.8439827.95
			MA
			out
[200]
			2017-09-28
			17:02:31.8439827.98
			MA
			in
[200]
			2017-09-28
			17:02:31.8439828.01
			MA
			out
[200]
			2017-09-28
			17:02:31.8439828.07
			MA
			in
[200]
			2017-09-28
			17:02:31.8439828.09
			MA
			out


突变点如下:
[200]
				2017-09-28
				17:02:31.8440248.55
				MA
				in
[200]
				2017-09-28
				17:02:31.8440248.56
				MA
				out
[200]
				2017-09-28
				17:02:32.8440248.58
				MA
				in
[200]
				2017-09-28
				17:02:32.8440248.58
				MA
				out
[200]
				2017-09-28
				17:02:32.8440248.60
				MA
				in
[200]
				2017-09-28
				17:02:32.8440248.60
				MA
				out


--  作者:李润Rex
--  发布时间:2017/9/28 17:10:40
--  
可以看到:
17:02:31和17:02:32有个突变点。
如果我反复调用十来个这样的函数,延迟直接上20秒了

--  作者:无为剑
--  发布时间:2017/9/28 17:23:04
--  

没看到突变点有什么异常

另外DLL公式的逐K线模式有个专门的标志函数,你需要打开标志才能让金字塔识别

还有,建议你用排除法,看一下如果不调用DLL那么看看是否还卡,如果是调用DLL才卡的,那么你应该去找DLL的算法是不是存在问题


--  作者:李润Rex
--  发布时间:2017/9/28 17:52:44
--  
2017-09-28
			17:02:31.8440248.56
			MA
			out
[200]
			2017-09-28
			17:02:32.8440248.58
			MA
			in




这两条是挨着打出来的,中间有1秒没有任何操作。
代码用的是示例代码,未做任何修改。