📄 tdxdataprocessdlg.cpp
字号:
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 + -