📄 technique.cpp
字号:
/*
Cross Platform Core Code.
Copyright(R) 2001-2002 Balang Software.
All rights reserved.
Using:
class CTechnique;
*/
#include "StdAfx.h"
#include "Stock.h"
#include "Technique.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////
// GetMinMaxInfo
// 一些反复使用的代码,用函数代替,得到技术指标在指定范围内的最大最小值
// 技术指标有不同日期作为参数
BOOL AfxGetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech, CSPDWordArray & adwDays )
{
SP_ASSERT( pTech );
if( nStart < 0 || nEnd < 0 || nStart > nEnd || !pTech )
return FALSE;
double dMin = 0, dMax = 0;
double dValue = 0;
BOOL bFirst = TRUE;
for( int i=0; i<adwDays.GetSize(); i++ )
{
for( int k=nStart; k<=nEnd; k++ )
{
if( pTech->Calculate( &dValue, k, adwDays[i], !bFirst ) )
{
if( bFirst || dValue < dMin ) dMin = dValue;
if( bFirst || dValue > dMax ) dMax = dValue;
bFirst = FALSE;
}
}
}
dMin -= fabs(dMin)*0.02;
dMax += fabs(dMax)*0.02;
if( dMax - dMin < 0.03 )
dMax = dMin + 0.05;
if( pdMin ) *pdMin = dMin;
if( pdMax ) *pdMax = dMax;
return !bFirst;
}
// 技术指标有1个最终值
BOOL AfxGetMinMaxInfo1( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech )
{
SP_ASSERT( pTech );
if( nStart < 0 || nEnd < 0 || nStart > nEnd || !pTech )
return FALSE;
double dMin = 0, dMax = 0;
double dValue = 0;
BOOL bFirst = TRUE;
for( int k=nStart; k<=nEnd; k++ )
{
if( pTech->Calculate( &dValue, k, !bFirst ) ) // 技术指标有1个最终值
{
if( bFirst || dValue < dMin ) dMin = dValue;
if( bFirst || dValue > dMax ) dMax = dValue;
bFirst = FALSE;
}
}
dMin -= fabs(dMin)*0.02;
dMax += fabs(dMax)*0.02;
if( dMax - dMin < 0.03 )
dMax = dMin + 0.05;
if( pdMin ) *pdMin = dMin;
if( pdMax ) *pdMax = dMax;
return !bFirst;
}
// 技术指标有2个最终值
BOOL AfxGetMinMaxInfo2( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech )
{
SP_ASSERT( pTech );
if( nStart < 0 || nEnd < 0 || nStart > nEnd || !pTech )
return FALSE;
double dMin = 0, dMax = 0;
double dValue1 = 0, dValue2 = 0;
BOOL bFirst = TRUE;
for( int k=nStart; k<=nEnd; k++ )
{
if( pTech->Calculate( &dValue1, &dValue2, k, !bFirst ) ) // 技术指标有2个最终值
{
if( bFirst || dValue1 < dMin ) dMin = dValue1;
if( bFirst || dValue1 > dMax ) dMax = dValue1;
if( dValue2 < dMin ) dMin = dValue2;
if( dValue2 > dMax ) dMax = dValue2;
bFirst = FALSE;
}
}
dMin -= fabs(dMin)*0.02;
dMax += fabs(dMax)*0.02;
if( dMax - dMin < 0.03 )
dMax = dMin + 0.05;
if( pdMin ) *pdMin = dMin;
if( pdMax ) *pdMax = dMax;
return !bFirst;
}
// 技术指标有3个最终值
BOOL AfxGetMinMaxInfo3( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech )
{
SP_ASSERT( pTech );
if( nStart < 0 || nEnd < 0 || nStart > nEnd || !pTech )
return FALSE;
double dMin = 0, dMax = 0;
double dValue1 = 0, dValue2 = 0, dValue3 = 0;
BOOL bFirst = TRUE;
for( int k=nStart; k<=nEnd; k++ )
{
if( pTech->Calculate( &dValue1, &dValue2, &dValue3, k, !bFirst ) ) // 技术指标有3个最终值
{
if( bFirst || dValue1 < dMin ) dMin = dValue1;
if( bFirst || dValue1 > dMax ) dMax = dValue1;
if( dValue2 < dMin ) dMin = dValue2;
if( dValue2 > dMax ) dMax = dValue2;
if( dValue3 < dMin ) dMin = dValue3;
if( dValue3 > dMax ) dMax = dValue3;
bFirst = FALSE;
}
}
dMin -= fabs(dMin)*0.02;
dMax += fabs(dMax)*0.02;
if( dMax - dMin < 0.03 )
dMax = dMin + 0.05;
if( pdMin ) *pdMin = dMin;
if( pdMax ) *pdMax = dMax;
return !bFirst;
}
// 技术指标有4个最终值
BOOL AfxGetMinMaxInfo4( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech )
{
SP_ASSERT( pTech );
if( nStart < 0 || nEnd < 0 || nStart > nEnd || !pTech )
return FALSE;
double dMin = 0, dMax = 0;
double dValue1 = 0, dValue2 = 0, dValue3 = 0, dValue4 = 0;
BOOL bFirst = TRUE;
for( int k=nStart; k<=nEnd; k++ )
{
if( pTech->Calculate( &dValue1, &dValue2, &dValue3, &dValue4, k, !bFirst ) ) // 技术指标有4个最终值
{
if( bFirst || dValue1 < dMin ) dMin = dValue1;
if( bFirst || dValue1 > dMax ) dMax = dValue1;
if( dValue2 < dMin ) dMin = dValue2;
if( dValue2 > dMax ) dMax = dValue2;
if( dValue3 < dMin ) dMin = dValue3;
if( dValue3 > dMax ) dMax = dValue3;
if( dValue4 < dMin ) dMin = dValue4;
if( dValue4 > dMax ) dMax = dValue4;
bFirst = FALSE;
}
}
dMin -= fabs(dMin)*0.02;
dMax += fabs(dMax)*0.02;
if( dMax - dMin < 0.03 )
dMax = dMin + 0.05;
if( pdMin ) *pdMin = dMin;
if( pdMax ) *pdMax = dMax;
return !bFirst;
}
// 技术指标有5个最终值
BOOL AfxGetMinMaxInfo5( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech )
{
SP_ASSERT( pTech );
if( nStart < 0 || nEnd < 0 || nStart > nEnd || !pTech )
return FALSE;
double dMin = 0, dMax = 0;
double dValue1 = 0, dValue2 = 0, dValue3 = 0, dValue4 = 0, dValue5 = 0;
BOOL bFirst = TRUE;
for( int k=nStart; k<=nEnd; k++ )
{
if( pTech->Calculate( &dValue1, &dValue2, &dValue3, &dValue4, &dValue5, k, !bFirst ) ) // 技术指标有5个最终值
{
if( bFirst || dValue1 < dMin ) dMin = dValue1;
if( bFirst || dValue1 > dMax ) dMax = dValue1;
if( dValue2 < dMin ) dMin = dValue2;
if( dValue2 > dMax ) dMax = dValue2;
if( dValue3 < dMin ) dMin = dValue3;
if( dValue3 > dMax ) dMax = dValue3;
if( dValue4 < dMin ) dMin = dValue4;
if( dValue4 > dMax ) dMax = dValue4;
if( dValue5 < dMin ) dMin = dValue5;
if( dValue5 > dMax ) dMax = dValue5;
bFirst = FALSE;
}
}
dMin -= fabs(dMin)*0.02;
dMax += fabs(dMax)*0.02;
if( dMax - dMin < 0.03 )
dMax = dMin + 0.05;
if( pdMin ) *pdMin = dMin;
if( pdMax ) *pdMax = dMax;
return !bFirst;
}
DWORD AfxGetMaxDays( CSPDWordArray & adw )
{
DWORD dwMax = 0;
for( int i=0; i<adw.GetSize(); i++ )
{
if( adw.ElementAt(i) > dwMax )
dwMax = adw.ElementAt(i);
}
return dwMax;
}
//////////////////////////////////////////////////////////////////////
// CTechnique
CTechnique::CTechnique( )
{
m_pKData = NULL;
m_pdCache1 = NULL;
m_pdCache2 = NULL;
m_pdCache3 = NULL;
m_pdCache4 = NULL;
m_pdCache5 = NULL;
m_pbHasCache1 = NULL;
m_pbHasCache2 = NULL;
m_pbHasCache3 = NULL;
m_pbHasCache4 = NULL;
m_pbHasCache5 = NULL;
m_nLength = 0;
m_nIndexStart = -1;
m_nLastIntensity = ITS_NOTHING;
m_nLastIntensityCode = ITSC_NOTHING;
}
CTechnique::CTechnique( CKData * pKData )
{
m_pKData = pKData;
m_pdCache1 = NULL;
m_pdCache2 = NULL;
m_pdCache3 = NULL;
m_pdCache4 = NULL;
m_pdCache5 = NULL;
m_pbHasCache1 = NULL;
m_pbHasCache2 = NULL;
m_pbHasCache3 = NULL;
m_pbHasCache4 = NULL;
m_pbHasCache5 = NULL;
m_nLength = 0;
m_nIndexStart = -1;
m_nLastIntensity = ITS_NOTHING;
m_nLastIntensityCode = ITSC_NOTHING;
}
CTechnique::~CTechnique()
{
CTechnique::Clear( );
}
void CTechnique::SetKData( CKData * pKData )
{
m_pKData = pKData;
CTechnique::Clear( );
}
CKData * CTechnique::GetKData( )
{
return m_pKData;
}
void CTechnique::Clear( )
{
if( m_pdCache1 )
delete [] m_pdCache1;
if( m_pdCache2 )
delete [] m_pdCache2;
if( m_pdCache3 )
delete [] m_pdCache3;
if( m_pdCache4 )
delete [] m_pdCache4;
if( m_pdCache5 )
delete [] m_pdCache5;
if( m_pbHasCache1 )
delete [] m_pbHasCache1;
if( m_pbHasCache2 )
delete [] m_pbHasCache2;
if( m_pbHasCache3 )
delete [] m_pbHasCache3;
if( m_pbHasCache4 )
delete [] m_pbHasCache4;
if( m_pbHasCache5 )
delete [] m_pbHasCache5;
m_pdCache1 = NULL;
m_pdCache2 = NULL;
m_pdCache3 = NULL;
m_pdCache4 = NULL;
m_pdCache5 = NULL;
m_pbHasCache1 = NULL;
m_pbHasCache2 = NULL;
m_pbHasCache3 = NULL;
m_pbHasCache4 = NULL;
m_pbHasCache5 = NULL;
m_nLength = 0;
m_nIndexStart = -1;
m_nLastIntensity = ITS_NOTHING;
m_nLastIntensityCode = ITSC_NOTHING;
}
void CTechnique::ClearLastIntensity( )
{
m_nLastIntensity = ITS_NOTHING;
m_nLastIntensityCode = ITSC_NOTHING;
}
// 准备缓冲区
BOOL CTechnique::PrepareCache( int nStart, int nEnd, BOOL bForceRecalculate )
{
SP_ASSERT( m_pKData );
if( NULL == m_pKData )
return FALSE;
if( -1 == nEnd )
nEnd = m_pKData->GetSize()-1;
if( nStart < 0 || nEnd < nStart || nEnd >= m_pKData->GetSize() )
return FALSE;
if( bForceRecalculate )
Clear( );
return GetMinMaxInfo( nStart, nEnd, NULL, NULL );
}
// 从缓冲区中读取计算好的数据
BOOL CTechnique::LoadFromCache( int nIndex, double * pValue1, double * pValue2, double * pValue3, double * pValue4, double * pValue5 )
{
if( m_nLength <= 0 || m_nIndexStart < 0
|| nIndex < m_nIndexStart || nIndex-m_nIndexStart>=m_nLength )
return FALSE;
BOOL bOK = TRUE;
if( pValue1 && !( m_pdCache1 && m_pbHasCache1 && m_pbHasCache1[nIndex-m_nIndexStart] ) )
bOK = FALSE;
if( pValue2 && !( m_pdCache2 && m_pbHasCache2 && m_pbHasCache2[nIndex-m_nIndexStart] ) )
bOK = FALSE;
if( pValue3 && !( m_pdCache3 && m_pbHasCache3 && m_pbHasCache3[nIndex-m_nIndexStart] ) )
bOK = FALSE;
if( pValue4 && !( m_pdCache4 && m_pbHasCache4 && m_pbHasCache4[nIndex-m_nIndexStart] ) )
bOK = FALSE;
if( pValue5 && !( m_pdCache5 && m_pbHasCache5 && m_pbHasCache5[nIndex-m_nIndexStart] ) )
bOK = FALSE;
if( !bOK )
return FALSE;
if( pValue1 )
*pValue1 = m_pdCache1[nIndex-m_nIndexStart];
if( pValue2 )
*pValue2 = m_pdCache2[nIndex-m_nIndexStart];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -