?? tdxdataprocessdlg.cpp
字號:
// TDXdataProcessDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TDXdataProcess.h"
#include "TDXdataProcessDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTDXdataProcessDlg dialog
CTDXdataProcessDlg::CTDXdataProcessDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTDXdataProcessDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTDXdataProcessDlg)
m_strDM = _T("");
m_date = _T("");
m_N = 5;
m_stepbydate = true;
m_stepAllData = true;
m_NbyDate = 5;
m_datebyDate = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTDXdataProcessDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT2, m_Edit_OriPath);
DDX_Control(pDX, IDC_EDIT4, m_Edit_Path);
DDX_Control(pDX, IDC_EDIT1, m_Edit_DM);
DDX_Control(pDX, IDC_EDIT3, m_Edit_Date);
DDX_Control(pDX, IDC_EDIT5, m_Edit_DateByDate);
//{{AFX_DATA_MAP(CTDXdataProcessDlg)
DDX_Control(pDX, IDC_SPIN2, m_spinbyDate);
DDX_Control(pDX, IDC_SPIN1, m_spin);
DDX_Text(pDX, IDC_EDIT1, m_strDM);
DDX_Text(pDX, IDC_EDIT3, m_date);
DDX_Text(pDX, IDC_EDIT6, m_N);
DDX_Check(pDX, IDC_CHECK1, m_SHzs);
DDX_Check(pDX, IDC_CHECK2, m_SZcz);
DDX_Check(pDX, IDC_CHECK3, m_stepbydate);
DDX_Check(pDX, IDC_CHECK5, m_stepAllData);
DDX_Text(pDX, IDC_EDIT7, m_NbyDate);
DDX_Text(pDX, IDC_EDIT5, m_datebyDate);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTDXdataProcessDlg, CDialog)
//{{AFX_MSG_MAP(CTDXdataProcessDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON2, OnButtonNextDay)
ON_BN_CLICKED(IDC_BUTTON3, OnButtonOriPath)
ON_BN_CLICKED(IDC_BUTTON4, OnButtonPath)
ON_BN_CLICKED(ID_MY_OK, OnMyOk)
ON_EN_CHANGE(IDC_EDIT1, OnChangeDM)
ON_EN_CHANGE(IDC_EDIT3, OnChangeDate)
ON_BN_CLICKED(IDC_BUTTON1, OnButtonClear)
ON_WM_DESTROY()
ON_EN_CHANGE(IDC_EDIT6, OnChangeN)
ON_BN_CLICKED(IDC_BUTTON5, OnButtonNextNday)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
ON_BN_CLICKED(IDC_BUTTON_FIRSTDAY, OnButtonFirstday)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_CHECK3, OnCheck3)
ON_BN_CLICKED(IDC_CHECK5, OnCheck5)
ON_BN_CLICKED(IDC_BUTTON7, OnButtonNextDayByDate)
ON_BN_CLICKED(IDC_BUTTON8, OnButtonNextNDayByDate)
ON_BN_CLICKED(IDC_BUTTON9, OnButtonClearByDate)
ON_EN_CHANGE(IDC_EDIT5, OnChangeDayByDate)
ON_EN_CHANGE(IDC_EDIT7, OnChangeNbyDate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTDXdataProcessDlg message handlers
BOOL CTDXdataProcessDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_path_add_sh = "\\vipdoc\\sh\\lday\\sh";
m_path_add_sz = "\\vipdoc\\sz\\lday\\sz";
m_pos = 0;
m_pos_sh = 0;
m_pos_sz = 0;
m_flag = true;
load_ini();
m_stepbydate = true;
m_stepAllData = true;
m_pos_date = 0;
m_spin.SetBuddy( GetDlgItem( IDC_EDIT6 ) ); //設(shè)置編輯控件為Spin控件的伙伴窗口
m_spin.SetRange( 1, 1000 ); //設(shè)置數(shù)據(jù)范圍為1-1000
m_spinbyDate.SetBuddy( GetDlgItem( IDC_EDIT7) ); //設(shè)置編輯控件為Spin控件的伙伴窗口
m_spinbyDate.SetRange( 1, 1000 ); //設(shè)置數(shù)據(jù)范圍為1-1000
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CTDXdataProcessDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTDXdataProcessDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/*
通達信股票軟件日線數(shù)據(jù)分析
2007-11-29 12:06:10 / 個人分類:技術(shù)
日線文件以"代號"+"股票代碼"+".day"命名,代號為"sh"或"sz",股票代碼6位,一個記錄32個字節(jié)。
以深發(fā)展1997年1月2日的數(shù)據(jù)為例:
00000000h: 36 B8 30 01 72 06 00 00 86 06 00 00 60 06 00 00 ;
00000010h: 72 06 00 00 77 69 D4 4C 68 FE 66 00 74 06 00 00 ;
以下是分解
00000000h:|36 B8 30 01|72 06 00 00|86 06 00 00|60 06 00 00|;
[36 B8 30 01] = 0x0130B836 = 19970102 日期[unsigned long]
[72 06 00 00] = 0x00000672 = 1650/100 = 16.50 開盤[unsigned long]
[86 06 00 00] = 0x00000686 = 1670/100 = 16.70 最高[unsigned long]
[60 06 00 00] = 0x00000660 = 1632/100 = 16.32 最低[unsigned long]
00000010h:|72 06 00 00|77 69 D4 4C|68 FE 66 00|74 06 00 00|;
[72 06 00 00] = 0x00000672 = 1650/100 = 16.50 收盤[unsigned long]
[77 69 D4 4C] = 0x4CD46977 = 111365048.0 成交額[float]
[68 FE 66 00] = 0x0066FE68 = 6749800 成交量[unsigned long]
[74 06 00 00] = 0x00000674 = 1652/100 = 16.52 上日收盤[unsigned long](保留)
*/
struct TDSData_Day
{
unsigned long date; //日期
unsigned long open; //開盤價,單位:分
unsigned long high; //最高價,單位:分
unsigned long low; //最低價,單位:分
unsigned long close; //收盤價,單位:分
float amount; //交易金額,單位:元
unsigned long vol; //成交量,單位:股
int reserv; //保留,有時用來保存上一交易日收盤價
};
bool get_path_type(string& code)
{
//true深圳
//目前只分析股票和基金
string tmp_str2;
tmp_str2 = code.substr(0,3);
if(tmp_str2 == "000" || tmp_str2 == "001" || tmp_str2 == "002" || tmp_str2 == "100" || tmp_str2 == "159")
{
return true;
}
else
{
return false;
}
}
void CTDXdataProcessDlg::NextDay(string &orifname, string& tagfname, int& pos, bool& flag, unsigned long &date)
{
//追加數(shù)據(jù)
TDSData_Day myIn, mytmp;
//讀完整文件的數(shù)據(jù)
ifstream fin;
fin.open(orifname.c_str(),ios::binary | ios::in);
//第一次定位數(shù)據(jù)
if(flag == true)
{
while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
{
if(myIn.date > m_day)
{
mytmp = myIn;
pos = fin.tellg();
break;
}
if(myIn.date == m_day)
{
fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day));
mytmp = myIn;
pos = fin.tellg();
break;
}
}
flag = false;
}
//以后只要取后面一個數(shù)據(jù)即可
else
{
fin.seekg (pos);
if(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day)))
{
mytmp = myIn;
pos += 32;
}
else
{
fin.close();
MessageBox("完成");
return;
}
}
fin.close();
//追加到模擬測試的股票數(shù)據(jù),文件尾追加
ofstream fout;
fout.open(tagfname.c_str(),ios::binary | ios::app);
fout.write(reinterpret_cast<char*>(&mytmp), sizeof(TDSData_Day));
fout.close();
date = mytmp.date;
}
void CTDXdataProcessDlg::OnButtonNextDay()
{
//和指數(shù)綁定時,由于個股會出現(xiàn)停盤現(xiàn)象,這時會出現(xiàn)個股的日期和指數(shù)對不上,由于采用的辦法是追加,所以會把后面日期的數(shù)據(jù)追加上。以后再想辦法
unsigned long date = 0;
bool tmpflg1,tmpflg2,tmpflg3;
tmpflg1 = m_flag;
tmpflg2 = m_flag;
tmpflg3 = m_flag;
string orifname, tagfname;
get_ori_filename(orifname);
get_tag_filename(tagfname);
NextDay(orifname, tagfname, m_pos, tmpflg1, date);
if(this->m_SHzs)
{
get_ori_szzs_filename(orifname);
get_tag_szzs_filename(tagfname);
NextDay(orifname, tagfname, m_pos_sh, tmpflg2, date);
}
if(this->m_SZcz)
{
get_ori_szcz_filename(orifname);
get_tag_szcz_filename(tagfname);
NextDay(orifname, tagfname, m_pos_sz, tmpflg3, date);
}
m_flag = tmpflg1;
char str[10];
sprintf(str,"%d",date);
m_Edit_Date.SetWindowText(str);
}
void CTDXdataProcessDlg::NextNDay(string &orifname, string& tagfname, int& pos, bool& flag, unsigned long &date)
{
int i;
m_N = m_spin.GetPos(); //獲取Spin控件當前值
//追加數(shù)據(jù)
TDSData_Day myIn;
vector<TDSData_Day> mytmp;
//讀完整文件的數(shù)據(jù)
ifstream fin;
fin.open(orifname.c_str(),ios::binary | ios::in);
//第一次定位數(shù)據(jù)
if(flag == true)
{
while(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day))) //read到文件尾,返回0值
{
if(myIn.date > m_day)
{
mytmp.push_back(myIn);
for(i = 1; i<m_N; i++)
{
if(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day)))
{
mytmp.push_back(myIn);
}
}
pos = fin.tellg(); //讀到文件尾時還可能有問題
break;
}
if(myIn.date == m_day)
{
fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day));
mytmp.push_back(myIn);
for(i = 1; i<m_N; i++)
{
if(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day)))
{
mytmp.push_back(myIn);
}
}
pos = fin.tellg();
break;
}
}
flag = false;
}
//以后只要取后面n個數(shù)據(jù)即可
else
{
fin.seekg (pos);
for(i = 0; i<m_N; i++)
{
if(fin.read(reinterpret_cast<char*>(&myIn), sizeof(TDSData_Day)))
{
mytmp.push_back(myIn);
pos += 32;
}
else
{
MessageBox("完成");
break;
}
}
}
fin.close();
//追加到模擬測試的股票數(shù)據(jù),文件尾追加
ofstream fout;
fout.open(tagfname.c_str(),ios::binary | ios::app);
for(i=0; i<mytmp.size(); i++)
{
fout.write(reinterpret_cast<char*>(&mytmp[i]), sizeof(TDSData_Day));
}
fout.close();
if(mytmp.size() >= 1)
{
date = mytmp[mytmp.size()-1].date;
}
}
void CTDXdataProcessDlg::OnButtonNextNday()
{
unsigned long date = 0;
bool tmpflg1,tmpflg2,tmpflg3;
tmpflg1 = m_flag;
tmpflg2 = m_flag;
tmpflg3 = m_flag;
string orifname,tagfname;
get_ori_filename(orifname);
get_tag_filename(tagfname);
NextNDay(orifname, tagfname, m_pos, tmpflg1, date);
if(this->m_SHzs)
{
get_ori_szzs_filename(orifname);
get_tag_szzs_filename(tagfname);
NextNDay(orifname, tagfname, m_pos_sh, tmpflg2, date);
}
if(this->m_SZcz)
{
get_ori_szcz_filename(orifname);
get_tag_szcz_filename(tagfname);
NextNDay(orifname, tagfname, m_pos_sz, tmpflg3, date);
}
m_flag = tmpflg1;
char str[10];
sprintf(str,"%d",date);
m_Edit_Date.SetWindowText(str);
}
void CTDXdataProcessDlg::OnButtonOriPath()
{
char szPath[MAX_PATH];
BROWSEINFO br;
ITEMIDLIST *pItem;
br.hwndOwner = this->GetSafeHwnd();
br.iImage = 0;
br.pszDisplayName = 0;
br.lParam = 0;
br.lpfn = 0;
br.lpszTitle = "請選擇路徑:";
br.pidlRoot = 0;
br.ulFlags = BIF_RETURNONLYFSDIRS;
pItem = SHBrowseForFolder(&br);
if (SHGetPathFromIDList(pItem,szPath)==TRUE)
{
m_Edit_OriPath.SetWindowText(szPath);
m_oripath = szPath;
}
}
void CTDXdataProcessDlg::OnButtonPath()
{
char szPath[MAX_PATH];
BROWSEINFO br;
ITEMIDLIST *pItem;
br.hwndOwner = this->GetSafeHwnd();
br.iImage = 0;
br.pszDisplayName = 0;
br.lParam = 0;
br.lpfn = 0;
br.lpszTitle = "請選擇路徑:";
br.pidlRoot = 0;
br.ulFlags = BIF_RETURNONLYFSDIRS;
pItem = SHBrowseForFolder(&br);
if (SHGetPathFromIDList(pItem,szPath)==TRUE)
{
m_Edit_Path.SetWindowText(szPath);
m_tagpath = szPath;
}
}
void CTDXdataProcessDlg::OnOK()
{
;
}
void CTDXdataProcessDlg::OnMyOk()
{
CDialog::OnOK();
}
void CTDXdataProcessDlg::OnChangeDM()
{
UpdateData();
}
void CTDXdataProcessDlg::OnChangeDate()
{
UpdateData();
m_day = atoi(m_date.GetBuffer(m_date.GetLength()));
}
void CTDXdataProcessDlg::load_ini()
{
char buffer[_MAX_PATH];
string tmp_str;
string ini_path = "dataprocess.ini";
ifstream infile(ini_path.c_str());
while(infile.getline(buffer,_MAX_PATH))
{
tmp_str = buffer;
if(tmp_str.length()>8)
{
if(tmp_str.substr(0,7) == "源路徑=")
{
m_oripath = tmp_str.substr(7,_MAX_PATH);
m_Edit_OriPath.SetWindowText(m_oripath.c_str());
}
else if(tmp_str.substr(0,9) == "目標路徑=")
{
m_tagpath = tmp_str.substr(9,_MAX_PATH);
m_Edit_Path.SetWindowText(m_tagpath.c_str());
}
else if(tmp_str.substr(0,9) == "股票代碼=")
{
m_strDM.Format("%s",tmp_str.substr(9,_MAX_PATH).c_str());
m_Edit_DM.SetWindowText(tmp_str.substr(9,_MAX_PATH).c_str());
}
else if(tmp_str.substr(0,9) == "開始日期=")
{
m_date.Format("%s",tmp_str.substr(9,_MAX_PATH).c_str());
m_Edit_Date.SetWindowText(tmp_str.substr(9,_MAX_PATH).c_str());
}
else
{
m_oripath = "";
m_tagpath = "";
m_strDM = "";
m_date = "";
}
}
}
OnCheck3();
OnCheck5();
}
void CTDXdataProcessDlg::save_ini()
{
string tmp_str;
string ini_path = "dataprocess.ini";
ofstream is(ini_path.c_str());
is << "源路徑=" << m_oripath.c_str() << endl;
is << "目標路徑=" << m_tagpath.c_str() << endl;
is << "股票代碼=" << m_strDM.GetBuffer(m_strDM.GetLength()) << endl;
is << "開始日期=" << m_date.GetBuffer(m_date.GetLength()) << endl;
is.close();
}
void CTDXdataProcessDlg::OnButtonClear()
{
string filename;
get_tag_filename(filename);
clear_data(filename);
if(this->m_SHzs)
{
get_tag_szzs_filename(filename);
clear_data(filename);
}
if(this->m_SZcz)
{
get_tag_szcz_filename(filename);
clear_data(filename);
}
//清除后需重新定位
m_flag = true;
}
int CTDXdataProcessDlg::get_ori_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_oripath + tmp_file_name;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -