你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 跟高手学编程
VC++.NET图形编程--绘K线图和条形图(五)
 
⒍ 绘K线图

如果熟悉股市,对K线不会陌生。不过,在绘K线图之前,还是要介绍一下K线的绘制原则。

K线

K线图来源于日本,广泛用于商品、期货、证券等交易市场。

K线是用当日(周、月、年等)成交的开盘价、收盘价、最高价及最低价四个数据绘制的。绘制的规则是:在坐标图上,首先,从最低价到最高价绘一线段。然后,以此线段作为矩形的左右对称线、以开盘价与收盘价作为矩形的上、下两边、自定数据作为矩形的左右两边绘一狭长的矩形。如果收盘价大于开盘价,则K线以红色表示;如果收盘价等于开盘价,则K线以红色(或绿色)表示,矩形变成一横线;如果收盘价小于开盘价,K线以绿色表示。

K线的矩形部分称为K线的实体,实体以上的部分称为K线的上影线,实体以下的部分称为K线的下影线。当收盘价大于开盘价时,K线称为阳线;当收盘价等于开盘价时,K线称为十字线;当收盘价小于开盘价时,K线称为阴线。如图5所示。

 



5  K线的绘制规则

 

由于用于绘制K线的四个数据之间的大小关系有不同的组合,因此,K线可以有不同的形态,如图6所示。

 


6  K线的几种形态

 

K线图

K线图用来表示股价及其变化,如图7所示。

 


7  K线图

K线如果是阳线(或十字线),以红色表示;如果是阴线,以绿色表示。因此要对阳线(或十字线)、阴线分别准备红色、绿色实心画笔。

可以有两种方式确定每根K线的位置及大小:

K线固定在外框内

根据K线图外框的位置、大小以及个股(指数)的价格可以计算:

1)实体的宽度= 外框宽度/K线根数 + K线间空白宽度占K线实体宽度的比例×(K线根数-1))

2)  体的长度=开盘价与收盘价之差的绝对值×折算比例

3)  线的左上角纵坐标=外框左上角纵坐标+(最高价的最大值-最高价)×折算比例

4)  引线的右下角纵坐标=外框左上角纵坐标+(最高价的最大值-最低价)×折算比例

上列各式中:

折算比例=外框高度/(最高价的最大值-最低价的最小值)

K线的横坐标由外框左上角横坐标、K线实体的宽度以及K线间空白宽度确定,计算方法比较简单,说明从略。

根据K线根数确定外框大小

这种方式先固定K线大小,然后根据K线根数确定外框大小。

这里采用第种方式。代码如下:

// K线图。

 

// 准备两种颜色(红色和绿色)的画笔分别用来画阳线和阴线。

System::Drawing::SolidBrush^ snBrush = gcnew System::Drawing::SolidBrush(System::Drawing::Color::Red);  /* 准备红色实心画笔                        (画阳线的实体)。*/

System::Drawing::SolidBrush^ ovrcstBrush = gcnew

    System::Drawing::SolidBrush(System::Drawing::Color::Green); /* 准备绿色实心画笔(画阴线的实体)。*/

System::Drawing::Pen^ snPen =gcnew

    System::Drawing::Pen(System::Drawing::Color::Red);  /* 准备红色画笔(画阳线的上、下引线)。*/

System::Drawing::Pen^ ovrcstPen =gcnew

    System::Drawing::Pen(System::Drawing::Color::Green);  /* 准备绿色画笔(画阴线的上、下引线)。*/

i=0;        // 数据表记录号。

float k_x;      // K线实体的左上角横坐标。

float k_y;      // K线实体的左上角纵坐标。

float k_h;      // K线实体的高度。

float kd_y1;    // K线引线的左上角纵坐标。

float kd_y2;    // K线引线的右下角纵坐标。

float pp=rgnk_h/(maxPrice-minPrice);    /* 计算:外框高度/(最高价的最大值-最低价的最小值)。*/

while (i<dayCount)

{

    Decimal tmp_d;    // 临时用于转换数据类型。

    float tmp_f;      // 临时用于转换数据类型。

    k_x=rgnk_x+(k_w+ksw)*i;

    kx_x=int(rgnk_x+(k_w+ksw)*i)+int(k_w/2);

    tmp_d=static_cast <Decimal>(table->Rows[i][4]);

    tmp_f=float(tmp_d);

    kd_y1=rgnk_y+(maxPrice-tmp_f)*pp;

    tmp_d=static_cast <Decimal>(table->Rows[i][5]);

    tmp_f=float(tmp_d);

    kd_y2=rgnk_y+(maxPrice-tmp_f)*pp;

if  (  static_cast <Decimal>(table->Rows[i][1]) <= static_cast <Decimal>(table->Rows[i][2]))  // 画阳线。

    {

        tmp_d=static_cast <Decimal> (table->Rows[i][2]);

        tmp_f=maxPrice-float(tmp_d);

        k_y=rgnk_y+tmp_f * pp;

tmp_d=static_cast <Decimal> (table->Rows[i][2]) - static_cast <Decimal> (table->Rows[i][1]);

        tmp_f=float(tmp_d);

        k_h=tmp_f*pp;

if (k_h<1)    /* K线高度(最高价与最低价的差(折算成像素个数))小于1时,让K线高度为1,以便画十字线;此时如果不将K线高度放大为1,将不会画K线。*/

        {

            k_h=1;

        }

        formGraphics->FillRectangle(snBrush,

        Rectangle(k_x, k_y, k_w, k_h));    // 画阳线实体。

        formGraphics->DrawLine(snPen,kx_x,  kd_y1,kx_x,kd_y2);  // 画阳线引线。

    }

    else    // 画阴线。

    {

        tmp_d=static_cast <Decimal> (table->Rows[i][1]);

        tmp_f=maxPrice-float(tmp_d);

        k_y=rgnk_y+tmp_f * pp;

tmp_d=static_cast <Decimal> (table->Rows[i][1]) - static_cast <Decimal> (table->Rows[i][2]);

        tmp_f=float(tmp_d);

        k_h=tmp_f*pp;

        if (k_h<1)

        {

            k_h=1;

        }

formGraphics->FillRectangle(ovrcstBrush,Rectangle(k_x,

k_y, k_w, k_h));    // 画阴线实体。

formGraphics->DrawLine(ovrcstPen,kx_x,  kd_y1,kx_x,kd_y2); // 画阴线引线。

    }

i++;

}

⒎ 绘条形图

条形图用来表示成交量,如图8所示。

 


 

8  条形图

 

条形也使用红色、绿色两种颜色,区分原则与K线相同。

条形的宽度与K线实体的宽度相同,并且由于同一个交易日的条形与K线实体上下对齐,因而横向位置也相同。

条形的高度由成交量折算:

条形的高度=成交量×折算比例

式中:

折算比例=矩形框高度÷成交量的最大值

// 绘条形图。

i=0;        // 数据表记录号。

float b_y;      // 条形的左上角纵坐标。

float b_h;      // 条形的高度。

float bp=rgnb_h/maxQuantity;    // 计算:矩形框高度/成交量的最大值。

while (i<dayCount)

{

    k_x=rgnk_x+(k_w+ksw)*i;

    int tmp_i;    // 临时用于转换数据类型。

    tmp_i=static_cast <int>(table->Rows[i][3]);

    b_h=tmp_i*bp;

    b_y=rgnb_y+(rgnb_h-b_h);

if  (  static_cast <Decimal>(table->Rows[i][1]) <= static_cast <Decimal>(table->Rows[i][2]))  // 画阳线。

{

formGraphics->FillRectangle(snBrush,

Rectangle(k_x, b_y, k_w, b_h));    // 画条形(红色)。

}

 

else    // 画阴线。

    {

formGraphics->FillRectangle(ovrcstBrush,

            Rectangle(k_x, b_y, k_w, b_h));    // 画条形(绿色)。

}

i++;

}

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089