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

📄 stockgraph.cpp

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

	ResetIndex( );
	ClearCurStock( );
	m_CurStock.SetStockInfo( &info );
	m_CurStock.SetDatabase( &AfxGetDB() );
	m_CurStockDown.SetStockInfo( &info );
	m_CurStockDown.SetDatabase( &AfxGetDB() );
	m_dwLatestDate		=	-1;
	
	return TRUE;
}

void CStockGraph::SetReportWhat( int nReportWhat )
{
	m_nReportWhat	=	nReportWhat;
}

BOOL CStockGraph::PrepareStockData( BOOL bReload )
{
	if( !m_CurStock.GetStockInfo().IsValidStock() )
		return FALSE;

	CStockInfo	info;
	if( AfxGetStockContainer().GetStockInfo( m_CurStock.GetStockCode(), &info )
		&& m_CurStock.GetStockInfo().IsEqualTo( info.GetMarket(), info.GetStockCode() ) )
	{
		m_CurStock.SetStockInfo( &info );
		m_CurStockDown.SetStockInfo( &info );
	}

	int nOldSize = m_CurStock.GetKData(m_nCurKType).GetSize();

	// Prepare Data
	AfxPrepareStockData( &AfxGetDB(), m_CurStock, m_nCurKType, m_nCurKFormat, m_nCurMaindataType, FALSE, bReload );
	AfxPrepareStockData( &AfxGetDB(), m_CurStockDown, m_nCurKType, CKData::formatXDRdown, m_nCurMaindataType, FALSE, bReload );

	if( m_CurStock.GetKData(m_nCurKType).GetSize() != nOldSize )
		ResetIndex( );

	AfxGetStkReceiver().RequestKData( &m_CurStock, m_nCurKType );

	m_techparam.Clear( );
	m_techparam.SetKData( &(m_CurStockDown.GetKData(m_nCurKType)) );
	m_techparam.volume.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );
	m_techparam.ma.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );
	m_techparam.bbi.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );
	m_techparam.boll.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );
	m_techparam.pv.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );
	m_techparam.sar.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );
	m_techparam.dj.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );
	m_techparam.mike.SetKData( &(m_CurStock.GetKData(m_nCurKType)) );

	return TRUE;
}

void CStockGraph::Redraw( CDC * pDC, CRect rectAll )
{
	ASSERT( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) );
	if( m_rectAll != rectAll )
		ResetClient( rectAll );
	DrawStock( pDC );
}

void CStockGraph::DrawReportRegion( CDC * pDC )
{
	ASSERT( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) );
	if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
		return;

	CClientDC	dc(m_pParent);
	if( NULL == pDC )
		pDC		=	&dc;

	switch( m_nReportWhat )
	{
	case CStockGraph::reportParam:		DrawReportParam( pDC );		break;
	case CStockGraph::reportCost:		DrawReportCost( pDC );		break;
	case CStockGraph::reportFlame:		DrawReportFlame( pDC );		break;
	case CStockGraph::reportActivity:	DrawReportActivity( pDC );	break;
	}
}

int CStockGraph::GetNextThickness( int nCurrentThickness, BOOL bAsc )
{
	if( bAsc )
	{
		switch( nCurrentThickness )
		{
		case 1:			return 2;
		case 2:			return 4;
		case 4:			return 5;
		case 5:			return 6;
		case 6:			return 7;
		case 7:			return 9;
		case 9:			return 10;
		case 10:		return 13;
		case 13:		return 15;
		case 15:		return 15;
		default:
			ASSERT( FALSE );
			return m_nDefaultThickness;
		}
	}
	else
	{
		switch( nCurrentThickness )
		{
		case 1:			return 1;
		case 2:			return 1;
		case 4:			return 2;
		case 5:			return 4;
		case 6:			return 5;
		case 7:			return 6;
		case 9:			return 7;
		case 10:		return 9;
		case 13:		return 10;
		case 15:		return 13;
		default:
			ASSERT( FALSE );
			return m_nDefaultThickness;
		}
	}
}

