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

📄 technique.h

📁 提供股票行情、股票提示、实数资料、异动个股、专家分析及预测、机构荐股
💻 H
📖 第 1 页 / 共 4 页
字号:
/*
	Cross Platform Core Code.

	Copyright(R) 2001-2002 Balang Software.
	All rights reserved.

	Using:
		class	CTechnique
*/

#if	!defined( __STKLIB_TECHNIQUE_H__ )
#define	__STKLIB_TECHNIQUE_H__

/* The Folowing Is Stock Technique Analysis Identify Number */
/* 技术指标唯一编号 */
#define	STT_MIN			1
//	K线属性类
#define	STT_KLINE_MIN	1
#define	STT_MA			1		//	移动平均线MA
#define	STT_BBI			2		//	多空指标BBI
#define	STT_BOLL		3		//	布林带BOLL
#define	STT_PV			4		//	汇证均价线P/V
#define	STT_SAR			5		//	停损点转向指标SAR
#define	STT_DJ			6		//	叠加图DJ
#define	STT_CW			7		//	筹码分布图CW
#define	STT_KLINE_MAX	7

//	趋势类
#define	STT_TREND_MIN	8
#define	STT_MACD		8		//	指数平滑异同移动平均线MACD
#define	STT_MIKE		9		//	麦克指标MIKE
#define	STT_PSY			10		//	心理线PSY
#define	STT_TREND_MAX	10

//	能量类
#define	STT_ENERGY_MIN	11
#define	STT_VOLUME		11		//	成交量
#define	STT_NVI			12		//	负成交量指标NVI
#define	STT_PVI			13		//	正成交量指标PVI
#define	STT_VR			14		//	容量比率VR
#define	STT_VROC		15		//	成交量变动率指标VROC
#define	STT_OBV			16		//	能量线OBV
#define	STT_MOBV		17		//	主力进出MOBV
#define	STT_MFI			18		//	资金流动指数MFI
#define	STT_VMACD		19		//	量指数平滑异同移动平均线VMACD
#define	STT_WVAD		20		//	威廉变异离散量WVAD
#define	STT_EMV			21		//	简易波动指标EMV
#define	STT_VRSI		22		//	量相对强弱指标VRSI
#define	STT_NVRSI		23		//	新量相对强弱指标VRSI
#define	STT_AD			24		//	聚/散指标A/D
#define	STT_CI			25		//	累积指数CI
#define	STT_ENERGY_MAX	25

//	摆动类
#define	STT_SWING_MIN	26
#define	STT_KDJ			26		//	随机指标KDJ
#define	STT_R			27		//	威廉指标R
#define	STT_RSI			28		//	相对强弱指标
#define	STT_BIAS		29		//	乖离率BIAS
#define	STT_MTM			30		//	动量指标MTM
#define	STT_DMI			31		//	动向指标DMI
#define	STT_ROC			32		//	变动率指标ROC
#define	STT_CCI			33		//	顺势通道指标CCI
#define	STT_CV			34		//	佳庆指标CV
#define	STT_ARBR		35		//	人气意愿指标ARBR
#define	STT_CR			36		//	中间意愿指标CR
#define	STT_OSC			37		//	摆动量OSC
#define	STT_UOS			38		//	极摆动指标UOS
#define	STT_MAOSC		39		//	移动平均摆动量MAOSC
#define	STT_36BIAS		40		//	3减6日乖离3-6BIAS
#define	STT_DPO			41		//	去势价格摆动指数DPO
#define	STT_KST			42		//	确然指标KST
#define	STT_SWING_MAX	42

//	其他类
#define	STT_OTHER_MIN	43
#define	STT_REI			43		//	范围膨胀指数REI
#define	STT_DMKI		44		//	迪马克尔指标DMKI
#define	STT_PCNT		45		//	幅度比PCNT
#define	STT_HLC			46		//	幅度分析HLC
#define	STT_CDP			47		//	逆势操作指标CDP
#define	STT_ASI			48		//	累积摆动指标ASI
#define	STT_ATR			49		//	均幅指标ATR
#define	STT_OTHER_MAX	49

