Alarm.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:4k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /*
  2. Cross Platform Core Code.
  3. Copyright(R) 2001-2002 Balang Software.
  4. All rights reserved.
  5. Using:
  6. Alarm functions;
  7. */
  8. #include "StdAfx.h"
  9. #include "Alarm.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #endif
  17. //////////////////////////////////////////////////////////////////////
  18. CSPString CAlarmCondContainer::AlarmCondToString( ALARMCOND & cond )
  19. {
  20. CSPString strResult;
  21. if( ALARM_TYPE_DIFFPERCENTMORE == cond.m_type )
  22. {
  23. strResult.Format( "%s %s > %.2f", cond.m_szCode, AfxGetVariantName( SLH_DIFFPERCENT, FALSE ), cond.m_fValue );
  24. }
  25. else if( ALARM_TYPE_DIFFPERCENTLESS == cond.m_type )
  26. {
  27. strResult.Format( "%s %s < %.2f", cond.m_szCode, AfxGetVariantName( SLH_DIFFPERCENT, FALSE ), cond.m_fValue );
  28. }
  29. else if( ALARM_TYPE_TRADEVOLUME == cond.m_type )
  30. {
  31. strResult.Format( "%s %s > %.2f", cond.m_szCode, AfxGetVariantName( SLH_VOLUME, FALSE ), cond.m_fValue*0.01 );
  32. }
  33. return strResult;
  34. }
  35. CSPString CAlarmContainer::GetDescript( ALARM & alarm )
  36. {
  37. CSPString strResult;
  38. if( ALARM_TYPE_DIFFPERCENTMORE == alarm.cond.m_type )
  39. {
  40. strResult.Format( "%s >%.2f", AfxGetVariantName( SLH_DIFFPERCENT, FALSE ), alarm.cond.m_fValue );
  41. }
  42. else if( ALARM_TYPE_DIFFPERCENTLESS == alarm.cond.m_type )
  43. {
  44. strResult.Format( "%s <%.2f", AfxGetVariantName( SLH_DIFFPERCENT, FALSE ), alarm.cond.m_fValue );
  45. }
  46. else if( ALARM_TYPE_TRADEVOLUME == alarm.cond.m_type )
  47. {
  48. strResult.Format( "%s >%.2f", AfxGetVariantName( SLH_VOLUME, FALSE ), alarm.cond.m_fValue*0.01 );
  49. }
  50. return strResult;
  51. }
  52. CAlarmContainer & AfxGetAlarmContainer()
  53. {
  54. static CAlarmContainer g_alarm;
  55. return g_alarm;
  56. }
  57. int CAlarmContainer::AddAlarm( ALARMCOND * pcond, REPORT * pReport, REPORT * pReportLast )
  58. {
  59. CSPMutex::Scoped l(m_mutex);
  60. if( NULL == pcond || NULL == pReport || NULL == pReportLast )
  61. return -1;
  62. ALARM a;
  63. memcpy( &(a.cond), pcond, sizeof(a.cond) );
  64. memcpy( &(a.report), pReport, sizeof(a.report) );
  65. a.report.m_fVolume = pReport->m_fVolume - pReportLast->m_fVolume;
  66. a.report.m_fAmount = pReport->m_fAmount - pReportLast->m_fAmount;
  67. return Add( a );
  68. }
  69. BOOL CAlarmContainer::OnReceiveReport( CStockInfo * pInfo, REPORT * pReport, REPORT * pReportLast )
  70. {
  71. if( NULL == pInfo || NULL == pReport || NULL == pReportLast || !pInfo->IsValidStock() )
  72. return FALSE;
  73. float fDiffPercent;
  74. float fTradeVolume;
  75. if( pReport->m_fLast <= 1e-4 || pReport->m_fNew < 1e-4 )
  76. return FALSE;
  77. fDiffPercent = (float)( 100. * pReport->m_fNew / pReport->m_fLast - 100 );
  78. fTradeVolume = pReport->m_fVolume - pReportLast->m_fVolume;
  79. if( fTradeVolume <= 0 )
  80. return FALSE;
  81. CAlarmCondContainer & conds = AfxGetProfile().GetAlarmCondContainer();
  82. for( int i=0; i<conds.GetSize(); i++ )
  83. {
  84. ALARMCOND cond = conds.GetAt(i);
  85. if( ALARM_TYPE_DIFFPERCENTMORE == cond.m_type )
  86. {
  87. if( fDiffPercent > cond.m_fValue && pInfo->IsEqualTo(cond.m_dwMarket,cond.m_szCode) )
  88. {
  89. AddAlarm( &cond, pReport, pReportLast );
  90. return TRUE;
  91. }
  92. }
  93. else if( ALARM_TYPE_DIFFPERCENTLESS == cond.m_type )
  94. {
  95. if( fDiffPercent < cond.m_fValue && pInfo->IsEqualTo(cond.m_dwMarket,cond.m_szCode) )
  96. {
  97. AddAlarm( &cond, pReport, pReportLast );
  98. return TRUE;
  99. }
  100. }
  101. else if( ALARM_TYPE_TRADEVOLUME == cond.m_type )
  102. {
  103. if( fTradeVolume > cond.m_fValue && pInfo->IsEqualTo(cond.m_dwMarket,cond.m_szCode) )
  104. {
  105. AddAlarm( &cond, pReport, pReportLast );
  106. return TRUE;
  107. }
  108. }
  109. }
  110. return FALSE;
  111. }