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

📄 stock.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
📖 第 1 页 / 共 3 页
字号:
BOOL CStockInfo::StatTechIndex( DWORD dwDate )
{
	SP_ASSERT( 0 != dwDate );

	if( m_kdata.GetSize() == 0 )
		return FALSE;

	int	nIndex	=	-1;
	if( -1 == dwDate )
		nIndex	=	m_kdata.GetSize() - 1;
	else
		nIndex	=	m_kdata.GetIndexByDate( dwDate );

	if( -1 == nIndex )
	{
		m_datetech	=	0;
		m_fLast		=	0;
		m_fOpen		=	0;
		m_fHigh		=	0;
		m_fLow		=	0;
		m_fClose	=	0;
		m_fAmount	=	0;
		m_fVolume	=	0;
		m_dwAdvance	=	0;
		m_dwDecline	=	0;
		
		return FALSE;
	}
	else
	{
		KDATA	& kd	=	m_kdata.ElementAt( nIndex );
		m_datetech	=	kd.m_date;
		if( nIndex > 0 )
			m_fLast	=	m_kdata.ElementAt(nIndex-1).m_fClose;
		else
			m_fLast	=	kd.m_fOpen;
		m_fOpen		=	kd.m_fOpen;
		m_fHigh		=	kd.m_fHigh;
		m_fLow		=	kd.m_fLow;
		m_fClose	=	kd.m_fClose;
		m_fAmount	=	kd.m_fAmount;
		m_fVolume	=	kd.m_fVolume;
		m_dwAdvance	=	kd.m_dwAdvance;
		m_dwDecline	=	kd.m_dwDecline;
		
		return TRUE;
	}
}

BOOL CStockInfo::StatBaseIndex( DWORD dwDate )
{
	SP_ASSERT( 0 != dwDate );

	if( m_basedata.GetSize() == 0 )
		return FALSE;

	int	nIndex	=	m_basedata.GetSize()-1;
	for( int i=m_basedata.GetSize()-1; i>=0; i-- )
	{
		if( m_basedata.ElementAt(i).m_date <= dwDate )
		{
			nIndex	=	i;
			break;
		}
	}

	BASEDATA	& block		=	m_basedata.ElementAt(nIndex);

	strncpy( m_szDomain, block.m_szDomain, min(sizeof(m_szDomain),sizeof(block.m_szDomain)) );
	strncpy( m_szProvince, block.m_szProvince, min(sizeof(m_szProvince),sizeof(block.m_szProvince)) );
	m_datebase				=	block.m_date;
	m_reporttype			=	block.m_reporttype;
	if( block.m_fErate_dollar > 1e-6 )
		m_fErate_dollar			=	block.m_fErate_dollar;
	if( block.m_fErate_hkdollar > 1e-6 )
		m_fErate_hkdollar		=	block.m_fErate_hkdollar;

	m_fRatio_liquidity		=	block.m_fRatio_liquidity;
	m_fRatio_quick			=	block.m_fRatio_quick;
	m_fVelocity_receivables	=	block.m_fVelocity_receivables;

	m_fVelocity_merchandise	=	block.m_fVelocity_merchandise;
	m_fMain_income			=	block.m_fMain_income;
	m_fCash_ps				=	block.m_fCash_ps;
	
	m_fProfit_margin		=	block.m_fProfit_margin;
	m_fNetasset_yield		=	block.m_fNetasset_yield;

	m_datebegin				=	block.m_datebegin;
	m_fShare_count_total	=	block.m_fShare_count_total;
	m_fShare_count_a		=	block.m_fShare_count_a;
	m_fShare_count_b		=	block.m_fShare_count_b;
	m_fShare_count_h		=	block.m_fShare_count_h;
	m_fShare_count_national	=	block.m_fShare_count_national;
	m_fShare_count_corp		=	block.m_fShare_count_corp;
	m_fProfit_psud			=	block.m_fProfit_psud;
	m_fAsset				=	block.m_fAsset;
	m_fRatio_holderright	=	block.m_fRatio_holderright;
	m_fRatio_longdebt		=	block.m_fRatio_longdebt;
	m_fRatio_debt			=	block.m_fRatio_debt;

	m_fNetasset_ps			=	block.m_fNetasset_ps;
	m_fNetasset_ps_regulate	=	block.m_fNetasset_ps_regulate;
	m_fEps					=	block.m_fEps;
	m_fEps_deduct			=	block.m_fEps_deduct;
	m_fNet_profit			=	block.m_fNet_profit;
	m_fMain_profit			=	block.m_fMain_profit;
	m_fTotal_profit			=	block.m_fTotal_profit;

	m_fProfit_inc			=	block.m_fProfit_inc;
	m_fIncome_inc			=	block.m_fIncome_inc;
	m_fAsset_inc			=	block.m_fAsset_inc;

	/* 以下统计值永远只取最近一期数值
	//	★技术数据统计值
	LONG		m_fYield_average;		// 平均收益率% 0.001
	LONG		m_fYield_stddev;		// 收益标准差% 0.001
	LONG		m_fBeite;				// β值 0.001
	*/
	BASEDATA	& blkLatest	=	m_basedata.ElementAt(m_basedata.GetSize()-1);
	m_fYield_average		=	blkLatest.m_fYield_average;
	m_fYield_stddev			=	blkLatest.m_fYield_stddev;
	m_fBeite				=	blkLatest.m_fBeite;

/*** stat
	m_fProfit_inc			=	0;
	m_fIncome_inc			=	0;
	LONG	nProfitCount = 0;
	LONG	nIncomeCount = 0;
	float	fProfitLast = 0, fProfitSum = 0;
	float	fIncomeLast = 0, fIncomeSum = 0;
	for( int i=0; i<m_basedata.GetSize(); i++ )
	{
		BASEDATA	& base	=	m_basedata.ElementAt(i);
		if( fabs(fProfitLast) > 1e-4 )
		{
			nProfitCount	++;
			fProfitSum	+=	(float) ( (base.m_fNet_profit)/nProfitLast - 1 );
		}
		if( fabs(fIncomeLast) > 1e-4 )
		{
			nIncomeCount	++;
			fIncomeSum	+=	(float)( (base.m_fMain_income)/nIncomeLast - 1 );
		}

		fProfitLast	=	base.m_fNet_profit;
		fIncomeLast	=	base.m_fMain_income;
	}
	if( nProfitCount > 0 )
		m_fProfit_inc	=	(float)(((double)fProfitSum)/nProfitCount);
	if( nIncomeCount > 0 )
		m_fIncome_inc	=	(float)(((double)fIncomeSum)/nIncomeCount);
*/
	return TRUE;
}

BOOL CStockInfo::IsValidStock( )
{
	return (strlen(m_szCode) > 0);
}

BOOL CStockInfo::IsShangHai( )
{
	if( CStock::marketSHSE == m_dwMarket )
		return TRUE;
	return (m_type & CStock::markShanghai);
}

BOOL CStockInfo::IsShenZhen( )
{
	if( CStock::marketSZSE == m_dwMarket )
		return TRUE;
	return (m_type & CStock::markShenzhen);
}

BOOL CStockInfo::IsIndex( )
{
	return ( CStock::typeshIndex == m_type || CStock::typeszIndex == m_type );
}

BOOL CStockInfo::IsBond( )
{
	if( CStock::typeshBond == m_type || CStock::typeszBond == m_type )
		return TRUE;
	return ( 0 == strncmp( m_szName, sz_stockname_bond, min(sizeof(m_szName),strlen(sz_stockname_bond)) ) );
}

BOOL CStockInfo::IsBondIndex( )
{
	return ( 0 == strncmp( m_szName, sz_stockname_bondindex, min(sizeof(m_szName),strlen(sz_stockname_bondindex)) )
		|| 0 == strncmp( m_szName, sz_stockname_bondindexcorp, min(sizeof(m_szName),strlen(sz_stockname_bondindexcorp)) ) );
}

BOOL CStockInfo::IsFund( )
{
	return ( 0 == strncmp( m_szName, sz_stockname_fund, min(sizeof(m_szName),strlen(sz_stockname_fund)) ) );
}

BOOL CStockInfo::IsRight( )
{
	return ( CStock::typeshRight == m_type || CStock::typeszRight == m_type );
}

int CStockInfo::DigitBit( )
{
	if( IsFund() || IsRight() || CStock::typeshB == m_type)
		return 3;
	return 2;
}

BOOL CStockInfo::GetAverage( double *pValue )
{
	if( CStock::typeshIndex == m_type || CStock::typeszIndex == m_type )
		return FALSE;
	if( m_fVolume > 1e-4 )
	{
		int		nCount	=	0;
		double	average	=	((double)(m_fAmount)) / m_fVolume;
		while( average < m_fLow && nCount < 10 )	{	average	*=	10;	nCount ++;	}
		while( average > m_fHigh && nCount < 20 )	{	average	/=	10;	nCount ++; }
		if( average < m_fLow )		//	说明是指数
			average	=	(m_fOpen+m_fHigh+m_fLow+m_fClose)/4;
		if( pValue )
			*pValue	=	average;
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetDiff( double *pValue, DWORD dateCur, int nDays )
{
	if( 1 == nDays && m_datetech == dateCur )
	{
		if( m_fLast <= 1e-4 || m_fClose < 1e-4 )
			return FALSE;
		if( pValue )
			*pValue	=	m_fClose - m_fLast;
		return TRUE;
	}
	return m_kdata.GetDiff( pValue, dateCur, nDays );
}

BOOL CStockInfo::GetDiffPercent( double *pValue, DWORD dateCur, int nDays )
{
	if( 1 == nDays && m_datetech == dateCur )
	{
		if( m_fLast <= 1e-4 || m_fClose < 1e-4 )
			return FALSE;
		if( pValue )
			*pValue	=	100. * m_fClose / m_fLast - 100;
		return TRUE;
	}
	return m_kdata.GetDiffPercent( pValue, dateCur, nDays );
}

BOOL CStockInfo::GetScope( double *pValue, DWORD dateCur, int nDays )
{
	if( 1 == nDays && m_datetech == dateCur )
	{
		if( m_fLast <= 1e-4 || m_fHigh <= 1e-4 || m_fLow <= 1e-4 )
			return FALSE;
		if( pValue )
			*pValue	=	100. * (m_fHigh-m_fLow)/m_fLast;
		return TRUE;
	}
	return m_kdata.GetScope( pValue, dateCur, nDays );
}

BOOL CStockInfo::GetDiffPercentMin5( double *pValue )
{
	return m_minute.GetDiffPercentMin5( pValue );
}

BOOL CStockInfo::GetPE( double * pValue )
{
	double	factor	=	CStock::GetReportFactor( m_reporttype );
	if( fabs(m_fEps) > 1e-4 && m_fClose > 1e-4 )
	{
		double	close_price_rmb	=	m_fClose;
		if( CStock::typeshB == m_type )
			close_price_rmb	=	/*m_fErate_dollar * */m_fClose;	// 备注,从通达信得到的基本资料数据是经过汇率换算的.
		else if( CStock::typeszB == m_type )
			close_price_rmb	=	/*m_fErate_hkdollar * */m_fClose;
		if( pValue )
			*pValue	=	close_price_rmb / (m_fEps * factor);
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetPNetAsset( double *pValue )
{
	if( fabs(m_fNetasset_ps) > 1e-4 && m_fClose > 1e-4 )
	{
		double	close_price_rmb	=	m_fClose;
		if( CStock::typeshB == m_type )
			close_price_rmb	=	/*m_fErate_dollar * */m_fClose;	// 备注,从通达信得到的基本资料数据是经过汇率换算的.
		else if( CStock::typeszB == m_type )
			close_price_rmb	=	/*m_fErate_hkdollar * */m_fClose;

		if( pValue )
			*pValue	=	close_price_rmb / m_fNetasset_ps;
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetPMainIncome( double * pValue )
{
	double	factor	=	CStock::GetReportFactor( m_reporttype );
	
	if( fabs(m_fMain_income) > 1e-4 && m_fClose > 1e-4 )
	{
		double	close_price_rmb	=	m_fClose;
		if( CStock::typeshB == m_type )
			close_price_rmb	=	/*m_fErate_dollar * */m_fClose;	// 备注,从通达信得到的基本资料数据是经过汇率换算的.
		else if( CStock::typeszB == m_type )
			close_price_rmb	=	/*m_fErate_hkdollar * */m_fClose;

		if( pValue )
			*pValue	=	close_price_rmb * m_fShare_count_total / (m_fMain_income*factor);
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetRatioPCash( double * pValue )
{
	if( CStock::typeshA != m_type && CStock::typeszA != m_type
		&& CStock::typeshB != m_type && CStock::typeszB != m_type )
		return FALSE;

	double	factor	=	CStock::GetReportFactor( m_reporttype );
	
	if( fabs(m_fCash_ps) > 1e-4 && m_fClose > 1e-4 )
	{
		double	close_price_rmb	=	m_fClose;
		if( CStock::typeshB == m_type )
			close_price_rmb	=	/*m_fErate_dollar * */m_fClose;	// 备注,从通达信得到的基本资料数据是经过汇率换算的.
		else if( CStock::typeszB == m_type )
			close_price_rmb	=	/*m_fErate_hkdollar * */m_fClose;

		if( pValue )
			*pValue	=	close_price_rmb / (m_fCash_ps*factor);
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetShareCurrency( double * pValue )
{
	if( CStock::typeshA != m_type && CStock::typeszA != m_type
		&& CStock::typeshB != m_type && CStock::typeszB != m_type )
		return FALSE;

	if( CStock::typeshA == m_type || CStock::typeszA == m_type )
	{
		*pValue	=	(double)m_fShare_count_a;
		return TRUE;
	}
	if( CStock::typeshB == m_type || CStock::typeszB == m_type )
	{
		*pValue	=	(double)m_fShare_count_b;
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetRatioCurrency( double * pValue )
{
	if( CStock::typeshA != m_type && CStock::typeszA != m_type
		&& CStock::typeshB != m_type && CStock::typeszB != m_type )
		return FALSE;

	if( m_fShare_count_total > 1e-4 )
	{
		if( CStock::typeshA == m_type || CStock::typeszA == m_type )
		{
			*pValue	=	(100. * (double)m_fShare_count_a) / m_fShare_count_total;
			return TRUE;
		}
		if( CStock::typeshB == m_type || CStock::typeszB == m_type )
		{
			*pValue	=	(100. * (double)m_fShare_count_b) / m_fShare_count_total;
			return TRUE;
		}
	}
	return FALSE;
}

BOOL CStockInfo::GetRatioChangeHand( double * pValue, double dVolume )
{
	if( CStock::typeshA != m_type && CStock::typeszA != m_type
		&& CStock::typeshB != m_type && CStock::typeszB != m_type )
		return FALSE;

	// get share currency
	double	dShareCurrency	=	0.;
	if( !GetShareCurrency( &dShareCurrency ) )
		return FALSE;
	if( fabs(dShareCurrency) < 1e-4 )
		return FALSE;

	if( pValue )
		*pValue	=	100. * dVolume / dShareCurrency;
	return TRUE;
}

BOOL CStockInfo::GetRatioChangeHand( CKData &kdata, double * pValue, DWORD dateCur, int nDays )
{
	double	dVolume	=	0;
	if( !kdata.GetVolumeSum( &dVolume, dateCur, nDays ) )
		return FALSE;

	return GetRatioChangeHand( pValue, dVolume );
}

BOOL CStockInfo::GetRatioChangeHand( double * pValue, DWORD dateCur, int nDays )
{
	return GetRatioChangeHand( m_kdata, pValue, dateCur, nDays );
}

BOOL CStockInfo::GetRatioVolume( double * pValue, DWORD dateCur, int nDays )
{
	return m_kdata.GetRatioVolume( pValue, dateCur, nDays );
}

BOOL CStockInfo::GetRS( double * pValue, DWORD dateCur, int nDays )
{
	return m_kdata.GetRS( pValue, dateCur, nDays );
}

BOOL CStockInfo::GetSellBuyRatio( double *pdRatio, double *pdDiff )
{
	double	dBuyVolume	= m_fBuyVolume[0];
	dBuyVolume	+=	m_fBuyVolume[1];
	dBuyVolume	+=	m_fBuyVolume[2];
	dBuyVolume	+=	m_fBuyVolume[3];
	double	dSellVolume	= m_fSellVolume[0];
	dSellVolume	+=	m_fSellVolume[1];
	dSellVolume	+=	m_fSellVolume[2];
	dSellVolume	+=	m_fSellVolume[3];
	
	double	dRatio	=	0;
	if( dBuyVolume + dSellVolume > 1e-4 )
		dRatio	=	200*dBuyVolume/(dBuyVolume+dSellVolume)-100;
	double	dDiff		=	dBuyVolume - dSellVolume;
	if( pdRatio )
		*pdRatio	=	dRatio;
	if( pdDiff )
		*pdDiff		=	dDiff;
	return TRUE;
}

BOOL CStockInfo::GetMarketValue( double * pValue )
{
	if( CStock::typeshA != m_type && CStock::typeszA != m_type
		&& CStock::typeshB != m_type && CStock::typeszB != m_type )
		return FALSE;

	if( m_fClose > 1e-4 && m_fShare_count_total > 1e-4 )
	{
		if( pValue )
			*pValue	=	m_fClose * m_fShare_count_total;
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetMarketValueA( double * pValue )
{
	if( m_fClose > 1e-4 && m_fShare_count_a > 1e-4
		&& (CStock::typeshA == m_type || CStock::typeszA == m_type) )
	{
		if( pValue )
			*pValue	=	m_fClose * m_fShare_count_a;
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetMarketValueB( double * pValue )
{
	if( m_fClose > 1e-4 && m_fShare_count_b > 1e-4
		&& (CStock::typeshB == m_type || CStock::typeszB == m_type) )
	{
		if( pValue )
			*pValue	=	m_fClose * m_fShare_count_b;
		return TRUE;
	}
	return FALSE;
}

BOOL CStockInfo::GetXiapu( double * pValue )
{
	if( fabs(STKLIB_DATA_INVALID - m_fYield_average) > 1e-4
		&& fabs(STKLIB_DATA_INVALID - m_fYield_stddev) > 1e-4 && fabs(m_fYield_stddev) > 1e-4 )
	{
		if( pValue )
			*pValue	=	100. * (m_fYield_average-3) / m_fYield_stddev;
		//                                       ^^^^ 市场无风险利率3%
		return TRUE;
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//	class	CStock

double CStock::GetReportFactor( int nReportType )
{
	double	factor	=	1;
	if( CStock::reportQuarter == nReportType )
		factor	=	4;
	else if( CStock::reportMid == nReportType )
		factor	=	2;

⌨️ 快捷键说明

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