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

📄 techenergy.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
}

/***
	A = 当天收盘价 - 当天开盘价
	B = 当天最高价 - 当天最低价
	C = A÷B×V(成交量)
	WVAD = 累计n天的C值
*/
BOOL CWVAD::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
	STT_ASSERT_CALCULATE1( m_pKData, nIndex );

	if( m_nDays > nIndex+1 )
		return FALSE;

	if( LoadFromCache( nIndex, pValue ) )
		return TRUE;

	int	nCount	=	0;
	double	dResult = 0;
	for( int k=nIndex; k>=0; k-- )
	{
		KDATA	kd	=	m_pKData->ElementAt(k);
		if( kd.m_fHigh > kd.m_fLow )
			dResult	+=	(((double)kd.m_fClose) - kd.m_fOpen)*kd.m_fVolume/(((double)kd.m_fHigh)-kd.m_fLow);

		nCount	++;
		if( nCount == m_nDays )
		{
			if( pValue )	*pValue	=	dResult;
			StoreToCache( nIndex, pValue );
			return TRUE;
		}
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//	CEMV
CEMV::CEMV( )
{
	SetDefaultParameters( );
}

CEMV::CEMV( CKData * pKData )
	: CTechnique( pKData )
{
	SetDefaultParameters( );
}

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

void CEMV::SetDefaultParameters( )
{
	m_nDays		=	14;
	m_nMADays	=	9;
	m_itsGoldenFork	=	ITS_BUY;
	m_itsGoldenFork	=	ITS_SELL;
}

void CEMV::AttachParameters( CEMV & src )
{
	m_nDays		=	src.m_nDays;
	m_nMADays	=	src.m_nMADays;
	m_itsGoldenFork	=	src.m_itsGoldenFork;
	m_itsDeadFork	=	src.m_itsDeadFork;
}

BOOL CEMV::IsValidParameters( )
{
	return ( VALID_DAYS(m_nDays) && VALID_DAYS(m_nMADays)
		&& VALID_ITS(m_itsGoldenFork) && VALID_ITS(m_itsDeadFork) );
}

void CEMV::Clear( )
{
	CTechnique::Clear( );
}

int CEMV::GetSignal( int nIndex, UINT * pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;

	int	nMaxDays	=	m_nDays+m_nMADays;
	double	dLiminalLow = 0, dLiminalHigh = 0;
	if( !IntensityPrepare( nIndex, pnCode, nMaxDays, ITS_GETMINMAXDAYRANGE, &dLiminalLow, &dLiminalHigh, 0.5, 0.5 ) )
		return ITS_NOTHING;

	double	dEMV;
	if( !Calculate( &dEMV, nIndex, FALSE ) )
		return ITS_NOTHING;

	int	nSignal	=	GetForkSignal( nIndex, m_itsGoldenFork, m_itsDeadFork, pnCode );
	if( dEMV < dLiminalLow && nSignal == m_itsGoldenFork )
	{	// 低位金叉
		if( pnCode )	*pnCode	=	ITSC_GOLDENFORK;
		return m_itsGoldenFork;
	}
	if( dEMV > dLiminalHigh && nSignal == m_itsDeadFork )
	{	// 高位死叉
		if( pnCode )	*pnCode	=	ITSC_DEADFORK;
		return m_itsDeadFork;
	}
	return	ITS_NOTHING;
/*  FROM BOOK */
/*	if( pnCode )	*pnCode	=	ITSC_NOTHING;

	double dValue;
	if( !Calculate( &dValue, nIndex, FALSE ) )
		return ITS_NOTHING;

	if( dValue > 0 )
	{
		if( pnCode )	*pnCode	=	ITSC_LONG;
		return m_itsLong;
	}
	if( dValue < 0 )
	{
		if( pnCode )	*pnCode	=	ITSC_SHORT;
		return m_itsShort;
	}
	
	return	ITS_NOTHING;
*/
}

BOOL CEMV::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
	return AfxGetMinMaxInfo2( nStart, nEnd, pdMin, pdMax, this );
}

