?? stockgraph.cpp
字號:
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 = "時 間";
pDC->TextOut( x, y+2, strTemp );
strTemp = "開 盤";
pDC->TextOut( x, y+37, strTemp );
strTemp = "最 高";
pDC->TextOut( x, y+71, strTemp );
strTemp = "最 低";
pDC->TextOut( x, y+105, strTemp );
strTemp = "收 盤";
pDC->TextOut( x, y+139, strTemp );
strTemp = "成交量";
pDC->TextOut( x, y+173, strTemp );
strTemp = "成交額";
pDC->TextOut( x, y+207, strTemp );
strTemp = "成交均價";
pDC->TextOut( x, y+241, strTemp );
strTemp = "換手率";
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 = "日";
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 = "時間";
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 = "年收益率";
pDC->TextOut( x, y+30, strTemp+strTempFmt );
strTemp = "標準差";
pDC->TextOut( x, y+55, strTemp+strTempFmt );
strTemp = "β值";
pDC->TextOut( x, y+80, strTemp+strTempFmt );
strTemp = "夏普指數";
pDC->TextOut( x, y+105, strTemp+strTempFmt );
DrawLine( pDC, 1, clrBorder, m_rectReport.left, y+126, m_rectReport.right, y+126 );
strTempFmt = "換手";
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 = "量比";
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 = "相對強度";
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 = "總股本-萬";
pDC->TextOut( x, y+380, strTemp );
strTemp = "流通股本-萬";
pDC->TextOut( x, y+405, strTemp );
strTemp = "每股凈資產";
pDC->TextOut( x, y+430, strTemp );
strTemp = "每股凈資產";
pDC->TextOut( x, y+455, strTemp );
strTemp = "市盈率";
pDC->TextOut( x, y+480, strTemp );
// Draw Param Values
// Time
UINT nOldAlign = pDC->SetTextAlign( TA_RIGHT | TA_TOP );
pDC->SetTextColor( clrPlane );
x = m_rectReport.right - 5;
CSPTime sptime;
if( CKData::IsDayOrMin( m_nCurKType ) )
{
sptime.FromStockTimeDay( dateCurrent );
strTemp = sptime.Format( "%Y-%m-%d" );
}
else
{
sptime.FromStockTimeMin( dateCurrent );
strTemp = sptime.Format( "%Y-%m-%d %H:%M" );
}
pDC->TextOut( x, y+5, strTemp );
// Change Hand
strTemp = "- ";
if( info.GetRatioChangeHand( kdata, &dValue, dateCurrent, 1) )
strTemp.Format( "%.2f%%", dValue );
pDC->TextOut( x, y+130, strTemp );
strTemp = "- ";
if( info.GetRatioChangeHand( kdata, &dValue, dateCurrent, 5) )
strTemp.Format( "%.2f%%", dValue );
pDC->TextOut( x, y+155, strTemp );
strTemp = "- ";
if( info.GetRatioChangeHand( kdata, &dValue, dateCurrent, 10) )
strTemp.Format( "%.2f%%", dValue );
pDC->TextOut( x, y+180, strTemp );
strTemp = "- ";
if( info.GetRatioChangeHand( kdata, &dValue, dateCurrent, 20) )
strTemp.Format( "%.2f%%", dValue );
pDC->TextOut( x, y+205, strTemp );
// Ratio Volume
strTemp = "- ";
if( kdata.GetRatioVolume(&dValue, dateCurrent, 5) )
strTemp.Format( "%.2f", dValue );
pDC->SetTextColor( dValue >= 1.005 ? clrRise : (dValue<0.995?clrFall:clrPlane) );
pDC->TextOut( x, y+230, strTemp );
strTemp = "- ";
if( kdata.GetRatioVolume(&dValue, dateCurrent, 10) )
strTemp.Format( "%.2f", dValue );
pDC->SetTextColor( dValue >= 1.005 ? clrRise : (dValue<0.995?clrFall:clrPlane) );
pDC->TextOut( x, y+255, strTemp );
strTemp = "- ";
if( kdata.GetRatioVolume(&dValue, dateCurrent, 20) )
strTemp.Format( "%.2f", dValue );
pDC->SetTextColor( dValue >= 1.005 ? clrRise : (dValue<0.995?clrFall:clrPlane) );
pDC->TextOut( x, y+280, strTemp );
// RS
strTemp = "- ";
if( kdata.GetRS(&dValue, dateCurrent, 5) )
strTemp.Format( "%.2f%%", dValue );
pDC->SetTextColor( dValue >= 1.005 ? clrRise : (dValue<0.995?clrFall:clrPlane) );
pDC->TextOut( x, y+305, strTemp );
strTemp = "- ";
if( kdata.GetRS(&dValue, dateCurrent, 10) )
strTemp.Format( "%.2f%%", dValue );
pDC->SetTextColor( dValue >= 1.005 ? clrRise : (dValue<0.995?clrFall:clrPlane) );
pDC->TextOut( x, y+330, strTemp );
strTemp = "- ";
if( kdata.GetRS(&dValue, dateCurrent, 20) )
strTemp.Format( "%.2f%%", dValue );
pDC->SetTextColor( dVal
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -