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

📄 stock.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	else if( CStock::reportQuarter3 == nReportType )
		factor	=	1.333333;
	return factor;
}

CStock::CStock( )
{
	m_nBaseTextLen	=	0;
	m_pBaseText		=	NULL;

	m_pDatabase	=	NULL;

	SetKDataTypes( );
}

CStock::CStock( CStDatabase * pDatabase )
{
	m_nBaseTextLen	=	0;
	m_pBaseText		=	NULL;

	SP_ASSERT( pDatabase );
	m_pDatabase	=	pDatabase;

	SetKDataTypes( );
}

CStock::CStock( CStDatabase * pDatabase, DWORD dwMarket, const char * code )
{
	m_nBaseTextLen	=	0;
	m_pBaseText		=	NULL;

	SP_ASSERT( pDatabase );
	m_pDatabase	=	pDatabase;
	m_stockinfo.SetStockCode( dwMarket, code );

	SetKDataTypes( );
}

CStock::~CStock()
{
	Clear( );
}

void CStock::SetKDataTypes( )
{
	m_kdMonth.SetKType( CKData::ktypeMonth );
	m_kdWeek.SetKType( CKData::ktypeWeek );
	m_kdDay.SetKType( CKData::ktypeDay );
	m_kdMin60.SetKType( CKData::ktypeMin60 );
	m_kdMin30.SetKType( CKData::ktypeMin30 );
	m_kdMin15.SetKType( CKData::ktypeMin15 );
	m_kdMin5.SetKType( CKData::ktypeMin5 );
}

void CStock::SetDatabase( CStDatabase * pDatabase )
{
	m_pDatabase	=	pDatabase;
}

CStDatabase * CStock::GetDatabase( )
{
	return m_pDatabase;
}

void CStock::SetStockCode( DWORD dwMarket, const char *szCode )
{
	if( m_stockinfo.IsEqualTo(dwMarket, szCode) )
		return;

	Clear();
	m_stockinfo.SetStockCode(dwMarket,szCode);
}

const char * CStock::GetStockCode( )
{
	return m_stockinfo.GetStockCode();
}

BOOL CStock::SetStockInfo( CStockInfo * pInfo )
{
	if( NULL == pInfo )
	{
		Clear();
		return FALSE;
	}
	if( m_stockinfo.IsEqualTo( pInfo->GetMarket(), pInfo->GetStockCode() ) )
	{
		m_stockinfo	=	*pInfo;
		return m_stockinfo.IsValidStock( );
	}
	Clear();
	m_stockinfo	=	*pInfo;
	return m_stockinfo.IsValidStock( );
}

CStockInfo & CStock::GetStockInfo( )	{	return m_stockinfo;	}
CKData	& CStock::GetKData( int ktype )
{
	switch( ktype )
	{
	case CKData::ktypeMonth:
		return GetKDataMonth();
	case CKData::ktypeWeek:
		return GetKDataWeek();
	case CKData::ktypeDay:
		return GetKDataDay();
	case CKData::ktypeMin60:
		return GetKDataMin60();
	case CKData::ktypeMin30:
		return GetKDataMin30();
	case CKData::ktypeMin15:
		return GetKDataMin15();
	case CKData::ktypeMin5:
		return GetKDataMin5();
	default:
		SP_ASSERT( FALSE );
		return GetKDataDay();
	}
}
CKData	& CStock::GetKDataMonth( )		{	return m_kdMonth;	}
CKData	& CStock::GetKDataWeek( )		{	return m_kdWeek;	}
CKData	& CStock::GetKDataDay( )		{	return m_kdDay;		}
CKData	& CStock::GetKDataMin60( )		{	return m_kdMin60;	}
CKData	& CStock::GetKDataMin30( )		{	return m_kdMin30;	}
CKData	& CStock::GetKDataMin15( )		{	return m_kdMin15;	}
CKData	& CStock::GetKDataMin5( )		{	return m_kdMin5;	}
CDRData	& CStock::GetDRData( )			{	return m_drData;	}
CReport & CStock::GetReport( )			{	return m_report;	}
CMinute & CStock::GetMinute( )			{	return m_minute;	}
COutline & CStock::GetOutline( )		{	return m_outline;	}

char	* CStock::GetBaseTextPtr( )		{	return m_pBaseText;	}
int		CStock::GetBaseTextLength( )	{	return m_nBaseTextLen;	}

BOOL	CStock::AllocBaseTextMem( int nNewLength )
{
	SP_ASSERT( nNewLength <= 0x200000 );
	if( nNewLength > 0x200000 )	return FALSE;

	if( m_pBaseText )
	{
		delete	m_pBaseText;
		m_nBaseTextLen	=	0;
	}

	m_pBaseText	=	new CHAR[nNewLength+1];
	if( m_pBaseText )
	{
		memset( m_pBaseText, 0, nNewLength+1 );
		m_nBaseTextLen	=	nNewLength;
		return TRUE;
	}
	return FALSE;
}