/***
	A = (今天最高 + 今天最低)÷ 2
	B = (前一天最高 + 前一天最低)÷2
	C = 今天最高 - 今天最低
	EM = (A-B)×C÷今天成交额
	EMV = 累计n天的EM值
*/
BOOL CEMV::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
	STT_ASSERT_CALCULATE1( m_pKData, nIndex );

	if( m_nDays > nIndex )
		return FALSE;

	if( LoadFromCache( nIndex, pValue ) )
		return TRUE;

	double	dEMV = 0;
	int	nCount	=	0;
	for( int k=nIndex; k>=1; k-- )
	{
		KDATA	kd		=	m_pKData->ElementAt(k);
		KDATA	kdLast	=	m_pKData->ElementAt(k-1);
		if( 0 == kd.m_fVolume )
			return FALSE;
		double	dDIF = 0;
		dDIF	=	(kd.m_fHigh+kd.m_fLow)/2 - (((double)kdLast.m_fHigh)+kdLast.m_fLow)/2;
		dEMV	+=	dDIF * (kd.m_fHigh-kd.m_fLow) / kd.m_fVolume;

		nCount	++;
		if( nCount == m_nDays )
		{
			if( pValue )
				*pValue	=	dEMV / m_nDays;
			StoreToCache( nIndex, pValue );
			return TRUE;
		}
	}

	return FALSE;
}

BOOL CEMV::Calculate( double * pValue, double * pMA, int nIndex, BOOL bUseLast )
{
	return CalculateMA( pValue, pMA, nIndex, bUseLast, m_nMADays );
}

//////////////////////////////////////////////////////////////////////
//	CVRSI
CVRSI::CVRSI( )
{
	SetDefaultParameters( );
}

CVRSI::CVRSI( CKData * pKData )
	: CTechnique( pKData )
{
	SetDefaultParameters( );
}

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

void CVRSI::SetDefaultParameters( )
{
	m_nDays		=	10;
	m_itsDeviateOnBottom	=	ITS_BUYINTENSE;
	m_itsDeviateOnTop		=	ITS_SELLINTENSE;
	m_itsSold				=	ITS_BUY;
	m_itsBought				=	ITS_SELL;
}

void CVRSI::AttachParameters( CVRSI & src )
{
	m_nDays		=	src.m_nDays;
	m_itsDeviateOnBottom	=	src.m_itsDeviateOnBottom;
	m_itsDeviateOnTop		=	src.m_itsDeviateOnTop;
	m_itsSold				=	src.m_itsSold;
	m_itsBought				=	src.m_itsBought;
}

BOOL CVRSI::IsValidParameters( )
{
	return ( VALID_DAYS( m_nDays )
		&& VALID_ITS(m_itsDeviateOnBottom) && VALID_ITS(m_itsDeviateOnTop)
		&& VALID_ITS(m_itsSold) && VALID_ITS(m_itsBought) );
}

void CVRSI::Clear( )
{
	CTechnique::Clear( );
}

int CVRSI::GetSignal( int nIndex, UINT * pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;

	int	nMaxDays	=	m_nDays;
	double	dLiminalLow = 0, dLiminalHigh = 0;
	if( !IntensityPrepare( nIndex, pnCode, nMaxDays, ITS_GETMINMAXDAYRANGE, &dLiminalLow, &dLiminalHigh ) )
		return ITS_NOTHING;

	double	dNow;
	if( !Calculate( &dNow, nIndex, FALSE ) )
		return ITS_NOTHING;

	if( IsDeviateOnBottom( nIndex, m_pdCache1, m_pdCache2 ) )
	{	// 底背离
		if( pnCode )	*pnCode	=	ITSC_DEVIATEONBOTTOM;
		return m_itsDeviateOnBottom;
	}
	if( IsDeviateOnTop( nIndex, m_pdCache1, m_pdCache2 ) )
	{	// 顶背离
		if( pnCode )	*pnCode	=	ITSC_DEVIATEONTOP;
		return m_itsDeviateOnTop;
	}
	if( dNow < dLiminalLow )
	{	// 超卖
		if( pnCode )	*pnCode	=	ITSC_OVERSOLD;
		return m_itsSold;
	}
	if( dNow > dLiminalHigh )
	{	// 超买
		if( pnCode )	*pnCode	=	ITSC_OVERBOUGHT;
		return m_itsBought;
	}

	return	ITS_NOTHING;
}

