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

📄 stock.cpp

📁 通达信股票软件数据接收程序 能够将连接服务器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -