// Technical Lines
void CStockGraph::DrawTechMACD( CDC * pDC, CRect rect, BOOL bDrawTitle, int nTech, CMACD * pmacd )
{
CHECK_NODATATODRAW
DECLARE_COLOR_DEFINATION
COLORREF clrLine1 = AfxGetProfile().GetColor(CColorClass::clrLine1);
COLORREF clrLine2 = AfxGetProfile().GetColor(CColorClass::clrLine2);
// Prepare
CKData & kdata = m_CurStock.GetKData(m_nCurKType);
m_techparam.macd.AttachParameters( AfxGetProfile().GetTechParameters().macd );
if( NULL == pmacd )
{
pmacd = &(m_techparam.macd);
nTech = STT_MACD;
}
double dMin = 0, dMax = 1;
if( !pmacd->GetMinMaxInfo( m_nIndexStart, m_nIndexEnd, &dMin, &dMax )
|| !DrawAxis( pDC, rect, m_nHeightSubtitle, 5, dMin, dMax, FALSE, TRUE, 2 ) )
return;
// Draw Title
if( bDrawTitle )
DrawTechTitle( pDC, rect.left+5, rect.top+1,AfxGetSTTShortName(nTech), TA_LEFT | TA_TOP, 14, clrBK, clrTitle );
// Draw
double dEMA1 = 0, dEMA2 = 0, dDIF = 0, dDEA = 0;
int yDIFLast = (int)dMin, yDIFNow, yDEALast = (int)dMin, yDEANow;
BOOL bHasLast = FALSE;
for( int nIndex=m_nIndexStart; nIndex<=m_nIndexEnd; nIndex++ )
{
// Prepare Rect
CRect rectK;
long xMedium = 0;
if( !GetOneKLineRect( nIndex, &rectK, NULL, NULL, &xMedium ) )
continue;
// Draw
if( pmacd->Calculate( &dEMA1, &dEMA2, &dDIF, &dDEA, nIndex, bHasLast ) )
{
yDIFNow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dDIF - dMin) / (dMax-dMin) );
yDEANow = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (dDEA - dMin) / (dMax-dMin) );
int yZero = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (0-dMin) / (dMax-dMin) );
int yGap = int( rect.bottom - (rect.Height()-m_nHeightSubtitle) * (2*dDIF-2*dDEA-dMin) / (dMax-dMin) );
if( bHasLast )
{
CPen penDiff( PS_SOLID, 1, (dDIF-dDEA)>0 ? clrRise : clrFall );
CPen * pOldPen = pDC->SelectObject( &penDiff );
pDC->MoveTo( xMedium, yZero );
pDC->LineTo( xMedium, yGap );
pDC->SelectObject( pOldPen );
if( nIndex > m_nIndexStart )
{
if( yDIFLast > rect.bottom || yDIFLast < rect.top+m_nHeightSubtitle || yDIFNow > rect.bottom || yDIFNow < rect.top+m_nHeightSubtitle
|| yDEALast > rect.bottom || yDEALast < rect.top+m_nHeightSubtitle || yDEANow > rect.bottom || yDEANow < rect.top+m_nHeightSubtitle )
continue;
CPen penDIF( PS_SOLID, 1, clrLine1 );
pOldPen = pDC->SelectObject( &penDIF );
pDC->MoveTo( xMedium-m_nThickness, yDIFLast );
pDC->LineTo( xMedium, yDIFNow );
CPen penDEA( PS_SOLID, 1, clrLine2 );
pDC->SelectObject( &penDEA );
pDC->MoveTo( xMedium-m_nThickness, yDEALast );
pDC->LineTo( xMedium, yDEANow );
pDC->SelectObject( pOldPen );
}
}
bHasLast = TRUE;
yDIFLast = yDIFNow;
yDEALast = yDEANow;
// Draw Sub Title, Param Value
int nIndexParam = ( m_nIndexCurrent >= 0 ? m_nIndexCurrent : kdata.GetSize()-1 );
if( bDrawTitle && nIndex == nIndexParam )
{
if( rect.left+300 <= rect.right )
{
CFont * pOldFont = AfxSelectDCFont( pDC, 12 );
pDC->SetBkColor( clrBK );
CString strText;
strText.Format( "EMA(%d) EMA(%d) DIF %.2f ", pmacd->m_nEMA1Days, pmacd->m_nEMA2Days, dDIF );
pDC->SetTextColor( clrLine1 );
pDC->TextOut( rect.left+m_nWidthSubtitle, rect.top+1, strText );
strText.Format( "DEA(%d) %.2f", pmacd->m_nDIFDays, dDEA );
pDC->SetTextColor( clrLine2 );
pDC->TextOut( rect.left+m_nWidthSubtitle+m_nWidthParameter*2, rect.top+1, strText );
pDC->SelectObject( pOldFont );
}
}
}
}
}