?? stock.cpp
字號:
#include "config.h"
#include <string>
#include <vector>
#include <set>
#include <map>
#include <iostream>
//#include <boost/assign/std/vector.hpp>
//#include <boost/assign/list_inserter.hpp>
#include <boost/thread/detail/config.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include "boost/filesystem/operations.hpp" // includes boost/filesystem/path.hpp
#include "boost/filesystem/fstream.hpp" // ditto
// #include <boost/smart_assert/assert.hpp>
#include <boost/foreach.hpp>
#include "stockio.h"
#include "util.hpp"
#include "stock.h"
using namespace boost;
BOOST_CLASS_TRACKING(StockMarket::GBBQMap, serialization::track_never);
namespace StockMarket{
// using namespace assign;
const float MarketInfo::tax = 0.01f; // 1 %
unsigned int MarketInfo::stocks_count[MarketInfo::MARKET_MAX];
StringSet MarketInfo::stocks_set[MarketInfo::MARKET_MAX];
recursive_mutex transact_mutex;
recursive_mutex bid_mutex;
StockTransact::DateTransact today_transact;
StockTransact::TransactMap hist_transact;
StockBid::BidMap instant_price_list;
#if 0
int StockBasicInfo::apply_gbbq_front(const string &stock_code, const gregorian::date& ref_dt
, const gregorian::date& dst_dt, int ref_price)
{
float new_price = static_cast<float>(ref_price);
uint uint_ref_dt = date_to_uint(ref_dt);
uint uint_dst_dt = date_to_uint(dst_dt);
DateGBBQ &dgb = stock_gbbq_info[stock_code];
for(DateGBBQ::const_iterator iter = dgb.begin(); iter < dgb.end(); ++iter)
{
if(iter->dt <= uint_ref_dt)
continue;
else if(iter->dt <= uint_dst_dt)
{
if(1 == iter->chg_type && iter->data.bonus.cash > 0.1) // 派發現金
{
new_price -= iter->data.bonus.cash * 10;
}
if(1 == iter->chg_type && iter->data.bonus.sell_price > 0.1) // 配股
{
float sell_price = 0, sell_count = 0;
sell_price = iter->data.bonus.sell_price * 100; // 轉化為分
sell_count = iter->data.bonus.sell_count;
new_price += ((sell_price * sell_count) / 10);
}
else if(1 == iter->chg_type&& iter->data.bonus.give_count > 0) // 送或配股或轉增股上市
{
new_price = (new_price * 10) / (10 + iter->data.bonus.give_count);
}
else if(6 == iter->chg_type && iter->data.bonus.sell_price > 0.1) // 增發
{
}
else if(8 == iter->chg_type) // 增發上市
{
}
}
else
{
break;
}
}
if(new_price < 0) new_price = 0;
return static_cast<int>(new_price);
}
#endif
string StockBasicInfo::get_gbbq_file_name(uint tr_date)
{
const string stock_gbbq_file = "F:\\Develop\\stock\\data\\G";
stringstream ss;
ss << stock_gbbq_file << tr_date << ".mat";
return ss.str();
}
bool StockBasicInfo::is_gbbq_file_exist(uint tr_date)
{
return is_file_exist(get_gbbq_file_name(tr_date));
}
void StockBasicInfo::clear_gbbq_info()
{
stock_gbbq_info.clear();
}
#if 0
bool StockBasicInfo::load_gbbq_info(gregorian::date tr_date, int day_count)
{
while(day_count--)
{
if(is_gbbq_file_exist(date_to_uint(tr_date)))
{
string filename = get_gbbq_file_name(date_to_uint(tr_date));
ifstream ifs(filename.c_str(), ios::binary);
if(ifs)
{
archive::binary_iarchive ia(ifs);
ia >> stock_gbbq_info;
std::cout << "GBBQ file " << filename << " applied\r\n";
return true;
}
}
tr_date -= gregorian::date_duration(1);
}
std::cout << "No GBBQ found!\r\n";
return false;
}
#endif
void StockBasicInfo::save_gbbq_info(uint tr_date)
{
if (is_gbbq_file_exist(tr_date))
{
return;
}
string filename = get_gbbq_file_name(tr_date);
int maxDealCount = 0;
GBBQMap::const_iterator iter;
for(iter = stock_gbbq_info.begin();iter != stock_gbbq_info.end(); ++iter)
{
if(iter->second.size() > (uint)maxDealCount)
{
maxDealCount = iter->second.size();
}
}
const int col_count = 8;
int dims[3];
dims[0] = col_count;
dims[1] = maxDealCount;
dims[2] = stock_gbbq_info.size();
mxArray *mx_t0_data = mxCreateNumericArray(3, &dims[0], mxDOUBLE_CLASS, mxREAL);
double *p_mxT0data = mxGetPr(mx_t0_data), *p_temp_mxT0data = p_mxT0data;
const gregorian::date christ_date(2000,1,1);
for(GBBQMap::const_reverse_iterator iter = stock_gbbq_info.rbegin(); iter != stock_gbbq_info.rend(); ++iter)
{
for(DateGBBQ::const_iterator iter_code = iter->second.begin();iter_code != iter->second.end(); ++iter_code)
{
p_temp_mxT0data[0] = iter->first;
p_temp_mxT0data[1] = (uint_to_date(iter->first) - christ_date).days() + 730486; // 相當于 matlab 的 date_num
p_temp_mxT0data[2] = atoi(iter_code->code.c_str());
p_temp_mxT0data[3] = iter_code->chg_type;
p_temp_mxT0data[4] = iter_code->data.gb.old_cir;
p_temp_mxT0data[5] = iter_code->data.gb.old_ttl;
p_temp_mxT0data[6] = iter_code->data.gb.new_cir;
p_temp_mxT0data[7] = iter_code->data.gb.new_ttl;
p_temp_mxT0data += col_count;
}
p_mxT0data += maxDealCount * col_count;
p_temp_mxT0data = p_mxT0data;
}
matlab_engine::Instance().saveVarToFile(filename, mx_t0_data, "gbbq_info");
mxDestroyArray(mx_t0_data);
}
bool StockBasicInfo::load_basic_info()
{
// 加載股票基本資料
// 基本信息
stock_base_info.clear();
BaseInfo bs;
const string stock_data_path = "C:\\Program Files\\xyzq\\T0002\\";
string full_path = stock_data_path + "BASE.DBF";
fstream fs(full_path.c_str(), ios::in);
// fstream ofs("d:\\temp\\t.txt", ios::out);
if(!fs) return false;
int record_off = 0x522;
fs.seekg(record_off);
char c;
fs >> c;
while(!fs.eof() && -1 != fs.tellg())
{
fs >> bs;
record_off += BaseInfo::record_len;
stock_base_info.insert(make_pair(bs.stock_code, bs));
// ofs << bs.stock_code << endl;
fs.seekg(record_off);
fs >> c;
}
return true;
}
void StockBasicInfo::save_basic_info()
{
const string filename = "F:\\Develop\\stock\\data\\basic_info.mat";
StockBaseInfoMap::const_iterator iter_code;
const int deal_col_count = 31;
int dims[2];
dims[0] = deal_col_count;
dims[1] = stock_base_info.size();
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_base_info.begin();iter_code != stock_base_info.end(); ++iter_code)
{
p_temp_mxT0data[0] = atoi(iter_code->first.c_str());
p_temp_mxT0data[1] = iter_code->second.update_time;
p_temp_mxT0data[2] = iter_code->second.ttl_amount;
p_temp_mxT0data[3] = iter_code->second.state_own_amount;
p_temp_mxT0data[4] = iter_code->second.init_amount;
p_temp_mxT0data[5] = iter_code->second.corp_amount;
p_temp_mxT0data[6] = iter_code->second.b_amount;
p_temp_mxT0data[7] = iter_code->second.h_amount;
p_temp_mxT0data[8] = iter_code->second.cir_amount;
p_temp_mxT0data[9] = iter_code->second.empl_amount;
p_temp_mxT0data[10] = iter_code->second.ttl_asset;
p_temp_mxT0data[11] = iter_code->second.varible_asset;
p_temp_mxT0data[12] = iter_code->second.firm_asset;
p_temp_mxT0data[13] = iter_code->second.invisible_asset;
p_temp_mxT0data[14] = iter_code->second.long_term_invest; // 長期投資
p_temp_mxT0data[15] = iter_code->second.varible_debt; // 流動負債
p_temp_mxT0data[16] = iter_code->second.long_term_debt; // 長期負債
p_temp_mxT0data[17] = iter_code->second.accu_fund; // 公積金
p_temp_mxT0data[18] = iter_code->second.net_asset; // 凈資產
p_temp_mxT0data[19] = iter_code->second.major_income; // 主營收入
p_temp_mxT0data[20] = iter_code->second.major_profit; // 主營利潤
p_temp_mxT0data[21] = iter_code->second.bussiness_income; // 營業收入
p_temp_mxT0data[22] = iter_code->second.invest_income; // 營業收入
p_temp_mxT0data[23] = iter_code->second.allowance; // 補貼收入
p_temp_mxT0data[24] = iter_code->second.non_bussiness_income; // 業外收入
p_temp_mxT0data[25] = iter_code->second.income_adjustment; // 收入調整
p_temp_mxT0data[26] = iter_code->second.ttl_profit; // 利潤總額
p_temp_mxT0data[27] = iter_code->second.unknown3; //
p_temp_mxT0data[28] = iter_code->second.net_profit; // 稅后利潤
p_temp_mxT0data[29] = iter_code->second.undist_profit; // 未分配利潤
p_temp_mxT0data[30] = iter_code->second.per_net_assert2; // 每股凈資產2
p_temp_mxT0data += deal_col_count;
}
matlab_engine::Instance().saveVarToFile(filename, mx_t0_data, "basic_info");
mxDestroyArray(mx_t0_data);
}
bool StockBasicInfo::load_block_info()
{
// 加載板塊資料
stock_block_info.clear();
const string stock_data_path = "C:\\Program Files\\xyzq\\T0002\\";
string full_path = stock_data_path + "BLOCK.DAT";
fstream fs(full_path.c_str(), ios::in | ios::binary);
if(!fs) return false;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -