📄 selfdb.cpp.svn-base
字号:
if( 0 != access( strRoot + ml_sz_base, 0 ) )
mkdir( strRoot + ml_sz_base );
if( 0 != access( strRoot + ml_sz_month, 0 ) )
mkdir( strRoot + ml_sz_month );
if( 0 != access( strRoot + ml_sz_week, 0 ) )
mkdir( strRoot + ml_sz_week );
if( 0 != access( strRoot + ml_sz_day, 0 ) )
mkdir( strRoot + ml_sz_day );
if( 0 != access( strRoot + ml_sz_min, 0 ) )
mkdir( strRoot + ml_sz_min );
if( 0 != access( strRoot + self_sz_xdr, 0 ) )
mkdir( strRoot + self_sz_xdr );
if( 0 != access( strRoot + self_news, 0 ) )
mkdir( strRoot + self_news );
return TRUE;
}
int LoadCodeTable( CStockContainer & container, LPCTSTR lpszFileName, DWORD dwMarket )
{
int nCount = 0;
char seps[] = ",\t\r\n";
char quotation_mark[] = "\"";
BOOL bHasQuotationMark = FALSE;
CSPFile file;
if( file.Open( lpszFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
{
CSPString rString;
while( file.ReadString( rString ) )
{
CStockInfo info;
// 600000,浦发银行,17,PFYH,"PuFaYinHang"
// 英文名称可以用双引号引起来
int nToken = 0;
while( !rString.IsEmpty() )
{
nToken ++;
CSPString sTemp;
int nIndex = -1;
if( 5 == nToken && -1 != (nIndex=rString.Find( quotation_mark )) )
{
rString = rString.Mid( nIndex+1 );
nIndex = rString.Find( quotation_mark );
if( -1 != nIndex ) sTemp = rString.Left( nIndex );
if( -1 != nIndex ) rString = rString.Mid( nIndex+1 );
nIndex = rString.FindOneOf( seps );
if( -1 != nIndex )
rString = rString.Mid( nIndex+1 );
else
rString.Empty();
}
else
{
nIndex = rString.FindOneOf( seps );
if( -1 != nIndex )
{
sTemp = rString.Left( nIndex );
rString = rString.Mid( nIndex+1 );
}
else
{
sTemp = rString;
rString.Empty();
}
}
if( 1 == nToken )
info.SetStockCode( dwMarket, sTemp );
else if( 2 == nToken )
info.SetStockName( sTemp );
else if( 3 == nToken )
info.SetType( atol(sTemp) );
else if( 4 == nToken )
info.SetStockShortName( sTemp );
else if( 5 == nToken )
{
info.SetStockNameEnu( sTemp );
break;
}
}
if( info.IsValidStock() )
container.Add( info );
nCount ++;
}
file.Close();
}
return nCount;
}
int CSelfDB::LoadCodetable( CStockContainer & container )
{
if( !m_bIsOK ) return 0;
container.SetSize( 0, 2000 );
// 上海指数
CSPString sFileName = GetRootPath();
sFileName += self_sh_code;
LoadCodeTable( container, sFileName, CStock::marketSHSE );
// 深圳指数
sFileName = GetRootPath();
sFileName += self_sz_code;
LoadCodeTable( container, sFileName, CStock::marketSZSE );
if( container.GetSize() <= 0 )
CQianlong::LoadCodetable( container );
return container.GetSize();
}
int CSelfDB::StoreCodetable( CStockContainer & container )
{
if( !m_bIsOK ) return 0;
if( container.GetSize() <= 0 )
return 0;
// 上海指数
CSPString sFileNameSH = GetRootPath();
sFileNameSH += self_sh_code;
// 深圳指数
CSPString sFileNameSZ = GetRootPath();
sFileNameSZ += self_sz_code;
CSPFile fileSHSE, fileSZSE;
if( !fileSHSE.Open( sFileNameSH, CSPFile::modeCreate | CSPFile::modeWrite )
|| !fileSZSE.Open( sFileNameSZ, CSPFile::modeCreate | CSPFile::modeWrite ) )
{
return 0;
}
container.Lock();
for( int i=0; i<container.GetSize(); i++ )
{
CStockInfo & info = container.ElementAt(i);
CSPString str;
str.Format( "%s,%s,%d,%s,\"%s\"\r\n", info.GetStockCode(), info.GetStockNameChs(), info.GetType(),
info.GetStockShortName(), info.GetStockNameEnu() );
if( info.IsShangHai() )
{
fileSHSE.Write( str, str.GetLength() );
}
if( info.IsShenZhen() )
{
fileSZSE.Write( str, str.GetLength() );
}
}
container.UnLock();
return container.GetSize();
}
int CSelfDB::LoadKData( CStock *pstock, int nKType )
{
// WILLCHECK
int ret = CQianlong::LoadKData( pstock, nKType );
if( CKData::ktypeMin5 == nKType && LoadMinute( pstock ) > 0 )
{
CKData & kdataMin5 = pstock->GetKDataMin5();
CMinute & minute = pstock->GetMinute();
CKData kdataNew;
if( minute.ToKData( kdataNew ) && CKData::ktypeMin5 == kdataNew.GetKType() )
{
kdataMin5.MergeKData( &kdataNew );
}
return kdataMin5.GetSize();
}
return ret;
}
int CSelfDB::LoadBasetable( CStockContainer & container )
{
container.Lock();
CSPMapStringToPtr map;
map.InitHashTable( container.GetSize() + container.GetSize() + 100 );
for( int i=0; i<container.GetSize(); i++ )
{
CStockInfo & info = container.ElementAt(i);
map.SetAt( info.GetStockCode(), (void *)i );
info.m_basedata.RemoveAll();
}
CSPString sFileName = GetRootPath();
sFileName += self_chna_basetbl;
CSPFile file;
if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
{
BASEDATA block;
while( sizeof(block) == file.Read( &block, sizeof(block) ) )
{
void * pArrayID = NULL;
if( map.Lookup( block.m_szCode, pArrayID ) )
{
int nIndex = ((int)pArrayID);
if( nIndex >= 0 && nIndex < container.GetSize() )
{
container.ElementAt(nIndex).m_basedata.InsertBaseDataSort( block );
}
}
}
file.Close();
}
container.UnLock();
return container.GetSize();
}
int CSelfDB::StoreBasetable( CStockContainer & container )
{
SP_ASSERT( m_bIsOK && container.GetSize() > 0 );
if( !m_bIsOK || container.GetSize() <= 0 ) return 0;
int nCount = 0;
CSPString sRoot = GetRootPath();
CSPString sFileName = sRoot + self_chna_basetbl;
container.Lock();
CSPFile file;
if( file.Open( sFileName, CSPFile::modeWrite | CSPFile::modeCreate ) )
{
for( int i=0; i<container.GetSize(); i++ )
{
CStockInfo & info = container.ElementAt(i);
for( int k=0; k<info.m_basedata.GetSize(); k++ )
{
BASEDATA & block = info.m_basedata.ElementAt(k);
if( k == info.m_basedata.GetSize() - 1 )
{
block.m_fYield_average = info.m_fYield_average;
block.m_fYield_stddev = info.m_fYield_stddev;
block.m_fBeite = info.m_fBeite;
}
file.Write( &block, sizeof(block) );
}
nCount ++;
}
}
container.UnLock();
return nCount;
}
int CSelfDB::LoadDRData( CStock *pstock )
{
SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
CSPString sFileName;
GetFileName( sFileName, CStock::dataDR, &(pstock->GetStockInfo()) );
CDRData & drdata = pstock->GetDRData();
DWORD dwMarket = pstock->GetStockInfo().GetMarket();
CSPString sCode = pstock->GetStockCode();
CSPFile file;
if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
{
DWORD dwLen = file.GetLength();
CLK_DRDATA dbdr;
int nSize = dwLen/sizeof(dbdr);
drdata.SetSize( 0, nSize );
while( sizeof(dbdr) == file.Read( &dbdr, sizeof(dbdr) ) )
{
DRDATA dr;
if( convert_CLK_DRDATA_to_DRDATA( dwMarket, sCode, &dbdr, &dr ) )
drdata.InsertDRDataSort( dr );
}
file.Close();
return drdata.GetSize();
}
// Load From FXJ_DRDATA
sFileName = GetRootPath();
sFileName += self_chna_xdr;
WORD wFxjMarket = 'HS';
if( CStock::marketSZSE == dwMarket )
wFxjMarket = 'ZS';
if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
{
if( 8 == file.Seek( 8, CSPFile::begin ) )
{
BOOL bMy = FALSE;
FXJ_DRDATA fxjdr;
while( sizeof(fxjdr) == file.Read( &fxjdr, sizeof(fxjdr) ) )
{
BOOL bMyOld = bMy;
if( -1 == fxjdr.m_dwMagic )
bMy = ( fxjdr.m_wMarket == wFxjMarket && 0 == strncmp( sCode, fxjdr.m_szCode, min(sizeof(fxjdr.m_szCode),sCode.GetLength()) ) );
else if( bMy )
{
DRDATA dr;
if( convert_FXJ_DRDATA_to_DRDATA( dwMarket, sCode, &fxjdr, &dr ) )
drdata.InsertDRDataSort( dr );
}
if( bMyOld && !bMy )
break;
}
}
}
return drdata.GetSize();
}
int CSelfDB::StoreDRData( CStock *pstock )
{
SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
CSPString sFileName;
GetFileName( sFileName, CStock::dataDR, &(pstock->GetStockInfo()) );
CDRData & drdata = pstock->GetDRData();
if( drdata.GetSize() == 0 )
{
::DeleteFile( sFileName );
return 0;
}
// Compare
CStock stocktemp;
stocktemp.SetStockInfo( &(pstock->GetStockInfo()) );
if( LoadDRData( &stocktemp ) > 0 && stocktemp.GetDRData().IsSameAs(&drdata) )
return drdata.GetSize();
// Store
CSPFile file;
if( file.Open( sFileName, CSPFile::modeCreate | CSPFile::modeWrite | CSPFile::shareDenyNone ) )
{
for( int i=0; i<drdata.GetSize(); i++ )
{
CLK_DRDATA dbdr;
convert_DRDATA_to_CLK_DRDATA( &(drdata.ElementAt(i)), &dbdr );
file.Write( &dbdr, sizeof(dbdr) );
}
}
return drdata.GetSize();
}
DWORD ReadReport( CStock * pstock, LPCTSTR lpszFileName )
{
SP_ASSERT( pstock && pstock->GetStockInfo().IsValidStock() );
if( !pstock || !pstock->GetStockInfo().IsValidStock() )
return 0;
CReport & aReport = pstock->GetReport();
aReport.RemoveAll();
// 读取
CClkFile file;
if( file.Open( lpszFileName ) )
{
DWORD dwDataRecordCount = file.GetDataRecordCount( pstock->GetStockInfo().GetMarket(), pstock->GetStockCode() );
aReport.SetSize( dwDataRecordCount );
DWORD dwCount = file.LoadDataRecord(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(),
aReport.GetData(), sizeof(REPORT), dwDataRecordCount );
aReport.SetSize( dwCount );
aReport.Sort( );
int nOldSize = aReport.GetSize();
aReport.RemoveDirty( );
if( nOldSize - aReport.GetSize() > 50 )
{
SP_VERIFY( aReport.GetSize() == (int)file.StoreDataRecord( pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(),
aReport.GetData(), sizeof(REPORT), aReport.GetSize(), TRUE ) );
}
}
return aReport.GetSize();
}
int CSelfDB::LoadReport( CStock *pstock )
{
SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
pstock->GetReport().RemoveAll();
CSPString sFileName;
SP_VERIFY( GetFileName( sFileName, CStock::dataReport, &(pstock->GetStockInfo()) ) );
ReadReport( pstock, sFileName );
return pstock->GetReport().GetSize();
}
DWORD ReadMinute( CStock * pstock, LPCTSTR lpszFileName )
{
SP_ASSERT( pstock && pstock->GetStockInfo().IsValidStock() );
if( !pstock || !pstock->GetStockInfo().IsValidStock() )
return 0;
CMinute & aMinute = pstock->GetMinute();
aMinute.RemoveAll();
// 读取
CClkFile file;
if( file.Open( lpszFileName ) )
{
DWORD dwDataRecordCount = file.GetDataRecordCount( pstock->GetStockInfo().GetMarket(), pstock->GetStockCode() );
aMinute.SetSize( dwDataRecordCount );
DWORD dwCount = file.LoadDataRecord(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(),
aMinute.GetData(), sizeof(MINUTE), dwDataRecordCount );
aMinute.SetSize( dwCount );
aMinute.Sort( );
aMinute.RemoveDirty( );
}
return aMinute.GetSize();
}
int CSelfDB::LoadMinute( CStock *pstock )
{
SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
pstock->GetMinute().RemoveAll();
CSPString sFileName;
SP_VERIFY( GetFileName( sFileName, CStock::dataMinute, &(pstock->GetStockInfo()) ) );
ReadMinute( pstock, sFileName );
return pstock->GetMinute().GetSize();
}
int CSelfDB::LoadOutline( CStock *pstock )
{
SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
COutline & aOutline = pstock->GetOutline();
aOutline.RemoveAll();
CSPString sFileName;
SP_VERIFY( GetFileName( sFileName, CStock::dataOutline, &(pstock->GetStockInfo()) ) );
CSPFile file;
if( file.Open( sFileName, CSPFile::modeRead ) )
{
OUTLINE outline;
aOutline.SetSize( aOutline.GetSize(), file.GetLength()/sizeof(outline) + 10 );
while( sizeof(outline) == file.Read(&outline,sizeof(outline)) )
aOutline.Add( outline );
}
return aOutline.GetSize();
}
int CSelfDB::StoreReport( REPORT * pReport, int nCount, BOOL bBigTrade )
{
SP_ASSERT( m_bIsOK && pReport && nCount > 0 );
if( !m_bIsOK || !pReport || nCount <= 0 ) return 0;
static BOOL bFirstCall = TRUE;
if( bFirstCall )
{
bFirstCall = FALSE;
// remove old
CSPString sRoot = GetRootPath();
CClkFile::RemoveFileIfOutoftime( sRoot+self_sh_report, pReport->m_time );
CClkFile::RemoveFileIfOutoftime( sRoot+self_sz_report, pReport->m_time );
}
CSPString sFileName;
CClkFile file;
DWORD dwStoreCount = 0;
for( int i=0; i<nCount; i++ )
{
CStockInfo info;
CSPString sFileNameNew;
if( !info.SetStockCode( pReport[i].m_dwMarket, pReport[i].m_szCode )
|| !GetFileName( sFileNameNew, CStock::dataReport, &info ) )
continue;
if( 0 != sFileNameNew.Compare( sFileName ) )
{
sFileName = sFileNameNew;
SP_VERIFY( CClkFile::BuildEmptyFile( sFileName, CStock::dataReport, pReport->m_dwMarket, 5000, 125, FALSE ) );
SP_VERIFY( file.Open( sFileName ) );
}
// store
if( bBigTrade )
{
dwStoreCount += file.StoreDataRecord( pReport[i].m_dwMarket, STKLIB_CODE_ZLDD,
&(pReport[i]), sizeof(REPORT), 1, FALSE );
}
else
{
dwStoreCount += file.StoreDataRecord( pReport[i].m_dwMarket, pReport[i].m_szCode,
&(pReport[i]), sizeof(REPORT), 1, FALSE );
}
}
return dwStoreCount;
}
int CSelfDB::StoreMinute( MINUTE * pMinute, int nCount )
{
SP_ASSERT( m_bIsOK && pMinute && nCount > 0 );
if( !m_bIsOK || !pMinute || nCount <= 0 ) return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -