⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdxdataprocessdlg.cpp

📁 读取通达信日线数据的一些代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	return 0;
}

int CTDXdataProcessDlg::get_tag_filename(string &filename)
{
	//追加数据
	string tmp_file_name,tmp;
    
	//取路径
	tmp = m_strDM;
	if(get_path_type(tmp))
	{
		tmp_file_name += m_path_add_sz;
	}
	else
	{
		tmp_file_name += m_path_add_sh;
	}
    tmp_file_name += m_strDM;
	tmp_file_name += ".day";
	filename = m_tagpath + tmp_file_name;

	return 0;
}


void CTDXdataProcessDlg::OnDestroy() 
{
	save_ini();

	CDialog::OnDestroy();
		
}

void CTDXdataProcessDlg::OnChangeN() 
{
	;
}


BOOL CTDXdataProcessDlg::PreTranslateMessage(MSG* pMsg) 
{
	//屏蔽掉Esc键,还有cancel按钮
	if(pMsg->message == WM_KEYDOWN)  
    {
		switch(pMsg->wParam)  
        {
			case   VK_ESCAPE   :     return   1;     //屏蔽ESC  
            case   VK_CANCEL   :     return   1;     //屏蔽Cancel  
			default:                     break;  
        }  

		//回车实现tab切换焦点,这样会屏蔽回车,不太好
		/*
		if(pMsg->message   ==   WM_KEYDOWN   &&   VK_RETURN   ==   pMsg->wParam)          
        {  
           pMsg->wParam   =   VK_TAB;  
        } */  

	}   

	return CDialog::PreTranslateMessage(pMsg);
}

void CTDXdataProcessDlg::clear_data(string &filename)
{
	int length = 0;
	char * buffer;

	//清理模拟测试文件中指定日期后的数据
	ifstream fin;
    fin.open(filename.c_str(),ios::binary | ios::in);

	TDSData_Day myIn;
    while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
	{
		if(myIn.date > m_day)
		{
			length = fin.tellg(); //多了一天的数据
			length = length - 32;
			break;
		}

		if(myIn.date == m_day)
		{
			length = fin.tellg();
			break;
		}
    }
	if(length <= 0) //空文件
		return;

	buffer = new char [length];
	fin.seekg(ios::beg);
	fin.read (buffer,length);
	fin.close();

	ofstream fout;
    fout.open(filename.c_str(),ios::binary);
	fout.write (buffer,length);
	fout.close();
	delete[] buffer;

}

int CTDXdataProcessDlg::get_ori_szzs_filename(string &filename)
{
	//追加数据
	string tmp_file_name,tmp;
    
	//取路径
	tmp = "999999";
	tmp_file_name += m_path_add_sh;
	tmp_file_name += tmp;
	tmp_file_name += ".day";
	filename = m_oripath + tmp_file_name;

	return 0;
}

int CTDXdataProcessDlg::get_ori_szcz_filename(string &filename)
{
	//追加数据
	string tmp_file_name,tmp;
    
	//取路径
	tmp = "399001";
	tmp_file_name += m_path_add_sz;
	tmp_file_name += tmp;
	tmp_file_name += ".day";
	filename = m_oripath + tmp_file_name;

	return 0;
}

int CTDXdataProcessDlg::get_tag_szzs_filename(string &filename)
{
	//追加数据
	string tmp_file_name,tmp;
    
	//取路径
	tmp = "999999";
	tmp_file_name += m_path_add_sh;
	tmp_file_name += tmp;
	tmp_file_name += ".day";
	filename = m_tagpath + tmp_file_name;

	return 0;
}

int CTDXdataProcessDlg::get_tag_szcz_filename(string &filename)
{
	//追加数据
	string tmp_file_name,tmp;
    
	//取路径
	tmp = "399001";
	tmp_file_name += m_path_add_sz;
	tmp_file_name += tmp;
	tmp_file_name += ".day";
	filename = m_tagpath + tmp_file_name;

	return 0;
}