#define	STT_CLK_MIN		50
#define	STT_CYO			50		//	周期摆动量CYO
#define	STT_DCYO		51		//	去噪周期摆动量DCYO
#define	STT_HSL			52		//	相对换手率HSL
#define	STT_DPER		53		//	去势百分比指标DPER
#define	STT_CLK_MAX		53

#define	STT_MAX			53

#define	STT_USER_MIN	10000

#define	STT_INVALID		DWORD(-1)

// 指标类别
#define	STT_CLASS_MIN		1
#define	STT_CLASS_KLINE		1	// K线叠加类
#define	STT_CLASS_TREND		2	// 趋势类
#define	STT_CLASS_ENERGY	3	// 能量类
#define	STT_CLASS_SWING		4	// 摆动类
#define	STT_CLASS_OTHER		5	// 其它类
#define	STT_CLASS_CLK		6	// 策略为王类
#define	STT_CLASS_USER		7	// 外挂指标类
#define	STT_CLASS_MAX		7

// 买卖信号
#define	ITS_MIN				-15
#define	ITS_SELLINTENSE		-15	//	强烈卖出
#define	ITSG_SELLINTENSE	-13	//	门限
#define	ITS_SELL			-10	//	卖出
#define	ITSG_SELL			-8	//	门限
#define	ITS_SELLFEEBLE		-5	//	微弱卖出
#define	ITSG_SELLFEEBLE		-3	//	门限
#define	ITS_NOTHING			0	//	无
#define	ITSG_BUYFEEBLE		3	//	门限
#define	ITS_BUYFEEBLE		5	//	微弱买进
#define	ITSG_BUY			8	//	门限
#define	ITS_BUY				10	//	买进
#define	ITSG_BUYINTENSE		13	//	门限
#define	ITS_BUYINTENSE		15	//	强烈买进
#define	ITS_MAX				15

// 买卖信号理由
#define	ITSC_MIN				1
#define	ITSC_NOTHING			1	//	无
#define	ITSC_DEVIATEONBOTTOM	2	//	底背离
#define	ITSC_DEVIATEONTOP		3	//	顶背离
#define	ITSC_GOLDENFORK			4	//	金叉
#define	ITSC_DEADFORK			5	//	死叉
#define	ITSC_LONG				6	//	多头
#define	ITSC_SHORT				7	//	空头
#define	ITSC_OVERBOUGHT			8	//	超买
#define	ITSC_OVERSOLD			9	//	超卖
#define	ITSC_SUPPORT			10	//	支撑位
#define	ITSC_RESISTANCE			11	//	阻力位
#define	ITSC_MAX				11

#define	ITS_ISSELL(x)			(x<0)
#define	ITS_ISBUY(x)			(x>0)
#define	ITS_ISSELLORNOTHING(x)	(x<=0)
#define	ITS_ISBUYORNOTHING(x)	(x>=0)

#define	ITS_GETMINMAXDAYRANGE	120
#define	ITS_DAYS_DEVIATE		115


/***
	一些宏定义,主要是技术指标计算中常用的一些代码
*/
#define	STT_ASSERT_GETMINMAXINFO( m_pKData, nStart, nEnd )	\
	SP_ASSERT( m_pKData && nStart >= 0 && nStart < m_pKData->GetSize() && nEnd >= 0 && nEnd < m_pKData->GetSize() );	\
	if( nStart < 0 || nStart >=m_pKData->GetSize() || nEnd < 0 || nEnd >=m_pKData->GetSize() )							\
		return FALSE;

#define	STT_ASSERT_CALCULATE( m_pKData, nIndex, nDays )		\
	SP_ASSERT( m_pKData && nIndex >= 0 && nIndex < m_pKData->GetSize() && nDays > 0 );	\
	if( !m_pKData || nIndex < 0 || nIndex >=m_pKData->GetSize() || nDays <= 0 )			\
		return FALSE;																	\
	if( !IsValidParameters( ) )															\
		SetDefaultParameters( );

#define	STT_ASSERT_CALCULATE1( m_pKData, nIndex )			\
	SP_ASSERT( m_pKData && nIndex >= 0 && nIndex < m_pKData->GetSize() );	\
	if( !m_pKData || nIndex < 0 || nIndex >=m_pKData->GetSize() )			\
		return FALSE;														\
	if( !IsValidParameters( ) )												\
		SetDefaultParameters( );

