Visual Studio MFC/Win32 项目中,可以利用 代码块折叠(Code Folding / Outlining) 来管理长函数或区域,让代码更清晰。
使用 #pragma region / #pragma endregion这是 Visual Studio 官方支持的 代码折叠指令,兼容 MFC/C++ 项目:
#pragma region custom extend by stockso.com叠加指数分时线
void CHistoryRealTime::DrawPriceVolume2(CDC* pDC)
{
DECLARE_COLOR_DEFINATION
//获取当前股票的最大、最小值
double dMin = 0, dMax = 0, dMaxVolume = 0;
double dLastClose = m_CurStock.GetStockInfo().m_fLast;
if (!GetMinMaxInfo(&dLastClose, &dMin, &dMax, &dMaxVolume, TRUE))//画分时线,获取昨天收盘价,当天最低价、最高价、最大量
return;
//从股票中获取选择的日K线日期
DWORD date = 0;
date = m_CurStock.GetStockInfo().m_dateHistoryReport;
//读取指数数据
CStockInfo info;
AfxGetStockContainer().GetStockInfo("399001", &info);
CStock m_CurStock2;
//设置选择的日期,会读出历史分笔数据
info.m_dateHistoryReport = date;
m_CurStock2.SetStockInfo(&info);
// Prepare Data
// 读取本地文件
m_CurStock2.SetDatabase(&AfxGetDB());
//修改指数昨日收盘价
m_CurStock2.PrepareData(CStock::dataK, CKData::ktypeDay, TRUE);
CKData& kdata = m_CurStock2.GetKData(CKData::ktypeDay);
//根据日期获取索引号
int nIndexCurrent = kdata.GetIndexByDate(date);
//取前一日索引
nIndexCurrent -= 1;
if (nIndexCurrent < 0)
nIndexCurrent = 0;
KDATA kd;
memset(&kd, 0, sizeof(kd));
//根据索引获取日K线数据,再获取收盘价
kd.m_fClose = kdata.ElementAt(nIndexCurrent).m_fClose;
info.m_fLast = kd.m_fClose;
//设置这只股票的昨日收盘价信息
m_CurStock2.SetStockInfo(&info);
// 从磁盘读取指数的历史分笔数据
m_CurStock2.PrepareData(CStock::dataReport, CKData::ktypeDay, TRUE);
m_CurStock2.PrepareData(CStock::dataMinute, CKData::ktypeDay, TRUE);
// Draw Price
//CStockInfo& info = m_CurStock2.GetStockInfo();
CMinute& aMinute = m_CurStock2.GetMinute();
//----start开始计算指数的最大、最小值 GetMinMaxInfo----
double dMinDJ2 = 0, dMaxDJ2 = 0;
double dLastCloseDJ2 = 0;
dLastCloseDJ2 = m_CurStock2.GetStockInfo().m_fLast;//指数昨日收盘价
dMinDJ2 = dLastCloseDJ2, dMaxDJ2 = dLastCloseDJ2;//天的指数最低价,当天的指数最高价初始化为指数昨日收盘价
BOOL bPriceOKDJ2 = FALSE;
REPORT reportDJ2;
//初始化
if (m_CurStock2.GetReport().GetSize() > 0)
{
reportDJ2 = m_CurStock2.GetReport().ElementAt(m_CurStock2.GetReport().GetSize() - 1);
if (reportDJ2.m_fNew > 1e-4 && reportDJ2.m_fHigh > 1e-4 && reportDJ2.m_fLow > 1e-4)
{
dMinDJ2 = reportDJ2.m_fLow; //当天的指数最低价
dMaxDJ2 = reportDJ2.m_fHigh;//当天的指数最高价
bPriceOKDJ2 = TRUE;
}
}
//计算指数分钟线最大值、最小值
for (int i = 0; i < m_CurStock2.GetMinute().GetSize(); i++)
{
MINUTE& m = m_CurStock2.GetMinute().ElementAt(i);
if (!bPriceOKDJ2 && dMin < 1e-4)
dMinDJ2 = m.m_fNew;
if (!bPriceOKDJ2 && m.m_fNew < dMinDJ2)
dMinDJ2 = m.m_fNew;
if (!bPriceOKDJ2 && m.m_fNew > dMaxDJ2)
dMaxDJ2 = m.m_fNew;
}
//以昨日收盘价为基准,选幅度最大的那个方向的绝对值
double dABS = 1.00 * max(fabs(dMaxDJ2 - dLastCloseDJ2), fabs(dMinDJ2 - dLastCloseDJ2));
if (dABS < dLastCloseDJ2 * 0.001)
dABS = dLastCloseDJ2 * 0.001;
dMinDJ2 = dLastCloseDJ2 - dABS;
dMaxDJ2 = dLastCloseDJ2 + dABS;
//计算指数最大涨幅(绝对值)
double indexMaxDiffPercentDJ2 = (dMaxDJ2 - m_CurStock2.GetStockInfo().m_fLast) / m_CurStock2.GetStockInfo().m_fLast;
//计算股票最大涨幅(绝对值)
double m_curentStockMaxDiffPercent = (dMax - m_CurStock.GetStockInfo().m_fLast) / m_CurStock.GetStockInfo().m_fLast;
//放大百分比例
double ratio = 1;
if (indexMaxDiffPercentDJ2 > m_curentStockMaxDiffPercent)
{
ratio = m_curentStockMaxDiffPercent / indexMaxDiffPercentDJ2;
}
//----end 开始计算指数的最大、最小值----
//开始画图
DWORD secNow = CSPTime::GetCurrentTime().ToStockTimeSecOrder();//获取当前时间
DWORD secStep = 60;
//x Axis
int ptr = 0;
int xPos = m_rectPrice.left;
int yPosMid = m_rectPrice.top + m_rectPrice.Height() / 2;
int yPos = yPosMid;
int yPosLast = yPos; //y 指向中间线
//画线颜色
COLORREF clrLine5 = AfxGetProfile().GetColor(CColorClass::clrCW);
DWORD dwSeconds = CSPTime::GetTradeSecondsOfOneDay();
//以60秒为步进,开始画指数分时线
for (DWORD sec = 0; sec <= dwSeconds; sec += secStep)
{
BOOL bDrawed = FALSE;
for (; ptr < aMinute.GetSize(); ptr++) //指数分钟线
{
DWORD secTemp = CSPTime(aMinute[ptr].m_time).ToStockTimeSecOrder();
//如果如果当前分钟线>显示的时间
if (secTemp > sec)
break;
if ((long)secTemp <= (long)sec - (long)secStep)
continue;
if (aMinute[ptr].m_fNew < 1e-4)
aMinute[ptr].m_fNew = m_CurStock2.GetStockInfo().m_fLast;//昨日收盘价
int xPosNew = m_rectPrice.left + m_rectPrice.Width() * secTemp / dwSeconds;
yPosLast = yPos;
// Draw Price Line
CPen pen1(PS_SOLID, 1, clrLine5);
CPen* pOldPen = pDC->SelectObject(&pen1);
pDC->MoveTo(xPos, yPos);
//根据价格算Y抽
double dPriceNew = aMinute[ptr].m_fNew;
//计算指数涨幅
double indexDiffPercent = (dPriceNew - m_CurStock2.GetStockInfo().m_fLast) / m_CurStock2.GetStockInfo().m_fLast;
//换算成股票价格
//dPriceNew = m_CurStock.GetStockInfo().m_fLast * (1 + indexDiffPercent)* ratio; // 放大百分比
dPriceNew = m_CurStock.GetStockInfo().m_fLast * (1 + indexDiffPercent);
//指数换算成股票价格后在股票最高价和最低价范围内,则画图
if (dPriceNew <= dMax && dPriceNew >= dMin && dMax - dMin > 1e-4)
{
yPos = (int)(m_rectPrice.top + m_rectPrice.Height() * (dMax - dPriceNew) / (dMax - dMin));
if (yPos <= m_rectPrice.top) yPos = m_rectPrice.top + 1;
if (yPos >= m_rectPrice.bottom) yPos = m_rectPrice.bottom - 1;
pDC->LineTo(xPosNew, yPos);
}
pDC->SelectObject(pOldPen);
xPos = xPosNew;
bDrawed = TRUE;
}
}
}
#pragma endregion
/////////////////////////////////////////////////////////////////////////////
// 函 数 名:
// 功能说明:分时图画窗口顶部的时间 价格 成交量等信息 by freeman
// 入口参数:无入口数
// 出口参数:无出口数
// 返回参数:无返回数
////////////////////////////////////////////////////////////////////////////