欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → stockfunc.dll 的问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有11153人关注过本帖树形打印复制链接

主题:stockfunc.dll 的问题

帅哥哟,离线,有人找我吗?
sbant
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:27 积分:260 威望:0 精华:0 注册:2010/1/14 10:32:46
stockfunc.dll 的问题  发帖心情 Post By:2011/10/31 17:01:37 [只看该作者]

管理员能否看看 一下代码有什么问题吗

 

----------------------------------------------------------------------------

int mRSX(double Buffer[],int Lengh,double JRSX_Bufer[])
{
 //---暂时省略xx

 return 0;
}


__declspec(dllexport) int WINAPI MJRSX(CALCINFO* pData)
{
 if ( pData->m_pCalcParam[1].m_nParamStart >= 0)
 {  
  int Length=(int)pData->m_pCalcParam[1].m_pfParam[0];  
  int count=pData->m_nNumData;

  const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;

  double *input=new double[count];
  double *output=new double[count];

  for (int i=0;i<count;i++)
  { input[i]=(double)pValue1[i]; }  

  int cond=mRSX(input,Length,output);

  if (cond==0)
  {
   for (int i=0;i<count;i++)
   {   
    pData->m_pResultBuf[i]=(float)output[i];     
   }   
  }

  delete []input;
  delete []output;
  return 1;
 }
 return -1;
}


 回到顶部
帅哥哟,离线,有人找我吗?
26327756l
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:676 积分:2548 威望:0 精华:3 注册:2011/4/13 16:18:50
  发帖心情 Post By:2011/10/31 17:19:08 [只看该作者]

等待高手回答

 回到顶部
帅哥,在线噢!
admin
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2011/10/31 17:22:57 [只看该作者]

先说明你遇到了什么问题?:

 回到顶部
帅哥哟,离线,有人找我吗?
sbant
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:27 积分:260 威望:0 精华:0 注册:2010/1/14 10:32:46
  发帖心情 Post By:2011/11/1 1:39:08 [只看该作者]

数据大部分时间不能显示 修改参数后有时能显示默认参数的结果 但是其他参数的结果无效

 

而且按键盘下键增加和减少数据时 计算出得结果会变化或者错误


 回到顶部
帅哥,在线噢!
admin
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2011/11/1 9:19:17 [只看该作者]

那请将完整的公式测试代码,以及DLL中的C++代码提供一下,我们本地做一下测试


 回到顶部
帅哥哟,离线,有人找我吗?
sbant
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:27 积分:260 威望:0 精华:0 注册:2010/1/14 10:32:46
  发帖心情 Post By:2011/11/1 13:43:41 [只看该作者]

请给个qq

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2011/11/1 14:46:33 [只看该作者]

抱歉此类客服我们不对客户进行QQ指导,请提供能表现故障的示例代码即可


金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
sbant
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:27 积分:260 威望:0 精华:0 注册:2010/1/14 10:32:46
  发帖心情 Post By:2011/11/2 9:23:34 [只看该作者]

stockfunc.h 部分

__declspec(dllexport) int WINAPI MJRSX(CALCINFO* pData);

 

------------------------------------------------------------------------

 

stockfunc.cpp 部分

 

int mRSX(double Buffer[],int Lengh,double JRSX_Bufer[])
{
 int    shift,r,w,k,Tnew,counted_bars,T0,T1;

 double v4,v8,v10,v14,v18,v20,v0C,v1C,v8A;  
 double F28,F30,F38,F40,F48,F50,F58,F60,F68,F70,F78,F80;
 double f0,f28,f30,f38,f40,f48,f50,f58,f60,f68,f70,f78,f80,Kg,Hg;

 if (Lengh-1>=5)w=Lengh-1;else w=5; Kg=3/(Lengh+2.0); Hg=1.0-Kg;

 for (shift=0;shift<sizeof(Buffer);shift++)
 {
  if (r==0)
  {
   r = 1; k = 0;
  }
  else
  {
   if (r>=w) r=w+1; else r=r+1;

   v8 = Buffer[shift]-Buffer[shift-1]; v8A=abs(v8);

   f28 = Hg  * f28 + Kg  *  v8;
   f30 = Kg  * f28 + Hg  * f30;
   v0C = 1.5 * f28 - 0.5 * f30;
   f38 = Hg  * f38 + Kg  * v0C;
   f40 = Kg  * f38 + Hg  * f40;
   v10 = 1.5 * f38 - 0.5 * f40;
   f48 = Hg  * f48 + Kg  * v10;
   f50 = Kg  * f48 + Hg  * f50;
   v14 = 1.5 * f48 - 0.5 * f50;

   f58 = Hg  * f58 + Kg  * v8A;
   f60 = Kg  * f58 + Hg  * f60;
   v18 = 1.5 * f58 - 0.5 * f60;
   f68 = Hg  * f68 + Kg  * v18;
   f70 = Kg  * f68 + Hg  * f70;
   v1C = 1.5 * f68 - 0.5 * f70;
   f78 = Hg  * f78 + Kg  * v1C;
   f80 = Kg  * f78 + Hg  * f80;
   v20 = 1.5 * f78 - 0.5 * f80;

   if ((r <= w) && (v8!= 0)) k = 1;
   if ((r == w) && (k == 0)) r = 0;
  }
  if ((r >  w) &&(v20 > 0.0000000001 ))
  {
   v4 = (v14/v20+1.0)*50.0; if(v4>100.0)v4=100.0; if(v4<0.0)v4=0.0;
  }
  else  v4 = 50.0;
  JRSX_Bufer[shift]=v4;

 }

 return 0;
}