int CStock::PrepareData( int type, int period, BOOL bReload )
{
	SP_ASSERT( m_pDatabase );
	if( ! m_pDatabase )	return 0;

	switch( type )
	{
	case dataInfo:
		return AfxGetStockContainer().GetStockInfo( m_stockinfo.GetStockCode(), &m_stockinfo );
	case dataK:
		{
			switch( period )
			{
			case CKData::ktypeMonth:
				if( bReload || GetKDataMonth().GetSize() == 0 )
					m_pDatabase->LoadKData( this, CKData::ktypeMonth );
				break;
			case CKData::ktypeWeek:
				if( bReload || GetKDataWeek().GetSize() == 0 )
					m_pDatabase->LoadKData( this, CKData::ktypeWeek );
				break;
			case CKData::ktypeDay:
				if( bReload || GetKDataDay().GetSize() == 0 )
					m_pDatabase->LoadKData( this, CKData::ktypeDay );
				break;		// month, week, and day willnot extract from min60,min30...

			case CKData::ktypeMin60:
				if( bReload || GetKDataMin60().GetSize() == 0 )
					m_pDatabase->LoadKData( this, CKData::ktypeMin60 );
				break;
			case CKData::ktypeMin30:
				if( bReload || GetKDataMin30().GetSize() == 0 )
					m_pDatabase->LoadKData( this, CKData::ktypeMin30 );
				break;
			case CKData::ktypeMin15:
				if( bReload || GetKDataMin15().GetSize() == 0 )
					m_pDatabase->LoadKData( this, CKData::ktypeMin15 );
				break;
			case CKData::ktypeMin5:
				if( bReload || GetKDataMin5().GetSize() == 0 )
					m_pDatabase->LoadKData( this, CKData::ktypeMin5 );
				break;
			default:
				SP_ASSERT( FALSE );
				return 0;
			}
			return ExtractKData( period, FALSE );
		}
	case dataDR:
		if( bReload || GetDRData().GetSize() == 0 )
			return m_pDatabase->LoadDRData( this );
		else
			return GetDRData().GetSize();
	case dataBasetable:
		return AfxGetStockContainer().GetStockInfo( m_stockinfo.GetStockCode(), &m_stockinfo );
	case dataBasetext:
		if( bReload || !GetBaseTextPtr() )
			return m_pDatabase->LoadBaseText( this );
		else
			return GetBaseTextLength();
	case dataReport:
		if( bReload || GetReport().GetSize() == 0 )
			return m_pDatabase->LoadReport( this );
		else
			return GetReport().GetSize();
	case dataMinute:
		if( bReload || GetMinute().GetSize() == 0 )
			return m_pDatabase->LoadMinute( this );
		else
			return GetMinute().GetSize();
	case dataOutline:
		if( bReload || GetOutline().GetSize() == 0 )
			return m_pDatabase->LoadOutline( this );
		else
			return GetOutline().GetSize();
	default:
		SP_ASSERT( FALSE );
		return 0;
	}
}

int CStock::PrepareBaseInfo( BOOL bReload )
{
	// Load From File
	PrepareData( CStock::dataBasetext, 0, bReload );
	
	// Save To pText
	int nTextLen = m_nBaseTextLen;
	char * pText	=	NULL;
	if( m_pBaseText && nTextLen > 0 )
	{
		pText = new CHAR[nTextLen+1];
		if( pText )	memcpy( pText, m_pBaseText, nTextLen );
		if( pText )	pText[nTextLen] = 0;
	}
	
	int nIntroLen = SLH_MAX * 80;
	if( !AllocBaseTextMem( nIntroLen + m_nBaseTextLen + 10 ) )
		return 0;

	int nCount = 0;
	
#ifdef	CLKLAN_ENGLISH_US
	{ // Chinese pronunciation
		CSPString strTemp = m_stockinfo.GetStockNameChs();
		strTemp = AfxMakeSpellCode( strTemp );
		strTemp = "Chinese Name(pronunciation): \t" + strTemp + STRING_CRLF;
		if( nCount + strTemp.GetLength() < nIntroLen )
		{
			nCount += strTemp.GetLength();
			strcat( m_pBaseText, (LPCTSTR)strTemp );
		}
	}
#endif

	for( int nVariantID = SLH_MIN; nVariantID <= SLH_MAX; nVariantID ++ )
	{
		CSPString	strTemp	=	AfxGetVariantName( nVariantID, TRUE );
		strTemp	+=	": \t";
		strTemp	+=	(LPCTSTR)AfxGetVariantDispString( nVariantID, m_stockinfo, NULL );
		strTemp	+=	STRING_CRLF;

		SP_ASSERT( nCount + strTemp.GetLength() < nIntroLen );
		if( nCount + strTemp.GetLength() < nIntroLen )
		{
			nCount += strTemp.GetLength();
			strcat( m_pBaseText, (LPCTSTR)strTemp );
		}
	}
	
	nCount += strlen(STRING_CRLF);
	strcat( m_pBaseText, STRING_CRLF );
	nCount += strlen(STRING_CRLF);
	strcat( m_pBaseText, STRING_CRLF );
	
#ifdef	CLKLAN_ENGLISH_US
	if( pText && nCount + nTextLen < m_nBaseTextLen && AfxIsEnglish( pText, nTextLen, 0.01f ) )
#else
	if( pText && nCount + nTextLen < m_nBaseTextLen )
#endif
	{
		nCount += nTextLen;
		strcat( m_pBaseText, pText );
	}
	
	if( pText )
		delete [] pText;

	return nCount;
}

