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

📄 singleview.cpp

📁 一种简单的股票软件源代码,编译后可以实时显示证券行情
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	for(int ii=0;ii<an;ii++)
	{
		if(ii==0) longv[ii]=rx[ii].m_fClose;
		if(ii<L && ii>0)
		{
			for(int m=0;m<ii;m++)
			{
				sum+=rx[ii-m].m_fClose;
			}
			longv[ii]=sum/ii;
			sum=0.00;
		}
		if(ii>=L)
		{
			for(int j=0;j<L;j++)
			{
				sum+=rx[ii-j].m_fClose;
			}
			longv[ii]=sum/L;
			sum=0.00;
		}
	}
	double* DIF=new double[an];
	for(int iii=0;iii<an;iii++)
	{
		DIF[iii]=shortv[iii]-longv[iii];
	}
	delete [] shortv;
	delete [] longv;
	
	double* MACD=new double[an];
	sum=0.00;
	for(int iiii=0;iiii<an;iiii++)
	{
		if(iiii==0) MACD[iiii]=DIF[iiii];
		if(iiii<V && iiii>0)
		{
			for(int m=0;m<iiii;m++)
			{
				sum+=DIF[iiii];
			}
			MACD[iiii]=sum/iiii;
			sum=0.00;
		}
		if(iiii>=V)
		{
			for(int j=0;j<V;j++)
			{
				sum+=DIF[iiii-j];
			}
			MACD[iiii]=sum/V;
			sum=0.00;
		}
	}
	//MACD赋值完毕 
	//验证正确
	/////////////////////////////////
	if(an>=m_days)
	{
		for(int di=an-m_days;di<an;di++)
		{
			if(DIF[di]>=pH) pH=DIF[di];
			if(MACD[di]>=pH) pH=MACD[di];
			if(DIF[di]<=pL) pL=DIF[di];
			if(MACD[di]<=pL) pL=MACD[di];
		}
	}
	if(an<m_days)
	{
		for(int di=0;di<an;di++)
		{
			if(DIF[di]>=pH) pH=DIF[di];
			if(MACD[di]>=pH) pH=MACD[di];
			if(DIF[di]<=pL) pL=DIF[di];
			if(MACD[di]<=pL) pL=MACD[di];
		}
	}
	//找出最高和最低
	//一下开始画线
	int MAC=m_pointY[2]-m_pointY[1];
	double bb=(MAC-20)/(pH-pL);//得到单位像素数
	int line0=m_pointY[2]+pL*bb;
	pDC->MoveTo(0,line0);
	pDC->LineTo(bj-50,line0);
	int pos=0;
	//
	if(an>=m_days)
	{
		////////////////////////////////1.画DIF
		double fff=(DIF[an-m_days]-pL)*bb;
		int DIFy1=m_pointY[2]-fff;
		CPen pen(PS_SOLID,1,RGB(0,32,255));
		CPen* Oldpen=pDC->SelectObject(&pen);
		pDC->MoveTo(zx,DIFy1);
		pos=zx;
		for(int p=an-m_days;p<an;p++)
		{
			int DIFy=m_pointY[2]-(DIF[p]-pL)*bb;
			pDC->LineTo(pos,DIFy);
			pos+=(m_KWidth+1);
		}
		pDC->SelectObject(Oldpen);
		pos=zx;
		pDC->SetTextColor(RGB(0,32,255));
		CString str;
		str.Format("%5.3f",DIF[an-1]/100.00);
		pDC->TextOut(100,m_pointY[1]+1,"DIF:"+str);
		pDC->SetTextColor(RGB(0,0,0));
		
		/////////////////////////////////////2.画MACD
		double mf=(MACD[an-m_days]-pL)*bb;
		int MACDy1=m_pointY[2]-mf;
		CPen pen1(PS_SOLID,1,RGB(22,171,18));
		CPen* Oldpen1=pDC->SelectObject(&pen1);
		pDC->MoveTo(zx,MACDy1);
		for(int p2=an-m_days;p2<an;p2++)
		{
			int MACDy=m_pointY[2]-(MACD[p2]-pL)*bb;
			pDC->LineTo(pos,MACDy);
			pos+=(m_KWidth+1);
		}
		pDC->SelectObject(Oldpen1);
		pos=zx;
		pDC->SetTextColor(RGB(128,0,128));
		CString str1;
		str1.Format("%5.3f",MACD[an-1]/100.00);
		pDC->TextOut(170,m_pointY[1]+1,"MACD:"+str1);
		pDC->SetTextColor(RGB(0,0,0));
		////////////////////////////////////////3.画柱状线
		for(int p3=an-m_days;p3<an;p3++)
		{
			pDC->MoveTo(pos,line0);
			int D_M=(DIF[p3]-MACD[p3]);
			if(D_M>0)
			{
				CPen pen2(PS_SOLID,1,RGB(255,0,0));
				CPen* Oldpen2=pDC->SelectObject(&pen2);
				pDC->LineTo(pos,line0-D_M*bb);
				pDC->SelectObject(Oldpen2);
			}
			if(D_M<=0)
			{
				CPen pen3(PS_SOLID,1,RGB(0,128,64));
				CPen* Oldpen3=pDC->SelectObject(&pen3);
				pDC->LineTo(pos,line0-D_M*bb);
				pDC->SelectObject(Oldpen3);
			}
			pos+=(m_KWidth+1);
		}
		if(DIF[an-1]-MACD[an-1]>=0)
		{
			pDC->SetTextColor(RGB(255,0,255));
		}
		else
		{
			pDC->SetTextColor(RGB(0,180,0));
		}
		
		CString str2;
		str2.Format("%5.3f",(DIF[an-1]-MACD[an-1])/100.00);
		pDC->TextOut(260,m_pointY[1]+1,"DEA:"+str2);
		pDC->SetTextColor(RGB(0,0,0));
		delete [] DIF;
		delete [] MACD;
		
	}
	if(an<m_days)
	{
		double fff=(DIF[0]-pL)*bb;
		int DIFy1=m_pointY[2]-fff;
		CPen pen(PS_SOLID,1,RGB(0,32,255));
		CPen* Oldpen=pDC->SelectObject(&pen);
		pDC->MoveTo(zx,DIFy1);
		pos=zx;
		
		for(int p=1;p<an;p++)
		{
			int DIFy=m_pointY[2]-(DIF[p]-pL)*bb;
			pDC->LineTo(pos,DIFy);
			pos+=(m_KWidth+1);
		}
		pos=zx;
		pDC->SelectObject(Oldpen);
		pDC->SetTextColor(RGB(0,32,255));
		CString str;
		str.Format("%5.3f",DIF[an-1]/100.00);
		pDC->TextOut(100,m_pointY[1]+1,"DIF:"+str);
		pDC->SetTextColor(RGB(0,0,0));
		//////////////
		double mf=(MACD[0]-pL)*bb;
		int MACDy1=m_pointY[2]-mf;
		CPen pen1(PS_SOLID,1,RGB(22,171,18));
		CPen* Oldpen1=pDC->SelectObject(&pen1);
		pDC->MoveTo(zx,MACDy1);
		for(int p2=0;p2<an;p2++)
		{
			int MACDy=m_pointY[2]-(MACD[p2]-pL)*bb;
			pDC->LineTo(pos,MACDy);
			pos+=(m_KWidth+1);
		}
		pDC->SelectObject(Oldpen1);
		pos=zx;
		pDC->SetTextColor(RGB(128,0,128));
		CString str1;
		str1.Format("%5.3f",MACD[an-1]/100.00);
		pDC->TextOut(170,m_pointY[1]+1,"MACD:"+str1);
		pDC->SetTextColor(RGB(0,0,0));
		/////////////////////////////////
		for(int p3=0;p3<an;p3++)
		{
			pDC->MoveTo(pos,line0);
			int D_M=DIF[p3]-MACD[p3];
			if(D_M>0)
			{
				CPen pen2(PS_SOLID,1,RGB(255,0,0));
				CPen* Oldpen2=pDC->SelectObject(&pen2);
				pDC->LineTo(pos,line0-D_M*bb);
				pDC->SelectObject(Oldpen2);
			}
			if(D_M<=0)
			{
				CPen pen3(PS_SOLID,1,RGB(0,128,64));
				CPen* Oldpen3=pDC->SelectObject(&pen3);
				pDC->LineTo(pos,line0-D_M*bb);
				pDC->SelectObject(Oldpen3);
			}
			pos+=(m_KWidth+1);
		}
		if(DIF[an-1]-MACD[an-1]>=0)
		{
			pDC->SetTextColor(RGB(255,0,255));
		}
		else
		{
			pDC->SetTextColor(RGB(0,180,0));
		}
		
		CString str2;
		str2.Format("%5.3f",(DIF[an-1]-MACD[an-1])/100.00);
		pDC->TextOut(260,m_pointY[1]+1,"DEA:"+str2);
		pDC->SetTextColor(RGB(0,0,0));
		delete [] DIF;
		delete [] MACD;
		ReleaseDC(pDC);
	}
	
}

