Пример #1
0
/*
 * Class:     com_wiesen_test_provider_MapDecodeJNI
 * Method:    decodeTileInfo
 * Signature: (Ljava/lang/String;II)V
 */
void JNICALL Java_com_wiesen_test_provider_MapDecodeJNI_decodeTileInfo
        (JNIEnv *env, jobject object, jstring path, jint start, jint length){
    const char *j_path = env->GetStringUTFChars(path, 0);
    std::ifstream file(j_path,std::ios::in|std::ios::binary);
    char * tile_info = (char *) malloc(length);
    if (!file){
        return;
    }
    file.seekg(start,std::ios_base::beg);
    file.read(tile_info,length);
    file.close();
    env->ReleaseStringUTFChars(path,j_path);

    jclass  clazz = env->GetObjectClass(object);
    if (clazz == NULL){
        MY_LOG_ERROR("clazz is null");
        return;
    }
    jmethodID  method_id = env->GetMethodID(clazz,"setTileInfo","([B)V");

    if (method_id == NULL){
        MY_LOG_ERROR("not found setTileInfo([B) method");
        return;
    }

    jbyteArray bytes = env->NewByteArray(length);
    env->SetByteArrayRegion(bytes, 0,length, (jbyte *) tile_info);
    env->CallVoidMethod(object,method_id,bytes);
    free(tile_info);
}
Пример #2
0
/*
 * Class:     com_wiesen_test_provider_MapDecodeJNI
 * Method:    getTileIndex
 * Signature: (Ljava/lang/String;)V
 */
void JNICALL Java_com_wiesen_test_provider_MapDecodeJNI_getTileIndex
        (JNIEnv *env, jobject object, jstring path){
    const char *j_path = env->GetStringUTFChars(path, 0);
    std::ifstream in(j_path,std::ios::in|std::ios::binary);
    char *index = (char *) malloc(8 * 1024);
    if (!in) {
        MY_LOG_ERROR("file open error");
        return;
    }
    in.seekg(0, std::ios_base::beg);
    in.read(index, 8 * 1024);
    in.close();
    env->ReleaseStringUTFChars(path,j_path);


    jclass  clazz = env->GetObjectClass(object);
    if (clazz == NULL){
        MY_LOG_ERROR("clazz is null");
        return;
    }
    jmethodID  method_id = env->GetMethodID(clazz,"parseIndex","(Ljava/lang/String;)V");

    if (method_id == NULL){
        MY_LOG_ERROR("not found parseIndex(String) method");
        return;
    }
    jstring index_str = env->NewStringUTF(index);
    env->CallVoidMethod(object,method_id,index_str);
    env->ReleaseStringUTFChars(index_str,index);
    free(index);
}
Пример #3
0
IndexDB::IndexDB():m_mutex()
{
	MY_LOG_DEBUG("IndexDB::IndexDB()");
	const Conf & cf = Conf::get_instance();
	m_conn = mysql_init(NULL);
	if( m_conn == NULL)
	{
		MY_LOG_ERROR("IndexDB() mysql_init() %s", mysql_error(m_conn));
	}
	unsigned int  port = (unsigned int)atoi( cf["sql_port"].c_str());
	m_db = cf["sql_db"];
	m_table = cf["sql_table"];
	if( mysql_real_connect( 
				m_conn, 
				cf["sql_host"].c_str(),  
				cf["sql_usr"].c_str(), 
				cf["sql_passwd"].c_str(), 
				m_db.c_str(),
				port, 
				NULL, 
				0 ) == NULL)
	{
		MY_LOG_ERROR("IndexDB() mysql_real_connect() %s ", mysql_error(m_conn));
	}

	std::string qstr = " select max(id) from ";
	qstr += m_table;
	if( mysql_real_query( m_conn,  qstr.c_str(), qstr.size() )  )
	{

		MY_LOG_ERROR("IndexDB() mysql_real_query() %s  :  %s ", qstr.c_str(),  mysql_error(m_conn));
	}
	
	MYSQL_RES * result = mysql_store_result( m_conn);
	if( NULL ==  result )
	{
		MY_LOG_ERROR("IndexDB() mysql_store_result() %s ", mysql_error(m_conn));
	}
	else
	{
		MYSQL_ROW  row;
		while( (row = mysql_fetch_row( result)))
		{
			if( row[0] == NULL)	
			{
				m_count =0;
			}
			else
			{
				m_count = strtoul( row[0] , NULL, 0)	;
			}
		}
	
	}

	mysql_free_result(result);

}
Пример #4
0
void MYCTPTradeInterface::OnRspQryInstrumentCommissionRate(CThostFtdcInstrumentCommissionRateField *pInstrumentCommissionRate,
    CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    // 成功了
    if (pRspInfo == NULL || pRspInfo->ErrorID == 0)
    {
        if (pInstrumentCommissionRate)
        {
            MY_LOG_INFO("OnRspQryInstrumentCommissionRate, InstrumentID: %s"
                "; InvestorRange: %c"
                "; BrokerID: %s"
                "; InvestorID: %s"
                "; OpenRatioByMoney: %.4f"
                "; OpenRatioByVolume: %.4f"
                "; CloseRatioByMoney: %.4f"
                "; CloseRatioByVolume: %.4f"
                "; CloseTodayRatioByMoney: %.4f"
                "; CloseTodayRatioByVolume: %.4f",
                pInstrumentCommissionRate->InstrumentID,
                pInstrumentCommissionRate->InvestorRange,
                pInstrumentCommissionRate->BrokerID,
                pInstrumentCommissionRate->InvestorID,
                pInstrumentCommissionRate->OpenRatioByMoney,
                pInstrumentCommissionRate->OpenRatioByVolume,
                pInstrumentCommissionRate->CloseRatioByMoney,
                pInstrumentCommissionRate->CloseRatioByVolume,
                pInstrumentCommissionRate->CloseTodayRatioByMoney,
                pInstrumentCommissionRate->CloseTodayRatioByVolume
                );
        }
        else
        {
            MY_LOG_ERROR("OnRspQryInstrumentCommissionRate, response info is null.");
        }
    }
    else
    {
        MY_LOG_ERROR("OnRspQryInstrumentCommissionRate, ErrorID: %d; ErrorMsg: %s",
            pRspInfo->ErrorID, pRspInfo->ErrorMsg);
    }

    // 查别的
    if (bIsLast)
    {
        CThostFtdcQryInstrumentField instrument_struct;
        memset(&instrument_struct, 0, sizeof(instrument_struct));
        memcpy(instrument_struct.InstrumentID, "", strlen(""));
        memcpy(instrument_struct.ExchangeID, "", strlen(""));
        memcpy(instrument_struct.ExchangeInstID, "", strlen(""));
        memcpy(instrument_struct.ProductID, "", strlen(""));

        boost::this_thread::sleep(boost::posix_time::millisec(1000)); // 查询要间隔1s
        int ret = p_trader_api_->ReqQryInstrument(&instrument_struct, ++nRequestID);
        MY_LOG_INFO("ReqQryInstrument, return_code: %d", ret);
    }
}
Пример #5
0
void Socket::set_nonblock()
{
	int flag = fcntl( m_sockfd, F_GETFL,0);
	if( flag <0 )
	{
		MY_LOG_ERROR("Socket::set_nonblock() error ");
	}
	flag |= O_NONBLOCK;
	if( fcntl( m_sockfd, F_SETFL, flag) < 0)
	{
		MY_LOG_ERROR("Socket::set_nonblock() error ");
	}
	return ;
}
Пример #6
0
void Socket::bind( const InetAddress &addr)
{
	if( -1 == ::bind(m_sockfd, (const struct sockaddr *)addr.get_sockaddr_in(), sizeof( addr )) )
	{
		MY_LOG_ERROR("Socket::bind() error ");
	}
}
Пример #7
0
void MYPositionDataManager::InitPosition(
		const std::string &code, char dir, VolumeType volume,int today_buy_volume,
		int today_sell_volume,int yestoday_long_pos,char ex)
{
    MY_LOG_DEBUG("MYPositionDataManager::InitPosition: %s, dir=%c, volume=%ld", code.c_str(), dir, volume);

    if (volume != 0){
        std::lock_guard < std::mutex > lock(mutex_pos_);

        PositionDataOfCode::iterator it = pos_datas_.find(code);
        if (it == pos_datas_.end()){
            it = pos_datas_.insert(std::make_pair(code, PositionInfoInEX())).first;
        }

        MY_LOG_DEBUG("before InitPosition (%s): long=%d, short=%d",
            code.c_str(), it->second.long_position, it->second.short_position);
        it->second.exchange = ex;
        if (dir == BUSSINESS_DEF::ENTRUST_BUY){
            it->second.long_position += volume;
            it->second.today_buy_volume += today_buy_volume;
            it->second.today_sell_volume += today_sell_volume;
            it->second.long_pos_yd += yestoday_long_pos;
        }else if (dir == BUSSINESS_DEF::ENTRUST_SELL){
            it->second.short_position += volume;
        }else{
            MY_LOG_ERROR("MYPositionDataManager::InitPosition goto wrong branch");
        }

        MY_LOG_DEBUG("after InitPosition, pos(%s): l=%d,s=%d",
            code.c_str(),it->second.long_position, it->second.short_position);
    }
}
Пример #8
0
bool FileMgr::add_page( const Page & page , IndexEntry & idx)
{

	MY_LOG_DEBUG("FileMgr::add_page() %ld", page.m_id);

	MutexGuard guard(m_mutex);

	m_fileStream[m_lastFileNum].seekp(0, std::ios::end);
	size_t off1 = m_fileStream[m_lastFileNum].tellp();	
	m_fileStream[m_lastFileNum] << page;
	size_t off2 = m_fileStream[m_lastFileNum].tellp();

	idx.m_offset = off1;
	idx.m_length = off2 - off1;
	std::string hash = page.get_hash();			
	memcpy( (void *) idx.m_contenthash, (const void*)hash.c_str(), hash.size());

	idx.m_filenum = m_lastFileNum;

	if( !m_fileStream[m_lastFileNum])
	{

		MY_LOG_ERROR("fstream error file num: %d ", m_lastFileNum);
		return false;
	}

	MY_LOG_DEBUG("FileMgr::add_page() pageid=%ld hash=%s", page.m_id, idx.hash_to_hex_string().c_str());

	return true;
}
Пример #9
0
void Socket::shut_down_write() 
{
	if( -1 == ::shutdown(m_sockfd, SHUT_WR))
	{
		MY_LOG_ERROR("Socket::shut_down_write() error ");
	}
}
Пример #10
0
void Socket::listen()
{
	if( -1 == ::listen( m_sockfd, SOMAXCONN))	
	{
		MY_LOG_ERROR("Socket::listen() error ");
	}

}
Пример #11
0
void Socket::set_keep_alive(bool on)
{
	int optval = on? 1:0;
	int ret = setsockopt( m_sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, static_cast<socklen_t>( sizeof(optval))) ;
	if(ret == -1 )
	{
		MY_LOG_ERROR("Soccket::set_keep_alive() error ");
	}
}
Пример #12
0
void Socket::set_reuse_port(bool on)
{
	int optval = on? 1:0;
	int ret = setsockopt( m_sockfd, SOL_SOCKET, SO_REUSEPORT, &optval, static_cast<socklen_t>( sizeof(optval))) ;
	if(ret == -1 )
	{
		MY_LOG_ERROR("Socket::set_reuse_port() error ");
	}
}
Пример #13
0
void Socket::set_tcp_no_delay(bool on)
{  
	int optval = on? 1:0;
	int ret = setsockopt( m_sockfd, IPPROTO_TCP,  TCP_NODELAY, &optval, static_cast< socklen_t>(sizeof( optval)));
	if( ret == -1 )	
	{
		MY_LOG_ERROR("Socket::set_tcp_no_delay() error ");
	}

}
Пример #14
0
void MYCTPTradeInterface::OnRspQryBrokerTradingParams(CThostFtdcBrokerTradingParamsField *pBrokerTradingParams,
    CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    // 成功了
    if (pRspInfo == NULL || pRspInfo->ErrorID == 0)
    {
        if (pBrokerTradingParams)
        {
            MY_LOG_INFO("OnRspQryBrokerTradingParams, BrokerID: %s"
                "; InvestorID: %s"
                "; MarginPriceType: %c"
                "; Algorithm: %c"
                "; AvailIncludeCloseProfit: %c",
                pBrokerTradingParams->BrokerID,
                pBrokerTradingParams->InvestorID,
                pBrokerTradingParams->MarginPriceType,
                pBrokerTradingParams->Algorithm,
                pBrokerTradingParams->AvailIncludeCloseProfit
                );
        }
        else
        {
            MY_LOG_ERROR("OnRspQryBrokerTradingParams, response info is null.");
        }
    }
    else
    {
        MY_LOG_ERROR("OnRspQryBrokerTradingParams, ErrorID: %d; ErrorMsg: %s",
            pRspInfo->ErrorID, pRspInfo->ErrorMsg);
    }

    // 处理完毕,登出,节约交易连接数
    CThostFtdcUserLogoutField user_logout;
    memset(&user_logout, 0, sizeof(user_logout));
    memcpy(user_logout.BrokerID, broker_id_, strlen(broker_id_));
    memcpy(user_logout.UserID, user_, strlen(user_));

    // 发出登出请求
    boost::this_thread::sleep(boost::posix_time::millisec(1000)); // 间隔1s
    int ret = p_trader_api_->ReqUserLogout(&user_logout, ++nRequestID);
    MY_LOG_INFO("ReqUserLogout, return_code: %d", ret);
}
Пример #15
0
void QuoteInterface_TDF::InitOpenSetting(TDF_OPEN_SETTING *settings, const ConfigData &cfg)
{
    if (cfg.Logon_config().quote_provider_addrs.empty())
    {
        MY_LOG_ERROR("TDF - quote provider's address is empty");
        return;
    }
    // tcp://192.168.60.23:7120
    const std::string &addr_cfg = cfg.Logon_config().quote_provider_addrs.front();
    std::string ip_port = addr_cfg.substr(6);
    std::size_t split_pos = ip_port.find(":");
    if ((split_pos == std::string::npos) || (split_pos + 1 >= ip_port.length()))
    {
        MY_LOG_ERROR("TDF - parse quote provider's address error: %s", addr_cfg.c_str());
    }

    MY_LOG_DEBUG("ip_port: %s", ip_port.c_str());

    std::string addr_ip = ip_port.substr(0, split_pos);
    std::string addr_port = ip_port.substr(split_pos + 1);

    //MY_LOG_DEBUG("ip: %s, port: %s, user: %s, pw: %s", addr_ip.c_str(),  addr_port.c_str(), cfg.Logon_config().account.c_str(), cfg.Logon_config().password.c_str());
    //MY_LOG_DEBUG("subscriptions: %s", DeepCopy(FormatSubscribString(cfg.Subscribe_datas()).c_str()));

    memset(settings, 0, sizeof(TDF_OPEN_SETTING));

    strncpy(settings->szIp, addr_ip.c_str(), sizeof(settings->szIp) - 1);
    strncpy(settings->szPort, addr_port.c_str(), sizeof(settings->szPort) - 1);
    strncpy(settings->szUser, cfg.Logon_config().account.c_str(), sizeof(settings->szUser) - 1);
    strncpy(settings->szPwd, cfg.Logon_config().password.c_str(), sizeof(settings->szPwd) - 1);

    settings->pfnMsgHandler = &QuoteInterface_TDF::QuoteDataHandler;
    settings->pfnSysMsgNotify = &QuoteInterface_TDF::SystemMsgHandler;

    settings->szMarkets = DeepCopy("SZ-2;SH-2;"); // subscibe two market
    settings->szSubScriptions = DeepCopy(FormatSubscribString(cfg.Subscribe_datas()).c_str());

    settings->nTime = 0;

    settings->nTypeFlags = DATA_TYPE_TRANSACTION | DATA_TYPE_ORDER | DATA_TYPE_ORDERQUEUE;
}
Пример #16
0
FileMgr::FileMgr( const std::string & file ) : m_mutex()
{
	MY_LOG_DEBUG("FileMgr() %s", file.c_str());
	m_lastFileNum = 0;
	m_fileStream[ m_lastFileNum ].open( file , std::ios::in | std::ios::out | std::ios::binary );
	if( !m_fileStream)
	{
		MY_LOG_ERROR("FileMgr::FileMgr() m_fileStream error");
	}


}
Пример #17
0
InetAddress::InetAddress( const std::string &ip, unsigned short port)
{
//	MY_LOG_DEBUG("InetAddress::InetAddress()  ip: %s, port= %d " ,ip.c_str(), port);
	memset(&m_addr, 0, sizeof( m_addr));
	m_addr.sin_family = AF_INET;
	m_addr.sin_port = htons(port);
	if( inet_aton( ip.c_str(), & m_addr.sin_addr )==0)
	{
		MY_LOG_ERROR(" ip invalid ");
	}	

}
Пример #18
0
void MYCTPTradeInterface::OnRspUserLogout(CThostFtdcUserLogoutField *pUserLogout,
    CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    if (pRspInfo == NULL || pRspInfo->ErrorID == 0)
    {
        MY_LOG_INFO("CTP-Trade - OnRspUserLogout success.");
        securities_get_finished = true;
    }
    else
    {
        MY_LOG_ERROR("CTP-Trade - OnRspUserLogout, ErrorID: %d; ErrorMsg: %s",
            pRspInfo->ErrorID, pRspInfo->ErrorMsg);
    }
}
Пример #19
0
QuoteInterface_TDF::QuoteInterface_TDF(const SubscribeContracts* subscribe_contracts, const ConfigData& cfg)
    : cfg_(cfg), p_stock_md_save_(NULL), p_stock_idx_save_(NULL)
{
    if (subscribe_contracts)
    {
        subscribe_contracts_ = *subscribe_contracts;
    }

    InitErrorMap();

    sprintf(qtm_name_, "tdf_%s_%u", cfg.Logon_config().account.c_str(), getpid());
    QuoteUpdateState(qtm_name_, QtmState::INIT);

    // create save object
    p_stock_md_save_ = new QuoteDataSave<TDF_MARKET_DATA_MY>(cfg_, qtm_name_, "tdf_market_data", TDF_STOCK_QUOTE_TYPE);
    p_stock_idx_save_ = new QuoteDataSave<TDF_INDEX_DATA_MY>(cfg_, qtm_name_, "tdf_index_data", TDF_INDEX_QUOTE_TYPE);
    p_stock_oq_save_ = new QuoteDataSave<T_OrderQueue>(cfg_, qtm_name_, "order_queue_data", KMDS_ORDER_QUEUE_TYPE);
    p_stock_pe_save_ = new QuoteDataSave<T_PerEntrust>(cfg_, qtm_name_, "per_entrust_data", KMDS_PER_ENTRUST_TYPE);
    p_stock_pb_save_ = new QuoteDataSave<T_PerBargain>(cfg_, qtm_name_, "per_bargain_data", KMDS_PER_BARGAIN_TYPE);
    s_p_stock_md_save = p_stock_md_save_;
    s_p_stock_idx_save = p_stock_idx_save_;
    s_p_stock_oq_save = p_stock_oq_save_;
    s_p_stock_pe_save = p_stock_pe_save_;
    s_p_stock_pb_save = p_stock_pb_save_;

    // environment settings
    //TDF_SetEnv(TDF_ENVIRON_HEART_BEAT_INTERVAL, 10);
    //TDF_SetEnv(TDF_ENVIRON_MISSED_BEART_COUNT, 2);
    //TDF_SetEnv(TDF_ENVIRON_OPEN_TIME_OUT, 30);

    // quote connection settings
    open_settings = new TDF_OPEN_SETTING();
    InitOpenSetting(open_settings, cfg);

    TDF_ERR nErr = TDF_ERR_SUCCESS;
    g_hTDF = TDF_Open(open_settings, &nErr);

    // try till open success
    while (nErr == TDF_ERR_NETWORK_ERROR || g_hTDF == NULL)
    {
        MY_LOG_ERROR("TDF_Open returned: %s; try again.", GetErrStr(nErr));
        QuoteUpdateState(qtm_name_, QtmState::CONNECT_FAIL);
        sleep(3);

        g_hTDF = TDF_Open(open_settings, &nErr);
    }
    MY_LOG_INFO("TDF_Open success.");
    QuoteUpdateState(qtm_name_, QtmState::CONNECT_SUCCESS);
    QuoteUpdateState(qtm_name_, QtmState::API_READY);
}
Пример #20
0
PageDB::PageDB( const std::string & datafile, const std::string & indexfile): m_update(false),  m_fileMgr( datafile) 
{
	MY_LOG_DEBUG("PageDB::PageDB()");
	const Conf & cf = Conf::get_instance();
	if( cf["pagedbidx_use_db"] == "yes")	
	{
		m_indexer.reset(new IndexDB());
		if(!m_indexer)
		{
			MY_LOG_ERROR( "PageDB::PageDB() new IndexDB() error  ");
		}
	}
	else
	{
		m_indexer.reset(new IndexFile( indexfile ));
		if( !m_indexer)
		{
		
			MY_LOG_ERROR( "PageDB::PageDB() new IndexFile() error  ");
		}
	}

}
Пример #21
0
void MYCTPTradeInterface::OnRspQryInstrumentMarginRate(CThostFtdcInstrumentMarginRateField *pInstrumentMarginRate,
    CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    // 成功了
    if (pRspInfo == NULL || pRspInfo->ErrorID == 0)
    {
        if (pInstrumentMarginRate)
        {
            MY_LOG_INFO("OnRspQryInstrumentMarginRate, InstrumentID: %s; "
                "InvestorRange: %c; BrokerID: %s; InvestorID: %s; HedgeFlag: %c; "
                "LongMarginRatioByMoney: %.4f; LongMarginRatioByVolume: %.4f; "
                "ShortMarginRatioByMoney: %.4f; ShortMarginRatioByVolume: %.4f; IsRelative: %d",
                pInstrumentMarginRate->InstrumentID,
                pInstrumentMarginRate->InvestorRange,
                pInstrumentMarginRate->BrokerID,
                pInstrumentMarginRate->InvestorID,
                pInstrumentMarginRate->HedgeFlag,
                pInstrumentMarginRate->LongMarginRatioByMoney,
                pInstrumentMarginRate->LongMarginRatioByVolume,
                pInstrumentMarginRate->ShortMarginRatioByMoney,
                pInstrumentMarginRate->ShortMarginRatioByVolume,
                pInstrumentMarginRate->IsRelative
                );
        }
        else
        {
            MY_LOG_INFO("OnRspQryInstrumentMarginRate, response info is null.");
        }
    }
    else
    {
        MY_LOG_ERROR("OnRspQryInstrumentMarginRate, ErrorID: %d; ErrorMsg: %s",
            pRspInfo->ErrorID, pRspInfo->ErrorMsg);
    }

    // 查别的
    if (bIsLast)
    {
        CThostFtdcQryInstrumentCommissionRateField instrument_commission_rate;
        memset(&instrument_commission_rate, 0, sizeof(instrument_commission_rate));
        memcpy(instrument_commission_rate.BrokerID, broker_id_, strlen(broker_id_));
        memcpy(instrument_commission_rate.InvestorID, user_, strlen(user_));
        memcpy(instrument_commission_rate.InstrumentID, "", strlen(""));

        boost::this_thread::sleep(boost::posix_time::millisec(1000)); // 查询要间隔1s
        int ret = p_trader_api_->ReqQryInstrumentCommissionRate(&instrument_commission_rate, ++nRequestID);
        MY_LOG_INFO("ReqQryInstrumentCommissionRate, return_code: %d", ret);
    }
}
Пример #22
0
void MYCTPTradeInterface::OnRspQryTradingCode(CThostFtdcTradingCodeField *pTradingCode,
    CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    // 成功了
    if (pRspInfo == NULL || pRspInfo->ErrorID == 0)
    {
        if (pTradingCode)
        {
            MY_LOG_INFO("OnRspQryTradingCode, InvestorID: %s; BrokerID: %s; ExchangeID: %s; ClientID: %s; ClientIDType: %c",
                pTradingCode->InvestorID,
                pTradingCode->BrokerID,
                pTradingCode->ExchangeID,
                pTradingCode->ClientID,
                pTradingCode->ClientIDType
                );
        }
        else
        {
            MY_LOG_INFO("OnRspQryTradingCode, response info is null.");
        }
    }
    else
    {
        MY_LOG_ERROR("OnRspQryTradingCode, ErrorID: %d; ErrorMsg: %s",
            pRspInfo->ErrorID, pRspInfo->ErrorMsg);
    }

    // 查别的
    if (bIsLast)
    {
        CThostFtdcQryInstrumentMarginRateField instrument_margin_rate;
        memset(&instrument_margin_rate, 0, sizeof(instrument_margin_rate));
        memcpy(instrument_margin_rate.BrokerID, broker_id_, strlen(broker_id_));
        memcpy(instrument_margin_rate.InvestorID, user_, strlen(user_));
        memcpy(instrument_margin_rate.InstrumentID, "", strlen(""));
        instrument_margin_rate.HedgeFlag = THOST_FTDC_CIDT_Speculation;

        boost::this_thread::sleep(boost::posix_time::millisec(1000)); // 查询要间隔1s
        int ret = p_trader_api_->ReqQryInstrumentMarginRate(&instrument_margin_rate, ++nRequestID);
        MY_LOG_INFO("ReqQryInstrumentMarginRate, return_code: %d", ret);
    }
}
Пример #23
0
void MYCTPTradeInterface::OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin,
    CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    // 登陆了,则查查信息
    if (pRspInfo == NULL || pRspInfo->ErrorID == 0)
    {
        MY_LOG_INFO("CTP-Trade - OnRspUserLogin success.");
    }
    else
    {
        MY_LOG_ERROR("CTP-Trade - OnRspUserLogin, ErrorID: %d; ErrorMsg: %s",
            pRspInfo->ErrorID, pRspInfo->ErrorMsg);

        // 登录失败,不断重试
        boost::this_thread::sleep(boost::posix_time::millisec(1000)); // 查询要间隔1s
        CThostFtdcReqUserLoginField user_logon;
        memset(&user_logon, 0, sizeof(user_logon));
        memcpy(user_logon.BrokerID, broker_id_, strlen(broker_id_));
        memcpy(user_logon.UserID, user_, strlen(user_));
        memcpy(user_logon.Password, password_, strlen(password_));

        // 发出登陆请求
        p_trader_api_->ReqUserLogin(&user_logon, 1);
    }

    if (bIsLast)
    {
        // 查询交易编码
        CThostFtdcQryTradingCodeField qry_trading_code;
        memset(&qry_trading_code, 0, sizeof(qry_trading_code));
        memcpy(qry_trading_code.BrokerID, broker_id_, strlen(broker_id_));
        memcpy(qry_trading_code.InvestorID, user_, strlen(user_));
        memcpy(qry_trading_code.ExchangeID, "", strlen(""));
        memcpy(qry_trading_code.ClientID, user_, strlen(user_));
        qry_trading_code.ClientIDType = THOST_FTDC_CIDT_Speculation;

        boost::this_thread::sleep(boost::posix_time::millisec(1000)); // 查询要间隔1s
        int ret = p_trader_api_->ReqQryTradingCode(&qry_trading_code, ++nRequestID);
        MY_LOG_INFO("CTP-Trade - ReqQryTradingCode, return_code: %d", ret);
    }
}
Пример #24
0
bool FileMgr::get_page( const IndexEntry & idx, Page & page )
{

	MY_LOG_DEBUG("FileMgr::get_page() %ld", idx.m_id);
	MutexGuard guard(m_mutex);

	int num = idx.m_filenum;
	if( num <= m_lastFileNum  && num >=0 )
	{
		std::unique_ptr<char> p( new char [ idx.m_length] );
		if( !p )
		{
			MY_LOG_ERROR("unique_ptr");
		}
		m_fileStream[num].clear();
		m_fileStream[num].seekg( idx.m_offset , std::ios::beg);
		m_fileStream[num].read( p.get(), idx.m_length );
		if( m_fileStream[num])
		{
			std::string tmp( p.get(), idx.m_length );
			Page pg(tmp);
			std::string hash = pg.get_hash();
			if( 0 == memcmp( idx.m_contenthash, hash.c_str(), hash.size() ))
			{
				page = pg;
				return true;
			}

			IndexEntry idx2;
			memcpy((void *)idx.m_contenthash, (const void *)hash.c_str(), hash.size());
			std::string hashstr1 = idx.hash_to_hex_string();
			std::string hashstr2 = idx2.hash_to_hex_string();
			MY_LOG_INFO("FileMgr::get_page() %ld hash not match {hash1:%s  hash2:%s}, tmp={%s}\npage.m_content={%s}", idx.m_id, hashstr1.c_str(), hashstr2.c_str(), tmp.c_str(), page.m_content.c_str());
		}
	}
	MY_LOG_DEBUG("FileMgr::get_page() %lu failed!", idx.m_id);
	return false;
}
Пример #25
0
void MYCTPTradeInterface::OnRspQryInstrument(CThostFtdcInstrumentField *pInstrument,
    CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
    // 成功了
    if (pRspInfo == NULL || pRspInfo->ErrorID == 0)
    {
        if (pInstrument)
        {
            MY_LOG_INFO("OnRspQryInstrument, InstrumentID: %s"
                "; ExchangeID: %s"
                "; InstrumentName: %s"
                "; ExchangeInstID: %s"
                "; ProductID: %s"
                "; ProductClass: %c"
                "; DeliveryYear: %08d"
                "; DeliveryMonth: %02d"
                "; MaxMarketOrderVolume: %d"
                "; MinMarketOrderVolume: %d"
                "; MaxLimitOrderVolume: %d"
                "; MinLimitOrderVolume: %d"
                "; VolumeMultiple: %d"
                "; PriceTick: %0.4f"
                "; CreateDate: %s"
                "; OpenDate: %s"
                "; ExpireDate: %s"
                "; StartDelivDate: %s"
                "; EndDelivDate: %s"
                "; InstLifePhase: %c"
                "; IsTrading: %d"
                "; PositionType: %c"
                "; PositionDateType: %c"
                "; LongMarginRatio: %0.4f"
                "; ShortMarginRatio: %.4f",
                pInstrument->InstrumentID,
                pInstrument->ExchangeID,
                pInstrument->InstrumentName,
                pInstrument->ExchangeInstID,
                pInstrument->ProductID,
                pInstrument->ProductClass,
                pInstrument->DeliveryYear,
                pInstrument->DeliveryMonth,
                pInstrument->MaxMarketOrderVolume,
                pInstrument->MinMarketOrderVolume,
                pInstrument->MaxLimitOrderVolume,
                pInstrument->MinLimitOrderVolume,
                pInstrument->VolumeMultiple,
                pInstrument->PriceTick,
                pInstrument->CreateDate,
                pInstrument->OpenDate,
                pInstrument->ExpireDate,
                pInstrument->StartDelivDate,
                pInstrument->EndDelivDate,
                pInstrument->InstLifePhase,
                pInstrument->IsTrading,
                pInstrument->PositionType,
                pInstrument->PositionDateType,
                InvalidToZeroD(pInstrument->LongMarginRatio),
                InvalidToZeroD(pInstrument->ShortMarginRatio)
                    );
            securities_exchcode.insert(std::make_pair(pInstrument->InstrumentID, ExchNameToExchCode(pInstrument->ExchangeID)));
            securities_volumn_multiple.insert(std::make_pair(pInstrument->InstrumentID, pInstrument->VolumeMultiple));
            securities_tickprice.insert(std::make_pair(pInstrument->InstrumentID, pInstrument->PriceTick));
        }
        else
        {
            MY_LOG_ERROR("OnRspQryInstrument, response info is null.");
        }
    }
    else
    {
        MY_LOG_ERROR("OnRspQryInstrument, ErrorID: %d; ErrorMsg: %s",
            pRspInfo->ErrorID, pRspInfo->ErrorMsg);
    }

    // 查别的
    if (bIsLast)
    {
        MY_LOG_INFO("OnRspQryInstrument, task finished.");
        CThostFtdcQryBrokerTradingParamsField broker_param;
        memset(&broker_param, 0, sizeof(broker_param));
        memcpy(broker_param.BrokerID, broker_id_, strlen(broker_id_));
        memcpy(broker_param.InvestorID, user_, strlen(user_));

        boost::this_thread::sleep(boost::posix_time::millisec(1000)); // 查询要间隔1s
        int ret = p_trader_api_->ReqQryBrokerTradingParams(&broker_param, ++nRequestID);
        MY_LOG_INFO("ReqQryBrokerTradingParams, return_code: %d", ret);
    }
}
Пример #26
0
//系统消息回调,用于通知用户收到了网络断开事件、连接(重连)结果、代码表结果等。
//当获取系统消息时,pMsgHead->pAppHead指针为空,
//pMsgHead->pData指向相应的结构体
void QuoteInterface_TDF::SystemMsgHandler(THANDLE hTdf, TDF_MSG* pMsgHead)
{
    if (!pMsgHead || !hTdf)
    {
        return;
    }


    switch (pMsgHead->nDataType)
    {
        case MSG_SYS_DISCONNECT_NETWORK:
            {
            MY_LOG_INFO("network disconnected.");
            QuoteUpdateState(qtm_name_, QtmState::DISCONNECT);
        }
            break;
        case MSG_SYS_CONNECT_RESULT:
            {
            TDF_CONNECT_RESULT* pConnResult = (TDF_CONNECT_RESULT*) pMsgHead->pData;
            if (pConnResult && pConnResult->nConnResult)
            {
                MY_LOG_INFO("TDF - connect success.");
                QuoteUpdateState(qtm_name_, QtmState::CONNECT_SUCCESS);
            }
            else
            {
                MY_LOG_ERROR("TDF - connect failed.");
                QuoteUpdateState(qtm_name_, QtmState::CONNECT_FAIL);
            }
        }
            break;
        case MSG_SYS_LOGIN_RESULT:
            {
            TDF_LOGIN_RESULT* pLoginResult = (TDF_LOGIN_RESULT*) pMsgHead->pData;
            if (pLoginResult && pLoginResult->nLoginResult)
            {
                MY_LOG_INFO("TDF - login success.");
                QuoteUpdateState(qtm_name_, QtmState::LOG_ON_SUCCESS);
                for (int i = 0; i < pLoginResult->nMarkets; i++)
                {
                    MY_LOG_INFO("market: %s, dyn_date: %d", pLoginResult->szMarket[i], pLoginResult->nDynDate[i]);
                }
            }
            else
            {
                MY_LOG_ERROR("TDF - login failed.");
                QuoteUpdateState(qtm_name_, QtmState::LOG_ON_FAIL);
            }
        }
            break;
        case MSG_SYS_CODETABLE_RESULT:
            {
            TDF_CODE_RESULT* pCodeResult = (TDF_CODE_RESULT*) pMsgHead->pData;
            MY_LOG_INFO("code table: %s; market count: %d", pCodeResult->szInfo, pCodeResult->nMarkets);
            for (int i = 0; i < pCodeResult->nMarkets; i++)
            {
                MY_LOG_INFO("market: %s; items: %d; date: %d", pCodeResult->szMarket[i], pCodeResult->nCodeCount[i],
                    pCodeResult->nCodeDate[i]);
                //获取代码表
                TDF_CODE* pCodeTable;
                unsigned int nItems;
                TDF_GetCodeTable(hTdf, pCodeResult->szMarket[i], &pCodeTable, &nItems);
                for (unsigned int i = 0; i < nItems; i++)
                {
                    TDF_CODE& code = pCodeTable[i];
                    MY_LOG_INFO("code: %s; market: %s; type: %d", code.szCode, code.szMarket, code.nType);
                }
                TDF_FreeArr(pCodeTable);
            }
        }
            break;
        case MSG_SYS_QUOTATIONDATE_CHANGE:
            {
            TDF_QUOTATIONDATE_CHANGE* pChange = (TDF_QUOTATIONDATE_CHANGE*) pMsgHead->pData;
            if (pChange)
            {
                MY_LOG_INFO("date changed, prepare reconnect.");
            }
        }
            break;
        case MSG_SYS_MARKET_CLOSE:
            {
            TDF_MARKET_CLOSE* pCloseInfo = (TDF_MARKET_CLOSE*) pMsgHead->pData;
            if (pCloseInfo)
            {
                MY_LOG_INFO("close market: %s; time: %d", pCloseInfo->szMarket, pCloseInfo->nTime);
            }
        }
            break;
        case MSG_SYS_HEART_BEAT:
            {
            MY_LOG_INFO("TDF - heart beat.");
        }
            break;
        default:
            break;
    }
}
Пример #27
0
//数据回调,用于通知用户收到了行情、逐笔成交,逐笔委托,委托队列等
//pMsgHead->pAppHead->ItemCount字段可以获知得到了多少条记录
//pMsgHead->pAppHead->pData指向第一条数据记录
void QuoteInterface_TDF::QuoteDataHandler(THANDLE hTdf, TDF_MSG* pMsgHead)
{
    if (!pMsgHead || !pMsgHead->pData)
    {
        MY_LOG_ERROR("QuoteDataHandler receive null data.");
        return;
    }

    unsigned int nItemCount = pMsgHead->pAppHead->nItemCount;

    if (!nItemCount)
    {
        MY_LOG_ERROR("QuoteDataHandler receive data, count is 0.");
        return;
    }
    //MY_LOG_DEBUG("QuoteDataHandler receive data, DataType: %d", pMsgHead->nDataType);
    switch (pMsgHead->nDataType)
    {
        case MSG_DATA_MARKET:
            {
            TDF_MARKET_DATA *p = (TDF_MARKET_DATA*) pMsgHead->pData;

            timeval t;
            gettimeofday(&t, NULL);
            for (unsigned int i = 0; i < nItemCount; ++i)
            {
                TDF_MARKET_DATA_MY tdf_my = Convert(*p);
                if (md_data_handler_
                    && (subscribe_contracts_.empty() || subscribe_contracts_.find(p->szCode) != subscribe_contracts_.end()))
                {
                    md_data_handler_(&tdf_my);
                }

                // 存起来
                s_p_stock_md_save->OnQuoteData(t.tv_sec * 1000000 + t.tv_usec, &tdf_my);
                ++p;
            }
        }
            break;
        case MSG_DATA_INDEX:
            {
            TDF_INDEX_DATA *p = (TDF_INDEX_DATA*) pMsgHead->pData;

            timeval t;
            gettimeofday(&t, NULL);
            for (unsigned int i = 0; i < nItemCount; ++i)
            {
                TDF_INDEX_DATA_MY tdf_my = Convert(*p);
                if (id_data_handler_
                    && (subscribe_contracts_.empty() || subscribe_contracts_.find(p->szCode) != subscribe_contracts_.end()))
                {
                    id_data_handler_(&tdf_my);
                }

                // 存起来
                s_p_stock_idx_save->OnQuoteData(t.tv_sec * 1000000 + t.tv_usec, &tdf_my);
                ++p;
            }
        }
            break;
        case MSG_DATA_ORDERQUEUE:
        {
            TDF_ORDER_QUEUE *p = (TDF_ORDER_QUEUE*)pMsgHead->pData;

            timeval t;
            gettimeofday(&t, NULL);
            for (unsigned int i = 0; i < nItemCount; ++i)
            {
                T_OrderQueue tdf_my = Convert(*p);
                if (order_queue_handler_
                    && (subscribe_contracts_.empty() || subscribe_contracts_.find(p->szCode) != subscribe_contracts_.end()))
                {
                    order_queue_handler_(&tdf_my);
                }

                // 存起来
                s_p_stock_oq_save->OnQuoteData(t.tv_sec * 1000000 + t.tv_usec, &tdf_my);
                ++p;
            }
        }
        break;
        case MSG_DATA_ORDER:
        {
            TDF_ORDER *p = (TDF_ORDER*)pMsgHead->pData;

            timeval t;
            gettimeofday(&t, NULL);
            for (unsigned int i = 0; i < nItemCount; ++i)
            {
                T_PerEntrust tdf_my = Convert(*p);
                if (perentrust_handler_
                    && (subscribe_contracts_.empty() || subscribe_contracts_.find(p->szCode) != subscribe_contracts_.end()))
                {
                    perentrust_handler_(&tdf_my);
                }

                // 存起来
                s_p_stock_pe_save->OnQuoteData(t.tv_sec * 1000000 + t.tv_usec, &tdf_my);
                ++p;
            }
        }
        break;
        case MSG_DATA_TRANSACTION:
        {
            TDF_TRANSACTION *p = (TDF_TRANSACTION*)pMsgHead->pData;

            timeval t;
            gettimeofday(&t, NULL);
            for (unsigned int i = 0; i < nItemCount; ++i)
            {
                T_PerBargain tdf_my = Convert(*p);
                if (perbargain_handler_
                    && (subscribe_contracts_.empty() || subscribe_contracts_.find(p->szCode) != subscribe_contracts_.end()))
                {
                    perbargain_handler_(&tdf_my);
                }

                // 存起来
                s_p_stock_pb_save->OnQuoteData(t.tv_sec * 1000000 + t.tv_usec, &tdf_my);
                ++p;
            }
        }
        break;
        default:
            break;
    }
}