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