📄 stockgraph.cpp.svn-base
字号:
pDC->MoveTo( xMedium, m_rectKLineCenter.bottom );
pDC->LineTo( xMedium, m_rectKLineCenter.top );
}
}
pDC->SetROP2( nOldDrawMode );
pDC->SelectObject( pOldPen );
}
void CStockGraph::DrawSelectionRect( CDC * pDC, CPoint ptBegin, CPoint ptEnd, BOOL bAddOrRemove )
{
ASSERT( m_pParent && ::IsWindow( m_pParent->GetSafeHwnd() ) );
if( !m_pParent || !::IsWindow(m_pParent->GetSafeHwnd()) )
return;
CClientDC dc(m_pParent);
if( NULL == pDC )
pDC = &dc;
CPen penVLine( PS_SOLID, 1, AfxGetProfile().GetColor( CColorClass::clrLine2 ) );
CPen * pOldPen = pDC->SelectObject( &penVLine );
int nOldDrawMode = pDC->SetROP2( R2_XORPEN );
CRect rect;
rect.left = min(ptBegin.x,ptEnd.x);
rect.right = max(ptBegin.x,ptEnd.x);
rect.top = min(ptBegin.y,ptEnd.y);
rect.bottom = max(ptBegin.y,ptEnd.y);
pDC->MoveTo( rect.left, rect.top );
pDC->LineTo( rect.right, rect.top );
pDC->LineTo( rect.right, rect.bottom );
pDC->LineTo( rect.left, rect.bottom );
pDC->LineTo( rect.left, rect.top );
pDC->SetROP2( nOldDrawMode );
pDC->SelectObject( pOldPen );
}
void CStockGraph::DrawKData( )
{
if( !::IsWindow( m_wndKData.GetSafeHwnd() ) )
{
if( !m_wndKData.Create( NULL, "", WS_CHILD, m_rectKData, m_pParent, 0 ) )
{
TRACE( "Failed to create m_wndKData!\n" );
return;
}
m_wndKData.SetWindowPos( NULL, m_rectKData.left, m_rectKData.top, m_rectKData.Width(), m_rectKData.Height(),
SWP_SHOWWINDOW );
}
CClientDC dc(&m_wndKData);
CRect rectClient;
m_wndKData.GetClientRect( &rectClient );
CKData &kdata = m_CurStock.GetKData(m_nCurKType);
if( m_nIndexCurrent >= 0 && m_nIndexCurrent < kdata.GetSize() )
{
m_wndKData.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW );
m_wndKData.ValidateRect( &rectClient );
DrawKData( &dc, rectClient );
m_wndKData.ValidateRect( &rectClient );
}
else
m_wndKData.SetWindowPos( NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW );
}
void CStockGraph::DrawKData( CDC * pDC, CRect rect )
{
CHECK_NODATATODRAW
DECLARE_COLOR_DEFINATION
CStockInfo & info = m_CurStock.GetStockInfo();
CKData &kdata = m_CurStock.GetKData( m_nCurKType );
CKData &kdataDown = m_CurStockDown.GetKData( m_nCurKType );
// Prepare kd and fLastClose
KDATA kd;
memset( &kd, 0, sizeof(kd) );
float fLastClose = 0;
double dAmount = 0, dVolume = 0, dPriceAverage = 0, dRatioChangeHand = 0, dVolumeDown = 0;
if( m_anIndexCurrent.GetSize() > 0
&& (int)m_anIndexCurrent[0] < kdata.GetSize() && (int)m_anIndexCurrent[m_anIndexCurrent.GetSize()-1] < kdata.GetSize() )
{
int nStart = m_anIndexCurrent[0];
int nEnd = m_anIndexCurrent[m_anIndexCurrent.GetSize()-1];
kd.m_date = kdata.ElementAt(nStart).m_date;
kd.m_fOpen = kdata.ElementAt(nStart).m_fOpen;
kd.m_fLow = kdata.ElementAt(nStart).m_fLow;
kd.m_fClose = kdata.ElementAt(nEnd).m_fClose;
for( int k=0; k<m_anIndexCurrent.GetSize() && (int)m_anIndexCurrent[k]<kdata.GetSize(); k++ )
{
KDATA & kdTemp = kdata.ElementAt(m_anIndexCurrent[k]);
if( (int)m_anIndexCurrent[k] < nStart )
{
kd.m_fOpen = kdTemp.m_fOpen;
kd.m_date = kdTemp.m_date;
nStart = m_anIndexCurrent[k];
}
if( (int)m_anIndexCurrent[k] > nEnd )
{
kd.m_fClose= kdTemp.m_fClose;
nEnd = m_anIndexCurrent[k];
}
if( kd.m_fHigh < kdTemp.m_fHigh )
kd.m_fHigh = kdTemp.m_fHigh;
if( kd.m_fLow > kdTemp.m_fLow )
kd.m_fLow = kdTemp.m_fLow;
dAmount += kdTemp.m_fAmount;
dVolume += kdTemp.m_fVolume;
if( (int)m_anIndexCurrent[k] < kdataDown.GetSize() )
dVolumeDown += kdataDown.ElementAt(m_anIndexCurrent[k]).m_fVolume;
}
fLastClose = kd.m_fOpen;
if( nStart - 1 >= 0 )
fLastClose = kdata.ElementAt(nStart-1).m_fClose;
}
else if( m_nIndexCurrent >= 0 && m_nIndexCurrent < kdata.GetSize() )
{
kd = kdata.ElementAt(m_nIndexCurrent);
dAmount = kd.m_fAmount;
dVolume = kd.m_fVolume;
if( m_nIndexCurrent < kdataDown.GetSize() )
dVolumeDown += kdataDown.ElementAt(m_nIndexCurrent).m_fVolume;
fLastClose = kd.m_fOpen;
if( m_nIndexCurrent - 1 >= 0 )
fLastClose = kdata.ElementAt(m_nIndexCurrent-1).m_fClose;
}
else
return;
if( dVolume >= 1 )
dPriceAverage = dAmount / dVolume;
m_CurStockDown.GetStockInfo().GetRatioChangeHand( &dRatioChangeHand, dVolumeDown );
// 相对换手率
double dMainChangeHand = CHSL::GetMainChangeHand( m_CurStockDown.GetStockInfo().GetMarket(), kdataDown, m_nIndexCurrent );
double dRelativeChangeHand = 1.0;
if( dMainChangeHand > 1e-6 )
dRelativeChangeHand = dRatioChangeHand / dMainChangeHand;
// Fill Background
pDC->FillSolidRect( &rect, clrBK );
pDC->Draw3dRect( &rect, clrBorder, clrBorder );
pDC->SetBkColor( clrBK );
CString strTemp;
CFont * pOldFont = AfxSelectDCFont( pDC, 14 );
int x = rect.left + 1;
int y = rect.top;
pDC->SetTextColor( clrText );
strTemp.LoadString( IDS_STOCKGRAPH_TIME );
pDC->TextOut( x, y+2, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_OPEN );
pDC->TextOut( x, y+37, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_HIGH );
pDC->TextOut( x, y+71, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_LOW );
pDC->TextOut( x, y+105, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_CLOSE );
pDC->TextOut( x, y+139, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_VOLUME );
pDC->TextOut( x, y+173, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_AMOUNT );
pDC->TextOut( x, y+207, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_PRICEAVERAGE );
pDC->TextOut( x, y+241, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_RELATIVECHANGEHAND );
pDC->TextOut( x, y+275, strTemp );
x = rect.right - 3;
UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
CSPTime sptime;
if( CKData::IsDayOrMin( m_nCurKType ) )
{
sptime.FromStockTimeDay( kd.m_date );
strTemp = sptime.Format( "%y-%m-%d" );
}
else
{
sptime.FromStockTimeMin( kd.m_date );
strTemp = sptime.Format( "%m%d%H%M" );
}
pDC->SetTextColor( clrPlane );
pDC->TextOut( x, y+18, strTemp );
// 价格小数位数格式串
CString strPriceFmt;
strPriceFmt.Format( "%%.%df", info.DigitBit() );
strTemp.Format( strPriceFmt, kd.m_fOpen );
pDC->SetTextColor( kd.m_fOpen > fLastClose ? clrRise : (kd.m_fOpen<fLastClose?clrFall:clrPlane) );
pDC->TextOut( x, y+53, strTemp );
strTemp.Format( strPriceFmt, kd.m_fHigh );
pDC->SetTextColor( kd.m_fHigh > fLastClose ? clrRise : (kd.m_fHigh<fLastClose?clrFall:clrPlane) );
pDC->TextOut( x, y+87, strTemp );
strTemp.Format( strPriceFmt, kd.m_fLow );
pDC->SetTextColor( kd.m_fLow > fLastClose ? clrRise : (kd.m_fLow<fLastClose?clrFall:clrPlane) );
pDC->TextOut( x, y+121, strTemp );
strTemp.Format( strPriceFmt, kd.m_fClose );
pDC->SetTextColor( kd.m_fClose > fLastClose ? clrRise : (kd.m_fClose<fLastClose?clrFall:clrPlane) );
pDC->TextOut( x, y+155, strTemp );
strTemp.Format( "%.0f", dVolume/100 );
pDC->SetTextColor( clrTitle );
pDC->TextOut( x, y+189, strTemp );
strTemp.Format( "%.0f", dAmount/1000 );
pDC->SetTextColor( clrTitle );
pDC->TextOut( x, y+223, strTemp );
strTemp.Format( strPriceFmt, dPriceAverage );
pDC->SetTextColor( clrTitle );
pDC->TextOut( x, y+257, strTemp );
strTemp.Format( "%.2f", dRelativeChangeHand );
pDC->SetTextColor( clrTitle );
pDC->TextOut( x, y+291, strTemp );
pDC->SetTextAlign( nOldAlign );
pDC->SelectObject( pOldFont );
}
void CStockGraph::DrawTechLine(CDC * pDC )
{
CSPDWordArray & anShow = AfxGetProfile().GetGraphTechsShow( );
for( int k=0; k<m_arcTech.GetSize(); k++ )
{
CRect rect = m_arcTech.ElementAt(k);
if( k < anShow.GetSize() )
{
DrawTechLine( pDC, anShow[k], rect, FALSE );
DrawTechLine( pDC, anShow[k], rect, TRUE );
}
}
}
void CStockGraph::DrawKLineAttribute(CDC * pDC, UINT nTech, CRect rect, BOOL bDrawTitle, double dMin, double dMax )
{
switch( nTech )
{
case STT_MA: DrawTechMA( pDC, rect, bDrawTitle, dMin, dMax ); break;
case STT_BBI: DrawTechBBI( pDC, rect, bDrawTitle, dMin, dMax ); break;
case STT_BOLL: DrawTechBOLL( pDC, rect, bDrawTitle, dMin, dMax ); break;
case STT_PV: DrawTechPV( pDC, rect, bDrawTitle, dMin, dMax ); break;
case STT_SAR: DrawTechSAR( pDC, rect, bDrawTitle, dMin, dMax ); break;
case STT_DJ: DrawTechDJ( pDC, rect, bDrawTitle, dMin, dMax ); break;
case STT_CW: DrawTechCW( pDC, rect, bDrawTitle, dMin, dMax ); break;
default:;
ASSERT( FALSE );
}
}
void CStockGraph::DrawTechLine(CDC * pDC, UINT nTech, CRect rect, BOOL bDrawTitle )
{
DECLARE_COLOR_DEFINATION
if( !bDrawTitle )
{
pDC->FillSolidRect( &rect, clrBK );
pDC->FillSolidRect( CRect(m_rectAll.left,rect.top,rect.left-1,rect.bottom), clrBK );
pDC->Draw3dRect( &rect, clrBorder, clrBorder );
}
switch( nTech )
{
case STT_MACD: DrawTechMACD( pDC, rect, bDrawTitle ); break;
case STT_MIKE: DrawTechMIKE( pDC, rect, bDrawTitle ); break;
case STT_PSY: DrawTechPSY( pDC, rect, bDrawTitle ); break;
case STT_VOLUME: DrawTechVOLUME( pDC, rect, bDrawTitle ); break;
case STT_NVI: DrawTechNVI( pDC, rect, bDrawTitle ); break;
case STT_PVI: DrawTechPVI( pDC, rect, bDrawTitle ); break;
case STT_VR: DrawTechVR( pDC, rect, bDrawTitle ); break;
case STT_VROC: DrawTechVROC( pDC, rect, bDrawTitle ); break;
case STT_OBV: DrawTechOBV( pDC, rect, bDrawTitle ); break;
case STT_MOBV: DrawTechMOBV( pDC, rect, bDrawTitle ); break;
case STT_MFI: DrawTechMFI( pDC, rect, bDrawTitle ); break;
case STT_VMACD: DrawTechVMACD( pDC, rect, bDrawTitle ); break;
case STT_WVAD: DrawTechWVAD( pDC, rect, bDrawTitle ); break;
case STT_EMV: DrawTechEMV( pDC, rect, bDrawTitle ); break;
case STT_VRSI: DrawTechVRSI( pDC, rect, bDrawTitle ); break;
case STT_NVRSI: DrawTechNVRSI( pDC, rect, bDrawTitle ); break;
case STT_AD: DrawTechAD( pDC, rect, bDrawTitle ); break;
case STT_CI: DrawTechCI( pDC, rect, bDrawTitle ); break;
case STT_KDJ: DrawTechKDJ( pDC, rect, bDrawTitle ); break;
case STT_R: DrawTechR( pDC, rect, bDrawTitle ); break;
case STT_RSI: DrawTechRSI( pDC, rect, bDrawTitle ); break;
case STT_BIAS: DrawTechBIAS( pDC, rect, bDrawTitle ); break;
case STT_MTM: DrawTechMTM( pDC, rect, bDrawTitle ); break;
case STT_DMI: DrawTechDMI( pDC, rect, bDrawTitle ); break;
case STT_ROC: DrawTechROC( pDC, rect, bDrawTitle ); break;
case STT_CCI: DrawTechCCI( pDC, rect, bDrawTitle ); break;
case STT_CV: DrawTechCV( pDC, rect, bDrawTitle ); break;
case STT_ARBR: DrawTechARBR( pDC, rect, bDrawTitle ); break;
case STT_CR: DrawTechCR( pDC, rect, bDrawTitle ); break;
case STT_OSC: DrawTechOSC( pDC, rect, bDrawTitle ); break;
case STT_UOS: DrawTechUOS( pDC, rect, bDrawTitle ); break;
case STT_MAOSC: DrawTechMAOSC( pDC, rect, bDrawTitle ); break;
case STT_36BIAS: DrawTech3_6BIAS( pDC, rect, bDrawTitle ); break;
case STT_DPO: DrawTechDPO( pDC, rect, bDrawTitle ); break;
case STT_KST: DrawTechKST( pDC, rect, bDrawTitle ); break;
case STT_REI: DrawTechREI( pDC, rect, bDrawTitle ); break;
case STT_DMKI: DrawTechDMKI( pDC, rect, bDrawTitle ); break;
case STT_PCNT: DrawTechPCNT( pDC, rect, bDrawTitle ); break;
case STT_HLC: DrawTechHLC( pDC, rect, bDrawTitle ); break;
case STT_CDP: DrawTechCDP( pDC, rect, bDrawTitle ); break;
case STT_ASI: DrawTechASI( pDC, rect, bDrawTitle ); break;
case STT_ATR: DrawTechATR( pDC, rect, bDrawTitle ); break;
case STT_CYO: DrawTechCYO( pDC, rect, bDrawTitle ); break;
case STT_DCYO: DrawTechDCYO( pDC, rect, bDrawTitle ); break;
case STT_HSL: DrawTechHSL( pDC, rect, bDrawTitle ); break;
case STT_DPER: DrawTechDPER( pDC, rect, bDrawTitle ); break;
default:
{
UINT nTechUserCount = CTechUser::GetTechUserCount();
if( nTech >= STT_USER_MIN && nTech <= STT_USER_MIN+nTechUserCount-1 )
DrawTechUser( nTech, pDC, rect, bDrawTitle );
else
ASSERT( FALSE );
}
}
}
void CStockGraph::DrawReportParam( CDC * pDC )
{
DECLARE_COLOR_DEFINATION
// Prepare Data
/* Old Version
m_CurStock.PrepareData( CStock::dataK, CKData::ktypeDay );
m_CurStock.PrepareData( CStock::dataDR );
m_CurStock.PrepareData( CStock::dataK, m_nCurKType );
CStockInfo & info = m_CurStock.GetStockInfo();
CKData & kday = m_CurStock.GetKDataDay();
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
CKData & kdayMain = AfxGetStockMain().GetKDataDay();
kday.SetDRData( m_CurStock.GetDRData() );
if( kday.GetCurFormat() < CKData::formatMin
|| kday.GetCurFormat() > CKData::formatMax )
return ;
kday.FullFillKData( kdayMain, FALSE );
if( CKData::formatXDRup != kday.GetCurFormat() && CKData::formatXDRdown != kday.GetCurFormat() )
kday.ChangeCurFormat( CKData::formatXDRdown, AfxGetProfile().GetAutoResumeDRBegin(), AfxGetProfile().GetAutoResumeDRLimit() );
*/
CStockInfo & info = m_CurStock.GetStockInfo();
CKData & kday = m_CurStockDown.GetKDataDay();
CKData & kdata = m_CurStockDown.GetKData(m_nCurKType);
CKData & kdayMain = AfxGetStockMain().GetKDataDay();
double dValue = 0.;
DWORD dateCurrent = kdata.GetDate(m_nIndexCurrent);
DWORD dateDayCurrent = kdata.GetDateDay( m_nIndexCurrent );
int nIndexDay = kday.GetIndexByDate( dateDayCurrent );
int nIndexDayMain = kdayMain.GetIndexByDate( dateDayCurrent );
// Draw Rect
pDC->FillSolidRect( &m_rectReport, clrBK );
pDC->Draw3dRect( &m_rectReport, clrBorder, clrBorder );
pDC->SetBkColor( clrBK );
// Select Name And Code Font
CString strTemp, strFont, strTempFmt, strDay;
strDay.LoadString( IDS_STOCKGRAPH_DAY );
CFont * pOldFont = AfxSelectDCFont( pDC, 18 );
// Draw Name And Code
pDC->SetTextColor( clrTitle );
pDC->TextOut( m_rectReport.left+1, m_rectAll.top+3, m_CurStock.GetStockInfo().GetStockName() );
pDC->SetTextColor( clrText );
pDC->TextOut( m_rectReport.left+96, m_rectAll.top+3, m_CurStock.GetStockInfo().GetStockCode() );
// Select Param Font
AfxSelectDCFont( pDC, 14 );
// Draw Param Names
int x = m_rectReport.left + 6;
int y = m_rectReport.top;
pDC->SetTextColor( clrText );
strTemp.LoadString( IDS_STOCKGRAPH_TIME2 );
pDC->TextOut( x, y+5, strTemp );
#ifdef CLKLAN_ENGLISH_US
strTempFmt.Format( "(%d)", AfxGetProfile().GetYieldAverageDays() );
#else
strTempFmt.Format( "-%d%s-", AfxGetProfile().GetYieldAverageDays(), strDay );
#endif
strTemp.LoadString( IDS_STOCKGRAPH_YIELDAVERAGE );
pDC->TextOut( x, y+30, strTemp+strTempFmt );
strTemp.LoadString( IDS_STOCKGRAPH_YIELDSTDDEV );
pDC->TextOut( x, y+55, strTemp+strTempFmt );
strTemp.LoadString( IDS_STOCKGRAPH_BEITE );
pDC->TextOut( x, y+80, strTemp+strTempFmt );
strTemp.LoadString( IDS_STOCKGRAPH_XIAPU );
pDC->TextOut( x, y+105, strTemp+strTempFmt );
DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+126, m_rectReport.right, y+126 );
strTempFmt.LoadString( IDS_STOCKGRAPH_CHANGEHAND );
strTemp.Format( "%s-%d", strTempFmt, 1 );
pDC->TextOut( x, y+130, strTemp );
strTemp.Format( "%s-%d", strTempFmt, 5 );
pDC->TextOut( x, y+155, strTemp );
strTemp.Format( "%s-%d", strTempFmt, 10 );
pDC->TextOut( x, y+180, strTemp );
strTemp.Format( "%s-%d", strTempFmt, 20 );
pDC->TextOut( x, y+205, strTemp );
DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+226, m_rectReport.right, y+226 );
strTempFmt.LoadString( IDS_STOCKGRAPH_RATIOVOLUME );
strTemp.Format( "%s-%d", strTempFmt, 5 );
pDC->TextOut( x, y+230, strTemp );
strTemp.Format( "%s-%d", strTempFmt, 10 );
pDC->TextOut( x, y+255, strTemp );
strTemp.Format( "%s-%d", strTempFmt, 20 );
pDC->TextOut( x, y+280, strTemp );
DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+301, m_rectReport.right, y+301 );
strTempFmt.LoadString( IDS_STOCKGRAPH_RS );
strTemp.Format( "%s-%d", strTempFmt, 5 );
pDC->TextOut( x, y+305, strTemp );
strTemp.Format( "%s-%d", strTempFmt, 10 );
pDC->TextOut( x, y+330, strTemp );
strTemp.Format( "%s-%d", strTempFmt, 20 );
pDC->TextOut( x, y+355, strTemp );
DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+376, m_rectReport.right, y+376 );
strTemp.LoadString( IDS_STOCKGRAPH_SHARETOTAL );
pDC->TextOut( x, y+380, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_SHARECURRENCY );
pDC->TextOut( x, y+405, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_NETASSETPS );
pDC->TextOut( x, y+430, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_EPS );
pDC->TextOut( x, y+455, strTemp );
strTemp.LoadString( IDS_STOCKGRAPH_PE );
pDC->TextOut( x, y+480, strTemp );
// Draw Param Values
// Time
UINT nOldAlign = pDC->SetTextA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -