📄 singleview.cpp
字号:
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 + -