Exemplo n.º 1
0
void CPluginChangeOrder_US::HandleTimeoutReq()
{
	if ( m_vtReqData.empty() )
	{
		SetTimerHandleTimeout(false);
		return;
	}

	DWORD dwTickNow = ::GetTickCount();	
	VT_REQ_TRADE_DATA::iterator it_req = m_vtReqData.begin();
	for ( ; it_req != m_vtReqData.end(); )
	{
		StockDataReq *pReq = *it_req;	
		if ( pReq == NULL )
		{
			CHECK_OP(false, NOOP);
			++it_req;
			continue;
		}		
		//
		if (pReq->bWaitDelaySvrID)
		{
			continue;;
		}

		if ( int(dwTickNow - pReq->dwReqTick) > 8000 )
		{
			TradeAckType ack;
			ack.head = pReq->req.head;
			ack.head.ddwErrCode= PROTO_ERR_SERVER_TIMEROUT;
			CA::Unicode2UTF(L"协议超时", ack.head.strErrDesc);

			//tomodify 5
			ack.body.nEnvType = pReq->req.body.nEnvType;
			ack.body.nCookie = pReq->req.body.nCookie;
			ack.body.nSvrOrderID = pReq->req.body.nSvrOrderID;
			ack.body.nLocalOrderID = pReq->req.body.nLocalOrderID;

			ack.body.nSvrResult = Trade_SvrResult_Failed;
			HandleTradeAck(&ack, pReq->sock);

			it_req = m_vtReqData.erase(it_req);
			delete pReq;
		}
		else
		{
			++it_req;
		}
	}

	if ( m_vtReqData.empty() )
	{
		SetTimerHandleTimeout(false);
		return;
	}
}
Exemplo n.º 2
0
void  CPluginChangeOrder_US::DoTryProcessTradeOpt(StockDataReq* pReq)
{
	CHECK_RET(m_pTradeOp && pReq, NORET); 

	bool bIsNewReq = !IsReqDataExist(pReq); 

	ChangeOrderReqBody &body = pReq->req.body;
	TradeReqType& req = pReq->req; 
	SOCKET sock = pReq->sock; 

	//如果是新的调用, 通过本地id查找定单SvrID 
	if (bIsNewReq)
	{
		m_vtReqData.push_back(pReq); 

		if (0 == body.nSvrOrderID && 0 != body.nLocalOrderID) 
		{ 
			body.nSvrOrderID = m_stOrderIDCvt.FindSvrOrderID((Trade_Env)body.nEnvType, 
				body.nLocalOrderID, true);	

			// 等待svrid 取到后再实际调用接口
			if (0 == body.nSvrOrderID)
			{ 
				return; 
			}
		} 
	} 
	// 
	bool bRet = false;
	//美股只支持撤单, 只有真实交易环境!!
	if (body.nSvrOrderID != 0 && body.nEnvType == Trade_Env_Real)
	{  
		pReq->bWaitDelaySvrID = false;
		bRet = m_pTradeOp->ChangeOrder((UINT*)&pReq->dwLocalCookie, body.nSvrOrderID, 
			body.nPrice, body.nQty);
	} 

	if ( !bRet )
	{
		TradeAckType ack;
		ack.head = req.head;
		ack.head.ddwErrCode = PROTO_ERR_UNKNOWN_ERROR;
		CA::Unicode2UTF(L"发送失败", ack.head.strErrDesc);

		ack.body.nEnvType = body.nEnvType;
		ack.body.nCookie = body.nCookie;
		ack.body.nLocalOrderID = body.nLocalOrderID;
		ack.body.nSvrOrderID = body.nSvrOrderID; 

		ack.body.nSvrResult = Trade_SvrResult_Failed;
		HandleTradeAck(&ack, sock);

		//清除req对象 
		DoRemoveReqData(pReq);
		return ;
	}

	SetTimerHandleTimeout(true);
} 
Exemplo n.º 3
0
void CPluginPlaceOrder::SetTradeReqData(int nCmdID, const Json::Value &jsnVal, SOCKET sock)
{
	CHECK_RET(nCmdID == PROTO_ID_QUOTE && sock != INVALID_SOCKET, NORET);
	CHECK_RET(m_pTradeOp && m_pHKTradeServer, NORET);
	
	CProtoQuote proto;
	CProtoQuote::ProtoReqDataType	req;
	proto.SetProtoData_Req(&req);
	if ( !proto.ParseJson_Req(jsnVal) )
	{
		CHECK_OP(false, NORET);
		return;
	}

	CHECK_RET(req.head.nProtoID == nCmdID && req.body.nCookie, NORET);

	StockDataReq *pReq = new StockDataReq;
	CHECK_RET(pReq, NORET);
	pReq->sock = sock;
	pReq->dwReqTick = ::GetTickCount();
	pReq->req = req;	

	//tomodify 3
	PlaceOrderHKReqBody &body = req.body;
	std::wstring strCode;
	CA::UTF2Unicode(body.strCode.c_str(), strCode);
	bool bRet = m_pTradeOp->PlaceOrder((UINT*)&pReq->dwLocalCookie, (Trade_OrderType_HK)body.nOrderTypeHK, 
		(Trade_OrderSide)body.nOrderDir, strCode.c_str(), body.nPrice, body.nQty);

	if ( !bRet )
	{
		TradeAckType ack;
		ack.head = req.head;
		ack.head.nErrCode = PROTO_ERR_UNKNOWN_ERROR;
		ack.head.strErrDesc = "·¢ËÍʧ°Ü";

		ack.body.nCookie = body.nCookie;
		ack.body.nLocalID = 0;
		ack.body.nSvrResult = Trade_SvrResult_Failed;
		HandleTradeAck(&ack, sock);

		delete pReq;
		pReq = NULL;
		return ;
	}

	m_vtReqData.push_back(pReq);
	SetTimerHandleTimeout(true);
}