int CStock::ExtractKData( int period, BOOL bForced )
{
	switch( period )
	{
	case CKData::ktypeMonth:
		{
			if( bForced )
				return CKData::DayToMonth( GetKDataDay(), GetKDataMonth() );
			int compare = GetKDataMonth().CompareLatestDate( GetKDataDay() );
			if( -1 == compare )
				return CKData::DayToMonth( GetKDataDay(), GetKDataMonth() );
			else if( 1 == compare )
				return GetKDataMonth().GetSize();
			else if( GetKDataMonth().GetSize() * 18 < GetKDataDay().GetSize() )
				return CKData::DayToMonth( GetKDataDay(), GetKDataMonth() );
			else
				return GetKDataMonth().GetSize();
		}
		break;
	case CKData::ktypeWeek:
		{
			if( bForced )
				return CKData::DayToWeek( GetKDataDay(), GetKDataWeek() );
			int compare = GetKDataWeek().CompareLatestDate( GetKDataDay() );
			if( -1 == compare )
				return CKData::DayToWeek( GetKDataDay(), GetKDataWeek() );
			else if( 1 == compare )
				return GetKDataWeek().GetSize();
			else if( GetKDataWeek().GetSize() * 5 < GetKDataDay().GetSize() )
				return CKData::DayToWeek( GetKDataDay(), GetKDataWeek() );
			else
				return GetKDataWeek().GetSize();
		}
		break;
	case CKData::ktypeDay:
		return GetKDataDay().GetSize();
	case CKData::ktypeMin60:
		{
			if( bForced )
				return CKData::Min5ToMin60( GetKDataMin5(), GetKDataMin60() );
			int compare = GetKDataMin60().CompareLatestDate( GetKDataMin5() );
			if( -1 == compare )
				return CKData::Min5ToMin60( GetKDataMin5(), GetKDataMin60() );
			else if( 1 == compare )
				return GetKDataMin60().GetSize();
			else if( GetKDataMin60().GetSize() * 12 < GetKDataMin5().GetSize() )
				return CKData::Min5ToMin60( GetKDataMin5(), GetKDataMin60() );
			else
				return GetKDataMin60().GetSize();
		}
		break;
	case CKData::ktypeMin30:
		{
			if( bForced )
				return CKData::Min5ToMin30( GetKDataMin5(), GetKDataMin30() );
			int compare = GetKDataMin30().CompareLatestDate( GetKDataMin5() );
			if( -1 == compare )
				return CKData::Min5ToMin30( GetKDataMin5(), GetKDataMin30() );
			else if( 1 == compare )
				return GetKDataMin30().GetSize();
			else if( GetKDataMin30().GetSize() * 6 < GetKDataMin5().GetSize() )
				return CKData::Min5ToMin30( GetKDataMin5(), GetKDataMin30() );
			else
				return GetKDataMin30().GetSize();
		}
		break;
	case CKData::ktypeMin15:
		{
			if( bForced )
				return CKData::Min5ToMin15( GetKDataMin5(), GetKDataMin15() );
			int compare = GetKDataMin15().CompareLatestDate( GetKDataMin5() );
			if( -1 == compare )
				return CKData::Min5ToMin15( GetKDataMin5(), GetKDataMin15() );
			else if( 1 == compare )
				return GetKDataMin15().GetSize();
			else if( GetKDataMin15().GetSize() * 3 < GetKDataMin5().GetSize() )
				return CKData::Min5ToMin15( GetKDataMin5(), GetKDataMin15() );
			else
				return GetKDataMin15().GetSize();
		}
		break;
	case CKData::ktypeMin5:
		return GetKDataMin5().GetSize();
	default:
		SP_ASSERT( FALSE );
		return 0;
	}
}

int CStock::MergeBaseText( CStock &stock )
{
	if( GetBaseTextLength() > 0 )
		return GetBaseTextLength();
	if( stock.GetBaseTextLength() > 0 )
	{
		if( AllocBaseTextMem( stock.GetBaseTextLength() ) )
			strncpy( GetBaseTextPtr(), stock.GetBaseTextPtr(), stock.GetBaseTextLength() );
		return stock.GetBaseTextLength();
	}
	return 0;
}

int CStock::MergeKData( CStock &stock, int period )
{
	CKData	* pkdata	=	NULL;
	CKData	* pkdata2	=	NULL;
	switch( period )
	{
	case CKData::ktypeMonth:
		pkdata	=	&(GetKDataMonth());
		pkdata2	=	&(stock.GetKDataMonth());
		break;
	case CKData::ktypeWeek:
		pkdata	=	&(GetKDataWeek());
		pkdata2	=	&(stock.GetKDataWeek());
		break;
	case CKData::ktypeDay:
		pkdata	=	&(GetKDataDay());
		pkdata2	=	&(stock.GetKDataDay());
		break;
	case CKData::ktypeMin60:
		pkdata	=	&(GetKDataMin60());
		pkdata2	=	&(stock.GetKDataMin60());
		break;
	case CKData::ktypeMin30:
		pkdata	=	&(GetKDataMin30());
		pkdata2	=	&(stock.GetKDataMin30());
		break;
	case CKData::ktypeMin15:
		pkdata	=	&(GetKDataMin15());
		pkdata2	=	&(stock.GetKDataMin15());
		break;
	case CKData::ktypeMin5:
		pkdata	=	&(GetKDataMin5());
		pkdata2	=	&(stock.GetKDataMin5());
		break;
	default:
		SP_ASSERT( FALSE );
		return 0;
	}

	return pkdata->MergeKData( pkdata2 );
}

int CStock::MergeDRData( CStock &stock )
{
	if( GetDRData().GetSize() < stock.GetDRData().GetSize() )
		GetDRData().Copy( stock.GetDRData() );
	return GetDRData().GetSize();
}

int CStock::StoreDRData( )
{
	if( m_pDatabase )
		return m_pDatabase->StoreDRData( this );
	return 0;
}

void CStock::Clear( )
{
	m_stockinfo.Clear( );
	if( m_pBaseText )
		delete [] (CHAR*)m_pBaseText;
	m_nBaseTextLen	=	0;
	m_pBaseText		=	NULL;

	m_kdMonth.Clear();
	m_kdWeek.Clear();
	m_kdDay.Clear();
	m_kdMin60.Clear();
	m_kdMin30.Clear();
	m_kdMin15.Clear();
	m_kdMin5.Clear();
	m_drData.SetSize( 0 );
	m_report.SetSize( 0 );
	m_minute.SetSize( 0 );
	m_outline.SetSize( 0 );

	SetKDataTypes( );
}

// 投资家万能引擎证券市场
/*
#define  SH_MARKET_EX   'HS'  // 上海证券
#define  SZ_MARKET_EX   'ZS'  // 深圳证券
#define  CZ_MARKET_EX   'ZC'  // 郑州商品
#define  DL_MARKET_EX   'LD'  // 大连商品
#define  SF_MARKET_EX   'FS'  // 上海商品
#define  SM_MARKET_EX   'MS'  // 上海金属
#define  CE_MARKET_EX   'EC'  // 亚洲指数
#define  CB_MARKET_EX   'BC'  // CBOT
#define  CC_MARKET_EX   'CC'  // 软商品
#define  MC_MARKET_EX   'CM'  // C M X
#define  IM_MARKET_EX   'MI'  // 外汇期货
#define  LM_MARKET_EX   'ML'  // L M E
#define  NY_MARKET_EX   'YN'  // NYSE
#define  AI_MARKET_EX   'IA'  // 亚洲期指
#define  WH_MARKET_EX   'HW'  // 外汇交易
#define  XH_MARKET_EX   'HX'  // 欧美指数
#define  CM_MARKET_EX   'MC'  // C M E
#define  NF_MARKET_EX   'FN'  // 欧美期指
#define  NM_MARKET_EX   'MN'  // 石油产品
#define  LC_MARKET_EX   'CL'  // 巴黎油籽
#define  LI_MARKET_EX   'IL'  // 马来西亚
#define  SI_MARKET_EX   'IS'  // 温尼伯格
#define  HS_MARKET_EX   'SH'  // H S I
#define  HK_MARKET_EX   'HK'  // 香港股票
#define  ZJ_MARKET_EX   'JZ'  // ZJFE
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -