策略为王源代码分析-GraphView.cpp-显示技术指标

Published

1.技术指标的计算

技术指标的计算在StkLib库中。

Technique.h       技术指标类定义

分别由下面的文件来实现。

TechCL.cpp        自有技术指标
      TechEnergy.cpp    能量类技术指标
      TechKLine.cpp     K线叠加类技术指标
      Technique.cpp     技术指标基类
      TechSwing.cpp     摆动类技术指标
      TechTrend.cpp     趋势类技术指标
      TechOther.cpp     其它类技术指标

2.画技术指标

G:\stock\TskingVS2019\src\Client\StkUI\View\DrawTech.cpp

此文件是CStockGraph的类实现的一部分,专门负责画技术指标。

在CStockGraph类中,定义的一个技术指标的变量CTechParameters m_techparam; // 指标参数

void CStockGraph::DrawTechMA( CDC * pDC, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
	CKData	& kdata	=	m_CurStock.GetKData(m_nCurKType);
	m_techparam.ma.AttachParameters( AfxGetProfile().GetTechParameters().ma );
	DrawTechUtil( pDC, rect, bDrawTitle, dMin, dMax, STT_MA, &(m_techparam.ma), &kdata, m_techparam.ma.m_adwMADays );
}

 

 

第二部分 技术指标对象的创建和使用

2.1 技术指标变量的声明

G:\stock\TskingVS2019\src\Client\StkLib\Include\Profile.h

技术指标变量的声明为硬编码

/////////////////////////////////////////////////////////////////////////////
// CTechParameters
/***
	技术指标参数,包含所有技术指标的参数设定
*/
class STKLIB_API CTechParameters
{
public:
	CTechParameters( );

	void	Clear( );
	void	SetKData( CKData * pKData );
	void	SetDefaultParametersAll( );
	BOOL	FindParameters( UINT nTech, CTechnique * pTech );
	void	Serialize( CSPArchive &ar );

	CMA		ma;

2.2 技术指标对象的创建

G:\stock\TskingVS2019\src\Client\StkLib\Src\Technique.cpp

根据技术指标对象的ID号来创建

// 创建新的技术指标对象
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;
		

 

2.3 技术指标的自动创建

G:\stock\TskingVS2019\src\Client\StkLib\Src\Strategy.cpp

/////////////////////////////////////////////////////////////////////////
// Cache
// 准备数据,读取K线数据,长周期K线数据,生成技术指标对象
BOOL CStrategy::PrepareData( SIMULATION_CALLBACK fnCallback, void * cookie )
{
	if( m_techstocks.GetSize() == m_stocks.GetSize() )
		return TRUE;

	ClearCache( );

	// m_techstocks.m_kdataIndex m_techstocks.m_infoIndex
	if( m_opparam.m_bIndexTrend )	// 指数K线数据
	{
		CStockInfo	infoIndex;
		if( AfxGetStockContainer().GetStockInfo( STKLIB_CODE_MAIN, &infoIndex ) )
		{
			m_techstocks.m_infoIndex	=	infoIndex;
			
			CStock	stockIndex;
			stockIndex.SetStockInfo( &infoIndex );
			stockIndex.SetDatabase( &AfxGetDB() );
			stockIndex.PrepareData( CStock::dataK, m_opparam.m_nKTypeIndex );
			CKData	&	kdataIndex		=	stockIndex.GetKData(m_opparam.m_nKTypeIndex);
			kdataIndex.SetMaindataType( m_opparam.m_nMaindataType );
			m_techstocks.m_kdataIndex	=	kdataIndex;

			// m_techstocks.m_techsIndex
			for( int j=0; j<m_anTechsIndexTrend.GetSize(); j++ ) //创建技术指标对象
			{
				CTechnique * pTech	=	CTechnique::CreateTechnique( m_anTechsIndexTrend[j], &(m_techstocks.m_kdataIndex) );
				m_paramIndexTrend.FindParameters( m_anTechsIndexTrend[j], pTech );
				m_techstocks.m_techsIndex.Add( pTech );
			}
		}
	}

G:\stock\TskingVS2019\src\Client\StkUI\View\SelectorView.cpp

/智能选股按钮
void CSelectorView::OnRunselector() 
{
if( kdata.GetSize() < 1 )
			continue;
		CTechnique * pTech	=	CTechnique::CreateTechnique( nTech, &kdata ); //创建技术指标
		if( NULL == pTech )
			continue;

 

第三部份 技术指标的应用

1.鼠标右键弹出框

技术指标弹出框

根据视图界面来确定加载哪些种类的技术指标

G:\stock\TskingVS2019\src\Client\StkUI\MainFrm.cpp

 

//右键弹出菜单初始化 by freeman
void CMainFrame::InitMenuPopup(CMenu* pPopupMenu)
{
	if (NULL == pPopupMenu || NULL == pPopupMenu->GetSafeHmenu())
		return;

	for (UINT nMenu = 0; nMenu < pPopupMenu->GetMenuItemCount(); nMenu++)
	{
		else if (ID_VIEW_TECHCLK == pPopupMenu->GetMenuItemID(nMenu)) //日K线策略为王指标加载处、右键弹出菜单初始化
		{
			CView* pView = AfxGetStaticDoc()->GetActiveView();
			UINT	nFlags = ((pView && pView->IsKindOf(RUNTIME_CLASS(CGraphView))) ? MF_BYPOSITION | MF_STRING : MF_BYPOSITION | MF_STRING | MF_GRAYED);
			pPopupMenu->DeleteMenu(nMenu, MF_BYPOSITION);
			for (UINT nID = STT_CLK_MAX; nID >= STT_CLK_MIN; nID--)
			{
				UINT	nFlagsLocal = nFlags;
				if (AfxGetProfile().IsGraphTechShow(nID))	nFlagsLocal |= MF_CHECKED;
				pPopupMenu->InsertMenu(nMenu, nFlagsLocal, ID_VIEW_TECH_START + nID, AfxGetSTTFullName(nID));
			}
		}

 

2.主菜单-技术指标

G:\stock\TskingVS2019\src\Client\StkUI\StkUI.rc

IDR_MENU_MAINBARTECH MENU
BEGIN
    POPUP "Tech"
    BEGIN
        POPUP "K线图指标显示(&K)"                  //主菜单 K线图指标显示
        BEGIN
            MENUITEM "K线图指标",                       ID_VIEW_TECHKLINE
        END
        POPUP "趋势类指标显示(&Q)"
        BEGIN
            MENUITEM "趋势类",                         ID_VIEW_TECHTREND

G:\stock\TskingVS2019\src\Client\StkUI\resource.h

#define ID_VIEW_TECHKLINE               33275  //K线图指标显示 id定义