void CTDXdataProcessDlg::OnCheck1() 
{
	UpdateData();	
}

void CTDXdataProcessDlg::OnCheck2() 
{
	UpdateData();	
}

void CTDXdataProcessDlg::Firstday(string &orifname, string& tagfname, unsigned long &date)
{
	//追加数据
	TDSData_Day myIn, mytmp;
    
	//读完整文件的数据
    ifstream fin;
	fin.open(orifname.c_str(),ios::binary | ios::in);

	//第一个数据
	while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
	{
		mytmp = myIn;
		break;
	}
	fin.close();
    
	//追加到模拟测试的股票数据,文件尾追加
	ofstream fout;
	fout.open(tagfname.c_str(),ios::binary);
    fout.write(reinterpret_cast<char*>(&mytmp), sizeof(TDSData_Day));
	fout.close();

	date = mytmp.date;

}

void CTDXdataProcessDlg::OnButtonFirstday() 
{

	unsigned long date = 0;
    string orifname, tagfname;

	get_ori_filename(orifname);
	get_tag_filename(tagfname);
	Firstday(orifname, tagfname, date);

	char str[10];
	sprintf(str,"%d",date);
	m_Edit_Date.SetWindowText(str);
}

void CTDXdataProcessDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnTimer(nIDEvent);
}

/*  
函数声明:public  
函数功能:获得指定目录下指定文件名、扩展名文件的个数。  
函数参数:  
DirPath:目录全路径;  
vFiles:返回获得的所有文件名;  
Prefix:文件名,默认为"*";  
Postfix:扩展名,默认为".*"。  
函数返回值:返回文件个数,查找过程有误则返回-1。  
*/  
int   GetFilesCount(   const   char*   DirPath,  
					vector<string>&   vFiles,  
					const   char*   Prefix,  
					const   char*   Postfix   )  
{  
	vFiles.clear();  
	int   count=0;  
	
	string   MyStr_Path,   MyStr_Prefix,   MyStr_Postfix,   MyStr_temp;  
	MyStr_Path   =   DirPath;  
	MyStr_Prefix   =   Prefix;  
	MyStr_Postfix   =   Postfix;  
	if(   MyStr_Path.substr(   MyStr_Path.length()-1,1   )   !=   "\\"   )  
		MyStr_Path   +=   "\\";  
	if(   MyStr_Prefix.empty()   )  
		MyStr_Prefix   =   "*";  
	if(   MyStr_Postfix.empty()   )  
		MyStr_Postfix   =   ".*";  
	string   MyStr_Files   =   MyStr_Path   +   MyStr_Prefix   +   MyStr_Postfix;  
	
	WIN32_FIND_DATA   FindFileData;  
	HANDLE   hFind;  
	
	hFind   =   FindFirstFile(   MyStr_Files.c_str(),&FindFileData   );  
	if   (hFind   ==   INVALID_HANDLE_VALUE)  
		return   -1;  
	
	try  
	{  
		do  
		{  
			MyStr_temp   =   FindFileData.cFileName;  
			if(   MyStr_temp   ==   "."   ||   MyStr_temp   ==   ".."   )  
				continue;  
			
			if(  FILE_ATTRIBUTE_DIRECTORY == FindFileData.dwFileAttributes   )  
				continue;  
			
			count   +=   1;  
			vFiles.push_back(   MyStr_Path+MyStr_temp   );  
		}  
		while(   FindNextFile(   hFind,&FindFileData   )   ==   true   );  
		FindClose(   hFind   );  
	}   //end   try  
	catch(...)  
	{  
		FindClose(   hFind   );  
		vFiles.clear();  
		return   -1;  
	}  
	
	return   count;  
}

void GetFirstday(string &orifname, unsigned long &date)
{
	//追加数据
	TDSData_Day myIn, mytmp;
    
	//读完整文件的数据
    ifstream fin;
	fin.open(orifname.c_str(),ios::binary | ios::in);

	//第一个数据
	while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
	{
		mytmp = myIn;
		break;
	}
	fin.close();
    
	date = mytmp.date;

}

