/*** 两种: 1. MA MA = n日收盘价的平均值 2. EXPMA EXPMA(1) = CLOSE(1) EXPMA(i) = (1-α)EXPMA(i-1) + αCLOSE(i) 其中 α = 2 / (n+1) */ BOOL CMA::Calculate( double * pValue, int nIndex, int nDays, BOOL bUseLast ) { STT_ASSERT_CALCULATE( m_pKData, nIndex, nDays ); int nCount = 0; if( nDays > nIndex+1 ) return FALSE; double dResult = 0; int k = 0; switch( m_nType ) { case typeMA: return m_pKData->GetMA( pValue, nIndex, nDays ); break; case typeEXPMA: if( bUseLast && pValue ) { if( 0 == nIndex ) dResult = m_pKData->MaindataAt(nIndex); else dResult = (*pValue)*(nDays-1)/(nDays+1) + m_pKData->MaindataAt(nIndex) * 2./(nDays+1); } else { for( k=0; k<=nIndex; k++ ) { if( 0 == k ) dResult = m_pKData->MaindataAt(k); else dResult = dResult*(nDays-1)/(nDays+1) + m_pKData->MaindataAt(k) * 2./(nDays+1); } } if( pValue ) *pValue = dResult; break; default: SP_ASSERT( FALSE ); } return TRUE; }
/*** 计算nDays的平均成交量 */ BOOL CVOLUME::Calculate( double * pValue, int nIndex, int nDays, BOOL bUseLast ) { STT_ASSERT_CALCULATE( m_pKData, nIndex, nDays ); int nCount = 0; if( nDays > nIndex+1 ) return FALSE; double dResult = 0; for( int k=nIndex; k>=0; k-- ) { dResult += m_pKData->ElementAt(k).m_fVolume; nCount ++; if( nCount == nDays ) { if( pValue ) *pValue = dResult / nDays; return TRUE; } } return FALSE; }