#define	VALID_DAYS( x )		(x>=1&&x<=1024)
#define	STT_VALID_DAYSARRAY( a )						\
	if( a.GetSize() <= 0 )								\
		return FALSE;									\
	for( int k=0; k<a.GetSize(); k++ )					\
		if( a[k] < 1 || a[k] > 1024 )					\
			return FALSE;
#define	VALID_ITS( x )		(x>=ITS_MIN&&x<=ITS_MAX)


/***
	一些反复使用的代码,用函数代替,得到技术指标在指定范围内的最大最小值
*/
class	CTechnique;
BOOL AfxGetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech, CSPDWordArray & adwDays );	// 技术指标有不同日期作为参数
BOOL AfxGetMinMaxInfo1( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech );	// 技术指标有1个最终值
BOOL AfxGetMinMaxInfo2( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech );	// 技术指标有2个最终值
BOOL AfxGetMinMaxInfo3( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech );	// 技术指标有3个最终值
BOOL AfxGetMinMaxInfo4( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech );	// 技术指标有4个最终值
BOOL AfxGetMinMaxInfo5( int nStart, int nEnd, double *pdMin, double *pdMax, CTechnique * pTech );	// 技术指标有5个最终值
DWORD	AfxGetMaxDays( CSPDWordArray & adw );	// 数组adw的最大值

/**
	技术指标基类
*/
class STKLIB_API CTechnique
{
public:
	// Constructors
	CTechnique( );
	CTechnique( CKData * pKData );
	virtual ~CTechnique();

	void SetKData( CKData * pKData );	//	设定K线数据
	CKData * GetKData( );
	virtual	void	Clear( );			//	清除
	virtual	void	ClearLastIntensity( );	//	清除上次买卖信号
	virtual	BOOL	PrepareCache( int nStart, int nEnd, BOOL bForceRecalculate );	//	计算好数据,放入缓冲区

protected:
	BOOL	LoadFromCache( int nIndex, double * pValue1,
				double * pValue2 = NULL, double * pValue3 = NULL, double * pValue4 = NULL, double * pValue5 = NULL );	// 从缓冲区读入结果
	BOOL	StoreToCache( int nIndex, double * pValue1,
				double * pValue2 = NULL, double * pValue3 = NULL, double * pValue4 = NULL, double * pValue5 = NULL );	// 将结果保存至缓冲区

	// Intensity Utility
	BOOL	IntensityPrepare( int nIndex, UINT * pnCode, int nMaxDays, int nMinMaxDays, double *pdLiminalLow, double *pdLiminalHigh, double dGateLow = 0.3, double dGateHigh = 0.7 );		// 准备数据,得到较大值和较小值
	BOOL	IntensityPreparePrice( int nIndex, UINT * pnCode, int nMaxDays, int nMinMaxDays, double *pdLiminalLow, double *pdLiminalHigh, double dGateLow = 0.3, double dGateHigh = 0.7 );	// 准备数据,得到价格较大值和较小值
	BOOL	IsNewValue( int nIndex, BOOL bTopOrBottom, int nDays, double * pdValue1, double * pdValue2 );	// 是否创新高或者创新低
	BOOL	IsDeviateOnBottom( int nIndex, double * pdValue1, double * pdValue2 );	// 是否底背离
	BOOL	IsDeviateOnTop( int nIndex, double * pdValue1, double * pdValue2 );		// 是否顶背离
	BOOL	IsGoldenFork( int nIndex, double * pdValue1, double * pdValue2 );		// 是否金叉
	BOOL	IsDeadFork( int nIndex, double * pdValue1, double * pdValue2 );			// 是否死叉
	int		GetForkSignal( int nIndex, CSPDWordArray & adwDays, UINT itsGoldenFork, UINT itsDeadFork,  UINT * pnCode );	// 得到金叉或者死叉信号
	int		GetForkSignal( int nIndex, UINT itsGoldenFork, UINT itsDeadFork, UINT *pnCode );		// 得到金叉或者死叉信号
	int		GetForkSignal(int nIndex, double * pdValue1, double * pdValue2, UINT itsGoldenFork, UINT itsDeadFork, UINT *pnCode );	// 得到金叉死叉信号
	int		GetTrendIntensity(int nIndex, CSPDWordArray & adwDays, UINT itsLong, UINT itsShort, UINT * pnCode );	// 得到趋势信号
	int		GetTrendIntensity1( int nIndex, UINT itsLong, UINT itsShort, UINT *pnCode );	// 得到趋势信号
	int		GetTrendIntensity2( int nIndex, UINT itsLong, UINT itsShort, UINT *pnCode );	// 得到趋势信号
	int		GetTrendIntensity(int nIndex, double * pdValue1, double * pdValue2, UINT itsLong, UINT itsShort, UINT *pnCode );	// 得到趋势信号

public:
	// Attributes
	virtual	void	SetDefaultParameters( );		// 设定缺省参数
	void	AttachParameters( CTechnique & src );	// 指定参数与src相同
	virtual	BOOL	IsValidParameters( );			// 参数是否合法