void CTDXdataProcessDlg::OnButton6() 
{
	unsigned long date = 0;
	string _path, tmpstr;
	vector<string> filename_vec;
	typedef multimap<int, string>::value_type valType;
	typedef multimap<int, string>::iterator multimap_It;  
	multimap<int,string> sh_firstday_map, sz_firstday_map;

	_path = m_oripath + "\\vipdoc\\sh\\lday\\";
	
	if(GetFilesCount(_path.c_str(), filename_vec, "*", ".day") > 0)
	{
	
		for(int i=0; i<filename_vec.size(); i++)
		{
			tmpstr = filename_vec[i];
			GetFirstday(tmpstr,date);
			
			sh_firstday_map.insert(valType(date, tmpstr));
		}
	}

	_path = m_oripath + "\\vipdoc\\sz\\lday\\";
		
	if(GetFilesCount(_path.c_str(), filename_vec, "*", ".day") > 0)
	{
	
		for(int i=0; i<filename_vec.size(); i++)
		{
			tmpstr = filename_vec[i];
			GetFirstday(tmpstr,date);
			sz_firstday_map.insert(valType(date, tmpstr));
		}
	}

	string tmp_str;
	
	string ini_path = "stock_first_day.txt";
	ofstream is(ini_path.c_str());

	multimap_It it;
	for (it = sh_firstday_map.begin(); it != sh_firstday_map.end(); it++)
	{
		is << (*it).first << '\t' << (*it).second << '\t' << endl;
	}
	for (it = sz_firstday_map.begin(); it != sz_firstday_map.end(); it++)
	{
		is << (*it).first << '\t' << (*it).second << '\t' << endl;
	}
	is.close();

	MessageBox("成功!","成功",MB_OK);
}

void CTDXdataProcessDlg::OnCheck3() 
{
	// 选按日期步进时获取上证指数的日期列表
	UpdateData();

	if(m_date_vec.size() > 0)
		return;
	
	string orifname;
	get_ori_szzs_filename(orifname);
	
	TDSData_Day myIn;
    
	//读完整文件的数据
    ifstream fin;
	fin.open(orifname.c_str(),ios::binary | ios::in);
	
	while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
	{
		m_date_vec.push_back(myIn.date);
	}
	
	fin.close();
}

void CTDXdataProcessDlg::OnCheck5() 
{
	// 选全部数据同时步进时建立股票上市首日信息map
	UpdateData();

	if(m_firstday_map.size() > 0)
		return;
	
	unsigned long date = 0;
	string _path;
	vector<string> filename_vec;
	typedef multimap<int, string>::value_type valType;
	typedef multimap<int, string>::iterator multimap_It;  
	
	_path = m_oripath + "\\vipdoc\\sh\\lday\\";
	
	if(GetFilesCount(_path.c_str(), filename_vec, "*", ".day") > 0)
	{
	
		for(int i=0; i<filename_vec.size(); i++)
		{
			GetFirstday(filename_vec[i],date);
			m_firstday_map.insert(valType(date, filename_vec[i]));
		}
	}

	_path = m_oripath + "\\vipdoc\\sz\\lday\\";
		
	if(GetFilesCount(_path.c_str(), filename_vec, "*", ".day") > 0)
	{
	
		for(int i=0; i<filename_vec.size(); i++)
		{
			GetFirstday(filename_vec[i],date);
			m_firstday_map.insert(valType(date, filename_vec[i]));
		}
	}
}

void CTDXdataProcessDlg::OnButtonNextDayByDate() 
{
	//用上证指数的日期作bydate的日期,用取第一天的multimap做判断该文件是否需要更新,这样就可以实现熊市的策略研究
	//实现在熊市选股的交易系统检验。按日期做全部数据的步进对于策略研究比较有用,这里就先将两者合一
	if(m_daybyDate < 19901219)
		return;

	int nextday = 0;

	if(m_pos_date >= m_date_vec.size() || m_date_vec[m_pos_date] != m_daybyDate)
	{
		m_pos_date = 0;
	}

	if(m_pos_date > 0)//已经计算好位置
	{
		m_pos_date++;
		nextday = m_date_vec[m_pos_date];
		//追加一天数据到文件
		AddNextDayByDate(nextday);
	}
	else //查找位置
	{
		for(int i = 0; i < m_date_vec.size(); i++)
		{
			if(m_daybyDate < m_date_vec[i])
			{
				//m_daybyDate = m_date_vec[i];
				nextday = m_date_vec[i];
				m_pos_date = i;
				//输出某天前的全部数据到文件
				OverwriteByDate(nextday);
				break;
			}
		}
	}

	char str[10];
	sprintf(str,"%d",nextday);
	m_Edit_DateByDate.SetWindowText(str);

}

void CTDXdataProcessDlg::AddNextDayByDate(int date)
{
	//追加数据
	bool write_flg = false;
	TDSData_Day myIn;
	multimap<int, string>::iterator it;  
	
	string ori_file, tag_file;
	for (it = m_firstday_map.begin(); it != m_firstday_map.end(); it++)
	{
		if((*it).first > date)
			break;

		write_flg = false;
		ori_file = (*it).second;
		Orifile2Tagfile(ori_file, tag_file);
		
		//读原始文件的数据
		ifstream fin;
		fin.open(ori_file.c_str(),ios::binary | ios::in);
		while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
		{
			if(myIn.date == date)
			{
				write_flg = true;
				break;
			}

			if(myIn.date > date)
			{
				break;
			}
		}
		fin.close();
    
		if(write_flg)
		{
			//追加到模拟测试的股票数据,文件尾追加
			ofstream fout;
			fout.open(tag_file.c_str(),ios::binary | ios::app);
			fout.write(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day));
			fout.close();
		}
	}

}

void CTDXdataProcessDlg::OverwriteByDate(int date)
{
	//将date前的数据覆盖过去
	TDSData_Day myIn;
	multimap<int, string>::iterator it;  
	
	string ori_file, tag_file;
	for (it = m_firstday_map.begin(); it != m_firstday_map.end(); it++)
	{
		if((*it).first > date)
			break;

		ori_file = (*it).second;
		Orifile2Tagfile(ori_file, tag_file);
		
		//读原始文件的数据
		ifstream fin;
		fin.open(ori_file.c_str(),ios::binary | ios::in);

		ofstream fout;
		fout.open(tag_file.c_str(),ios::binary | ios_base::out);

		while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
		{
			if(myIn.date <= date)
			{
				fout.write(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day));
			}

			if(myIn.date > date)
			{
				break;
			}
		}
		fin.close();
		fout.close();
	}

}

void CTDXdataProcessDlg::OnButtonNextNDayByDate() 
{
	// TODO: Add your control notification handler code here
	
}

void CTDXdataProcessDlg::OnButtonClearByDate() 
{
	multimap<int, string>::iterator it;  
	
	string ori_file, tag_file;
	for (it = m_firstday_map.begin(); it != m_firstday_map.end(); it++)
	{
		ori_file = (*it).second;
		Orifile2Tagfile(ori_file, tag_file);
		ofstream outfile(tag_file.c_str(), ios_base::out); //输出模式清空文件
	}

}

void CTDXdataProcessDlg::OnChangeDayByDate() 
{
	UpdateData();
	m_daybyDate = atoi(m_datebyDate.GetBuffer(m_datebyDate.GetLength()));
}

void CTDXdataProcessDlg::OnChangeNbyDate() 
{

}

void CTDXdataProcessDlg::Orifile2Tagfile(string& orifile, string& tagfile)
{
	string tmpstr="";
	tmpstr = orifile.substr(m_oripath.length(),orifile.length()-m_oripath.length());
	tagfile = m_tagpath + tmpstr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -