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

📄 tdxdataprocessdlg.cpp

📁 读取通达信日线数据的一些代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 ) );    //设置编辑控件为Spin控件的伙伴窗口
	m_spin.SetRange( 1, 1000 );    //设置数据范围为1-1000


	m_spinbyDate.SetBuddy( GetDlgItem( IDC_EDIT7) );    //设置编辑控件为Spin控件的伙伴窗口
	m_spinbyDate.SetRange( 1, 1000 );    //设置数据范围为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;
}

/*
通达信股票软件日线数据分析
2007-11-29 12:06:10 / 个人分类:技术

日线文件以"代号"+"股票代码"+".day"命名,代号为"sh"或"sz",股票代码6位,一个记录32个字节。
以深发展1997年1月2日的数据为例:
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)
{
	//追加数据
	TDSData_Day myIn, mytmp;
    
	//读完整文件的数据
    ifstream fin;
	fin.open(orifname.c_str(),ios::binary | ios::in);

	//第一次定位数据
	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;
	}
	//以后只要取后面一个数据即可
	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();
    
	//追加到模拟测试的股票数据,文件尾追加
	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() 
{
	//和指数绑定时,由于个股会出现停盘现象,这时会出现个股的日期和指数对不上,由于采用的办法是追加,所以会把后面日期的数据追加上。以后再想办法
	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控件当前值

	//追加数据
	TDSData_Day myIn;
	vector<TDSData_Day> mytmp;
    
	//读完整文件的数据
    ifstream fin;
	fin.open(orifname.c_str(),ios::binary | ios::in);

	//第一次定位数据
	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个数据即可
	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();
    
	//追加到模拟测试的股票数据,文件尾追加
	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 + -