__declspec(dllexport) int WINAPI MJRSX(CALCINFO* pData)
{
 if ( pData->m_pCalcParam[1].m_nParamStart >= 0)
 {  
  int Length=(int)pData->m_pCalcParam[1].m_pfParam[0];  
  int count=pData->m_nNumData;

  const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;

  double *input=new double[count];
  double *output=new double[count];

  for (int i=0;i<count;i++)
  { input[i]=(double)pValue1[i]; }  

  int cond=mRSX(input,Length,output);

  if (cond==0)
  {
   for (int i=0;i<count;i++)
   {   
    pData->m_pResultBuf[i]=(float)output[i];     
   }   
  }

  delete []input;
  delete []output;
  return 1;
 }
 return -1;
}


 回到顶部
帅哥,在线噢!
admin
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2011/11/2 9:44:48 [只看该作者]

初步看了你的DLL代码,由于原理复杂很难理解其中的内容,但是初步分析来看应该与你的内部使用的数据行情有关,建议多在DLL内加日志输出,逐步排除到底是哪个位置原因,附上我们经常使用的调试输出日志的C++代码类:

 

#if !defined(AFX_LOGINFO_H__9EABF931_9C07_4EC9_9FF4_CA90E9F59C5D__INCLUDED_)
#define AFX_LOGINFO_H__9EABF931_9C07_4EC9_9FF4_CA90E9F59C5D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <stdio.h>    // 文件相关操作的头文件
#include <tchar.h>    // TCHAR的头文件

//! UNICODE格式文件头的常量定义
const unsigned short int gc_uUnicodeFileHeader = 0xFEFF;

/**
*  @brief 记录日志类
*
*      使用本模块的“LOG_DEBUG_INFO”宏,即可生成即时日志。具体特性如下:
*  @n 1.) 在"Debug"编译模式下,或在"Release"编译模式下在工程设置中定义了"_LOG"选项,
*         产生日志文件;
*  @n 2.) 支持UNICODE编码的日志信息;
*  @n 3.) 支持UNICODE编码的文件格式;
*  @n 4.) 自动添加产生日志信息的细化到毫秒级别的当前时间信息;
*  @n 5.) 自动在日志信息后添加回车换行;
*  @n 6.) 用C/C++类库函数操作文件,提升代码的可移植性;
*  @n 7.) 支持可变参数的日志信息;
*  @n 8.) 返璞归真,恢复对TCHAR和SEH的使用。
*
*/
class CLogInfo
{
 //-----------------------------------------------------------------------
 //    公共的成员变量 :
 //-----------------------------------------------------------------------
 public:
  /**
  *  @brief 记录日志信息
  *
  *      本函数可生成即时日志。具体特性如下:
  *  @n 1.) 在"Debug"编译模式下,或在"Release"编译模式下在工程设置中定义了"_LOG"选项,
  *         产生日志文件;
  *  @n 2.) 支持UNICODE编码的日志信息;
  *  @n 3.) 支持UNICODE编码的文件格式;
  *  @n 4.) 自动添加产生日志信息的细化到毫秒级别的当前时间信息;
  *  @n 5.) 自动在日志信息后添加回车换行;
  *  @n 6.) 用C/C++类库函数操作文件,提升代码的可移植性;
  *  @n 7.) 支持可变参数的日志信息;
  *  @n 8.) 返璞归真,恢复对TCHAR和SEH的使用。
  *
  *  @param szLogFileName[]    日志文件名字符串
  *  @param szFormat[]         日志信息格式字符串
  *  @param ...                可变日志信息
  *  @return static void
  */
  static void LogInfo( const TCHAR szLogFileName[], const TCHAR szFormat[], ... )
  {
   //若文件大小超过500K,则转移文件
   CFileStatus status;
   if(CFile::GetStatus(szLogFileName,status))
   {
    if(status.m_size >= 500*1024)
    {
     CTime time = CTime::GetCurrentTime();
     CString strFileName = szLogFileName + time.Format("%Y-%m-%d %H#%M#%S.txt");
     ::CopyFile(szLogFileName, strFileName, FALSE);
     
     RemoveFiles(szLogFileName);
    }
   }
   
   // 待记录的日志信息
   TCHAR szLogInfo[1024];

   // 临时信息
   TCHAR szTemp[1024];

   // 当前本机时间的结构实例
   SYSTEMTIME stuSystemTime;

   // 日志文件指针
   FILE * pFile = NULL;

   try
   {
    // 获取当前的本机系统时间
    ::GetLocalTime( &stuSystemTime );

    // 按照传入的格式,格式化日志信息 :
    va_list ap;

    va_start( ap, szFormat );
    ::_vsntprintf( szTemp, 1024, szFormat, ap );
    va_end( ap );
    // 结束 ( 按照传入的格式,格式化日志信息 )

    // 在日志信息前添加当前时间信息,并在信息尾添加换行信息 :
    ::_stprintf( szLogInfo,
        _T( "%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d    %s\r\n" ),
        stuSystemTime.wYear,
        stuSystemTime.wMonth,
        stuSystemTime.wDay,
        stuSystemTime.wHour,
        stuSystemTime.wMinute,
        stuSystemTime.wSecond,
        stuSystemTime.wMilliseconds,
        szTemp );
    // 结束 ( 在日志信息前添加当前时间信息,并在信息尾添加换行信息 )
   }
   catch (...)
   {
    return;
   }

   // 打开日志信息文件
   pFile  = ::_tfopen( szLogFileName, _T( "a+b" ) );

   if ( pFile )
   {
    try
    {
     // 偏移到文件尾
     ::fseek( pFile, 0, SEEK_END );

     #ifdef _UNICODE

     // 文件大小
     long lFileSize = 0;

     // 获取文件大小
     lFileSize = ::ftell( pFile );

     // 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 :
     if( lFileSize == 0 )
     {
      ::fwrite( &gc_uUnicodeFileHeader,
          sizeof( unsigned short int ),
          1,
          pFile );
     }

     #endif
     // 结束 ( 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 )

     // 向文件写入日志信息数据
     ::fwrite( szLogInfo,
         ::_tcslen( szLogInfo ) * sizeof( TCHAR ),
         1,
         pFile );

     // 关闭文件 :
     ::fclose( pFile );
     // 结束 。
    }
    catch(...)
    {
    }
   }
  }

