void CDRData::Copy( const CDRData &src ) { SetSize( 0, src.GetSize()+5 ); for( int i=0; i<src.GetSize(); i++ ) { Add( src.GetAt(i) ); } }
void CKData::ConvertXDR( BOOL bUP, DWORD dateAutoDRBegin, double dAutoDRLimit ) { CDRData drtemp; drtemp = m_drdata; drtemp.Sort( ); if( m_pData ) { delete [] (BYTE*)m_pData; m_nSize = m_nMaxSize = 0; m_pData = NULL; } if( NULL == m_pDataOriginal || 0 == m_nSizeOriginal ) return; /* if( drtemp.GetSize() == 0 ) { SetSize( m_nSizeOriginal ); if( m_pData ) memcpy( m_pData, m_pDataOriginal, sizeof(KDATA)*m_nSize ); return; } */ dAutoDRLimit = dAutoDRLimit / 100; if( bUP ) { SetSize( 0, m_nSizeOriginal ); int drPos = 0; float fRatio = 1.000000; for( int i=0; i<m_nSizeOriginal; i++ ) { KDATA & kd = m_pDataOriginal[i]; KDATA newkd = kd; if( drPos < drtemp.GetSize() && ToDayDate(kd.m_date) >= drtemp.ElementAt(drPos).m_date ) { if( i > 0 ) { KDATA kdLast = m_pDataOriginal[i-1]; fRatio = fRatio * GetRatio( kdLast.m_fClose, drtemp.ElementAt(drPos) ); } drPos ++; } else if( ToDayDate(kd.m_date) >= dateAutoDRBegin && i > 0 ) // Auto XDR { KDATA kdLast = m_pDataOriginal[i-1]; if( kdLast.m_fClose > 1e-4 && kd.m_fOpen < kdLast.m_fClose && fabs(kd.m_fOpen/kdLast.m_fClose-1) > dAutoDRLimit ) fRatio = fRatio * kd.m_fOpen / kdLast.m_fClose; } newkd.m_fOpen = (kd.m_fOpen / fRatio); newkd.m_fHigh = (kd.m_fHigh / fRatio); newkd.m_fLow = (kd.m_fLow / fRatio); newkd.m_fClose = (kd.m_fClose / fRatio); newkd.m_fVolume = (kd.m_fVolume * fRatio); Add( newkd ); } } else { SetSize( m_nSizeOriginal ); int drPos = drtemp.GetSize()-1; float fRatio = 1.000000; for( int i=m_nSizeOriginal-1; i>=0; i-- ) { KDATA & kd = m_pDataOriginal[i]; KDATA newkd = kd; if( drPos >= 0 && ToDayDate(kd.m_date) < drtemp.ElementAt(drPos).m_date ) { if( i < m_nSizeOriginal-1 ) fRatio = fRatio * GetRatio( kd.m_fClose, drtemp.ElementAt(drPos) ); drPos --; } else if( ToDayDate(kd.m_date) >= dateAutoDRBegin && i+1 < m_nSizeOriginal ) // Auto XDR { KDATA kdNext = m_pDataOriginal[i+1]; if( kdNext.m_fOpen > 1e-4 && kdNext.m_fOpen < kd.m_fClose && fabs(kdNext.m_fOpen/kd.m_fClose-1) > dAutoDRLimit ) fRatio = fRatio * kdNext.m_fOpen / kd.m_fClose; } newkd.m_fOpen = (kd.m_fOpen * fRatio); newkd.m_fHigh = (kd.m_fHigh * fRatio); newkd.m_fLow = (kd.m_fLow * fRatio); newkd.m_fClose = (kd.m_fClose * fRatio); newkd.m_fVolume = (kd.m_fVolume / fRatio); SetAt( i, newkd ); } } }