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

📄 technique.cpp

📁 股软 通达信行情接收接口, 包括美元汇率
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	if( dLast1 <= dLast2 && dNow1 > dNow2
		&& dNow1 >= dLast1 && dNow2 >= dLast2 )
	{
		if( pnCode )	*pnCode	=	ITSC_GOLDENFORK;
		return itsGoldenFork;
	}
	if( dLast1 >= dLast2 && dNow1 < dNow2
		&& dNow1 <= dLast1 && dNow2 <= dLast2 )
	{
		if( pnCode )	*pnCode	=	ITSC_DEADFORK;
		return itsDeadFork;
	}

	return ITS_NOTHING;
}

// 得到金叉或者死叉信号
int CTechnique::GetForkSignal(int nIndex, double * pdValue1, double * pdValue2,
							  UINT itsGoldenFork, UINT itsDeadFork, UINT *pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;

	if( IsGoldenFork( nIndex, pdValue1, pdValue2 ) )
	{
		if( pnCode )	*pnCode	=	ITSC_GOLDENFORK;
		return itsGoldenFork;
	}
	if( IsDeadFork( nIndex, pdValue1, pdValue2 ) )
	{
		if( pnCode )	*pnCode	=	ITSC_DEADFORK;
		return itsDeadFork;
	}
	return ITS_NOTHING;
}

// 得到趋势信号
int CTechnique::GetTrendIntensity(int nIndex, CSPDWordArray & adwDays,
								 UINT itsLong, UINT itsShort, UINT * pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;
	if( nIndex <= 0 )
		return ITS_NOTHING;

	int	nRet	=	ITS_NOTHING;
	for( int k=1; k<adwDays.GetSize(); k++ )
	{
		double	dMALast1, dMALast2, dMANow1, dMANow2;
		if( !Calculate( &dMALast1, nIndex-1, min(adwDays[k-1],adwDays[k]), FALSE )
			|| !Calculate( &dMALast2, nIndex-1, max(adwDays[k-1],adwDays[k]), FALSE )
			|| !Calculate( &dMANow1, nIndex, min(adwDays[k-1],adwDays[k]), FALSE )
			|| !Calculate( &dMANow2, nIndex, max(adwDays[k-1],adwDays[k]), FALSE ) )
			return ITS_NOTHING;
		
		if( dMANow1 >= dMALast1 && dMANow2 >= dMALast2
			&& dMANow1 > dMANow2 && (dMANow1-dMANow2)>=(dMALast1-dMALast2)
			&& (ITS_ISBUY(nRet) || 1==k) )
		{
			if( pnCode )	*pnCode	=	ITSC_LONG;
			nRet	=	itsLong;
		}
		else if( dMANow1 <= dMALast1 && dMANow2 <= dMALast2
			&& dMANow1 < dMANow2 && (dMANow1-dMANow2)<=(dMALast1-dMALast2)
			&& (ITS_ISSELL(nRet) || 1==k) )
		{
			if( pnCode )	*pnCode	=	ITSC_SHORT;
			nRet	=	itsShort;
		}
		else
		{
			if( pnCode )	*pnCode	=	ITSC_NOTHING;
			return ITS_NOTHING;
		}
	}
	return nRet;
}

// 得到趋势信号
int CTechnique::GetTrendIntensity1( int nIndex, UINT itsLong, UINT itsShort, UINT *pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;
	if( nIndex <= 0 )
		return ITS_NOTHING;

	double	dLast = 0, dNow = 0;
	if( !Calculate( &dLast, nIndex-1, FALSE )
		|| !Calculate( &dNow, nIndex, FALSE ) )
		return ITS_NOTHING;

	if( dNow > dLast )
	{
		if( pnCode )	*pnCode	=	ITSC_LONG;
		return itsLong;
	}
	if( dNow < dLast )
	{
		if( pnCode )	*pnCode	=	ITSC_SHORT;
		return itsShort;
	}
	return ITS_NOTHING;
}

// 得到趋势信号
int CTechnique::GetTrendIntensity2( int nIndex, UINT itsLong, UINT itsShort, UINT *pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;
	if( nIndex <= 0 )
		return ITS_NOTHING;

	double	dLast1 = 0, dLast2 = 0, dNow1 = 0, dNow2 = 0;
	if( Calculate( &dLast1, &dLast2, nIndex-1, FALSE )
		&& Calculate( &dNow1, &dNow2, nIndex, FALSE ) )
	{
		if( dNow1 >= dLast1 && dNow2 >= dLast2
			&& dNow1 > dNow2 && (dNow1-dNow2)>=(dLast1-dLast2) )
		{
			if( pnCode )	*pnCode	=	ITSC_LONG;
			return itsLong;
		}
		if( dNow1 <= dLast1 && dNow2 <= dLast2
			&& dNow1 < dNow2 && (dNow1-dNow2)<=(dLast1-dLast2) )
		{
			if( pnCode )	*pnCode	=	ITSC_SHORT;
			return itsShort;
		}
	}
	return ITS_NOTHING;
}

// 得到趋势信号
int CTechnique::GetTrendIntensity(int nIndex, double * pdValue1, double * pdValue2,
							  UINT itsLong, UINT itsShort, UINT *pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;

	SP_ASSERT( NULL != pdValue1 && NULL != pdValue2 );
	if( NULL == pdValue1 || NULL == pdValue2 )
		return FALSE;
	if( m_nLength <= 0 || m_nIndexStart < 0
		|| nIndex < m_nIndexStart || nIndex-m_nIndexStart>=m_nLength
		|| nIndex-m_nIndexStart < 1 )
		return FALSE;

	int	k	=	nIndex-m_nIndexStart;
	if( pdValue1[k] >= pdValue1[k-1] && pdValue2[k] >= pdValue2[k-1]
		&& pdValue1[k] > pdValue2[k] && (pdValue1[k]-pdValue2[k])>=(pdValue1[k-1]-pdValue2[k-1]) )
	{
		if( pnCode )	*pnCode	=	ITSC_LONG;
		return itsLong;
	}
	if( pdValue1[k] <= pdValue1[k-1] && pdValue2[k] <= pdValue2[k-1]
		&& pdValue1[k] < pdValue2[k] && (pdValue1[k]-pdValue2[k])<=(pdValue1[k-1]-pdValue2[k-1]) )
	{
		if( pnCode )	*pnCode	=	ITSC_SHORT;
		return itsShort;
	}
	return ITS_NOTHING;
}

void CTechnique::SetDefaultParameters( )
{
	SP_ASSERT( FALSE );
}

void CTechnique::AttachParameters( CTechnique & src )
{
	SP_ASSERT( FALSE );
}

BOOL CTechnique::IsValidParameters( )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

// 创建新的技术指标对象
CTechnique * CTechnique::CreateTechnique( UINT nTech, CKData * pKData )
{
	CTechnique	*	pTech	=	NULL;
	switch( nTech )
	{
		case STT_MA:		pTech	=	new CMA( pKData );		break;
		case STT_BBI:		pTech	=	new CBBI( pKData );		break;
		case STT_BOLL:		pTech	=	new CBOLL( pKData );	break;
		case STT_PV:		pTech	=	new CPV( pKData );		break;
		case STT_SAR:		pTech	=	new CSAR( pKData );		break;
		case STT_DJ:		pTech	=	new CDJ( pKData );		break;
		case STT_CW:		pTech	=	new CCW( pKData );		break;
		
		case STT_MACD:		pTech	=	new CMACD( pKData );	break;
		case STT_MIKE:		pTech	=	new CMIKE( pKData );	break;
		case STT_PSY:		pTech	=	new CPSY( pKData );		break;

		case STT_VOLUME:	pTech	=	new CVOLUME( pKData );	break;
		case STT_NVI:		pTech	=	new CNVI( pKData );		break;
		case STT_PVI:		pTech	=	new CPVI( pKData );		break;
		case STT_VR:		pTech	=	new CVR( pKData );		break;
		case STT_VROC:		pTech	=	new CVROC( pKData );	break;
		case STT_OBV:		pTech	=	new COBV( pKData );		break;
		case STT_MOBV:		pTech	=	new CMOBV( pKData );	break;
		case STT_MFI:		pTech	=	new CMFI( pKData );		break;
		case STT_VMACD:		pTech	=	new CVMACD( pKData );	break;
		case STT_WVAD:		pTech	=	new CWVAD( pKData );	break;
		case STT_EMV:		pTech	=	new CEMV( pKData );		break;
		case STT_VRSI:		pTech	=	new CVRSI( pKData );	break;
		case STT_NVRSI:		pTech	=	new CNVRSI( pKData );	break;
		case STT_AD:		pTech	=	new CAD( pKData );		break;
		case STT_CI:		pTech	=	new CCI( pKData );		break;

		case STT_KDJ:		pTech	=	new CKDJ( pKData );		break;
		case STT_R:			pTech	=	new CR( pKData );		break;
		case STT_RSI:		pTech	=	new CRSI( pKData );		break;
		case STT_BIAS:		pTech	=	new CBIAS( pKData );	break;
		case STT_MTM:		pTech	=	new CMTM( pKData );		break;
		case STT_DMI:		pTech	=	new CDMI( pKData );		break;
		case STT_ROC:		pTech	=	new CROC( pKData );		break;
		case STT_CCI:		pTech	=	new CCCI( pKData );		break;
		case STT_CV:		pTech	=	new CCV( pKData );		break;
		case STT_ARBR:		pTech	=	new CARBR( pKData );	break;
		case STT_CR:		pTech	=	new CCR( pKData );		break;
		case STT_OSC:		pTech	=	new COSC( pKData );		break;
		case STT_UOS:		pTech	=	new CUOS( pKData );		break;
		case STT_MAOSC:		pTech	=	new CMAOSC( pKData );	break;
		case STT_36BIAS:	pTech	=	new C36BIAS( pKData );	break;
		case STT_DPO:		pTech	=	new CDPO( pKData );		break;
		case STT_KST:		pTech	=	new CKST( pKData );		break;

		case STT_REI:		pTech	=	new CREI( pKData );		break;
		case STT_DMKI:		pTech	=	new CDMKI( pKData );	break;
		case STT_PCNT:		pTech	=	new CPCNT( pKData );	break;
		case STT_HLC:		pTech	=	new CHLC( pKData );		break;
		case STT_CDP:		pTech	=	new CCDP( pKData );		break;
		case STT_ASI:		pTech	=	new CASI( pKData );		break;
		case STT_ATR:		pTech	=	new CATR( pKData );		break;

		case STT_CYO:		pTech	=	new CCYO( pKData );		break;
		case STT_DCYO:		pTech	=	new CDCYO( pKData );	break;
		case STT_HSL:		pTech	=	new CHSL( pKData );		break;
		case STT_DPER:		pTech	=	new CDPER( pKData );	break;

		default:
			SP_ASSERT( FALSE );
	}
	return pTech;
}

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

// 得到趋势信号
int CTechnique::GetIntensity( int nIndex, UINT * pnCode, BOOL bTraceBack )
{
	UINT	nCode	=	ITSC_NOTHING;
	int	nSignal	=	GetSignal( nIndex, &nCode );
	if( ITS_NOTHING != nSignal )
	{
		m_nLastIntensity		=	nSignal;
		m_nLastIntensityCode	=	nCode;
		if( pnCode )	*pnCode	=	nCode;
		return nSignal;
	}

	if( m_nLastIntensity > 1 )
		m_nLastIntensity	--;
	if( m_nLastIntensity < -1  )
		m_nLastIntensity	++;

	if( bTraceBack && ITS_NOTHING == m_nLastIntensity )
		m_nLastIntensity		=	GetIntensityTraceback( nIndex, &m_nLastIntensityCode );

	if( pnCode )	*pnCode	=	m_nLastIntensityCode;
	return m_nLastIntensity;
}

int CTechnique::GetIntensityTraceback( int nIndex, UINT * pnCode )
{
	if( pnCode )	*pnCode	=	ITSC_NOTHING;

	int		nIntensity	=	ITS_NOTHING;
	UINT	nCode		=	ITSC_NOTHING;
	int k;
	for( k=nIndex; k>=0; k -- )
	{
		nIntensity	=	GetSignal(k,&nCode);
		if( ITS_NOTHING != nIntensity )
			break;
	}
	if( k < 0 )
		return ITS_NOTHING;
	for( k=k+1; k<=nIndex; k++ )
	{
		if( nIntensity > 1 )
			nIntensity	--;
		else if( nIntensity < -1  )
			nIntensity	++;
		else
			break;
	}
	if( pnCode )	*pnCode	=	nCode;
	return nIntensity;
}

BOOL CTechnique::GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

BOOL CTechnique::Calculate( double * pValue, int nIndex, int nDays, BOOL bUseLast )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

BOOL CTechnique::Calculate( double * pValue, int nIndex, BOOL bUseLast )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

BOOL CTechnique::Calculate( double * pValue1, double * pValue2, int nIndex, BOOL bUseLast )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

BOOL CTechnique::Calculate( double * pValue1, double * pValue2, double * pValue3, int nIndex, BOOL bUseLast )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

BOOL CTechnique::Calculate( double * pValue1, double * pValue2, double * pValue3, double *pValue4, int nIndex, BOOL bUseLast )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

BOOL CTechnique::Calculate( double * pValue1, double * pValue2, double * pValue3, double *pValue4, double *pValue5, int nIndex, BOOL bUseLast )
{
	SP_ASSERT( FALSE );
	return FALSE;
}

// 计算指标值和均值
BOOL CTechnique::CalculateMA( double * pValue, double * pMA, int nIndex, BOOL bUseLast, int nMADays )
{
	STT_ASSERT_CALCULATE1( m_pKData, nIndex );

	if( nMADays > nIndex+1 )
		return FALSE;

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

	double	dValue = 0, dMA = 0;
	int	nCount	=	0;
	for( int k=nIndex; k>=0; k-- )
	{
		double	dTemp = 0;
		if( Calculate( &dTemp, k, FALSE ) )
		{
			if( nIndex == k )
				dValue	=	dTemp;
			dMA	+=	dTemp;

			nCount	++;
			if( nCount == nMADays )
			{
				dMA	=	dMA / nMADays;
				if( pValue )	*pValue	=	dValue;
				if( pMA )		*pMA	=	dMA;
				StoreToCache( nIndex, pValue, pMA );
				return TRUE;
			}
		}
	}
	return FALSE;
}

⌨️ 快捷键说明

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