📄 chartmacd.cpp
字号:
// ChartMACD.cpp: implementation of the CChartMACD class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "LastProject.h"
#include "ChartMACD.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CChartMACD::CChartMACD(CRecords *pRecords,CDirectFace * pFace,int Short,int Long,int M)
{
int nWidth = pFace->m_rect.Width() - 60;
int nHeight = pFace->m_rect.Height() - 50;
int Zero = pFace->m_rect.Height() - 20;
double max = 0,min = 9999;
//计算所画区域中的最大最小值
for(int i = pRecords->m_records.size()-1;i>=0;i--)
{
if(nWidth<8) break;
if(pRecords->m_records.at(i).max>max) max = pRecords->m_records.at(i).max;
if(pRecords->m_records.at(i).min<min) min = pRecords->m_records.at(i).min;
nWidth -= 10;
}
nWidth = pFace->m_rect.Width() - 60;
if(max==min)
{
max = min * 1.4;
min = min * 0.8;
}
double delta = max - min;
CString fmt,str;
HDC layer = NULL;
pFace->m_lpLayer[1]->GetDC(&layer);
CDC *pDC = CDC::FromHandle(layer);
pDC->SetBkColor(RGB(0,0,0));
pDC->SetTextColor(RGB(0,170,0));
//刷清图层
pDC->SelectObject(::GetStockObject(BLACK_BRUSH));
pDC->SelectObject(&pFace->m_FramePen);
pDC->Rectangle(0,0,pFace->m_rect.Width(),pFace->m_rect.Height());
//画题头部分
pDC->SelectObject(&pFace->m_TitleFont);
pDC->TextOut(5,8,CodeToName(pRecords->ExCode));
pDC->TextOut(70,8,pRecords->TableName);
pDC->SetTextColor(RGB(255,255,0));
pDC->TextOut(127,8,"MACD(");
pDC->SetTextColor(RGB(255,0,0));
str.Format("%3d",Short);
pDC->TextOut(160,8,str);
pDC->SetTextColor(RGB(255,255,0));
pDC->TextOut(180,8,",");
pDC->SetTextColor(RGB(0,255,0));
str.Format("%3d",Long);
pDC->TextOut(190,8,str);
pDC->SetTextColor(RGB(255,255,0));
str.Format(",%3d)",M);
pDC->TextOut(210,8,str);
pDC->SetTextColor(RGB(0,170,0));
//画坐标轴
pDC->SelectObject(&pFace->m_WhitePen);
pDC->MoveTo(3,Zero);
pDC->LineTo(nWidth+5,Zero);
pDC->LineTo(nWidth+5,30);
int lab = 0;
pDC->SelectObject(&pFace->m_XFont);
for(i = pRecords->m_records.size()-1;i>=0;i--)
{
if(nWidth<8) break;
if(lab++%6 == 0)
{
if(pRecords->TableName=="五分钟" || pRecords->TableName == "三十分钟") fmt = "%d %H:%M";
if(pRecords->TableName=="小时") fmt = "%d日%H点";
if(pRecords->TableName=="日" || pRecords->TableName=="周") fmt = "%m月%d日";
if(pRecords->TableName=="月") fmt = "%y年%m月";
pDC->TextOut(nWidth-25,Zero+5,pRecords->m_records.at(i).DateTime.Format(fmt));
pDC->SelectObject(&pFace->m_GrayPen);
pDC->MoveTo(nWidth,Zero);
pDC->LineTo(nWidth,30);
}
nWidth -= 10;
}
deque<double> ema_short,ema_long,diff;
double ema1 = 0,ema2 = 0;
if(pRecords->m_records.size()>0)
{
ema1 = pRecords->m_records.at(0).close;
ema2 = ema1;
}
double Max = 0,Min = 9999,Diff=0,temp;
for(i = 0;i<pRecords->m_records.size();i++)
{
ema1 = EMA(pRecords->m_records.at(i).close,Short,ema1);
ema2 = EMA(pRecords->m_records.at(i).close,Long,ema2);
temp = (ema1 - ema2)>=0? ema1 - ema2:ema2 - ema1;
if(i+1>=Short) ema_short.push_back(ema1);
if(i+1>=Long) ema_long.push_back(ema2);
if(i+1>=Long && i+1>=Short) diff.push_back(ema1 - ema2);
}
//调整画图区域
nWidth = pFace->m_rect.Width() - 60;
for(i = ema_short.size()-1;i>=0;i--)
{
if(nWidth<3) break;else nWidth -= 10;
ema1 = ema_short.at(i);
if(Max<ema1) Max = ema1;
if(Min>ema1) Min = ema1;
}
nWidth = pFace->m_rect.Width() - 60;
for(i = ema_long.size()-1;i>=0;i--)
{
if(nWidth<3) break;else nWidth -= 10;
ema1 = ema_long.at(i);
if(Max<ema1) Max = ema1;
if(Min>ema1) Min = ema1;
}
nWidth = pFace->m_rect.Width() - 60;
for(i = diff.size()-1;i>=0;i--)
{
if(nWidth<3) break;else nWidth -= 10;
if(Diff<diff.at(i)) Diff = diff.at(i);
}
if( Diff > (Max-Min) )
{
temp = (Max + Min) / 2.0;
Max = temp + Diff ;
Min = temp - Diff ;
}
Diff = Max - Min;
temp = (Max + Min) / 2.0;
Max = temp + Diff * 0.6;
Min = temp - Diff * 0.6;
Diff = Max - Min;
//画平行于X轴网格
nWidth = pFace->m_rect.Width() - 60;
pDC->SelectObject(&pFace->m_GrayPen);
pDC->SelectObject(&pFace->m_YFont);
if(pRecords->ExCode.Find("27")!=-1) fmt = "%.02lf";else fmt = "%.04lf";
for(i = 0;i<=8;i++)
{
int y = (int)(nHeight * i / 8);
str.Format(fmt,Min + Diff * i / 8);
pDC->TextOut(nWidth+10,Zero-y-6,str);
if(i==0) continue;
pDC->MoveTo(3,Zero - y);
pDC->LineTo(nWidth+5,Zero - y);
}
//画Diff
nWidth = pFace->m_rect.Width() - 60;
for(i = diff.size()-1;i>0;i--)
{
if(nWidth<13 ) break;
int X1 = nWidth + 3;
int X2 = nWidth - 2;
int Y1 = Zero - nHeight / 2;
int Y2 = Y1 - diff.at(i) * nHeight / Diff;
if(Y2<Y1)
{
pDC->SelectObject(&pFace->m_RedBarPen);
pDC->SelectObject(&pFace->m_RedBarBrush);
pDC->Rectangle(X1,Y1,X2,Y2);
}
if(Y2>Y1)
{
pDC->SelectObject(&pFace->m_GreenBarPen);
pDC->SelectObject(&pFace->m_GreenBarBrush);
pDC->Rectangle(X1,Y1,X2,Y2);
}
if(Y2==Y1)
{
pDC->SelectObject(&pFace->m_YellowPen);
pDC->MoveTo(X1,Y1);
pDC->LineTo(X2,Y2);
}
nWidth -= 10;
}
//画EMA_SHORT
nWidth = pFace->m_rect.Width() - 60;
pDC->SelectObject(&pFace->m_RedPen);
for(i = ema_short.size()-1;i>0;i--)
{
if(nWidth<13 ) break;
int X1 = nWidth;
int X2 = nWidth - 10;
int Y1 = Zero - (ema_short.at(i) - Min) * nHeight / Diff;
int Y2 = Zero - (ema_short.at(i-1) - Min) * nHeight / Diff;
pDC->MoveTo(X1,Y1);
pDC->LineTo(X2,Y2);
nWidth -= 10;
}
//画EMA_LONG
nWidth = pFace->m_rect.Width() - 60;
pDC->SelectObject(&pFace->m_GreenPen);
for(i = ema_long.size()-1;i>0;i--)
{
if(nWidth<13 ) break;
int X1 = nWidth;
int X2 = nWidth - 10;
int Y1 = Zero - (ema_long.at(i) - Min) * nHeight / Diff;
int Y2 = Zero - (ema_long.at(i-1) - Min) * nHeight / Diff;
pDC->MoveTo(X1,Y1);
pDC->LineTo(X2,Y2);
nWidth -= 10;
}
if(diff.size()>0) diff.clear();
if(ema_short.size()>0) ema_short.clear();
if(ema_long.size()>0) ema_long.clear();
pFace->m_lpLayer[1]->ReleaseDC(layer);
pFace->m_lpLayer[0]->BltFast(0,0,pFace->m_lpLayer[1],CRect(0,0,pFace->m_rect.Width(),pFace->m_rect.Height()),DDBLTFAST_WAIT);
pFace->m_lpPSur->BltFast(pFace->m_rect.left,pFace->m_rect.top,pFace->m_lpLayer[0],CRect(0,0,pFace->m_rect.Width(),pFace->m_rect.Height()),DDBLTFAST_WAIT);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -