⒍ 绘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++;
}
|