/*** 自动设定交易费用 */ void CSimuAddOpDlg::AutoSetRateCost( ) { UpdateData( ); if( NULL == m_pStrategy ) return; // Share if( !IsNumber( m_strShare, TRUE ) || !IsNumber( m_strSharePrice, TRUE ) || !IsNumber( m_strRateCost, TRUE ) ) { AfxMessageBox( IDS_SIMUADDOP_NOTNUMBER, MB_OK|MB_ICONINFORMATION ); return; } DWORD dwShare = atol(m_strShare); double dSharePrice = atol(m_strSharePrice); CString strStockCode = m_comboStock.GetSelectedStockCode(); CStockInfo info; if( !AfxGetStockContainer().GetStockInfo( strStockCode, &info ) || !info.IsValidStock() ) return; m_strRateCost.Format( "%.2f", dwShare*dSharePrice*m_pStrategy->GetRateParam().GetRate(info) ); UpdateData( FALSE ); }
// update CStockContainer by Report data BOOL UpdateStockContainerByREPORT( CStockContainer &container, REPORT * pReport, BOOL bAddIfNotExist, REPORT * pReportLast ) { SP_ASSERT( pReport ); if( NULL == pReport ) return FALSE; REPORT reportLast; memset( &reportLast, 0, sizeof(reportLast) ); int id = 0; if( container.GetStockInfo( pReport->m_szCode, NULL, &id ) ) { container.Lock(); CStockInfo & info = container.ElementAt(id); reportLast = info.m_reportLatest; UpdateStockInfoByREPORT( info, pReport ); container.UnLock(); } else if( bAddIfNotExist && strlen(pReport->m_szCode)>0 ) { CStockInfo info; info.SetStockCode( pReport->m_dwMarket, pReport->m_szCode ); if( UpdateStockInfoByREPORT( info, pReport ) ) { container.Add( info ); } } if( pReportLast ) memcpy( pReportLast, &reportLast, sizeof(reportLast) ); return TRUE; }
/*** 初始化操作记录列表的数据 */ BOOL CReportListCtrl::LoadOpRecordList( COpRecordContainer & container ) { DeleteAllItems(); for( int i=0; i<container.GetSize(); i++ ) { OPRECORD & record = container.ElementAt(i); CString strTime, strOp, strStock, strShare, strSharePrice, strAmount, strRateCost; strTime = CSPTime(record.time).Format( "%Y/%m/%d" ); strOp = AfxGetStrategyOpTypeString( record.lOpType ); CStockInfo info; strStock = record.szCode; if( AfxGetStockContainer().GetStockInfo( record.szCode, &info ) ) strStock = info.GetStockName(); strShare.Format( "%u", record.dwShare ); strSharePrice.Format( "%.2f", record.dSharePrice ); strAmount.Format( "%.2f", record.dwShare*record.dSharePrice ); strRateCost.Format( "%.2f", record.dRateCost ); InsertItem( i, strStock ); SetItemText( i, 0, strTime ); SetItemText( i, 1, strOp ); SetItemText( i, 2, strStock ); SetItemText( i, 3, strShare ); SetItemText( i, 4, strSharePrice ); SetItemText( i, 5, strAmount ); SetItemText( i, 6, strRateCost ); SetItemData( i, i ); } if( GetItemCount() > 0 ) SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED ); return TRUE; }
BOOL CSetKDataDlg::DeleteKData( CString strStockCode ) { if( strStockCode.GetLength() <= 0 ) return FALSE; UpdateData( ); if( m_tmDate.GetTime() == -1 ) return FALSE; CStockInfo info; CStock stock; if( !info.SetStockCode( CStock::marketUnknown, strStockCode ) ) return FALSE; stock.SetStockInfo( &info ); int nKType = m_comboKType.GetSelect(); AfxPrepareStockData( &AfxGetDB(), stock, nKType, CKData::formatOriginal, CKData::mdtypeClose, FALSE, TRUE ); CKData & kdata = stock.GetKData(nKType); CSPTime sptime = m_tmDate.GetTime(); int nIndex = kdata.GetIndexByDate( sptime.ToStockTime(CKData::IsDayOrMin(kdata.GetKType())) ); if( nIndex >= 0 && nIndex < kdata.GetSize() ) { kdata.RemoveAt(nIndex); AfxGetDB().InstallKData( kdata, TRUE ); return TRUE; } return FALSE; }
void CMultiSortView::SendRequestQuote( BOOL bForced ) { BOOL bInTrade = CSPTime::InTradeTime(CSPTime::GetCurrentTime().GetTime(),900); CView * pView = AfxGetStaticDoc()->GetActiveView(); if( bForced || (bInTrade && pView == this) ) { CStockInfo info; info.SetType( m_multisort.GetMultiSortClass( ) ); AfxGetStkReceiver().RequestStockData( CStock::dataMultisort, &info, 1, 0, 0 ); } }
void CSetKDataDlg::LoadKData( CString strStockCode ) { if( strStockCode.GetLength() <= 0 ) return; UpdateData(); m_strOpen.Empty(); m_strHigh.Empty(); m_strLow.Empty(); m_strClose.Empty(); m_dwVolume = 0; m_dwAmount = 0; if( m_tmDate.GetTime() == -1 ) { UpdateData( FALSE ); return; } CStockInfo info; CStock stock; if( !info.SetStockCode( CStock::marketUnknown, strStockCode ) ) return; stock.SetStockInfo( &info ); int nKType = m_comboKType.GetSelect(); AfxPrepareStockData( &AfxGetDB(), stock, nKType, CKData::formatOriginal, CKData::mdtypeClose, FALSE, TRUE ); CKData & kdata = stock.GetKData(nKType); // 价格小数位数格式串 CString strPriceFmt; strPriceFmt.Format( "%%.%df", info.DigitBit() ); CSPTime sptime = m_tmDate.GetTime(); int nIndex = kdata.GetIndexByDate( sptime.ToStockTime(CKData::IsDayOrMin(kdata.GetKType())) ); if( nIndex >= 0 && nIndex < kdata.GetSize() ) { KDATA kd = kdata.ElementAt(nIndex); m_strOpen.Format( strPriceFmt, kd.m_fOpen ); m_strHigh.Format( strPriceFmt, kd.m_fHigh ); m_strLow.Format( strPriceFmt, kd.m_fLow ); m_strClose.Format( strPriceFmt, kd.m_fClose ); m_dwVolume = (DWORD)(kd.m_fVolume/100); m_dwAmount = (DWORD)(kd.m_fAmount/1000); } UpdateData( FALSE ); }
void CMultiSort::SetMultiSortClass( LONG type ) { m_lMultiSortClass = type; if( modeDirect == m_nRefreshMode ) { CStockInfo info; info.SetType( GetMultiSortClass( ) ); AfxGetStkReceiver().RequestStockData( CStock::dataMultisort, &info, 1, 0, 0 ); } else { RecalculateSortID( TRUE, TRUE ); } }
BOOL CStockContainer::GetVariantSaveValue( double *pValue, UINT nVariantID, CStockInfo &info, BOOL *pNoValue ) { CSPMutex::Scoped l(m_mutex); void * pArrayID = NULL; if( !m_map.Lookup( info.GetStockCode(), pArrayID ) ) return FALSE; int nIndex = (int)pArrayID; if( nIndex >= 0 && nIndex < m_aptrSaveValueArray.GetSize() ) { CSPPtrArray * pArray = (CSPPtrArray *)m_aptrSaveValueArray.ElementAt( nIndex ); if( pArray ) { VARIANT_SAVEVALUE * pSave = NULL; for( int j=0; j<pArray->GetSize(); j++ ) { pSave = (VARIANT_SAVEVALUE *) pArray->GetAt(j); if( pSave->nVariantID == nVariantID ) { if( pValue ) *pValue = pSave->Value; if( pNoValue ) *pNoValue = pSave->bNoValue; return TRUE; } } } } return FALSE; }
/*** 根据换手率m_dChangeHand和终止日,计算起始日 */ BOOL CCW::GetRange( int & nStart, int & nEnd, CStockInfo & info ) { if( !m_pKData || m_pKData->GetSize() <= 0 ) return FALSE; if( nEnd < 0 || nEnd >= m_pKData->GetSize() ) nEnd = m_pKData->GetSize()-1; BOOL bIndex = FALSE; double dShareCurrency = 0; if( !info.GetShareCurrency( &dShareCurrency ) || dShareCurrency < 1e+6 ) bIndex = TRUE; if( bIndex ) dShareCurrency = 100 * m_dChangeHand; else dShareCurrency *= m_dChangeHand; double dVol = 0; for( int k=nEnd; k>=0; k-- ) { if( bIndex ) dVol += 1; else dVol += m_pKData->ElementAt(k).m_fVolume; if( dVol > dShareCurrency ) break; } nStart = k; if( nStart < 0 ) nStart = 0; return TRUE; }
int CStockContainer::Add( CStockInfo &newElement ) { CSPMutex::Scoped l(m_mutex); int nIndex = CStockInfoArray::Add(newElement); m_map.SetAt( newElement.GetStockCode(), (void *)nIndex ); return nIndex; }
/*** 初始化拥有股票列表的数据 */ BOOL CReportListCtrl::LoadStockOwnList( CStockOwnContainer & stockown, double dCash, CSPTime tmCur, double dAsset, CTechStockContainer & techstocks ) { DeleteAllItems(); int i; for( i=0; i<stockown.GetSize(); i++ ) { STOCKOWN & own = stockown.ElementAt(i); CString strStock, strShare, strBuyPrice, strNowPrice; CStockInfo info; strStock = own.szCode; if( AfxGetStockContainer().GetStockInfo( own.szCode, &info ) ) strStock = info.GetStockName(); strShare.Format( "%u", own.dwShare ); strBuyPrice.Format( "%.2f", own.dBuyPrice ); double dNowPrice = 0; if( techstocks.GetClosePrice( own.szCode, tmCur.GetTime(), &dNowPrice ) ) strNowPrice.Format( "%.2f", dNowPrice ); InsertItem( i, strStock ); SetItemText( i, 0, strStock ); SetItemText( i, 1, strShare ); SetItemText( i, 2, strBuyPrice ); SetItemText( i, 3, strNowPrice ); SetItemData( i, i ); } CString strCash; strCash.LoadString( IDS_SIMUREPORT_CASH ); InsertItem( i, strCash ); strCash.Format( "%.2f", dCash ); SetItemText( i, 1, strCash ); i++; CString strAsset; strAsset.LoadString( IDS_SIMUREPORT_ASSET ); InsertItem( i, strAsset ); strAsset.Format( "%.2f", dAsset ); SetItemText( i, 1, strAsset ); if( GetItemCount() > 0 ) SetItemState( 0, LVIS_SELECTED, LVIS_SELECTED ); return TRUE; }
BOOL CSetKDataDlg::StoreKData( CString strStockCode ) { if( strStockCode.GetLength() <= 0 ) return FALSE; UpdateData( ); if( m_tmDate.GetTime() == -1 ) return FALSE; if( !IsNumber(m_strOpen,FALSE) || !IsNumber(m_strHigh,FALSE) || !IsNumber(m_strLow,FALSE) || !IsNumber(m_strClose,FALSE) ) { AfxMessageBox( IDS_SETKDATA_NOTNUMBER ); return FALSE; } DWORD dwMarket = CStock::marketUnknown; CStockInfo info; if( info.SetStockCode(dwMarket, strStockCode) ) dwMarket = info.GetMarket(); int nKType = m_comboKType.GetSelect(); CSPTime sptime = m_tmDate.GetTime(); KDATA kd; memset( &kd, 0, sizeof(kd) ); kd.m_dwMarket = dwMarket; strncpy( kd.m_szCode, strStockCode, min(sizeof(kd.m_szCode)-1,strStockCode.GetLength()) ); kd.m_time = m_tmDate.GetTime(); kd.m_date = sptime.ToStockTime(CKData::IsDayOrMin(nKType)); kd.m_fOpen = (float)atof(m_strOpen); kd.m_fHigh = (float)atof(m_strHigh); kd.m_fLow = (float)atof(m_strLow); kd.m_fClose = (float)atof(m_strClose); kd.m_fVolume = (float)m_dwVolume*100; kd.m_fAmount = (float)m_dwAmount*1000; CKData kdata(nKType); kdata.Add( kd ); AfxGetDB().InstallKData( kdata ); return TRUE; }
void CSearchBox::SetCurrentWindowText( ) { if( !::IsWindow(m_hWnd) ) return; if( !m_bShowOnSel ) return; CStockInfo info; if( AfxGetProfile().GetCurrentStock( &info ) ) { if( CB_ERR == SelectString( 0, info.GetStockCode() ) ) SetWindowText( info.GetStockCode() ); } else { SetWindowText( NULL ); } }
void CBaseView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { // TODO: Add your specialized code here and/or call the base class if( UPDATE_HINT_BASEVIEW != lHint ) return; if( IsWindowVisible() ) SetFocus( ); CStockInfo info; if( !AfxGetProfile().GetCurrentStock( &info ) ) return; CString strHeader = info.GetStockCode(); strHeader += " "; strHeader += info.GetStockName(); strHeader += "\r\n\r\n "; GetEditCtrl().SetWindowText( strHeader ); GetEditCtrl().SetSel( strHeader.GetLength()-1, strHeader.GetLength()-1 ); m_stock.Clear( ); m_stock.SetStockInfo( &info ); m_stock.SetDatabase( &AfxGetDB() ); m_stock.PrepareBaseInfo( TRUE ); char * pText = m_stock.GetBaseTextPtr(); int nLength = m_stock.GetBaseTextLength(); if( pText && nLength > 0 ) { GetEditCtrl().ReplaceSel( pText ); } else { CString strNoBaseData; strNoBaseData.LoadString( IDS_BASEVIEW_NOBASEDATA ); GetEditCtrl().ReplaceSel( strNoBaseData ); } GetEditCtrl().SetSel( 0, 0 ); AfxGetStkReceiver().RequestStockData( CStock::dataBasetext, &info, 1, 0, 0 ); }
/*** 筹码分布图计算,计算筹码分布 */ BOOL CCW::CalculateCW( int nStart, int nEnd, CStockInfo & info, double dStep, CSPDWordArray & adwPrice, CSPDWordArray & adwVolume, double * pdMinVolume, double * pdMaxVolume, double * pdTotalVolume, double * pdVolPercent ) { STT_ASSERT_GETMINMAXINFO( m_pKData, nStart, nEnd ); if( dStep < 1e-4 ) return FALSE; float dMinPrice = 0, dMaxPrice = 0; if( !m_pKData->GetMinMaxInfo( nStart, nEnd, &dMinPrice, &dMaxPrice ) ) return FALSE; // Calculate int nMaxCount = (int)((dMaxPrice-dMinPrice)/dStep) + 10; adwPrice.SetSize( 0, nMaxCount ); adwVolume.SetSize( 0, nMaxCount ); double dMinVolume = 0, dMaxVolume = 0, dTotalVolume = 0, dVolume = 0; BOOL bFirst = TRUE; for( double dPrice = dMinPrice; dPrice < dMaxPrice; dPrice += dStep ) { if( CalculateCW( &dVolume, nStart, nEnd, dPrice, dStep ) ) { if( bFirst || dVolume < dMinVolume ) dMinVolume = dVolume; if( bFirst || dVolume > dMaxVolume ) dMaxVolume = dVolume; adwPrice.Add( DWORD(dPrice * 1000) ); adwVolume.Add( DWORD(dVolume) ); dTotalVolume += dVolume; bFirst = FALSE; } } // Return // Min Max dMinVolume -= fabs(dMinVolume)*0.01; dMaxVolume += fabs(dMaxVolume)*0.01; if( dMaxVolume - dMinVolume < 3 ) dMaxVolume = dMinVolume + 3; if( pdMinVolume ) *pdMinVolume = dMinVolume; if( pdMaxVolume ) *pdMaxVolume = dMaxVolume; if( pdTotalVolume ) *pdTotalVolume = dTotalVolume; // VolPercent double dVolPercent = 1.0; double dShareCurrency = 0; if( (!info.GetShareCurrency( &dShareCurrency ) || dShareCurrency < 1e+6) && nEnd-nStart+1 > 0 ) dShareCurrency = dTotalVolume * 100 / (nEnd-nStart+1); if( dShareCurrency > 1e-4 ) dVolPercent = dTotalVolume / (dShareCurrency*m_dChangeHand); if( dVolPercent > 1.0 ) dVolPercent = 1.0; if( dVolPercent < 0.0 ) dVolPercent = 0.0; if( pdVolPercent ) *pdVolPercent = dVolPercent; return adwPrice.GetSize() > 0; }
BOOL CStockContainer::GetCurrentStock( CStockInfo * pInfo ) { CSPMutex::Scoped l(m_mutex); SP_ASSERT( pInfo ); if( m_nCurrentStock >= 0 && m_nCurrentStock < GetSize() ) { CStockInfo & info = ElementAt(m_nCurrentStock); if( pInfo ) * pInfo = info; return TRUE; } else if( m_strCurrentStockCode.GetLength() > 0 ) { CStockInfo info; info.SetStockCode( CStock::marketUnknown, m_strCurrentStockCode ); if( pInfo ) *pInfo = info; return TRUE; } return FALSE; }
BOOL AfxReloadStock( CStock & stock ) { CStockInfo info = stock.GetStockInfo(); // Reload AfxGetStockMain() AfxGetStockContainer().GetStockInfo( info.GetStockCode(), &info ); stock.Clear( ); stock.SetStockInfo( &info ); stock.SetDatabase( &AfxGetDB() ); stock.PrepareData( CStock::dataK, CKData::ktypeDay ); // Merge New stock.GetKDataDay().MergeKData( &(info.m_kdata) ); stock.PrepareData( CStock::dataK, CKData::ktypeWeek ); stock.PrepareData( CStock::dataK, CKData::ktypeMonth ); stock.PrepareData( CStock::dataK, CKData::ktypeMin5 ); stock.PrepareData( CStock::dataK, CKData::ktypeMin15 ); stock.PrepareData( CStock::dataK, CKData::ktypeMin30 ); stock.PrepareData( CStock::dataK, CKData::ktypeMin60 ); return TRUE; }
BOOL CDomainContainer::GetAllDomainInfo( CStockContainer * pContainer, DWORD dwDate ) { SP_ASSERT( pContainer ); if( NULL == pContainer ) return FALSE; DWORD dwDateLatest = -1; AfxGetStockContainer().GetLatestTechDate( &dwDateLatest ); for( int nDomain=0; nDomain<GetSize(); nDomain++ ) { CDomain & domain = ElementAt(nDomain); CStockContainer cntn; if( cntn.RetrieveSpecify( domain ) ) { if( -1 != dwDate && dwDateLatest != dwDate ) { for( int i=0; i<cntn.GetSize(); i++ ) { CStockInfo & info = cntn.ElementAt(i); info.StatBaseIndex( dwDate ); info.StatTechIndex( dwDate ); } } // cntn.SetMap( ); cntn.SetAverage( ); CStockInfo info = cntn.GetAverage( ); info.SetStockName( domain.m_strName ); info.SetStockShortName( domain.m_strName ); pContainer->Add( info ); } } pContainer->SetMap(); pContainer->SetAverage(); return TRUE; }
void CStockContainer::SetVariantSaveValue( double Value, UINT nVariantID, CStockInfo &info, BOOL bNoValue ) { CSPMutex::Scoped l(m_mutex); void * pArrayID = NULL; if( !m_map.Lookup( info.GetStockCode(), pArrayID ) ) return; // alloc for m_aptrSaveValueArray if( m_aptrSaveValueArray.GetSize() == 0 ) { m_aptrSaveValueArray.SetSize( GetSize() ); for( int i=0; i<m_aptrSaveValueArray.GetSize(); i++ ) m_aptrSaveValueArray.SetAt( i, NULL ); } int nIndex = (int)pArrayID; if( nIndex >= 0 && nIndex < m_aptrSaveValueArray.GetSize() ) { CSPPtrArray * pArray = (CSPPtrArray *)m_aptrSaveValueArray.ElementAt( nIndex ); if( NULL == pArray ) { pArray = new CSPPtrArray; m_aptrSaveValueArray.SetAt( nIndex, pArray ); } // 如果已经存在,覆盖之 for( int j=0; j<pArray->GetSize(); j++ ) { VARIANT_SAVEVALUE * pSave = (VARIANT_SAVEVALUE *) pArray->GetAt(j); if( pSave->nVariantID == nVariantID ) { pSave->Value = Value; pSave->bNoValue = bNoValue; return; } } // 加入新的 VARIANT_SAVEVALUE * pSaveValue = new VARIANT_SAVEVALUE; pSaveValue->nVariantID = nVariantID; pSaveValue->Value = Value; pSaveValue->bNoValue = bNoValue; pArray->Add( pSaveValue ); } }
/*** 筹码分布图计算,计算nDays天前内的筹码分布 */ BOOL CCW::CalculatePastCW(int nEnd, int nDays, CStockInfo & info, double dStep, CSPDWordArray & adwPrice, CSPDWordArray & adwVolume, double * pdMinVolume, double * pdMaxVolume, double * pdTotalVolume, double * pdVolPercent ) { // Prepare if( !m_pKData || m_pKData->GetSize() <= 0 ) return FALSE; if( nEnd < 0 || nEnd >= m_pKData->GetSize() ) nEnd = m_pKData->GetSize()-1; int nStart = nEnd - nDays; if( nStart < 0 || nStart >= m_pKData->GetSize() ) return FALSE; nEnd = nStart; if( !GetRange( nStart, nEnd, info ) ) return FALSE; BOOL bOK = CalculateCW( nStart, nEnd, info, dStep, adwPrice, adwVolume, pdMinVolume, pdMaxVolume, pdTotalVolume, pdVolPercent ); // TotalVolumeRecent double dTotalVolumeRecent = 0; for( int k=nEnd+1; k<=nEnd+nDays && k<m_pKData->GetSize(); k ++ ) dTotalVolumeRecent += m_pKData->ElementAt(k).m_fVolume; // VolPercent double dVolPercent = 1.0; double dShareCurrency = 0; if( (!info.GetShareCurrency( &dShareCurrency ) || dShareCurrency < 1e+6) && nDays > 0 ) dShareCurrency = dTotalVolumeRecent * 100 / nDays; if( dShareCurrency > 1e-4 ) dVolPercent = dTotalVolumeRecent / (dShareCurrency*m_dChangeHand); dVolPercent = 1.0 - dVolPercent; if( dVolPercent > 1.0 ) dVolPercent = 1.0; if( dVolPercent < 0.0 ) dVolPercent = 0.0; if( pdVolPercent ) *pdVolPercent = dVolPercent; return bOK; }
void CTyDataDlg::OnStart() { UpdateData( ); StoreProfile(); if( m_tmBegin > m_tmEnd ) { AfxMessageBox( IDS_TYDATADLG_ERRORTIME, MB_OK|MB_ICONINFORMATION ); return; } if( 0 == access(m_strFileDest,0) && IDNO == AfxMessageBox(IDS_TYDATADLG_OVERWRITE,MB_YESNO) ) return; CFile file; if( !file.Open( m_strFileDest, CFile::modeCreate | CFile::modeWrite ) ) { AfxMessageBox( IDS_TYDATADLG_ERRORCREATEFILE, MB_OK|MB_ICONINFORMATION ); return; } file.Close(); m_btnStart.EnableWindow( FALSE ); int nFileCountTotal = CNetDatabase::GetFileCount( m_strPathSrcSH, FALSE ) + CNetDatabase::GetFileCount( m_strPathSrcSZ, FALSE ); int nFileCount = 0, nCount = 0, nProgress = 0; m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE ); m_ctrlProgress.SetRange( 0, nFileCountTotal ); m_ctrlProgress.SetPos( 0 ); CFileFind finder; // ÉϺ£ BOOL bWorking = finder.FindFile( AfxGetFilePath( (LPCTSTR)m_strPathSrcSH, LPCTSTR("*.day") ) ); while( bWorking ) { bWorking = finder.FindNextFile(); CString sKFile = finder.GetFilePath(); CString sCode = AfxGetFileTitleNoExt(sKFile); CString sName; CStockInfo info; if( AfxGetStockContainer().GetStockInfo( sCode, &info ) ) sName = info.GetStockName(); int nRet = CStDatabase::AppendToTyData( sCode, sName, CKData::ktypeDay, sKFile, m_strFileDest, m_tmBegin.GetTime(), m_tmEnd.GetTime() ); nCount += nRet; if( nRet > 0 ) nFileCount ++; // Progress m_ctrlProgress.SetPos(++nProgress); CString strProgressNew; if( nFileCountTotal > 0 ) strProgressNew.Format( "%d%%", 100*nProgress/nFileCountTotal ); CString strProgressOld; m_staticProgress.GetWindowText( strProgressOld ); if( 0 != strProgressNew.Compare( strProgressOld ) ) m_staticProgress.SetWindowText( strProgressNew ); } finder.Close(); // ÉîÛÚ bWorking = finder.FindFile( AfxGetFilePath( (LPCTSTR)m_strPathSrcSZ, LPCTSTR("*.day") ) ); while( bWorking ) { bWorking = finder.FindNextFile(); CString sKFile = finder.GetFilePath(); CString sCode = AfxGetFileTitleNoExt(sKFile); CString sName; CStockInfo info; if( AfxGetStockContainer().GetStockInfo( sCode, &info ) ) sName = info.GetStockName(); int nRet = CStDatabase::AppendToTyData( sCode, sName, CKData::ktypeDay, sKFile, m_strFileDest, m_tmBegin.GetTime(), m_tmEnd.GetTime() ); nCount += nRet; if( nRet > 0 ) nFileCount ++; // Progress m_ctrlProgress.SetPos(++nProgress); CString strProgressNew; if( nFileCountTotal > 0 ) strProgressNew.Format( "%.2f%%", 100.*nProgress/nFileCountTotal ); CString strProgressOld; m_staticProgress.GetWindowText( strProgressOld ); if( 0 != strProgressNew.Compare( strProgressOld ) ) m_staticProgress.SetWindowText( strProgressNew ); } finder.Close(); CString strReportFmt, strReport; strReportFmt.LoadString( IDS_TYDATADLG_REPORTFMT ); strReport.Format( strReportFmt, nFileCount, nCount ); AfxMessageBox( strReport, MB_OK|MB_ICONINFORMATION ); m_btnStart.EnableWindow( TRUE ); }
// update CStockInfo by Report data BOOL UpdateStockInfoByREPORT( CStockInfo & info, REPORT * pReport ) { SP_ASSERT( pReport ); if( !pReport ) return FALSE; // 股票市场 if( strlen(pReport->m_szCode) > 0 ) info.SetStockCode( pReport->m_dwMarket, pReport->m_szCode ); if( strlen(pReport->m_szName) > 0 ) info.SetStockName( pReport->m_szName ); if( info.GetType() == 0 ) { if( CStock::marketSHSE == pReport->m_dwMarket ) info.SetType( CStock::typeshA ); else if( CStock::marketSZSE == pReport->m_dwMarket ) info.SetType( CStock::typeszA ); else info.SetType( CStock::typeshA ); } // 成交买卖价量信息 if( pReport->m_fLast > 1e-4 ) info.m_fLast = pReport->m_fLast; info.m_fOpen = pReport->m_fOpen; info.m_fHigh = pReport->m_fHigh; info.m_fLow = pReport->m_fLow; info.m_fClose = pReport->m_fNew; info.m_fVolume = pReport->m_fVolume; info.m_fAmount = pReport->m_fAmount; info.m_fBuyPrice[0] = pReport->m_fBuyPrice[0]; info.m_fBuyPrice[1] = pReport->m_fBuyPrice[1]; info.m_fBuyPrice[2] = pReport->m_fBuyPrice[2]; info.m_fBuyPrice[3] = pReport->m_fBuyPrice[3]; info.m_fBuyPrice[4] = pReport->m_fBuyPrice[4]; info.m_fBuyVolume[0] = pReport->m_fBuyVolume[0]; info.m_fBuyVolume[1] = pReport->m_fBuyVolume[1]; info.m_fBuyVolume[2] = pReport->m_fBuyVolume[2]; info.m_fBuyVolume[3] = pReport->m_fBuyVolume[3]; info.m_fBuyVolume[4] = pReport->m_fBuyVolume[4]; info.m_fSellPrice[0] = pReport->m_fSellPrice[0]; info.m_fSellPrice[1] = pReport->m_fSellPrice[1]; info.m_fSellPrice[2] = pReport->m_fSellPrice[2]; info.m_fSellPrice[3] = pReport->m_fSellPrice[3]; info.m_fSellPrice[4] = pReport->m_fSellPrice[4]; info.m_fSellVolume[0] = pReport->m_fSellVolume[0]; info.m_fSellVolume[1] = pReport->m_fSellVolume[1]; info.m_fSellVolume[2] = pReport->m_fSellVolume[2]; info.m_fSellVolume[3] = pReport->m_fSellVolume[3]; info.m_fSellVolume[4] = pReport->m_fSellVolume[4]; // K线数据、日期 KDATA kd; UpdateKDATAByREPORT( kd, pReport ); int nLen = info.m_kdata.GetSize(); if( nLen > 0 && info.m_kdata.ElementAt(nLen-1).m_date == kd.m_date ) info.m_kdata.SetAt( nLen-1, kd ); else info.m_kdata.Add( kd ); info.m_datetech = kd.m_date; // 保存 memcpy( &(info.m_reportLatest), pReport, sizeof(info.m_reportLatest) ); return TRUE; }
BOOL CSearchBox::InitStocks( CSPStringArray & astocks, BOOL bHasSTTTech, BOOL bShowOnSel, BOOL bDuplicate ) { ResetContent( ); m_bShowOnSel = bShowOnSel; CStockContainer & container = AfxGetStockContainer(); InitStorage( bDuplicate ? astocks.GetSize()*2 : astocks.GetSize(), 32 ); for( int i=0; i<astocks.GetSize(); i++ ) { if( astocks.ElementAt(i).GetLength() <= 0 ) continue; CStockInfo info; int nAID = -1; if( !container.GetStockInfo( astocks.ElementAt(i), &info, &nAID ) ) continue; CString strTemp = info.GetStockCode(); while( strTemp.GetLength() < 8 ) strTemp += ' '; strTemp += info.GetStockName(); int nItem = AddString( strTemp ); SetItemData( nItem, nAID ); if( bDuplicate ) { strTemp = info.GetStockShortName(); while( strTemp.GetLength() < 8 ) strTemp += ' '; strTemp += info.GetStockName(); if( CB_ERR == SelectString( 0, strTemp ) ) { nItem = AddString( strTemp ); SetItemData( nItem, nAID ); } } } if( bHasSTTTech ) { // 技术指标项 UINT nTechUserCount = CTechUser::GetTechUserCount(); for( UINT i=STT_MIN; i <= STT_MAX+nTechUserCount; i ++ ) { UINT nTech = i; if( nTech > STT_MAX ) nTech = i-STT_MAX-1+STT_USER_MIN; CString strTemp = AfxGetSTTShortName( nTech ); while( strTemp.GetLength() < 8 ) strTemp += ' '; strTemp += AfxGetSTTName( nTech ); int nItem = AddString( strTemp ); SetItemData( nItem, nTech | SEARCHBOX_SIGNBIT_STT ); } // 快捷键项 for( UINT i = ACCE_MIN; i <= ACCE_MAX; i++ ) { CString strTemp = AfxGetAccelerator( i, 8 ); SetItemData( AddString(strTemp), i | SEARCHBOX_SIGNBIT_ACCE ); } } return TRUE; }
void CMultiSort::DrawMultiSort( CDC * pDC, MULTISORT &ms, CRect rect, UINT nSLH, int nSelectPos ) { DECLARE_COLOR_DEFINATION int x = rect.left+8; int x2 = (int)( rect.left+0.56*rect.Width() ); int x3 = rect.right-8; int y = rect.top+20; int yStep = (rect.Height()-23) / 6 ; if( yStep <= 0 ) return; CFont * pOldFont = AfxSelectDCFont( pDC, 14 ); pDC->SetBkColor( clrBK ); int size = sizeof(m_msRise.m_stocks)/sizeof(m_msRise.m_stocks[0]); for( int i=0; i<size; i++ ) { CStockInfo info; char buf_code[sizeof(ms.m_stocks[i].m_code)+1]; memset( buf_code, 0, sizeof(buf_code) ); memcpy( buf_code, ms.m_stocks[i].m_code, sizeof(ms.m_stocks[i].m_code) ); if( !AfxGetStockContainer().GetStockInfo(buf_code, &info) ) continue; info.m_fClose = float(0.001*ms.m_stocks[i].m_data1); pDC->SetTextColor( clrText ); //#ifdef CLKLAN_ENGLISH_US // pDC->TextOut( x, y, info.GetStockCode() ); //#else pDC->TextOut( x, y, info.GetStockName() ); //#endif UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP ); pDC->SetTextColor( AfxGetVariantColor(SLH_CLOSE,info) ); pDC->TextOut( x2, y, (LPCTSTR)AfxGetVariantDispString(SLH_CLOSE,info,NULL) ); CString strTemp; if( CStock::classVolRatio == ms.m_class ) strTemp.Format( "%.2f", 0.01*ms.m_stocks[i].m_data2 ); else if( CStock::classAmount == ms.m_class ) strTemp.Format( "%.0f", 0.001*ms.m_stocks[i].m_data2 ); else strTemp.Format( "%.2f%%", 0.01*ms.m_stocks[i].m_data2 ); pDC->TextOut( x3, y, strTemp ); y += yStep; pDC->SetTextAlign( nOldAlign ); // 选中股票 if( nSelectPos == i ) { int ySel = y-yStep+16; if( ySel > rect.top && ySel < rect.bottom ) DrawLine( pDC, 2, clrBorder, rect.left+5, ySel, rect.right-5, ySel ); } } // 补足股票排名 for( i=size; i<6; i++ ) { pDC->SetTextColor( clrText ); pDC->TextOut( x, y, "-" ); UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP ); pDC->TextOut( x2, y, "-" ); pDC->TextOut( x3, y, "-" ); y += yStep; pDC->SetTextAlign( nOldAlign ); } pDC->SelectObject( pOldFont ); }
void CStockInfo::ResolveTypeAndMarket( ) { CStockInfo info; if( AfxGetStockContainer().GetStockInfo( m_szCode, &info ) && CStock::typeNone != info.GetType() && CStock::marketUnknown != info.GetMarket() ) { if( CStock::typeNone == m_type ) m_type = info.GetType(); if( CStock::marketUnknown == m_dwMarket ) m_dwMarket = info.GetMarket(); return; } long type = CStock::typeNone; DWORD dwMarket = CStock::marketUnknown; if( strlen(m_szCode) > 0 ) { if( strcmp(m_szCode,"000001") >= 0 && strcmp(m_szCode,"000999") <= 0 ) // 深圳A股 { type = CStock::typeszA; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"002001") >= 0 && strcmp(m_szCode,"002999") <= 0 ) // 深圳A股(中小企业) { type = CStock::typeszA; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"200001") >= 0 && strcmp(m_szCode,"200999") <= 0 ) // 深圳B股 { type = CStock::typeszB; dwMarket = CStock::marketSZSE; } else if( strncmp(m_szCode,"600",3) == 0 ) // 上海A股 { type = CStock::typeshA; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"500",3) == 0 ) // 上海基金 { type = CStock::typeshA; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"900",3) == 0 ) // 上海B股 { type = CStock::typeshB; dwMarket = CStock::marketSHSE; } else if( strcmp(m_szCode,"001001") >= 0 && strcmp(m_szCode,"001199") <= 0 ) // 深圳企业债券 { type = CStock::typeszBond; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"001200") >= 0 && strcmp(m_szCode,"001899") <= 0 ) // 深圳国债回购 { type = CStock::typeszBond; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"001900") >= 0 && strcmp(m_szCode,"001999") <= 0 ) // 深圳国债现货 { type = CStock::typeszBond; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"002600") >= 0 && strcmp(m_szCode,"002999") <= 0 ) // 深圳B股权证 { type = CStock::typeszRight; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"003001") >= 0 && strcmp(m_szCode,"003999") <= 0 ) // 深圳转配认购 { type = CStock::typeszAdmeasure; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"009001") >= 0 && strcmp(m_szCode,"009999") <= 0 ) // 深圳新股配售 { type = CStock::typeszAdmeasure; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"005001") >= 0 && strcmp(m_szCode,"005999") <= 0 ) // 深圳可转换债券 { type = CStock::typeszBond; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"006001") >= 0 && strcmp(m_szCode,"006999") <= 0 ) // 深圳国债期货 { type = CStock::typeszBond; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"004601") >= 0 && strcmp(m_szCode,"004699") <= 0 ) // 深圳证券投资基金 { type = CStock::typeszA; dwMarket = CStock::marketSZSE; } else if( strcmp(m_szCode,"008001") >= 0 && strcmp(m_szCode,"008999") <= 0 ) // 深圳配股认购 { type = CStock::typeszAdmeasure; dwMarket = CStock::marketSZSE; } else if( strncmp(m_szCode,"001",3) == 0 ) // 上海国债现货 { type = CStock::typeshBond; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"110",3) == 0 || strncmp(m_szCode,"120",3) == 0 ) // 上海企业债券 { type = CStock::typeshBond; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"310",3) == 0 ) // 上海国债期货 { type = CStock::typeshBond; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"580",3) == 0 || strncmp(m_szCode,"582",3) == 0 ) // 上海权证 { type = CStock::typeshRight; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"710",3) == 0 ) // 上海转配股 { type = CStock::typeshAdmeasure; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"711",3) == 0 ) // 上海转配股再转配股 { type = CStock::typeshAdmeasure; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"730",3) == 0 ) // 上海新股申购 { type = CStock::typeshAdmeasure; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"737",3) == 0 ) // 上海新股配售 { type = CStock::typeshAdmeasure; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"201",3) == 0 ) // 上海国债回购 { type = CStock::typeshBond; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"129",3) == 0 || strncmp(m_szCode,"100",3) == 0 ) // 上海可转换债券 { type = CStock::typeshBond; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"700",3) == 0 ) // 上海配股 { type = CStock::typeshAdmeasure; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"701",3) == 0 ) // 上海转配股再配股 { type = CStock::typeshAdmeasure; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"720",3) == 0 ) // 上海红利 { type = CStock::typeshBonus; dwMarket = CStock::marketSHSE; } else if( strncmp(m_szCode,"735",3) == 0 ) // 上海新基金申购 { type = CStock::typeshAdmeasure; dwMarket = CStock::marketSHSE; } } if( CStock::typeNone == m_type ) m_type = type; if( CStock::marketUnknown == m_dwMarket ) m_dwMarket = dwMarket; }