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; } }
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); }
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); }