void CStockGraph::ExpandUp( BOOL bShiftPressed )
{
	if( m_nIndexCurrent >= 0 )
	{
		CKData	&kdata	=	m_CurStock.GetKData( m_nCurKType );
		if( m_nIndexCurrent < kdata.GetSize() )
		{	
			if( -1 != m_dwLatestDate && kdata.ElementAt(m_nIndexCurrent).m_date > m_dwLatestDate )
			{
				KDATA	&	kd	=	kdata.ElementAt(m_nIndexCurrent);
				if( bShiftPressed )
				{
					float	fIncrease	=	100000;
					fIncrease	=	( kd.m_fVolume/10 > fIncrease ? kd.m_fVolume/10 : fIncrease );
					kd.m_fVolume	+=	fIncrease;
					kd.m_fAmount	=	( kd.m_fVolume*(kd.m_fOpen+kd.m_fClose)/2 );
				}
				else
				{
					float	fIncrease	=	(float)0.001;
					fIncrease	=	(float)( kd.m_fClose/500 > fIncrease ? kd.m_fClose/500 : fIncrease );
					kd.m_fClose		+=	fIncrease;
					kd.m_fOpen		+=	fIncrease;
					kd.m_fHigh		+=	fIncrease;
					kd.m_fLow		+=	fIncrease;
				}
				DrawStock( NULL );
				return;
			}
		}
	}

	int nOld = m_nThickness;
	m_nThickness = GetNextThickness( m_nThickness, TRUE );
	if( nOld != m_nThickness )
		DrawStock( NULL );
}

void CStockGraph::ExpandDown( BOOL bShiftPressed )
{
	if( m_nIndexCurrent >= 0 )
	{
		CKData	&kdata	=	m_CurStock.GetKData( m_nCurKType );
		if( m_nIndexCurrent < kdata.GetSize() )
		{	
			if( -1 != m_dwLatestDate && kdata.ElementAt(m_nIndexCurrent).m_date > m_dwLatestDate )
			{
				KDATA	&	kd	=	kdata.ElementAt(m_nIndexCurrent);
				if( bShiftPressed )
				{
					float	fDecline	=	100000;
					fDecline		=	( kd.m_fVolume/10 > fDecline ? kd.m_fVolume/10 : fDecline );
					if( kd.m_fVolume > fDecline )
						kd.m_fVolume	-=	fDecline;
					kd.m_fAmount	=	(float)( kd.m_fVolume*(kd.m_fOpen+kd.m_fClose)/2 );
				}
				else
				{
					float	fDecline	=	(float)0.001;
					fDecline	=	(float)( kd.m_fClose/500 > fDecline ? kd.m_fClose/500 : fDecline );
					if( kd.m_fLow > fDecline )
					{
						kd.m_fClose		-=	fDecline;
						kd.m_fOpen		-=	fDecline;
						kd.m_fHigh		-=	fDecline;
						kd.m_fLow		-=	fDecline;
					}
				}
				DrawStock( NULL );
				return;
			}
		}
	}

	int nOld = m_nThickness;
	m_nThickness = GetNextThickness( m_nThickness, FALSE );
	if( nOld != m_nThickness )
		DrawStock( NULL );
}

void CStockGraph::MoveLeft( BOOL bShiftPressed )
{
	Move( -1, bShiftPressed, FALSE );
}

void CStockGraph::MoveRight( BOOL bShiftPressed )
{
	if( m_nIndexCurrent >= 0 && bShiftPressed )
	{
		CKData	&kdata	=	m_CurStock.GetKData( m_nCurKType );
		if( m_nIndexCurrent+1 >= kdata.GetSize() )
		{	
			//	Add New KDATA to test predicate
			if( 0 == kdata.GetSize() )
				m_dwLatestDate	=	0;
			else if( -1 == m_dwLatestDate )
				m_dwLatestDate	=	kdata.ElementAt(kdata.GetSize()-1).m_date;
			KDATA	kd;
			memset( &kd, 0, sizeof(kd) );
			if( kdata.GetSize() > 0 )
				kd	=	kdata.ElementAt(kdata.GetSize()-1);
			else
				kd.m_fClose	=	1;
			kd.m_fOpen	=	kd.m_fHigh	=	kd.m_fLow	=	kd.m_fClose;
			kd.m_date	=	CSPTime::GetStockTimeNext( kd.m_date, m_nCurKType );
			kdata.Add( kd );
			m_CurStockDown.GetKData( m_nCurKType ).Add( kd );
			
			bShiftPressed	=	FALSE;
		}
	}

	Move( 1, bShiftPressed, FALSE );
}

void CStockGraph::PageLeft( BOOL bShiftPressed )
{
	int	nMove	=	-(m_nIndexEnd-m_nIndexStart-5);
	if( nMove >= 0 )
		nMove	=	-1;
	Move( nMove, bShiftPressed, FALSE );
}

void CStockGraph::PageRight( BOOL bShiftPressed )
{
	int	nMove	=	(m_nIndexEnd-m_nIndexStart-5);
	if( nMove <= 0 )
		nMove	=	1;
	Move( nMove, bShiftPressed, FALSE );
}

void CStockGraph::MoveHome( BOOL bShiftPressed )
{
	if( m_nIndexCurrent >= 0 )
	{
		// Move Current Selection
		int	nPos	=	m_nIndexStart;
		MoveTo( nPos, bShiftPressed, FALSE );
	}
	else
	{
		// Show Prev Technique Line
		UINT	nTechUserCount	=	CTechUser::GetTechUserCount();
		UINT	nTechMax	=	STT_MAX;
		if( nTechUserCount > 0 )
			nTechMax	=	STT_USER_MIN + nTechUserCount - 1;

		CSPDWordArray	& auShow	=	AfxGetProfile().GetGraphTechsShow();
		int	nOldSize = auShow.GetSize();
		if( auShow.GetSize() > 0 )
		{
			UINT	nNext	=	auShow.ElementAt(auShow.GetSize()-1);
			nNext	--;
			if( nNext < STT_TREND_MIN || nNext > nTechMax )
				nNext	=	nTechMax;
			if( nNext > STT_MAX && nNext < STT_USER_MIN )
				nNext	=	STT_MAX;
			AfxGetProfile().ShowGraphViewTech( nNext );
		}
		else
		{
			auShow.Add( nTechMax );
		}
		if( auShow.GetSize() == nOldSize )
			InvalidateCenter( );
		else if( m_pParent && ::IsWindow(m_pParent->GetSafeHwnd()) )
		{
			ResetClient( m_rectAll );
			m_pParent->Invalidate();
		}
	}
}

void CStockGraph::MoveEnd( BOOL bShiftPressed )
{
	if( m_nIndexCurrent >= 0 )
	{
		// Move Current Selection
		CKData	& kdata	=	m_CurStock.GetKData( m_nCurKType );
		int	nPos	=	( m_nIndexEnd < 0 ? kdata.GetSize()-1 : m_nIndexEnd );
		MoveTo( nPos, bShiftPressed, FALSE );
	}
	else
	{
		// Show Next Technique Line
		UINT	nTechUserCount	=	CTechUser::GetTechUserCount();
		UINT	nTechMax	=	STT_MAX;
		if( nTechUserCount > 0 )
			nTechMax	=	STT_USER_MIN + nTechUserCount - 1;

		CSPDWordArray	& auShow	=	AfxGetProfile().GetGraphTechsShow();
		int nOldSize = auShow.GetSize();
		if( auShow.GetSize() > 0 )
		{
			UINT	nNext	=	auShow.ElementAt(auShow.GetSize()-1);
			nNext	++;
			if( nNext < STT_TREND_MIN || nNext > nTechMax )
				nNext	=	STT_TREND_MIN;
			if( nNext > STT_MAX && nNext < STT_USER_MIN )
				nNext	=	STT_USER_MIN;
			AfxGetProfile().ShowGraphViewTech( nNext );
		}
		else
		{
			auShow.Add( STT_TREND_MIN );
		}
		if( auShow.GetSize() == nOldSize )
			InvalidateCenter( );
		else if( m_pParent && ::IsWindow(m_pParent->GetSafeHwnd()) )
		{
			ResetClient( m_rectAll );
			m_pParent->Invalidate();
		}
	}
}

void CStockGraph::OnInsert( )
{
	CKData	&kdata	=	m_CurStock.GetKData( m_nCurKType );

	KDATA	kd;
	memset( &kd, 0, sizeof(kd) );
	if( kdata.GetSize() > 0 )
		kd	=	kdata.ElementAt(kdata.GetSize()-1);
	else
		kd.m_fClose	=	1;
	kd.m_fOpen	=	kd.m_fHigh	=	kd.m_fLow	=	kd.m_fClose;
	kd.m_date	=	CSPTime::GetStockTimeNext( kd.m_date, m_nCurKType );

	if( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) )
		m_pParent->SetFocus( );
}

