亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? commands.cpp

?? 通信達接口引警 可直接下載股票數據,建立自已的股票軟件
?? CPP
字號:

#include "config.h"


#include <vector>
#include <set>
#include <map>
#include <queue>

#include <boost/thread/detail/config.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
//#include <boost/smart_assert/assert.hpp>
#include <boost/tuple/tuple.hpp>

#include <loki/Factory.h>

#include "tcpSocket.h"
#include "stock.h"
#include "request.h"
#include "response.h"
#include "commands.h"

namespace StockMarket
{

	static const int max_transaction_per_day = 6000;
	
	recursive_mutex InstantTransRes::inst_trans_res_map_mutex;

	InstantTransShareData g_InstantTransShareData;

	InstantTransReq::InstantTransReq(const string& stock_code, int count) 
		: s(stock_code, 0, count), finished(false) ,all_stock(false)
	{
		g_InstantTransShareData.current_stock = current_stock;
	}
	InstantTransReq::InstantTransReq(int count = 1000) : s("000000", 0, count), finished(true) ,all_stock(true)
	{
		// set the first stock
		if("" != (current_stock = MarketInfo::get_first_stock()))
		{
			g_InstantTransShareData.current_stock = current_stock;
			s.set_stock_code(current_stock);
			finished = false;
		}
		else
		{
			finished = true;
		}
	}
	char* InstantTransReq::buff()
	{
		return (char*)&s;
	}
	ulong InstantTransReq::len()
	{
		return sizeof(InstantTransStruct);
	}
	void InstantTransReq::send(TcpSocket& soc)
	{
		Request::send(soc);
	}

	InstantTransReq& InstantTransReq::operator++()
	{
		if("" != (current_stock = MarketInfo::find_next_stock(current_stock)))
		{
			g_InstantTransShareData.current_stock = current_stock;
			s.set_stock_code(current_stock);
			finished = false;
		}
		else
		{
			finished = true;
		}
		return *this;
	}
	InstantTransReq::operator bool ()
	{
		return !finished;
	}
	InstantTransReq::InstantTransStruct::InstantTransStruct(){}
	InstantTransReq::InstantTransStruct::InstantTransStruct(const string& stock_code,  ushort record_offset, ushort record_count )
		: header(CMD_INSTANT_TRANS, sizeof(InstantTransStruct)), 
		offset(record_offset), count(record_count)
	{
		set_stock_code(stock_code);
	}
	void InstantTransReq::InstantTransStruct::set_stock_code(const string& stock_code)
	{
		memcpy(code, stock_code.c_str(), MarketInfo::StocksCodeLen);
		location = MarketInfo::get_market_location(stock_code);
	}

	void InstantTransRes::operator()()
	{
		recursive_mutex::scoped_lock guard(inst_trans_res_map_mutex);

		const int recent_data_buffer = 1000;

		StockTransact::DailyTransact& today_t = today_transact[g_InstantTransShareData.current_stock];
		static StockTransact::Transact temp_daily_t[recent_data_buffer];	// 如果連續 多個 個相同,就認為是同一序列
		bool is_the_first_get = today_t.empty();

		StockTransact::Transact t;
		uint priceBase = 0;
		int first = 1;
		
		ushort count = get_ushort();

		int new_data_count = 0;
		
		while(count-- > 0)
		{
			t.minute = get_ushort();
			// relatively loose assert
			if(t.minute < 9 * 60 || t.minute > 16 * 60)
			{
				throw StockResWrongData(5);
			}
			if(first)
			{
				priceBase = t.price = parse_data2();
				first = 0;
			}
			else
			{
				priceBase = t.price = (uint)(parse_data2() + priceBase);
			}
			t.vol = parse_data2();
			t.count = get_uchar();		// 成交筆數。 0: 未知
			t.bs = get_uchar();
			skip_byte(1);			// the ending zero

			if(is_the_first_get)
			{
				today_t.push_back(t);
			}
			else
			{
				temp_daily_t[new_data_count++] = t;
			}
		}
		if(is_the_first_get) return;

		// 確定兩序列中要比較的記錄數
		int to_compare_count = 5 < today_t.size() ? 5 : today_t.size();

		if(new_data_count < to_compare_count) return;	// 太少數據,肯定出錯了。

		// 匹配兩序列中相同的部分
		bool matched = true; int i = 0, j = 0;
		for(; i < new_data_count; ++i)
		{
			matched = true;
			for(uint compare_index = today_t.size() - to_compare_count, j = i;
				compare_index < today_t.size(); ++compare_index, ++j)
			{
				if((today_t[compare_index].price != temp_daily_t[j].price) 
					|| (today_t[compare_index].vol != temp_daily_t[j].vol)
					|| (today_t[compare_index].minute != temp_daily_t[j].minute)
					|| (today_t[compare_index].bs != temp_daily_t[j].bs))
				{
					matched = false;
					break;
				}
			}
			if(matched)
			{
				break;
			}
		}
		// 將不相同即新增部分,添加到原有數據后。
		if(matched)
		{
			for(++j; j < new_data_count; ++j)
			{
				today_t.push_back(temp_daily_t[j]);
			}
		}
		return;

	}

	recursive_mutex HisTransRes::his_trans_res_map_mutex;

	HisTransShareData g_HisTransShareData;
	
	HisTransReq::HisTransReq(const string& stock_code,  uint record_date)
		: s(stock_code, record_date, 0, to_get_count), current_stock(stock_code), finished(false), all_stock(false)
	{
		g_HisTransShareData.current_stock = current_stock;
		g_HisTransShareData.date = record_date;
		g_HisTransShareData.to_get_offset = 0;
		g_HisTransShareData.total_got_count = 0;
		g_HisTransShareData.got_one_stock = false;
	}
	HisTransReq::HisTransReq(uint record_date)
		: s("000000", record_date, 0, to_get_count), finished(true) ,all_stock(true)
	{
		// set the first stock
		if("" != (current_stock = MarketInfo::get_first_stock()))
		{
			s.set_stock_code(current_stock);
			finished = false;

			g_HisTransShareData.current_stock = current_stock;
			g_HisTransShareData.date = record_date;
			g_HisTransShareData.to_get_offset = 0;
			g_HisTransShareData.total_got_count = 0;
			g_HisTransShareData.got_one_stock = false;
		}
		else
		{
			finished = true;
		}
	}
	char* HisTransReq::buff()
	{
		return (char*)&s;
	}
	ulong HisTransReq::len()
	{
		return sizeof(HisTransStruct);
	}
	void HisTransReq::send(TcpSocket& soc)
	{
		Request::send(soc);
	}
	HisTransReq& HisTransReq::operator++()
	{
		if(!g_HisTransShareData.got_one_stock)
		{
			g_HisTransShareData.to_get_offset = g_HisTransShareData.total_got_count;
			s.set_offset(g_HisTransShareData.to_get_offset);
			return *this;
		}

		if("" != (current_stock = MarketInfo::find_next_stock(current_stock)))
		{
			g_HisTransShareData.current_stock = current_stock;
			g_HisTransShareData.to_get_offset = 0;
			g_HisTransShareData.total_got_count = 0;
			g_HisTransShareData.got_one_stock = false;			// Next Stock

			s.set_stock_code(current_stock);
			s.set_offset(g_HisTransShareData.to_get_offset);
			finished = false;
		}
		else
		{
			finished = true;
		}
		return *this;
	}
	HisTransReq::operator bool ()
	{
		return !finished;
	}
	
	HisTransReq::HisTransStruct::HisTransStruct(){}
	HisTransReq::HisTransStruct::HisTransStruct(const string& stock_code,  uint record_date, ushort record_offset, ushort record_count)
		: header(CMD_HIS_TRANS, sizeof(HisTransStruct)), date(record_date), offset(record_offset), count(record_count)
	{
		set_stock_code(stock_code);
	}
	void HisTransReq::HisTransStruct::set_stock_code(const string& stock_code)
	{
		memcpy(code, stock_code.c_str(), MarketInfo::StocksCodeLen);
		location = MarketInfo::get_market_location(stock_code);
	}
	void HisTransReq::HisTransStruct::set_offset(ushort off)
	{
		offset = off;
	}

