⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selfdb.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
	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 + -