void CStockGraph::OnLButtonDown( UINT nFlags, CPoint point, BOOL bShiftPressed, BOOL bCtrlPressed )
{
	// Border Move
	if( m_bCursorBorder )
	{
		SetCapture(m_pParent->GetSafeHwnd());
		// Draw Border Moving Line
		DrawBorderMovingLine( NULL, point, TRUE );
		m_ptLastMovingLine	=	point;
		return;
	}

	// KLine Index
	int	nIndexClick	=	GetIndexClick( point );
	MoveTo( nIndexClick, bShiftPressed, bCtrlPressed );

	// Selection Rect
	if( -1 != nIndexClick && m_rectKLineCenter.PtInRect(point) )
	{
		SetCapture(m_pParent->GetSafeHwnd());
		m_ptSelectBegin	=	point;
		m_ptSelectEnd	=	point;
		DrawSelectionRect( NULL, m_ptSelectBegin, m_ptSelectEnd, TRUE );
	}

	// Selected TechID
	SelectTechID( point );
}

void CStockGraph::OnLButtonUp( UINT nFlags, CPoint point, BOOL bShiftPressed, BOOL bCtrlPressed )
{
	if( m_bCursorBorder && GetCapture() == m_pParent->GetSafeHwnd() )
	{
		ReleaseCapture( );
		// Remove Border Moving Line
		DrawBorderMovingLine( NULL, point, FALSE );
		// Reset Border
		if( 0 == m_nPosSelectBorder )
		{
			m_rectKLine.bottom	=	point.y;
			m_rectKLineCenter	=	m_rectKLine;
			m_rectKLineCenter.InflateRect( -2, -m_nHeightSubtitle, -2, -2 );
			if( m_arcTech.GetSize() > 0 )
				m_arcTech.ElementAt(0).top	=	point.y;
		}
		else if( m_nPosSelectBorder > 0 )
		{
			if( m_nPosSelectBorder < m_arcTech.GetSize() )
			{
				m_arcTech.ElementAt(m_nPosSelectBorder-1).bottom	=	point.y;
				m_arcTech.ElementAt(m_nPosSelectBorder).top			=	point.y;
			}
		}

		m_bCursorBorder = FALSE;
		DrawStock( NULL );
		return;
	}

	if( GetCapture() == m_pParent->GetSafeHwnd() )
	{
		ReleaseCapture( );
		DrawSelectionRect( NULL, m_ptSelectBegin, m_ptSelectEnd, FALSE );

		int nClickBegin = GetIndexClick( m_ptSelectBegin );
		int nClickEnd = GetIndexClick( m_ptSelectEnd );
		if( -1 == nClickBegin )
		{
			if( m_ptSelectBegin.x < m_rectCenter.left )		nClickBegin	=	m_nIndexStart;
			if( m_ptSelectBegin.x > m_rectCenter.right )	nClickBegin	=	m_nIndexEnd;
		}
		if( -1 == nClickEnd )
		{
			if( m_ptSelectEnd.x < m_rectCenter.left )		nClickEnd	=	m_nIndexStart;
			if( m_ptSelectEnd.x > m_rectCenter.right )		nClickEnd	=	m_nIndexEnd;
		}

		if( -1 != nClickBegin && -1 != nClickEnd )
		{
			if( nClickBegin < nClickEnd ) // 放大
			{
				int nLeft = min(nClickBegin,nClickEnd);
				int nRight = max(nClickBegin,nClickEnd);

				if( 15*(nRight-nLeft+1) < m_rectCenter.Width() )
				{
					nLeft -= (m_rectCenter.Width() - 15*(nRight-nLeft+1))/30 + 1;
					nRight += (m_rectCenter.Width() - 15*(nRight-nLeft+1))/30 + 1;
				}

				int	nOldLen = m_nIndexEnd - m_nIndexStart;
				int	nOldThick = m_nThickness;
				ResetIndex( nLeft, nRight, m_nIndexCurrent );

⌨️ 快捷键说明

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