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

📄 tdx_data.cpp

📁 通达信数据源
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		for (unsigned int i=0;i<vect_split_name.size();i++)
		{
			if (i==0)
			{
				if (str_toupper(vect_split_name[i]).find(str_toupper(str_market_code)) == string::npos)
				{
					strcpy(p_prefix_name_temp,str_market_code.c_str());
					strcat(p_prefix_name_temp,vect_split_name[i].c_str());
				} else
				{
					strcpy(p_prefix_name_temp,vect_split_name[i].c_str());
				}
			} else
			{
				if (str_toupper(vect_split_name[i]).find(str_toupper(str_market_code)) == string::npos)
				{
					strcat(p_prefix_name_temp,",");
					strcat(p_prefix_name_temp,str_market_code.c_str());
					strcat(p_prefix_name_temp,vect_split_name[i].c_str());
				} else
				{
					strcat(p_prefix_name_temp,",");
					strcat(p_prefix_name_temp,vect_split_name[i].c_str());
				}
			} // if (i==0)
		}  // for (unsigned int i=0;i<vect_split_name.size();i++)			
	} // if (p_prefix_name == NULL || strlen(p_prefix_name) == 0)
	
	const char* p_file_suffix = ".day";
	string str_tdx_day_data_dir = "w";
	
	//get day_data_dir
	str_tdx_day_data_dir = get_day_data_dir(str_market_code);
	
	std::vector<std::string> vect_file;
	isTrue = get_files_in_dir(vect_file,str_tdx_day_data_dir,p_prefix_name_temp,p_file_suffix);
	if (!isTrue)
	{
		throw stock_data_exception(_D("Can't find stock code, Please check tdx_dir = ") + m_str_tdx_dir + _D(" is correctly!"));
	}

#ifdef	_DEBUG_CHECK_
	I18N_DEBUG(_("%s [%s:%l] str_tdx_day_data_dir : %s\n"),str_tdx_day_data_dir.c_str());
	I18N_DEBUG(_("%s [%s:%l] p_prefix_name_temp : %s\n"),p_prefix_name_temp);
	I18N_DEBUG(_("%s [%s:%l] TdxDataLoader::get_stock_code --> 2\n"));
#endif
	
	bool is_contain = false;
	char p_ch_file[256];
	std::vector<std::string> vect_str;
	
	memset(p_ch_file,0,sizeof(p_ch_file));
	
	for (unsigned int i=0;i<vect_file.size();i++)
	{
		
#ifdef	_DEBUG_CHECK_
	I18N_DEBUG(_D("%s [%s:%l] vect_file : %s\n"),vect_file[i].c_str());
#endif
		
		vect_str.clear();
		
		strcpy(p_ch_file,vect_file[i].c_str());
		is_contain = str_split(p_ch_file,".",vect_str);
		if (is_contain)
		{
			vect_stock_code.push_back(str_toupper(str_market_code)+ "." + vect_str[0].substr(2));	
		}
		
	}

#ifdef	_DEBUG_CHECK_
	I18N_DEBUG(_("%s [%s:%l] TdxDataLoader::get_stock_code --> 3\n"));
#endif
	
	return isTrue;
}
    
bool TdxDataLoader::load_day_data(VectStockData& vect_stockdata,
		const std::string& str_stock_code,
		const char* p_ch_from_date,const char* p_ch_to_date,
		DIV_TYPE div_type,bool is_included_div_data) 
		throw (stock_data_exception)
{
	bool isTrue = false;
	
	string str_tdx_day_data_dir = "w";
	std::string str_stock_code_out = "w";
	std::string str_market_code = "w";
		
	if (!check_transform_stock_code(str_stock_code,str_stock_code_out,str_market_code))
	{
		throw stock_data_exception(_D("Can't find the stock code : ") + str_stock_code);
	}
	
	vect_stockdata.clear();
	
	//get day_data_dir
	str_tdx_day_data_dir = get_day_data_dir(str_market_code);	
	string str_file = str_tdx_day_data_dir + "/" + str_stock_code_out + ".day";
		
	int type = 0; // load_day_data from to		
	isTrue = load_day_data_from_file(str_file,type,vect_stockdata,
		p_ch_from_date,p_ch_to_date,0,false,
		div_type,is_included_div_data);	
	
	
	if (!isTrue)
	{
		throw stock_data_exception(_D("Can't read data from file "));
	}
	
	
	return isTrue;
}
bool TdxDataLoader::load_day_data(VectStockData& vect_stockdata,
		const std::string& str_stock_code, 
		const char* p_ch_date,int data_length,
		bool is_previous_data,DIV_TYPE div_type ,
		bool is_included_div_data) throw (stock_data_exception)
{
	bool isTrue = false;
	
	string str_tdx_day_data_dir = "w";
	std::string str_stock_code_out = "w";
	std::string str_market_code = "w";
	
	if (!check_transform_stock_code(str_stock_code,str_stock_code_out,str_market_code))
	{
		throw stock_data_exception(_D("Can't find the stock code : ") + str_stock_code);
	}
	
	vect_stockdata.clear();
	
	//get day_data_dir
	str_tdx_day_data_dir = get_day_data_dir(str_market_code);	
	string str_file = str_tdx_day_data_dir + "/" + str_stock_code_out + ".day";
	
	int type = 1; // load_day_data from ,data_length	
	isTrue = load_day_data_from_file(str_file,type,vect_stockdata,
		p_ch_date,NULL,data_length,is_previous_data,
		div_type,is_included_div_data);	
		
	if (!isTrue)
	{
		throw stock_data_exception(_D("Can't read data from file "));
	}
	
	return isTrue;
}

bool TdxDataLoader::load_min5_data(VectStockData& vect_stockdata,
		const std::string& str_stock_code, 
		const char* p_ch_from_date,const char* p_ch_to_date,DIV_TYPE div_type, 
		bool is_included_div_data) throw (stock_data_exception)
{
	bool isTrue = false;
		
	
	return isTrue;
}

bool TdxDataLoader::load_min5_data(VectStockData& vect_stockdata,
		const std::string& str_stock_code, 
		const char* p_ch_date,int data_length, bool is_previous_data,DIV_TYPE div_type ,
		bool is_included_div_data) throw (stock_data_exception)
{
	bool isTrue = false;
		
	return isTrue;
}

bool TdxDataLoader::load_day_data_from_file(const std::string& str_file,int type,
		VectStockData& vect_stockdata,		
		const char* p_ch_from_date,const char* p_ch_to_date,
		int data_length,bool is_previous_data,
		DIV_TYPE div_type, bool is_included_div_data)
{
	bool isTrue = false;
	
	/*	
	if (p_ch_from_date != NULL && strlen(p_ch_from_date) != 8)
	{
		throw stock_data_exception(_D("p_ch_from_date data format error,data format: YYYYMMDD,eg 20050902"));
		return isTrue;
	}
	*/
		
	int origin = 0;
	long offset = 0;
	char p_ch_last_time[256];
	string str_tmp_time = "w";
	struct tm tm_from_time;
	struct tm tm_last_time;
	double db_diff_time = 0;
	unsigned long l_from_date = 0;
	unsigned long l_to_date = 0;
	
	char p_ch_time_tmp[256];
	
	FILE *fp;
	
	tdx_data_block data_block;
	
	memset(&tm_from_time,0,sizeof(tm_from_time));
	memset(&tm_last_time,0,sizeof(tm_last_time));
	memset(&p_ch_last_time,'\0',sizeof(p_ch_last_time));
	memset(&p_ch_time_tmp,'\0',sizeof(p_ch_time_tmp));	
	
	memset(&data_block,0,sizeof(data_block));	
	
	// init data	
	
	if (NULL == (fp = fopen(str_file.c_str(),"rb")))
	{
		throw stock_data_exception(_D("Can't open file ") + str_file);		
		isTrue = false;
		return isTrue;
	}
	
	// read header
	size_t iCount = 0;
	int i_ret = 0;
	int data_block_len = sizeof(data_block);
		
	// get the last time
	if((i_ret = fseek(fp,-data_block_len,SEEK_END)) == EINVAL)
	{
		//I18N_ERROR(_D("%s [%s:%l] fseek error, error is : %s \n"),strerror(errno));		
		fclose(fp);	
		isTrue = false;
		throw stock_data_exception(_D("fseek error, error is : ") + string(strerror(errno)));
		return isTrue;
	}
	
	if ((iCount = fread(&data_block,sizeof(data_block),1,fp)) != 0)
	{		
		sprintf(p_ch_last_time,"%ld",data_block.date);
		//I18N_INFO(_D("%s date : %s \n"),p_ch_last_time);
		//str_tmp_time = p_ch_last_time;
		str_tmp_time = p_ch_last_time;
		gnu::get_tm(tm_last_time,p_ch_last_time);
	}
		
	if (p_ch_from_date == NULL)
	{
		origin = SEEK_SET;
		offset = 0;
		
		if((i_ret = fseek(fp,offset,origin)) == EINVAL)
		{			
			fclose(fp);	
			isTrue = false;
			throw stock_data_exception(_D("fseek error, error is : ")+string(strerror(errno)));
			return isTrue;
		}
	} else // p_ch_from_date != NULL
	{
		l_from_date = atol(p_ch_from_date);
		
		str_tmp_time = p_ch_from_date;
		gnu::get_tm(tm_from_time,p_ch_from_date);
				
		/*
		I18N_DEBUG(_("%s [%s:%l] tm_year : %d tm_mon: %d tm_mday:%d \n"),
			tm_last_time.tm_year,tm_last_time.tm_mon,tm_last_time.tm_mday);	
		I18N_DEBUG(_("%s [%s:%l] tm_year : %d tm_mon: %d tm_mday:%d \n"),
			tm_from_time.tm_year,tm_from_time.tm_mon,tm_from_time.tm_mday);	
		*/
		
		db_diff_time = difftime(mktime(&tm_last_time),mktime(&tm_from_time))/(60*60*24);		
		if (db_diff_time < 0)
		{
			db_diff_time = 0;
		}
		
		db_diff_time ++;
		
		//I18N_DEBUG(_("%s [%s:%l] db_diff_time : %f \n"),db_diff_time);	
		
		origin = SEEK_END;
		offset = - ((long)db_diff_time * data_block_len);
		i_ret = fseek(fp,offset,origin);
		if(i_ret == EINVAL || i_ret == EOF)
		{
			origin = SEEK_SET;
			offset = 0;
			//I18N_ERROR(_D("%s [%s:%l] fseek error, error is : %s \n"),strerror(errno));
			i_ret = fseek(fp,offset,origin);
			if(i_ret == EINVAL)
			{				
				fclose(fp);	
				isTrue = false;
				throw stock_data_exception(_D("fseek error, error is : ") + string(strerror(errno)));
				return isTrue;
			}
		}
		
	} //if (p_ch_from_date == NULL)
	
	if (p_ch_to_date != NULL)
	{
		l_to_date = atol(p_ch_to_date);
	}
	
	StockData stock_data;
	
	if (type == 0) // using p_ch_from_date and p_ch_to_date
	{
		//I18N_DEBUG(_("%s [%s:%l] l_from_date : %d \n"),l_from_date);	
		while ((iCount = fread(&data_block,sizeof(data_block),1,fp)) > 0)
		{
			//I18N_DEBUG(_("%s [%s:%l] data_block.date : %d \n"),data_block.date);
			
			if (l_to_date > 0 && data_block.date > l_to_date )
			{
				break;
			}	
			
			if (data_block.date >= l_from_date)
			{
				sprintf(p_ch_time_tmp,"%ld",data_block.date);
				strncpy(stock_data.day,p_ch_time_tmp,LEN_DATE);
				stock_data.open_price = (float)data_block.open_price/100;
				stock_data.close_price = (float)data_block.close_price/100;
				stock_data.high_price = (float)data_block.high_price/100;
				stock_data.low_price = (float)data_block.low_price/100;
				stock_data.volume = data_block.volume;
				stock_data.money = data_block.money;
				
				stock_data.last_close_price = (float) data_block.last_close_price/100;
				
				vect_stockdata.push_back(stock_data);						
			}						
		}
	} else // using p_ch_from_date , data_length and is_previous_data
	{
		if (is_previous_data)
		{
			bool is_no_curr_day = false;
			
			if (l_from_date == 0) // go to EOF
			{
				origin = SEEK_END;
				offset = 0;
		
				if((i_ret = fseek(fp,offset,origin)) == EINVAL)
				{					
					fclose(fp);	
					isTrue = false;
					throw stock_data_exception(_D("fseek error, error is : ") + string(strerror(errno)));
					return isTrue;
				}
			} else
			{
				// get the from_date
				while ((iCount = fread(&data_block,sizeof(data_block),1,fp)) > 0)
				{
					if (data_block.date == l_from_date)
					{
						is_no_curr_day = false;
						break;					
					}
					
					if (data_block.date > l_from_date)
					{
						is_no_curr_day = true;
						break;					
					} 			
				}
			} //if (l_from_date == 0) 			
			
			//I18N_DEBUG(_("%s [%s:%l] data_length : %d \n"),data_length);
			
			// go to begin postion
			origin = SEEK_CUR;	
			if (is_no_curr_day)
			{
				offset = - ((data_length+1) * data_block_len);
			} else
			{
				offset = - ((data_length) * data_block_len);	
			}	
						
			if (data_length == 0)
			{
				origin = SEEK_SET;
				offset = 0;
			}				
		
			i_ret = fseek(fp,offset,origin);
			if(i_ret == EINVAL || i_ret == EOF)
			{
				origin = SEEK_SET;
				offset = 0;
				//I18N_ERROR(_D("%s [%s:%l] fseek error, error is : %s \n"),strerror(errno));
			
				if((i_ret = fseek(fp,offset,origin)) == EINVAL)
				{					
					fclose(fp);	
					isTrue = false;
					throw stock_data_exception(_D("fseek error, error is : ") + string(strerror(errno)));
					return isTrue;
				}
			}
			
			// go to get data
			while ((iCount = fread(&data_block,sizeof(data_block),1,fp)) > 0)
			{
				//I18N_DEBUG(_("%s [%s:%l] data_block.date : %d \n"),data_block.date);
				
				if (l_from_date >0 && data_block.date > l_from_date)
				{
					break;						
				}	
				
				sprintf(p_ch_time_tmp,"%ld",data_block.date);
				strncpy(stock_data.day,p_ch_time_tmp,LEN_DATE);
				stock_data.open_price = (float)data_block.open_price/100;
				stock_data.close_price = (float)data_block.close_price/100;
				stock_data.high_price = (float)data_block.high_price/100;
				stock_data.low_price = (float)data_block.low_price/100;
				stock_data.volume = data_block.volume;
				stock_data.money = data_block.money;
				
				stock_data.last_close_price = (float)data_block.last_close_price/100;
				
				vect_stockdata.push_back(stock_data);						
				
			} // while ((iCount = fread(&data_block,sizeof(data_block),1,fp)) > 0)
			
		} else // not front_data
		{
			int i_tmp_count = 0;
			while ((iCount = fread(&data_block,sizeof(data_block),1,fp)) > 0)
			{
				//I18N_DEBUG(_("%s [%s:%l] data_block.date : %d \n"),data_block.date);
				
				if (data_length > 0 && i_tmp_count >= data_length )
				{
					break;
				}
				
				if (data_block.date >= l_from_date)
				{
					sprintf(p_ch_time_tmp,"%ld",data_block.date);
					strncpy(stock_data.day, p_ch_time_tmp,LEN_DATE);
					stock_data.open_price = (float)data_block.open_price/100;
					stock_data.close_price = (float)data_block.close_price/100;
					stock_data.high_price = (float)data_block.high_price/100;
					stock_data.low_price = (float)data_block.low_price/100;
					stock_data.volume = data_block.volume;
					stock_data.money = data_block.money;
				
					stock_data.last_close_price = (float)data_block.last_close_price/100;	
					
					vect_stockdata.push_back(stock_data);	
					
					i_tmp_count++;				
				}			
						
			} // while ((iCount = fread(&data_block,sizeof(data_block),1,fp)) > 0)
		} // if (is_previous_data)
	} // if (type == 0)
			
	fclose(fp);	
	isTrue = true;
	
	return isTrue;
}

	   
extern "C" {
	
DataLoader* maker_dataloader()
{
   return new TdxDataLoader;
}

} // extern "C" {

⌨️ 快捷键说明

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