void CSingleView::KDJ(int n)
{
	CDC* pDC=GetDC();
	RECT rect;
	GetClientRect(&rect);
	//CBrush myBrush(RGB(255,255,255));
	//pDC->FillRect(&rect,&myBrush);
	int pos=0;//X轴增量
	CString s1;
	s1.Format("%d",n);
	pDC->TextOut(1,m_pointY[0]+1,"KDJ("+s1+")");
	
	m_days=((rect.right)/4*3-50)/(m_KWidth+1);//画面周期
	int pH=0;
	int pL=99999999;
	int Close=0;
	CMyStockDoc* pDoc=(CMyStockDoc*)GetDocument();
	CString str=".\\DAY\\"+pDoc->m_FileName;
	str+=".day";
	ifstream kdjfile(str,ios::binary);
	kdjfile.seekg(0,ios::end);
	int fsize=kdjfile.tellg();
	an=fsize/sizeof(RCV_HISTORY_STRUCTEx);//得到总日期数
	int pk=0;
	RCV_HISTORY_STRUCTEx* rx=new RCV_HISTORY_STRUCTEx[an];//定义一个数组
	kdjfile.seekg(0,ios::beg);//设置到文件头
	for(int a=0;a<an;a++)
	{
		kdjfile.read((char*)/*mrx*/&rx[a],sizeof(RCV_HISTORY_STRUCTEx));
	}
	kdjfile.close();//关闭文件不要再使用delete kdjfile;
	//读数据到数组(经检查正确)
	//最后一个有效元素是下标为an-1的元素
	//下标为an的元素无效
	/////////////////////////////////////////
	//下面这段是数据验证代码:
	time_t time0=rx[0].m_time;
	int aaaa0=rx[0].m_fClose;
	
	time_t time1=rx[1].m_time;
	int aaaa1=rx[1].m_fClose;
	
	int aaaaan=rx[an-1].m_fClose;//最后一个有效元素是下标为an-1的元素
	time_t timean1=rx[an].m_time;
	int aaaaan1=rx[an].m_fClose;//下标为an的元素无效
	
	//数据验证代码结束
	////////////////////////////////////////
	MYKDJ* kdjarray=new MYKDJ[an];// 定义一个kdj天数的数组,n是kdj的周期
	////////////////////////////////
	//开始为kdj数组赋值:
	kdjarray[0].k=50.00;
	kdjarray[0].d=50.00;
	kdjarray[0].j=50.00;
	for(int ii=1;ii<an;ii++)
	{
		if(ii>0 && ii<n)//n是参数
		{
			for(int k=0;k<=ii;k++)
			{
				if(rx[ii-k].m_fClose>=pH)
				{
					pH=rx[ii-k].m_fClose;//找到最高和最低
				}
				if(rx[ii-k].m_fClose<=pL)
				{
					pL=rx[ii-k].m_fClose;
				}
				Close=rx[ii].m_fClose;	 
				
			}
			pk=(Close-pL)/(pH-pL)*100.00;//计算kdj  AAA
			kdjarray[ii].k=kdjarray[ii-1].k*2/3+pk/3;
			kdjarray[ii].d=kdjarray[ii-1].d*2/3+kdjarray[ii].k/3;
			kdjarray[ii].j=kdjarray[ii].k*3-kdjarray[ii].d*2;
			pH=1;
			pL=99999999;
		}
		//////////////////////////////////////
		if(ii>=n)
		{
			for(int jj=0;jj<n;jj++)
			{
				if(rx[ii-jj].m_fClose>=pH)
				{
					pH=rx[ii-jj].m_fClose;
				}
				if(rx[ii-jj].m_fClose<=pL)
				{
					pL=rx[ii-jj].m_fClose;
				}
			}
			Close=rx[ii].m_fClose;
			int pp=Close-pL;//
			double kk=pH-pL;//
			if(kk==0.000000000000000000)
			{
				kk=0.000000009;
				
			}
			pk=pp/kk*100.00;// 这3行等效于AAA处,但如果同样写法会出现C1001编译器错误。
			pH=0;
			pL=99999999;
			kdjarray[ii].k=kdjarray[ii-1].k*2/3+pk/3;
			kdjarray[ii].d=kdjarray[ii-1].d*2/3+kdjarray[ii].k/3;
			kdjarray[ii].j=kdjarray[ii].k*3-kdjarray[ii].d*2;
		}
	}// 完成为kdj数组赋值
	delete [] rx;//删除数组
	//////////////////////////////////////
	//以下开始画线
	int kdj=m_pointY[1]-m_pointY[0]-20;
	double bb=kdj/120.00;
	
	//char kkdj[10];
	//gcvt(an,8,kkdj);
	//pDC->TextOut(100,m_pointY[0]+20,"总天数");
	//pDC->TextOut(150,m_pointY[0]+20,kkdj);
	//gcvt(am,8,kkdj);
	//pDC->TextOut(100,m_pointY[0]+60,kkdj);
	////////////
	//分两种情况:
	//第一种:
	if(an>=m_days)
	{
		/////////////////////////k
		double k1=kdjarray[an-m_days].k;
		int ky=m_pointY[0]+20+bb*10+(100-k1)*bb;
		CPen pen(PS_SOLID,1,m_Line1Color);
		CPen* Oldpen=pDC->SelectObject(&pen);
		pDC->MoveTo(zx,ky);
		pos=zx;
		for(int km=an-m_days;km<an;km++)
		{
			double k=kdjarray[km].k;
			CString myk;
			myk.Format("%5.2f",k/1.00);
			myk="K: "+myk;
			pDC->SetTextColor(m_Line1Color);
			pDC->TextOut(60,m_pointY[0]+1,myk);
			int ky2=m_pointY[0]+20+bb*10+(100-k)*bb;
			pDC->LineTo(pos,ky2);
			pDC->SetTextColor(RGB(0,0,0));
			pos+=(m_KWidth+1);
			
		}
		pos=zx;
		pDC->SelectObject(Oldpen);
		//////////////////////////d
		CPen pend(PS_SOLID,1,RGB(22,171,18));
		CPen* Oldpend=pDC->SelectObject(&pend);
		double d1=kdjarray[an-m_days].d;
		int dy=m_pointY[0]+20+bb*10+(100-d1)*bb;
		pDC->MoveTo(zx,dy);
		for(int dm=an-m_days;dm<an;dm++)
		{
			double d=kdjarray[dm].d;
			CString myd;
			myd.Format("%5.2f",d/1.00);
			myd="D: "+myd;
			pDC->SetTextColor(RGB(22,171,18));
			pDC->TextOut(140,m_pointY[0]+1,myd);
			int dy2=m_pointY[0]+20+bb*10+(100-d)*bb;
			pDC->LineTo(pos,dy2);
			pDC->SetTextColor(RGB(0,0,0));
			pos+=(m_KWidth+1);
			
		}
		pDC->SelectObject(Oldpend);
		pos=zx;
		///////////////////j
		CPen penj(PS_SOLID,1,RGB(255,0,255));
		CPen* Oldpenj=pDC->SelectObject(&penj);
		double j1=kdjarray[an-m_days].j;
		int jy=m_pointY[0]+20+bb*10+(100-j1)*bb;
		pDC->MoveTo(zx,jy);
		for(int jm=an-m_days;jm<an;jm++)
		{
			double j=kdjarray[jm].j;
			int jy2=m_pointY[0]+20+bb*10+(100-j)*bb;
			CString myj;
			myj.Format("%5.2f",j/1.00);
			myj="J: "+myj;
			pDC->SetTextColor(RGB(255,0,255));
			pDC->TextOut(210,m_pointY[0]+1,myj);
			pDC->SetTextColor(RGB(0,0,0));
			if(jy2<m_pointY[0]+20)
			{
				jy2=m_pointY[0]+20;
			}
			if(jy2>m_pointY[1])
			{
				jy2=m_pointY[1]-1;
			}
			pDC->LineTo(pos,jy2);
			pos+=(m_KWidth+1);
		}
		pDC->SelectObject(Oldpenj);
		pos=zx;
		delete [] kdjarray;//删除数组
	}
	///第二种:
	else
	{
		int pos=zx;
		/////////////////////////k
		CPen penk(PS_SOLID,1,RGB(0,32,255));
		CPen* Oldpenk=pDC->SelectObject(&penk);
		int k1=kdjarray[0].k;
		int py=m_pointY[0]+20+bb*10+(100-k1)*bb;
		pDC->MoveTo(zx,py);
		for(int mm=0;mm<an;mm++)
		{
			double k=kdjarray[mm].k;
			CString myk;
			myk.Format("%5.2f",k);
			myk="K: "+myk;
			pDC->SetTextColor(RGB(0,32,255));
			pDC->TextOut(80,m_pointY[0]+1,myk);
			pDC->SetTextColor(RGB(0,0,0));
			int kx=m_pointY[0]+20+bb*10+(100-k)*bb;
			pDC->LineTo(pos,kx);
			pos+=(m_KWidth+1);
		}
		pos=zx;
		pDC->SelectObject(Oldpenk);
		
		//////////////////////////////
		CPen pend(PS_SOLID,1,RGB(22,171,18));
		CPen* Oldpend=pDC->SelectObject(&pend);
		int d1=kdjarray[0].d;
		int dy=m_pointY[0]+20+bb*10+(100-d1)*bb;
		pDC->MoveTo(zx,dy);
		for(int dm=0;dm<an;dm++)
		{
			double d=kdjarray[dm].d;
			CString myd;
			myd.Format("%5.2f",d);
			myd="D: "+myd;
			pDC->SetTextColor(RGB(22,171,18));
			pDC->TextOut(140,m_pointY[0]+1,myd);
			pDC->SetTextColor(RGB(0,0,0));
			int dy2=m_pointY[0]+20+bb*10+(100-d)*bb;
			pDC->LineTo(pos,dy2);
			pos+=(m_KWidth+1);
		}
		pDC->SelectObject(Oldpend);
		pos=zx;
		///////////////////j
		CPen penj(PS_SOLID,1,RGB(255,0,255));
		CPen* Oldpenj=pDC->SelectObject(&penj);
		int j1=kdjarray[0].j;
		int jy=m_pointY[0]+20+bb*10+(100-j1)*bb;
		pDC->MoveTo(zx,jy);
		for(int jm=0;jm<an;jm++)
		{
			double j=kdjarray[jm].j;
			int jy2=m_pointY[0]+20+bb*10+(100-j)*bb;
			CString myj;
			myj.Format("%5.2f",j);
			myj="J: "+myj;
			pDC->SetTextColor(RGB(255,0,255));
			pDC->TextOut(200,m_pointY[0]+1,myj);
			pDC->SetTextColor(RGB(255,0,255));
			if(jy2<m_pointY[0]+20)
			{
				jy2=m_pointY[0]+20;
			}
			if(jy2>m_pointY[1])
			{
				jy2=m_pointY[1]-1;
			}
			pDC->LineTo(pos,jy2);
			pos+=(m_KWidth+1);
		}
		pDC->SelectObject(Oldpenj);
		pos=zx;
		delete [] kdjarray;//删除数组
	}
	
}

void CSingleView::OnMouseMove(UINT nFlags, CPoint point) 
{
	RECT rect;
	GetClientRect(&rect);
	int bj=rect.right/4*3;
	CDC* pDC=GetDC();
	
	if(point.x>=bj-50)
	{
		::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));//设置光标
	}
	
	if(pp !=1)
	{
		for(i=0; i<m_paintnum-1;i++)//底线不选,即底线不能移动
		{
			if(point.y>m_pointY[i]-2 && point.y<m_pointY[i]+2 && point.x<=bj)
			{
				::SetCursor(AfxGetApp()->LoadCursor(IDC_MOVE));
				pPointY[i]=1;
				break;//一旦选到就跳出,使i不再改变,保证下标正确
			}
		}
	}
	
	
	if(pp==1 && pPointY[i]==1)
	{
		
		CRect rectOld(0,m_ptOld.y,bj,m_ptOld.y+1);
		pDC->InvertRect(&rectOld);
		CRect rectNew(0,point.y,bj,point.y+1);
		pDC->InvertRect(&rectNew);
		
		m_ptOld=point;
	}
	ReleaseDC(pDC);
	
	
	CView::OnMouseMove(nFlags, point);
}

void CSingleView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	pp=1;
	
	m_ptStart=point;
	m_ptOld=point;
	
	CView::OnLButtonDown(nFlags, point);
}

void CSingleView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	RECT rect;
	GetClientRect(&rect);
	int bj=(rect.right/4)*3;
	if(pp==1 && pPointY[i]==1)
	{
		int a=point.y;
		int b=m_pointY[i+1]-20;
		int c=m_pointY[i-1]+20;
		if(a<b && a>c)
		{
			m_pointY[i]=point.y;
		}
		if(a<c)
		{
			m_pointY[i]=c+2;
		}
		if(a>b)
		{
			m_pointY[i]=b-2;
		}
		
	}
	
	if(pp==1 && pPointY[i]==1)
	{
		pp=2;
		pPointY[i]=0;
		Invalidate();
		
		
	}
	//pp=2;
	//pPointY[i]=0;
	//Invalidate();
	
	CView::OnLButtonUp(nFlags, point);
}

void CSingleView::OnKline() 
{
	((CMyStockApp*)AfxGetApp())->m_bIsKLine=!(((CMyStockApp*)AfxGetApp())->m_bIsKLine);
	RedrawWindow();

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -