int CKData::DayToMonth( CKData &kdday, CKData &kdmonth ) { // convert day k line to month k line SP_ASSERT( ktypeDay == kdday.GetKType() ); SP_ASSERT( ktypeMonth == kdmonth.GetKType() ); kdmonth.SetSize( 0, kdday.GetSize() / 20 + 5 ); int nStart = kdday.GetSize() % 3; int nCount = 0; KDATA dataDest; memset( &dataDest, 0, sizeof(dataDest) ); int nYearCur = 0, nMonthCur = 0 ; for( int pos=nStart; pos<kdday.GetSize(); pos++ ) { KDATA & dataSrc = kdday.ElementAt( pos ); CSPTime tm; if( !tm.FromStockTimeDay(dataSrc.m_date) ) continue; int nYear = tm.GetYear(); int nMonth = tm.GetMonth(); if( nYear != nYearCur || nMonth != nMonthCur ) // a new month { if( 0 != pos ) kdmonth.Add( dataDest ); // add a month memcpy( &dataDest, &dataSrc, sizeof(dataDest) ); // begin a new month nYearCur = nYear; nMonthCur = nMonth; } else { dataDest.m_fAmount += dataSrc.m_fAmount; if( dataDest.m_fHigh < dataSrc.m_fHigh ) dataDest.m_fHigh = dataSrc.m_fHigh; if( dataDest.m_fLow > dataSrc.m_fLow ) dataDest.m_fLow = dataSrc.m_fLow; dataDest.m_fVolume += dataSrc.m_fVolume; dataDest.m_fClose = dataSrc.m_fClose; } if( pos == kdday.GetSize()-1 ) // the latest one kdmonth.Add( dataDest ); } return kdmonth.GetSize(); }
int CKData::DayToWeek( CKData &kdday, CKData &kdweek ) { // convert day k line to week k line SP_ASSERT( ktypeDay == kdday.GetKType() ); SP_ASSERT( ktypeWeek == kdweek.GetKType() ); kdweek.SetSize( 0, kdday.GetSize() / 5 + 5 ); int nStart = kdday.GetSize() % 3; int nCount = 0; KDATA dataDest; memset( &dataDest, 0, sizeof(dataDest) ); for( int pos=nStart; pos<kdday.GetSize(); pos++ ) { KDATA & dataSrc = kdday.ElementAt( pos ); CSPTime tm; if( !tm.FromStockTimeDay(dataSrc.m_date) ) continue; if( tm.GetDayOfWeek() == 2 ) // a new week { if( 0 != pos ) kdweek.Add( dataDest ); // add a week memcpy( &dataDest, &dataSrc, sizeof(dataDest) ); // begin a new week } else { dataDest.m_fAmount += dataSrc.m_fAmount; if( dataDest.m_fHigh < dataSrc.m_fHigh ) dataDest.m_fHigh = dataSrc.m_fHigh; if( dataDest.m_fLow > dataSrc.m_fLow ) dataDest.m_fLow = dataSrc.m_fLow; dataDest.m_fVolume += dataSrc.m_fVolume; dataDest.m_fClose = dataSrc.m_fClose; } if( pos == kdday.GetSize()-1 ) // the latest one kdweek.Add( dataDest ); } return kdweek.GetSize(); }
///////////////////////////////////////////////////////////////////////////// // Private Operations int CKData::ConvertKData( CKData &kdSrc, CKData &kdDest, int multiple ) { // convert kdSrc k line to kdDest k line accordding to their multiple SP_ASSERT( multiple > 1 ); if( multiple < 2 ) return 0; kdDest.SetSize( 0, kdSrc.GetSize() / multiple + 5 ); int nStart = kdSrc.GetSize() % multiple; int nCount = 0; KDATA dataDest; for( int pos=nStart; pos<kdSrc.GetSize(); pos++ ) { KDATA & dataSrc = kdSrc.ElementAt( pos ); nCount ++; if( 1 == nCount ) { memcpy( &dataDest, &dataSrc, sizeof(dataDest) ); } else { dataDest.m_fAmount += dataSrc.m_fAmount; if( dataDest.m_fHigh < dataSrc.m_fHigh ) dataDest.m_fHigh = dataSrc.m_fHigh; if( dataDest.m_fLow > dataSrc.m_fLow ) dataDest.m_fLow = dataSrc.m_fLow; dataDest.m_fVolume += dataSrc.m_fVolume; dataDest.m_fClose = dataSrc.m_fClose; } if( multiple == nCount ) // new dataDest is over { nCount = 0; kdDest.Add( dataDest ); } } return kdDest.GetSize(); }