📄 stockgraph.cpp
字号:
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 + -