	// Creations
	static	CTechnique *	CreateTechnique( UINT nTech, CKData * pKData );	// 创建CTechnique对象
	
	// Operations
	virtual	int		GetSignal( int nIndex, UINT * pnCode = NULL );	// 得到买卖信号
	virtual	int		GetIntensity( int nIndex, UINT * pnCode = NULL, BOOL bTraceBack = TRUE );	// 得到买卖趋势信号
	virtual	int		GetIntensityTraceback( int nIndex, UINT * pnCode = NULL );					// 得到买卖趋势信号
	virtual	BOOL	GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );		// 得到最大最小值
	virtual	BOOL	Calculate( double * pValue, int nIndex, int nDays, BOOL bUseLast );			// 计算指标值
	virtual	BOOL	Calculate( double * pValue, int nIndex, BOOL bUseLast );		// 计算指标值
	virtual	BOOL	Calculate( double * pValue1, double * pValue2, int nIndex, BOOL bUseLast );		// 计算指标值
	virtual	BOOL	Calculate( double * pValue1, double * pValue2, double * pValue3, int nIndex, BOOL bUseLast );		// 计算指标值
	virtual	BOOL	Calculate( double * pValue1, double * pValue2, double * pValue3, double * pValue4, int nIndex, BOOL bUseLast );		// 计算指标值
	virtual	BOOL	Calculate( double * pValue1, double * pValue2, double * pValue3, double * pValue4, double * pValue5, int nIndex, BOOL bUseLast );		// 计算指标值
	virtual	BOOL	CalculateMA( double * pValue, double * pMA, int nIndex, BOOL bUseLast, int nMADays );		// 计算指标值和均值

protected:
	CKData	*	m_pKData;

	double	*	m_pdCache1;
	double	*	m_pdCache2;
	double	*	m_pdCache3;
	double	*	m_pdCache4;
	double	*	m_pdCache5;
	BOOL	*	m_pbHasCache1;
	BOOL	*	m_pbHasCache2;
	BOOL	*	m_pbHasCache3;
	BOOL	*	m_pbHasCache4;
	BOOL	*	m_pbHasCache5;
	int			m_nLength;
	int			m_nIndexStart;

	int			m_nLastIntensity;
	UINT		m_nLastIntensityCode;
};

// K线
class STKLIB_API CKLine : public CTechnique
{
public:
	// Constructors
	CKLine( );
	CKLine( CKData * pKData );
	virtual ~CKLine();

public:
	virtual	void Clear( );

	// Attributes
	virtual	void	SetDefaultParameters( );
	void	AttachParameters( CKLine & src );
	virtual	BOOL	IsValidParameters( );

	// Operations
	virtual	BOOL	GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );
};

/////////////////////////////////////////////////////////////////////////
//	K线属性类
//	移动平均线MA
class STKLIB_API CMA : public CTechnique
{
public:
	// Constructors
	CMA( );
	CMA( CKData * pKData );
	virtual ~CMA();

public:
	virtual	void Clear( );

