⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chartmacd.cpp

📁 类似于股市K线技术分析的系统源码
💻 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 + -