  	void HisTransRes::operator()()
	{
		recursive_mutex::scoped_lock guard(his_trans_res_map_mutex);

		static StockTransact::Transact temp_daily_t[max_transaction_per_day];				// 緩沖, 大一些安全一些

		int priceBase = 0;
		int first = 1;
		
		short count = get_short();
		skip_byte(4);													// do not know what it is

		short got_count = count;
		g_HisTransShareData.total_got_count += count;

		int temp_count = g_HisTransShareData.total_got_count;
		
		if(g_HisTransShareData.total_got_count > max_transaction_per_day)										// 緩沖滿
		{
			cout << __FUNCTION__ << " code= " << g_HisTransShareData.current_stock << " date = " << g_HisTransShareData.date << "count= " << count << endl;
			throw StockResWrongData(6);
		}

		StockTransact::Transact *t = &temp_daily_t[max_transaction_per_day - g_HisTransShareData.total_got_count];
		while(count--)
		{
			t->minute = get_short();
			// relatively loose assert
			if(t->minute < 9 * 60 || t->minute > 16 * 60 || priceBase < 0)
			{
				cout << __FUNCTION__ << " code= " << g_HisTransShareData.current_stock << " date = " << g_HisTransShareData.date << "count= " << count << endl;
				throw StockResWrongData(7);
			}
			if(first)
			{
				priceBase = t->price = parse_data2();
				first = 0;
			}
			else
			{
				priceBase = t->price = parse_data2() + priceBase;
			}
			t->vol = parse_data2();
			t->bs = get_uchar();
			t->count = get_uchar();

			++t;
		}
		if(got_count < HisTransReq::to_get_count)				// 結束
		{
			StockTransact::DailyTransact& daily_t = hist_transact[g_HisTransShareData.date][g_HisTransShareData.current_stock];
			daily_t.assign(&temp_daily_t[max_transaction_per_day - g_HisTransShareData.total_got_count], &temp_daily_t[max_transaction_per_day]);
			g_HisTransShareData.got_one_stock = true;
			return;
		}
	}

	StockRes* CreateInstantTransRes()
	{
		return new InstantTransRes();
	}
	
