策略为王源代码分析-分组设定(自选股)

Published

1.

ON_COMMAND(ID_OPTION_SETGROUP, OnOptionSetgroup)

 

void CMainFrame::OnOptionSetgroup() 
{
	CSetGroupDlg	dlg;
	dlg.DoModal();
}

 

G:\stock\TskingVS2019\src\Client\StkUI\Dialog\SetGroupDlg.cpp

 

股票分组设定

在stock.cpp 中有 m_szDomain字段,设置它的值即是所属板块

G:\stock\TskingVS2019\src\Client\StkLib\Src\Stock.cpp
//设置股票所属板块 by freeman
void CStockInfo::SetStockDomain(const char* szDomain)
{
	memset(m_szDomain, 0, sizeof(m_szDomain));
	if (NULL == szDomain)
		return;
	strncpy(m_szDomain, szDomain, min(sizeof(m_szDomain) - 1, strlen(szDomain)));
}

 

 

step 1:在读取磁盘财务数据时,在采取数据结构中填入了板块数据

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

int LoadBasetable1(CStockContainer& container, LPCTSTR lpszFileName, DWORD dwMarket)
{
	container.Lock();
      ....

//填入股票的板块和省份数据.策略为王的板块数据和省份数据是从财务数据中获取并填入的 by freeman
		
		strcpy(basedatablock.m_szProvince, "block.m_szProvince");
		strcpy(basedatablock.m_szDomain, "block.m_szDomain");

		void* pArrayID = NULL;
		if (map.Lookup(szCode, pArrayID))
		{
			int	nIndex = ((int)pArrayID);
			if (nIndex >= 0 && nIndex < container.GetSize())
			{
				container.ElementAt(nIndex).m_basedata.InsertBaseDataSort(basedatablock);
			}
		}
      ....
}

 

step 2:在加载财务数据时,填入板块数据

// 财务信息数据结构 CStock::dataBasetbl
typedef struct basedata_t {
	DWORD	m_dwMarket;						// 证券市场类型,see CStock::StockMarket
	char	m_szCode[STKLIB_MAX_CODE2];		// 证券代码,以'\0'结尾
	
	char	m_szDomain[STKLIB_MAX_DOMAIN];		// 板块
	char	m_szProvince[STKLIB_MAX_PROVINCE];	// 省份

	time_t	m_time;						// 日期,time_t
...
}

StkLib\Src\Stock.cpp:注释,策略为王的板块和省份数据是从财务数据中获取并填入的

//财务数据
BOOL CStockInfo::StatBaseIndex(DWORD dwDate)
{
	SP_ASSERT(0 != dwDate);

	if (m_basedata.GetSize() == 0)
		return FALSE;

	int	nIndex = m_basedata.GetSize() - 1;
	for (int i = m_basedata.GetSize() - 1; i >= 0; i--)
	{
		if (m_basedata.ElementAt(i).m_date <= dwDate)
		{
			nIndex = i;
			break;
		}
	}

	BASEDATA& block = m_basedata.ElementAt(nIndex);

	//策略为王的板块和省份数据是从财务数据中获取并填入的 by freeman
	strncpy(m_szDomain, block.m_szDomain, min(sizeof(m_szDomain), sizeof(block.m_szDomain)));
	strncpy(m_szProvince, block.m_szProvince, min(sizeof(m_szProvince), sizeof(block.m_szProvince)));
	

 

二、扩展

1.先读取物理文件到容器,然后遍历容器填入板块信息

src/Client/StkUI/StkUI.cpp

AfxGetGroupContainer().Load( AfxGetProfile().GetGroupFile() );
	SendMessage( hWnd, WM_USER_STARTUP_PROGRESS, nMin+nRange*4/30, 0 );

	//add
	//加载板块数据到容器
	AfxGetDB().InstallCodetblBlock("D:\\Thirdprogram\\dzh2\\Downloaddzh365\\ABK\\downloaddzh365\\abk\\full.abk", "99");

	//一次性填入股票板块数据
	CDomainContainer& domains = AfxGetDomainContainer();
	for (int i = 0; i < domains.GetSize(); i++)
	{
		CDomain& domain = domains.ElementAt(i);
		//string blockName=domain.m_strName;
		//m_listGroup.SetItemData(nItem, NULL);




		for (int k = 0; k < domain.GetSize(); k++)
		{

			int	id = 0;//股票在容器中的id号
			if (AfxGetStockContainer().GetStockInfo(domain.ElementAt(k), NULL, &id))
			{
				CStockInfo& info = AfxGetStockContainer().ElementAt(id);//取得股票信息

				//const char* domainstr=
				info.SetStockDomain(info.GetStockDomain() + domain.m_strName);

				CStockInfo& info1 = AfxGetStockContainer().ElementAt(id);//取得股票信息
				int i = 0;


			}

			/*CStockInfo	info;
			if (!AfxGetStockContainer().GetStockInfo(domain.ElementAt(k), &info))
			{
				info.SetStockDomain(domain.m_strName);
				int i= 0;
			}*/


		}


	}

	//add end

2.设置财务数据的代码中有填入板块数据的代码,注释掉,否则已填好的数据又被重置了。

//财务数据  策略为王的板块数据和省份数据是从财务数据中获取并填入的 by freeman
	BOOL CStockInfo::StatBaseIndex(DWORD dwDate)
{

BASEDATA& block = m_basedata.ElementAt(nIndex);

		//策略为王的板块数据和省份数据是从财务数据中获取并填入的 by freeman  从另外的地方填入
		//strncpy(m_szDomain, block.m_szDomain, min(sizeof(m_szDomain), sizeof(block.m_szDomain)));  //从财务数据结构中设置股票板块 by freeman
		//strncpy(m_szProvince, block.m_szProvince, min(sizeof(m_szProvince), sizeof(block.m_szProvince)));

		
		m_datebase = block.m_date
}