BOOL CVRSI::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
	if( pdMin )	*pdMin	=	0;
	if( pdMax )	*pdMax	=	100;
	return TRUE;
}

/***
	VP = N日内成交量增加日的平均成交量
	VQ = N日内成交量减少日的平均成交量
	VRSI = 100 * VP / (VP+VQ)
*/
BOOL CVRSI::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
	STT_ASSERT_CALCULATE1( m_pKData, nIndex );

	if( m_nDays > nIndex )
		return FALSE;

	if( LoadFromCache( nIndex, pValue ) )
		return TRUE;

	double	dVP = 0, dVQ = 0, dResult = 0;
	int	nCount = 0, p = 0, q = 0;
	for( int k=nIndex; k>=1; k-- )
	{
		if( m_pKData->MaindataAt(k) >= m_pKData->MaindataAt(k-1) )
		{
			dVP	+=	m_pKData->ElementAt(k).m_fVolume;
			p	++;
		}
		else
		{
			dVQ	+=	m_pKData->ElementAt(k).m_fVolume;
			q	++;
		}

		nCount	++;
		if( nCount == m_nDays )
		{
			if( p > 0 )	dVP	=	dVP / p;
			if( q > 0 )	dVQ	=	dVQ / q;
			if( dVQ < 1e-4 )
				dResult	=	100;
			else
				dResult	=	100 - 100. / (1 + dVP / dVQ);
			if( pValue )	*pValue	=	dResult;
			StoreToCache( nIndex, pValue );
			return TRUE;
		}
	}

	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//	CNVRSI
CNVRSI::CNVRSI( )
{
	SetDefaultParameters( );
}

CNVRSI::CNVRSI( CKData * pKData )
	: CVRSI( pKData )
{
	SetDefaultParameters( );
}

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

/***
	VP = N日内成交量增加日的总成交量
	VQ = N日内成交量减少日的总成交量
	VRSI = 100 * VP / (VP+VQ)
*/
BOOL CNVRSI::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
	STT_ASSERT_CALCULATE1( m_pKData, nIndex );

	if( m_nDays > nIndex )
		return FALSE;

	if( LoadFromCache( nIndex, pValue ) )
		return TRUE;

	double	dUV = 0, dV = 0, dResult = 0;
	int	nCount	=	0;
	for( int k=nIndex; k>=1; k-- )
	{
		if( m_pKData->ElementAt(k).m_fVolume > m_pKData->ElementAt(k-1).m_fVolume )
			dUV	+=	m_pKData->ElementAt(k).m_fVolume;
		dV	+=	m_pKData->ElementAt(k).m_fVolume;

		nCount	++;
		if( nCount == m_nDays )
		{
			if( dV < 1e-4 )
				dResult	=	50;
			else
				dResult	=	100. * dUV / dV;
			if( pValue )	*pValue	=	dResult;
			StoreToCache( nIndex, pValue );
			return TRUE;
		}
	}

	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//	CAD
CAD::CAD( )
{
	SetDefaultParameters( );
}

CAD::CAD( CKData * pKData )
	: CTechnique( pKData )
{
	SetDefaultParameters( );
}

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

void CAD::SetDefaultParameters( )
{
	m_nDays		=	8;
}

void CAD::AttachParameters( CAD & src )
{
	m_nDays		=	src.m_nDays;
}

BOOL CAD::IsValidParameters( )
{
	return ( VALID_DAYS(m_nDays) );
}

void CAD::Clear( )
{
	CTechnique::Clear( );
}

int CAD::GetSignal( int nIndex, UINT * pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;
	// 无买卖信号
	return	ITS_NOTHING;
}

BOOL CAD::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
	return AfxGetMinMaxInfo1( nStart, nEnd, pdMin, pdMax, this );
}

/***
	A = 当日最高价 - 当日最低价
	B = 2 * 当日收盘价 - 当日最高价 - 当日最低价
	C = 当日成交量 * B / A
	AD = N日内C的总和
*/
BOOL CAD::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
	STT_ASSERT_CALCULATE1( m_pKData, nIndex );

	if( m_nDays > nIndex+1 )
		return FALSE;

	if( LoadFromCache( nIndex, pValue ) )
		return TRUE;

	double	dAD = 0;
	int	nCount	=	0;
	for( int k=nIndex; k>=0; k-- )
	{
		KDATA	kd		=	m_pKData->ElementAt(k);

		if( kd.m_fHigh-kd.m_fLow > 1e-4 )
			dAD	+=	kd.m_fVolume * (((double)kd.m_fClose)-kd.m_fLow-kd.m_fHigh+kd.m_fClose)/(((double)kd.m_fHigh)-kd.m_fLow);

		nCount	++;
		if( nCount == m_nDays )
		{
			if( pValue )	*pValue	=	dAD;
			StoreToCache( nIndex, pValue );
			return TRUE;
		}
	}

	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//	CCI
CCI::CCI( )
{
	SetDefaultParameters( );
}

CCI::CCI( CKData * pKData )
	: CTechnique( pKData )
{
	SetDefaultParameters( );
}

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

void CCI::SetDefaultParameters( )
{
}

void CCI::AttachParameters( CCI & src )
{
}

BOOL CCI::IsValidParameters( )
{
	return TRUE;
}

void CCI::Clear( )
{
	CTechnique::Clear( );
}

int CCI::GetSignal( int nIndex, UINT * pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;
	// 无买卖信号
	return	ITS_NOTHING;
}

BOOL CCI::GetMinMaxInfo(int nStart, int nEnd, double *pdMin, double *pdMax )
{
	return AfxGetMinMaxInfo1( nStart, nEnd, pdMin, pdMax, this );
}

/***
	CI = (当日收盘价 - 当日开盘价)/(当日最高价 - 当日最低价)
*/
BOOL CCI::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
	STT_ASSERT_CALCULATE1( m_pKData, nIndex );
	
	if( LoadFromCache( nIndex, pValue ) )
		return TRUE;

	KDATA	kd		=	m_pKData->ElementAt(nIndex);
	if( kd.m_fHigh-kd.m_fLow < 1e-4)
		return FALSE;
	double	dCI	=	(((double)kd.m_fClose)-kd.m_fOpen)/(((double)kd.m_fHigh)-kd.m_fLow);
/*
	if( nIndex > 0 )
	{
		KDATA	kdLast	=	m_pKData->ElementAt(nIndex-1);
		if( max(kd.m_fOpen,kd.m_fClose) > kdLast.m_fClose*1.08 && kd.m_fHigh>kdLast.m_fClose)
			dCI	+=	(2.*kd.m_fClose-kd.m_fLow-kdLast.m_fClose)/(((double)kd.m_fHigh)-kdLast.m_fClose);
		if( kd.m_fOpen < kdLast.m_fClose*0.92 )
			dCI	+=	(2.*kd.m_fLow-kd.m_fHigh-kdLast.m_fClose)/(((double)kd.m_fClose)-kd.m_fLow);
	}
*/
	dCI	=	kd.m_fVolume * dCI;
	if( pValue )
		*pValue	=	dCI;
	StoreToCache( nIndex, pValue );
	return TRUE;
}

⌨️ 快捷键说明

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