	// Attributes
	enum MATypes {
		typeMA		=	0x01,
		typeEXPMA	=	0x02,
	};
	int				m_nType;
	CSPDWordArray	m_adwMADays;
	int		m_itsGoldenFork;
	int		m_itsDeadFork;
	int		m_itsLong;
	int		m_itsShort;
	virtual	void	SetDefaultParameters( );
	void	AttachParameters( CMA & src );
	virtual	BOOL	IsValidParameters( );

	// Operations
	virtual	int		GetSignal( int nIndex, UINT * pnCode = NULL );
	virtual	BOOL	GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );
	virtual	BOOL	Calculate( double * pValue, int nIndex, int nDays, BOOL bUseLast );
};

//	多空指标BBI
class STKLIB_API CBBI : public CTechnique
{
public:
	// Constructors
	CBBI( );
	CBBI( CKData * pKData );
	virtual ~CBBI();

public:
	virtual	void Clear( );

	// Attributes
	int		m_nMA1Days;
	int		m_nMA2Days;
	int		m_nMA3Days;
	int		m_nMA4Days;
	int		m_itsGoldenFork;
	int		m_itsDeadFork;
	virtual	void	SetDefaultParameters( );
	void	AttachParameters( CBBI & src );
	virtual	BOOL	IsValidParameters( );

	// Operations
	virtual	int		GetSignal( int nIndex, UINT * pnCode = NULL );
	virtual	BOOL	GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );
	virtual	BOOL	Calculate( double * pValue, int nIndex, BOOL bUseLast );
};

//	布林带BOLL
class STKLIB_API CBOLL : public CTechnique
{
public:
	// Constructors
	CBOLL( );
	CBOLL( CKData * pKData );
	virtual ~CBOLL();

public:
	virtual	void Clear( );

	// Attributes
	double	m_dMultiUp;
	double	m_dMultiDown;
	int		m_nMADays;
	int		m_itsSupport;
	int		m_itsResistance;
	virtual	void	SetDefaultParameters( );
	void	AttachParameters( CBOLL & src );
	virtual	BOOL	IsValidParameters( );

	// Operations
	virtual	int		GetSignal( int nIndex, UINT * pnCode = NULL );
	virtual	BOOL	GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );
	virtual	BOOL	Calculate( double * pdMA, double * pdUp, double * pdDown, int nIndex, BOOL bUseLast );
};

//	汇证均价线P/V
class STKLIB_API CPV : public CTechnique
{
public:
	// Constructors
	CPV( );
	CPV( CKData * pKData );
	virtual ~CPV();

public:
	virtual	void Clear( );

	// Attributes
	virtual	void	SetDefaultParameters( );
	void	AttachParameters( CPV & src );
	virtual	BOOL	IsValidParameters( );

	// Operations
	virtual	int		GetSignal( int nIndex, UINT * pnCode = NULL );
	virtual	BOOL	GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );
	virtual	BOOL	Calculate( double * pValue, int nIndex, BOOL bUseLast );
};

//	停损点转向指标SAR
class STKLIB_API CSAR : public CTechnique
{
public:
	// Constructors
	CSAR( );
	CSAR( CKData * pKData );
	virtual ~CSAR();

protected:
	BOOL	CalculateSAR( double * pValue, int nIndex, BOOL bUseLast );

public:
	virtual	void Clear( );

	// Attributes
	int		m_nInitDays;
	int		m_bFirstUp;
	double	m_dAFStep;
	double	m_dAFMax;
	int		m_itsBuy;
	int		m_itsSell;
	virtual	void	SetDefaultParameters( );
	void	AttachParameters( CSAR & src );
	virtual	BOOL	IsValidParameters( );

	// Operations
	virtual	int		GetSignal( int nIndex, UINT * pnCode = NULL );
	virtual	BOOL	GetMinMaxInfo( int nStart, int nEnd, double *pdMin, double *pdMax );
	virtual	BOOL	Calculate( double * pValue, int nIndex, BOOL bUseLast );

protected:
	BOOL			m_bCurUp;
	BOOL			m_bTurn;
	double			m_dCurAF;
	double			m_dCurHigh;
	double			m_dCurLow;
};

//	叠加图DJ
class STKLIB_API CDJ : public CTechnique
{
public:

⌨️ 快捷键说明

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