  static void LogInfo2( const TCHAR szLogFileName[], const TCHAR szFormat[], ... )
  {
   //若文件大小超过500K,则转移文件
   CFileStatus status;
   if(CFile::GetStatus(szLogFileName,status))
   {
    if(status.m_size >= 500*1024)
    {
     CTime time = CTime::GetCurrentTime();
     CString strFileName = szLogFileName + time.Format("%Y-%m-%d %H#%M#%S");
     ::CopyFile(szLogFileName, strFileName, FALSE);
     
     RemoveFiles(szLogFileName);
    }
   }
   
   // 待记录的日志信息
   TCHAR szLogInfo[1024];

   // 临时信息
   TCHAR szTemp[1024];

   // 当前本机时间的结构实例
   SYSTEMTIME stuSystemTime;

   // 日志文件指针
   FILE * pFile = NULL;

   try
   {
    // 获取当前的本机系统时间
    ::GetLocalTime( &stuSystemTime );

    // 按照传入的格式,格式化日志信息 :
    va_list ap;

    va_start( ap, szFormat );
    ::_vsntprintf( szTemp, 1024, szFormat, ap );
    va_end( ap );
    // 结束 ( 按照传入的格式,格式化日志信息 )

    // 在日志信息前添加当前时间信息,并在信息尾添加换行信息 :
    ::_stprintf( szLogInfo,
        _T( "%s\r\n" ),
        szTemp );
    // 结束 ( 在日志信息前添加当前时间信息,并在信息尾添加换行信息 )
   }
   catch (...)
   {
    return;
   }

   // 打开日志信息文件
   pFile  = ::_tfopen( szLogFileName, _T( "a+b" ) );

   if ( pFile )
   {
    try
    {
     // 偏移到文件尾
     ::fseek( pFile, 0, SEEK_END );

     #ifdef _UNICODE

     // 文件大小
     long lFileSize = 0;

     // 获取文件大小
     lFileSize = ::ftell( pFile );

     // 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 :
     if( lFileSize == 0 )
     {
      ::fwrite( &gc_uUnicodeFileHeader,
          sizeof( unsigned short int ),
          1,
          pFile );
     }

     #endif
     // 结束 ( 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 )

     // 向文件写入日志信息数据
     ::fwrite( szLogInfo,
         ::_tcslen( szLogInfo ) * sizeof( TCHAR ),
         1,
         pFile );

     // 关闭文件 :
     ::fclose( pFile );
     // 结束 。
    }
    catch(...)
    {
    }
   }
  }
};

#define LOG_DEBUG_INFO CLogInfo::LogInfo
#define LOG_DEBUG_INFO2 CLogInfo::LogInfo2

#endif // !defined(AFX_LOGINFO_H__9EABF931_9C07_4EC9_9FF4_CA90E9F59C5D__INCLUDED_)


 回到顶部
帅哥哟,离线,有人找我吗?
sbant
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:27 积分:260 威望:0 精华:0 注册:2010/1/14 10:32:46
  发帖心情 Post By:2011/11/2 10:47:52 [只看该作者]

似乎也很复杂啊

 

谢谢~


 回到顶部
总数 16 1 2 下一页