void TwsDL::idle() { waitData(); if( quit || currentRequest.reqType() != GenericRequest::NONE ) { return; } if( !twsClient->isConnected() ) { connectTws(); return; } // HACK static int f****e = 0; if( f****e <= 0 ) { f****e = reqMktData(); } GenericRequest::ReqType reqType = workTodo->nextReqType(); switch( reqType ) { case GenericRequest::ACC_STATUS_REQUEST: reqAccStatus(); break; case GenericRequest::EXECUTIONS_REQUEST: reqExecutions(); break; case GenericRequest::ORDERS_REQUEST: reqOrders(); break; case GenericRequest::CONTRACT_DETAILS_REQUEST: reqContractDetails(); break; case GenericRequest::HIST_REQUEST: reqHistoricalData(); break; case GenericRequest::NONE: /* TODO for now we place all orders when nothing else todo */ if( strat != NULL ) { work_dso( strat, this ); } placeAllOrders(); break; } if( reqType == GenericRequest::NONE && f****e <= 1 && p_orders.empty() ) { _lastError = "No more work to do."; quit = true; } }
void TwsClient::processMessages() { fd_set readSet, writeSet, errorSet; struct timeval tval; tval.tv_usec = 0; tval.tv_sec = 0; time_t now = time(NULL); //std::cout<<"m_state "<<m_state<<std::endl; switch (m_state) { case ST_PLACEORDER: placeOrder(); break; case ST_PLACEORDER_ACK: break; case ST_CANCELORDER: cancelOrder(); break; case ST_CANCELORDER_ACK: break; case ST_PING: reqCurrentTime(); break; case ST_PING_ACK: if( m_sleepDeadline < now) { disconnect(); return; } break; case ST_IDLE: if( m_sleepDeadline < now) { m_state = ST_PING; return; } break; case ST_MKT_DATA: reqMktData(); } if( m_sleepDeadline > 0) { // initialize timeout with m_sleepDeadline - now tval.tv_sec = m_sleepDeadline - now; } if( m_pClient->fd() >= 0 ) { FD_ZERO( &readSet); errorSet = writeSet = readSet; FD_SET( m_pClient->fd(), &readSet); if( !m_pClient->isOutBufferEmpty()) FD_SET( m_pClient->fd(), &writeSet); FD_CLR( m_pClient->fd(), &errorSet); int ret = select( m_pClient->fd() + 1, &readSet, &writeSet, &errorSet, &tval); if( ret == 0) { // timeout return; } if( ret < 0) { // error disconnect(); return; } if( m_pClient->fd() < 0) return; if( FD_ISSET( m_pClient->fd(), &errorSet)) { // error on socket m_pClient->onError(); } if( m_pClient->fd() < 0) return; if( FD_ISSET( m_pClient->fd(), &writeSet)) { // socket is ready for writing m_pClient->onSend(); } if( m_pClient->fd() < 0) return; if( FD_ISSET( m_pClient->fd(), &readSet)) { // socket is ready for reading m_pClient->onReceive(); } } }