策略为王源代码扩展系列(2)-主菜单-历史行情

Published

思路:

1.在StockINfo中增加一个变量,日K线按回车则将K线日期存入变量。

2.在StockINfo中增加一个变量,如果该变量的值为年月日的日期值,则DzhProvider.cpp读取历史分笔数据。

 

1.StkUI:HistoryRealTimeView:复制RealTimeView并改名为HistoryRealTimeView

2.StkUI:HistoryRealTimeView:修改类名、两个函数名和一个变量,编译通过

 

第一部分 在主菜单中添加历史行情菜单

G:\stock\TskingVS2019\src\Client\StkUI\resource.h

/* *** extend 历史行情 by freeman ****/
#define ID_VIEW_HISTORYREALTIME         34594
/**************************************/

 

/*extend 行情回放 start */
		MENUITEM "历史行情",                       ID_VIEW_HISTORYREALTIME  //Extend by freeman
		/*extend end*/

 

第二部分 启用历史行情

step 1:在MainFrm.cpp中添加对HistoryRealtimeView.h类的引用

/**** extend 系统设置、行情回放菜单项 by freeman ****/
#include "Dialog/SetSystemSet1.h"
#include "View/PlayBackView.h"
#include "View/HistoryRealtimeView.h"
/**************************************/

step 2:在MainFrm.h中定义消息映射关系

G:\stock\TskingVS2019\src\Client\StkUI\MainFrm.h

/**** extend 系统设置、行情回放、历史行情菜单项 by freeman ****/
	afx_msg void OnViewPlayback(); 
	afx_msg void OnUpdateViewPlayback(CCmdUI* pCmdUI);
	afx_msg void OnOptionSystemset();
	afx_msg void OnViewHistoryRealtime();
	afx_msg void OnUpdateViewHistoryRealtime(CCmdUI* pCmdUI);
	/**************************************/

 

在主程序中添加点击菜单后生成的消息和对应的消息处理函数

/**** extend 系统设置、行情回放、历史行情菜单项 by freeman ****/
	ON_COMMAND(ID_VIEW_HISTORYREALTIME, OnViewHistoryRealtime)
	ON_COMMAND(ID_VIEW_PLAYBACK, OnViewPlayback)
	ON_UPDATE_COMMAND_UI(ID_VIEW_PLAYBACK, OnUpdateViewPlayback)
	/**************************************/

 

D:\temp\stock\k-line-print-master\client\cnmarket\StkUI\AfxCore.inl

_AFXCORE_INLINE	CRealTimeView * AfxGetRealTimeView( )
{
	CStaticDoc * pStaticDoc = AfxGetStaticDoc();
	return (CRealTimeView *)( pStaticDoc->GetViewIfExist(RUNTIME_CLASS(CRealTimeView)) );
}

 

第二部分 添加历史行情视图

先准备函数

StkUI:HistoryRealTimeView:在StkUI\AfxCore.inl中添加 AfxGetHistoryRealTimeView()

StkUI:HistoryRealTimeView:在StkUI\AfxCore.inl中添加 AfxShowStockHistoryRealTimeView()

第三部份 修改功能

添加在日K线按回车进入历史行情界面的功能

step 1: 在日K线按回车时判断,是否进入历史行情界面的功能

src/Client/StkUI/View/StockGraph.cpp

/按回车键查看历史行情
void CStockGraph::OnReturn(BOOL bShiftPressed, BOOL bCtrlPressed)
{

	/*****custom extend start 回车键处理 by freeman 2019/06/08****/

	if (m_nIndexCurrent >= 0)
	{
		CKData& kdata = m_CurStock.GetKData(m_nCurKType);
		if (m_nIndexCurrent < kdata.GetSize())
		{
			//获取回车选择的历史K线日期
			DWORD	date = kdata.ElementAt(m_nIndexCurrent).m_date; 
			
			//填入股票信息变量
			CStockInfo info;
			info=m_CurStock.GetStockInfo();
			info.m_dateHistoryReport = date;

			//设置当前股票的被选择的K线日期
			AfxGetSListStockContainer().m_nCurrentStockKDataSelectedDate= date;

			//在股票信息中填入收盘价
			if (m_nIndexCurrent >= 1)
				info.m_fLast = kdata.ElementAt(m_nIndexCurrent - 1).m_fClose;

			

			m_CurStock.SetStockInfo(&info);
			
		}
	}

 

 src/Client/StkUI/View/StockGraph.cpp

void CStockGraph::OnReturn(BOOL bShiftPressed, BOOL bCtrlPressed)
{


	/*****custom extend start 回车键处理 by freeman 2019/06/08****/

	BOOL bInTrade = CSPTime::InTradeTime(CSPTime::GetCurrentTime().GetTime(), 900);

	if (m_nIndexCurrent >= 0&& bInTrade)
	{
		/*****custom extend start 回车键处理 by freeman 2019/06/08****/


		{
			AfxSwitchToStaticView(RUNTIME_CLASS(CRealTimeView));
			CRealTimeView* pView = AfxGetRealTimeView();
			if (pView)
				pView->ChangeDrawMode(CRealTime::modePriceLine);
		}
		/**********custom extend end-********************************/

	}
	else
	{

		{
			AfxSwitchToStaticView(RUNTIME_CLASS(CHistoryRealTimeView));//历史行情
			CHistoryRealTimeView* pView = AfxGetHistoryRealTimeView();
			if (pView)
				pView->ChangeDrawMode(CHistoryRealTime::modePriceLine);
		}

	}

	/**********custom extend end-********************************/

 

3.2 添加选择的日K线日期变量

 

3.3 将日期变量存入股票容器中,以便历史行情视图获取。

 

 

G:\stock\TskingVS2019\src\Client\StkLib\Src\Stock.cpp

CStockInfo& CStockInfo::operator = (const CStockInfo& si)
{
	m_dwMarket = si.m_dwMarket;
	memcpy(m_szCode, si.m_szCode, sizeof(m_szCode));
....

/********custom extend 获取回车选择的历史K线日期;*********************/
	m_dateHistoryReport = si.m_dateHistoryReport;
	/********end*******************/

....
}

m_stockinfo = *pInfo;需要做上面的修改,m_dateHistoryReport才会被赋值。

BOOL CStock::SetStockInfo(CStockInfo * pInfo)
	{
		if (NULL == pInfo)
		{
			Clear();
			return FALSE;
		}
		if (m_stockinfo.IsEqualTo(pInfo->GetMarket(), pInfo->GetStockCode()))
		{
			m_stockinfo = *pInfo;
			return m_stockinfo.IsValidStock();
		}
		Clear();
		m_stockinfo = *pInfo;
		return m_stockinfo.IsValidStock();
	}

 

G:\stock\TskingVS2019\src\Client\StkLib\Src\DzhProvider.cpp

CDzhProvider根据m_dateHistoryReport读取历史分笔文件

//当前目录
			if (pInfo->IsShenZhen())
			{
				strPrpFileName.Format(dzh_sz_prp, pInfo->m_dateHistoryReport);
				sFileName += strPrpFileName;

			}
			else
			{
				strPrpFileName.Format(dzh_sh_prp, pInfo->m_dateHistoryReport);
				sFileName += strPrpFileName;

			}

			CSPFile file;

			//按年存放的历史分笔文件
			if (!file.Open(sFileName, CSPFile::modeRead))
			{
				

				if (pInfo->IsShenZhen())
				{
					strPrpFileName.Format(dzh_yyyy_sz_prp, pInfo->m_dateHistoryReport/10000,pInfo->m_dateHistoryReport);
					sFileName = strPrpYYYYDirectory+ strPrpFileName;

				}
				else
				{
					strPrpFileName.Format(dzh_yyyy_sh_prp, pInfo->m_dateHistoryReport / 10000, pInfo->m_dateHistoryReport);
					sFileName = strPrpYYYYDirectory+ strPrpFileName;

				}


				

			}

 

3.2  修改改窗口标题

/* *** extend 历史行情 by freeman ****/
#define IDS_TITLE_HISTORYREALTIMEVIEW   46000
/**************************************/