📄 stock.cpp
字号:
int p = 0;
fs.seekg(0x182);
while(!fs.eof() && -1 != (p =fs.tellg()))
{
char temp[10];
fs.read(&temp[0],9);
if(0 == temp[0]) break;
string name(temp); // block name
unsigned short cnt = 0;
fs.read((char*)&cnt, 2);
fs.seekg(2, ios::cur);
while(cnt -- > 0)
{
fs.read(&temp[0],7);
if(0 == temp[0]) break;
string member(temp, 6);
stock_block_info[name].push_back(member);
}
fs.seekg(p + 0x0afd);
}
return true;
}
void StockBasicInfo::save_block_info()
{
const string filename = "F:\\Develop\\stock\\data\\block_info.mat";
int deal_col_count = 0;
StockGroupMap::const_iterator iter_code;
for(iter_code = stock_block_info.begin();iter_code != stock_block_info.end(); ++iter_code)
{
if(iter_code->second.size() > (uint)deal_col_count)
{
deal_col_count = iter_code->second.size();
}
}
++deal_col_count; // 加上名称
int dims[2];
dims[0] = deal_col_count;
dims[1] = stock_block_info.size();
int block_index = 1;
mxArray *mx_t0_data = mxCreateNumericArray(2, &dims[0], mxDOUBLE_CLASS, mxREAL);
double *p_mxT0data = mxGetPr(mx_t0_data), *p_temp_mxT0data = p_mxT0data;
for(iter_code = stock_block_info.begin();iter_code != stock_block_info.end(); ++iter_code, ++block_index)
{
p_temp_mxT0data[0] = block_index; // Block name
int block_member_index = 1;
for(StringVector::const_iterator iter_i = iter_code->second.begin();iter_i < iter_code->second.end();++iter_i, ++block_member_index)
{
p_temp_mxT0data[block_member_index] = atoi(iter_i->c_str());
}
p_temp_mxT0data += deal_col_count;
}
matlab_engine::Instance().saveVarToFile(filename, mx_t0_data, "block_info");
mxDestroyArray(mx_t0_data);
}
void StockBasicInfo::save_stock_set()
{
uint d = date_to_uint(gregorian::day_clock::local_day());
const string filename = "F:\\Develop\\stock\\data\\StockSet";
stringstream ss;
ss << filename << d << ".mat";
if(is_file_exist(ss.str()))return;
int deal_col_count = 0; int max_stock_count = 0;
for(short m = MarketInfo::MARKET_FIRST; m < MarketInfo::MARKET_MAX; m++)
{
max_stock_count += MarketInfo::stocks_set[m].size();
}
int dims[2];
dims[0] = 1;
dims[1] = max_stock_count;
mxArray *mx_t0_data = mxCreateNumericArray(2, &dims[0], mxDOUBLE_CLASS, mxREAL);
double *p_mxT0data = mxGetPr(mx_t0_data), *p_temp_mxT0data = p_mxT0data;
for(short m = MarketInfo::MARKET_FIRST; m < MarketInfo::MARKET_MAX; m++)
{
for(StringSet::const_iterator iter = MarketInfo::stocks_set[m].begin();iter != MarketInfo::stocks_set[m].end();++iter, ++p_temp_mxT0data)
{
*p_temp_mxT0data = atoi(iter->c_str());
}
}
matlab_engine::Instance().saveVarToFile(ss.str(), mx_t0_data, "stock_set");
mxDestroyArray(mx_t0_data);
}
void StockBasicInfo::add_stock_gbbq(uint dt, const GBBQ& gbbq)
{
stock_gbbq_info[dt].push_back(gbbq);
}
#if 0
int StockBasicInfo::get_cir_amount(const string &stock_code, const gregorian::date& dt)
{
DateGBBQ &dgb = stock_gbbq_info[stock_code];
uint uint_dt = date_to_uint(dt);
float cir_amount = 0;
for(DateGBBQ::const_iterator iter = dgb.begin(); iter < dgb.end(); ++iter)
{
if(2 == iter->chg_type || 5 == iter->chg_type || 8 == iter->chg_type)
{
if(iter->dt == uint_dt)
{
cir_amount = iter->data.gb.new_cir;
break;
}
else if(iter->dt > uint_dt)
{
cir_amount = iter->data.gb.old_cir;
break;
}
else
{
cir_amount = iter->data.gb.new_cir;
}
}
}
if(cir_amount < 1.0) // 没有股本变迁数据。取当前值
{
if(stock_base_info.find(stock_code) != stock_base_info.end())
cir_amount = static_cast<float>(stock_base_info[stock_code].cir_amount);
else
cir_amount = 10000.0;
}
return static_cast<int>(cir_amount);
}
#endif
bool StockTransact::Transact::operator == (const StockTransact::Transact& t)
{
return (minute == t.minute
&& price == t.price
&& vol == t.vol
&& bs == t.bs);
}
const int BaseInfo::record_len = 0x1e1;
fstream& operator >> (fstream& fs, BaseInfo& bs)
{
char code[MarketInfo::StocksCodeLen];
fs.read(code, MarketInfo::StocksCodeLen);
bs.stock_code = string(&code[0], MarketInfo::StocksCodeLen);
fs >> bs.update_time;
fs >> bs.ttl_amount;
fs >> bs.state_own_amount; // 国家股
fs >> bs.init_amount; // 发起股本
fs >> bs.corp_amount; // 法人股本
fs >> bs.b_amount; // B 股本
fs >> bs.h_amount; // H 股本
fs >> bs.cir_amount; // 流通 股本
fs >> bs.empl_amount; // 职工 股本
fs >> bs.unknown1; //
fs >> bs.ttl_asset; // 总资产
fs >> bs.varible_asset; // 流动 资产
fs >> bs.firm_asset; // 固定 资产
fs >> bs.invisible_asset; // 无形 资产
fs >> bs.long_term_invest; // 长期投资
fs >> bs.varible_debt; // 流动负债
fs >> bs.long_term_debt; // 长期负债
fs >> bs.accu_fund; // 公积金
fs >> bs.net_asset; // 净资产
fs >> bs.major_income; // 主营收入
fs >> bs.major_profit; // 主营利润
fs >> bs.unknown2; //
fs >> bs.bussiness_income; // 营业收入
fs >> bs.invest_income; // 投资收入
fs >> bs.allowance; // 补贴收入
fs >> bs.non_bussiness_income; // 业外收入
fs >> bs.income_adjustment; // 收入调整
fs >> bs.ttl_profit; // 利润总额
fs >> bs.unknown3; //
fs >> bs.net_profit; // 税后利润
fs >> bs.undist_profit; // 未分配利润
fs >> bs.per_net_assert2; // 每股净资产2
return fs;
}
extern void output_short_index_data();
uint date_to_uint(gregorian::date d)
{
return d.year() * 10000 + d.month() * 100 + d.day();
}
gregorian::date uint_to_date(uint d)
{
return gregorian::date(d / 10000, d % 10000 / 100, d % 100);
}
string MarketInfo::get_first_stock()
{
// set the first stock
for(short m = MarketInfo::MARKET_FIRST; m < MarketInfo::MARKET_MAX; m++)
{
StringSet::const_iterator iter = MarketInfo::stocks_set[m].begin();
if(iter != MarketInfo::stocks_set[m].end())
{
return *iter;
}
}
return "";
}
string MarketInfo::find_next_stock(const string& stock_code)
{
bool first_in_market = false;
for(short m = MarketInfo::get_market_type(stock_code); m < MarketInfo::MARKET_MAX; m++)
{
StringSet::const_iterator iter ;
if(! first_in_market)
{
iter = MarketInfo::stocks_set[m].find(stock_code);
if( iter != MarketInfo::stocks_set[m].end())
{
++iter;
if(iter != MarketInfo::stocks_set[m].end())
{
return *iter;
}
}
first_in_market = true;
}
else
{
iter = MarketInfo::stocks_set[m].begin();
if(iter != MarketInfo::stocks_set[m].end())
{
return *iter;
}
}
}
return "";
}
void show_curr_bid(char const* first, char const* last )
{
cout << "show_curr_bid called\r\n";
recursive_mutex::scoped_lock guard(bid_mutex);
StockBid::BidMap::const_iterator i = instant_price_list.begin();
// has data
if(i != instant_price_list.end())
{
// print title here
}
while(i++ != instant_price_list.end())
{
cout << i->first << endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -