策略为王源代码分析-主菜单-多股同列

Published

1.多股同列的菜单点击事件

1.1 多股同列的菜单ID

IDR_MENU_MAINBARVIEW MENU 

 POPUP "行情(&N)"
    BEGIN
        ...
        MENUITEM "下一只股票(&N)\tPageDown",         ID_REALTIME_NEXT
        POPUP "多股同列(&M)"
        BEGIN
            MENUITEM "一只股票(&O)",                    ID_REALTIME_ONESTOCK
            MENUITEM "两只股票(&T)",                    ID_REALTIME_TWOSTOCK
            MENUITEM "四只股票(&F)",                    ID_REALTIME_FOURSTOCK
            MENUITEM "六只股票(&S)",                    ID_REALTIME_SIXSTOCK
            MENUITEM "九只股票(&N)",                    ID_REALTIME_NINESTOCK
        END

 

1.2.九只股票id 对应的消息函数

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

ON_UPDATE_COMMAND_UI(ID_REALTIME_NINESTOCK, OnUpdateRealtimeNinestock)

 

void CMainFrame::OnUpdateRealtimeNinestock(CCmdUI* pCmdUI)
{
	CRealTimeView* pView = AfxGetRealTimeView();
	pCmdUI->SetCheck(pView && 9 == pView->GetShowMultiStock());
}

1.3.九只股票id被点击后股票数据来源

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

void CRealTimeView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
  ...
// 多股同列
	for(int i=1; i < m_nMultiStockCount && i < RTV_MAX_MULTICOUNT; i++)
	{
		if(AfxGetProfile().GetNextStock(&info))
		{
			m_realtime[i].SetCurStock(info);
			m_realtime[i].PrepareStockData();
			if(CRealTime::modeReportDetail == m_realtime[0].GetDrawMode())
				AfxGetStkReceiver().RequestStockData(CStock::dataDetail, &info, 1, 0, 0);
			else
				AfxGetStkReceiver().RequestStockData(CStock::dataMinute, &info, 1, 0, 0);
		}
	}
	for(int i=1; i < m_nMultiStockCount && i < RTV_MAX_MULTICOUNT; i++)
		AfxGetProfile().GetPrevStock(&info);

	Invalidate();
  ...

}

AfxGetProfile().GetNextStock(&info)

BOOL CStProfile::GetNextStock( CStockInfo * pInfo )
{
	if( m_bCurStockFromSList )
		return AfxGetSListStockContainer().GetNextStock( pInfo );
	else
		return AfxGetStockContainer().GetNextStock( pInfo );
}

智能选股界面的条件初始初始化

StkUI\View\SelectorView.h

首先定义了股票范围、K线类型、技术指标三个对话框变量,分别由三个对话框提供。

public:
	//{{AFX_DATA(CSelectorView)
	enum { IDD = IDD_SELECTOR_FORM };
	CStatic	m_staticInfo;
	CProgressCtrl	m_progress;
	CButton		m_btnRunSelector;
	CTechComboBox	m_cmbTech; //技术指标类型,由StkUI\ParamDlg\SetParamDlg.h提供的CTechComboBox类实现
	CKTypeComboBox	m_cmbKType; //K线类型,由StkUI\ParamDlg\SetParamDlg.h提供的CKTypeComboBox类实现
	CDomainComboBox	m_cmbStockGroup;//股票范围,由StkUI\Dialog\SetGroupDlg.h
	//}}AFX_DATA

然后对股票范围、K线类型、技术指标三个对话框变量数据初始化

StkUI\View\SelectorView.cpp

void CSelectorView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

	InitializeGrid( );

	m_staticInfo.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );
	m_progress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE );

	LOGFONT lf;
	memset( &lf, 0, sizeof(lf) );
	AfxGetProfile().GetFontSListView( &lf );
	SetFont( &lf );

	//初始化股票选择范围。如智能选股
	m_cmbStockGroup.InitStrings( TRUE, TRUE, AfxGetGroupContainer( ) );
	m_cmbStockGroup.SetCurSel( 0 );
	m_cmbStockGroup.SelectGroupAll( );

	//初始化K线类型选择框
	m_cmbKType.InitializeDay( );
	//各项技术指标种类选择框初始化。如智能选股
	m_cmbTech.Initialize();
}

 

 

2.智能选股对话框分析

G:\stock\TskingVS2019\src\Client\StkUI\Dialog\FilterInfoDlg.cpp

2.1 智能选股对话框点击“开始”按钮

//基本资料和行情选股对话框点击“开始”按钮
void CFilterInfoDlg::OnStart() 
{
	UpdateData( ); ////step 1.基本资料和行情选股对话框,首先更新数据

	if( m_listCond.GetCount() <= 0 )
	{
		AfxMessageBox( IDS_FILTERINFO_NOCOND, MB_OK|MB_ICONINFORMATION );
		return;
	}

	BOOL	bAnd	=	TRUE;
	CButton * pbtn	=	(CButton *)GetDlgItem(IDC_RADIOAND);
	if( pbtn )	bAnd	=	pbtn->GetCheck();

	m_listResult.ResetContent();

	CStockContainer & container	=	AfxGetStockContainer();
	m_ctrlProgress.SetWindowPos( NULL, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE );
	m_ctrlProgress.SetRange( 0, container.GetSize() );//基本资料和行情选股对话框,进度条最大数设置为股票个数
	for( int i=0; i<container.GetSize(); i++ )
	{
		m_ctrlProgress.SetPos( i ); //进度条设置为当前股票序号

		CStockInfo	&	info	=	container.ElementAt(i); 
		LONG	stocktype	=	info.GetType(); //判断选股范围
		if( CStock::typeshA == stocktype )
		{	if( !m_btnAll.GetCheck() && !m_btnShaa.GetCheck() )	continue;	}
		else if( CStock::typeshB == stocktype )
		{	if( !m_btnAll.GetCheck() && !m_btnShab.GetCheck() )	continue;	}
		else if( CStock::typeszA == stocktype )
		{	if( !m_btnAll.GetCheck() && !m_btnSzna.GetCheck() )	continue;	}
		else if( CStock::typeszB == stocktype )
		{	if( !m_btnAll.GetCheck() && !m_btnSznb.GetCheck() )	continue;	}
		else
		{	continue;	}

		BOOL	bSelected	=	bAnd;
		for( int k=0; k<m_listCond.GetCount(); k++ )  //选股条件
		{
			FILTERINFO_CONDITION * pCond = (FILTERINFO_CONDITION *)m_listCond.GetItemData(k);
			double	dValue	=	0;
			BOOL	bOK		=	FALSE;
			if( pCond && AfxGetVariantValue( pCond->nVariantID, info, &dValue, &container ) ) //对第i只股票进行计算
			{
				bOK	=	TRUE;
				if( pCond->bHasMoreThan && dValue < pCond->dMoreThan )
					bOK	=	FALSE;
				if( pCond->bHasLessThan && dValue > pCond->dLessThan )
					bOK	=	FALSE;
			}

			if( bAnd && !bOK )
			{
				bSelected	=	FALSE;
				break;
			}
			if( !bAnd && bOK )
			{
				bSelected	=	TRUE; //符合选股条件
				break;
			}
		}

		//符合条件
		if( bSelected )
		{
			//加入结果列表,CListBox	m_listResult,因为是对话框,改变m_listResult的值即更新界面
			int nItem = m_listResult.AddString( CString(info.GetStockCode()) + "(" + info.GetStockName() + ")" );
			m_listResult.SetItemData( nItem, i ); 
		}
	}
	m_ctrlProgress.SetPos( container.GetSize() );
	
	m_btnAddToGroup.EnableWindow( TRUE );
}