BOOL UpdateStockContainerByKData( CStockContainer &container, LPCTSTR lpszCode, CKData & kdata ) { container.Lock(); int id = 0; if( CKData::ktypeDay == kdata.GetKType() && container.GetStockInfo( lpszCode, NULL, &id ) ) { CStockInfo & info = container.ElementAt(id); if( kdata.GetSize() > (int)AfxGetProfile().GetCacheDays() ) { // 只使用AfxGetProfile().GetCacheDays()天的数据 CKData temp( kdata.GetKType() ); for( int i=kdata.GetSize()-AfxGetProfile().GetCacheDays(); i<kdata.GetSize(); i++ ) temp.Add( kdata.ElementAt(i) ); info.m_kdata.MergeKData( &temp ); } else info.m_kdata.MergeKData( &kdata ); // 指数涨跌家数 int nSize = info.m_kdata.GetSize(); if( nSize > 0 ) { info.m_dwAdvance = info.m_kdata.ElementAt(nSize-1).m_dwAdvance; info.m_dwDecline = info.m_kdata.ElementAt(nSize-1).m_dwDecline; } } container.UnLock(); return TRUE; }
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(); }
int CKData::FullFillKData( CKData & kdataMain, BOOL bFillToEnd ) { SP_ASSERT( GetKType() == kdataMain.GetKType() ); if( GetKType() != kdataMain.GetKType() ) return 0; if( GetSize() == 0 || kdataMain.GetSize() == 0 ) return 0; DWORD dateBegin = ElementAt(0).m_date; DWORD dateMainEnd5 = (kdataMain.GetSize() >= 5 ? kdataMain.ElementAt(kdataMain.GetSize()-5).m_date : 0); DWORD dateEnd5 = (GetSize() >= 5 ? ElementAt(GetSize()-5).m_date : 0); int iMain = 0, iSelf = 0; for( iMain=0; iMain<kdataMain.GetSize(); iMain ++ ) { if( dateBegin == kdataMain.ElementAt(iMain).m_date ) break; } SetSize( GetSize(), kdataMain.GetSize()-iMain-GetSize() > 0 ? kdataMain.GetSize()-iMain-GetSize() : -1 ); int nCount = 0; for( ; iMain <= kdataMain.GetSize() && iSelf <= GetSize(); iMain++, iSelf++ ) { if( !bFillToEnd && iSelf == GetSize() && ElementAt(iSelf-1).m_date < dateMainEnd5 ) break; if( !bFillToEnd && iMain == kdataMain.GetSize() && kdataMain.ElementAt(iMain-1).m_date < dateEnd5 ) break; while( iMain > 0 && iMain <= kdataMain.GetSize() && iSelf < GetSize() && ( iMain == kdataMain.GetSize() || kdataMain.ElementAt(iMain).m_date > ElementAt(iSelf).m_date ) ) { // KDATA kd; // memset( &kd, 0, sizeof(kd) ); // kd.m_date = ElementAt(iSelf).m_date; // kd.open = kd.high = kd.low = kd.close = kdataMain.ElementAt(iMain-1).close; // kdataMain.InsertAt( iMain, kd ); // iMain ++; iSelf ++; // nCount ++; } while( iMain < kdataMain.GetSize() && iSelf <= GetSize() && iSelf > 0 && ( iSelf == GetSize() || kdataMain.ElementAt(iMain).m_date < ElementAt(iSelf).m_date ) ) { KDATA kd; memset( &kd, 0, sizeof(kd) ); kd.m_date = kdataMain.ElementAt(iMain).m_date; kd.m_fOpen = kd.m_fHigh = kd.m_fLow = kd.m_fClose = ElementAt(iSelf-1).m_fClose; InsertAt( iSelf, kd ); iMain ++; iSelf ++; nCount ++; } } return nCount; }