	StockRes* CreateHisTransRes()
	{
		return new HisTransRes();
	}
	

}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区精品视频| 色综合一区二区三区| 福利91精品一区二区三区| 精品视频1区2区| 国产精品久久久久久久久果冻传媒| 亚洲午夜久久久久久久久电影院| 国产美女在线观看一区| 欧洲国内综合视频| 中文幕一区二区三区久久蜜桃| 天天免费综合色| 91官网在线观看| 中文字幕亚洲精品在线观看| 美日韩一区二区三区| 在线观看网站黄不卡| 亚洲欧洲三级电影| 成人免费视频视频在线观看免费 | 91成人免费电影| 国产女人aaa级久久久级 | 亚洲成年人影院| 91片黄在线观看| 国产精品久久久久国产精品日日| 国产一区二区三区美女| 欧美成人r级一区二区三区| 日本中文在线一区| 国产亚洲成年网址在线观看| 亚洲成人精品在线观看| 在线观看免费亚洲| 亚洲乱码国产乱码精品精98午夜| 成人丝袜18视频在线观看| 久久这里只精品最新地址| 九九**精品视频免费播放| 日韩一级视频免费观看在线| 肉肉av福利一精品导航| 7777精品伊人久久久大香线蕉经典版下载 | 久久精品水蜜桃av综合天堂| 美女网站在线免费欧美精品| 7777精品久久久大香线蕉| 亚洲福利视频导航| 色婷婷一区二区| 午夜欧美一区二区三区在线播放| 91亚洲国产成人精品一区二三 | 亚洲乱码精品一二三四区日韩在线| 成人黄色国产精品网站大全在线免费观看 | 亚洲国产精品ⅴa在线观看| 国产综合成人久久大片91| 久久网站最新地址| 成人一区二区三区| 亚洲欧美在线观看| 欧美做爰猛烈大尺度电影无法无天| 亚洲一区二区在线观看视频| 在线观看日韩精品| 偷拍日韩校园综合在线| 日韩欧美综合在线| 久久99国产精品麻豆| 精品三级av在线| 国产成人精品aa毛片| 亚洲一区二区在线视频| 91在线精品秘密一区二区| 国产欧美精品一区二区色综合| 国产v综合v亚洲欧| 亚洲三级在线免费| 欧美高清激情brazzers| 国产一区二区久久| 1024精品合集| 欧美一级二级三级蜜桃| 丰满放荡岳乱妇91ww| 亚洲午夜精品在线| 精品91自产拍在线观看一区| 99麻豆久久久国产精品免费优播| 亚洲成人黄色影院| 国产日产亚洲精品系列| 欧美日韩免费不卡视频一区二区三区| 麻豆精品在线播放| 一区二区三区**美女毛片| 精品免费一区二区三区| 色妹子一区二区| 国产一区二区调教| 丝袜脚交一区二区| 国产精品久久久久影院色老大 | 久久精品99久久久| 国产精品伦理一区二区| 欧美一区二区三区免费视频| 97成人超碰视| 狠狠色丁香久久婷婷综| 亚洲成av人片在线| 亚洲婷婷综合久久一本伊一区| 日韩欧美成人一区二区| 欧美亚洲综合在线| 99久久免费国产| 国产精品中文字幕一区二区三区| 亚洲午夜久久久| 有码一区二区三区| 中文字幕在线播放不卡一区| 精品国产三级a在线观看| 欧美日韩视频在线观看一区二区三区| 粉嫩一区二区三区在线看| 麻豆91在线看| 日韩av一区二区在线影视| 亚洲一区二区三区视频在线播放 | 久久久亚洲精品一区二区三区| 色欧美片视频在线观看| 91一区二区三区在线观看| 日本欧美一区二区在线观看| 欧美成va人片在线观看| 欧美人伦禁忌dvd放荡欲情| 暴力调教一区二区三区| 国产精品影视天天线| 久久99精品久久久久久动态图| 日韩精品一二三| 日韩国产欧美一区二区三区| 亚洲国产精品久久久男人的天堂| 亚洲欧美日韩小说| 尤物视频一区二区| 亚洲国产精品久久久久秋霞影院 | 激情文学综合网| 男人的天堂亚洲一区| 亚洲一区二区三区四区在线| 亚洲与欧洲av电影| 亚洲成人一区在线| 秋霞午夜av一区二区三区| 中文字幕一区视频| 国产精品久久福利| 亚洲激情av在线| 国产精品美女久久福利网站| 久久久久高清精品| 国产亚洲精品免费| 国产精品对白交换视频| 亚洲欧美一区二区三区极速播放| 国产精品久久福利| 亚洲成人中文在线| 美女国产一区二区| 国产成人福利片| 91高清在线观看| 欧美一级专区免费大片| 欧美精品一区二| 最新国产成人在线观看| 亚洲在线中文字幕| 国内久久婷婷综合| 97se亚洲国产综合自在线| 欧美日韩国产系列| 久久一区二区三区国产精品| 最近日韩中文字幕| 天堂一区二区在线免费观看| 国产乱码一区二区三区| 色综合婷婷久久| 日韩视频一区在线观看| 国产精品久久福利| 久久精品无码一区二区三区| 国内精品国产三级国产a久久| 激情久久久久久久久久久久久久久久| 日本中文一区二区三区| 国产精品18久久久久久久久久久久 | 国产精品久久毛片| 日韩不卡一区二区| 色综合中文综合网| wwww国产精品欧美| 亚洲精品大片www| 久久福利视频一区二区| 91免费看片在线观看| 欧美不卡一区二区三区四区| 亚洲少妇中出一区| 经典三级在线一区| 欧美在线观看一二区| 久久精品在线观看| 偷拍一区二区三区| 在线免费精品视频| 国产精品每日更新| 久久国产精品露脸对白| 欧美日韩二区三区| 成人欧美一区二区三区白人| 韩国欧美国产1区| 欧美久久久久免费| 玉米视频成人免费看| 成人深夜视频在线观看| wwwwww.欧美系列| 日韩影视精彩在线| 欧美亚洲一区三区| 中文字幕一区免费在线观看| 精品亚洲成a人| 欧美高清www午色夜在线视频| 亚洲欧美电影一区二区| 高清国产一区二区三区| 亚洲精品在线三区| 美美哒免费高清在线观看视频一区二区 | 在线中文字幕不卡| 国产精品福利电影一区二区三区四区| 国模套图日韩精品一区二区| 欧美视频在线一区| ...xxx性欧美| 99久久精品99国产精品 | 久久综合色婷婷| 日韩精品福利网| 欧美日韩精品三区| 亚洲精品伦理在线| 91黄视频在线观看| 亚洲女同一区二区| 色哟哟国产精品免费观看| 国产精品高清亚洲| 9久草视频在线视频精品| ...av二区三区久久精品|