void CSecurityProfile::_SetDbKey(const _QuoteUpdateParams& Params, DBA_KEY *dbaKey) { _bstr_t bsSymbol(Params->Symbol); string sSymbol(bsSymbol); switch(Params->Type) { case enOPT: _ConvertOptionNameInKey(sSymbol); bsSymbol = sSymbol.c_str(); break; } StringToKey(bsSymbol, dbaKey); switch(Params->Type) { case enSTK: dbaKey->type = IT_EQUITY; break; case enOPT: dbaKey->type = IT_EQUITY_OPTION; break; } //CreateSpacedUpper((char*)dbaKey->countryCode, "US", 2); //CreateSpacedUpper((char*)dbaKey.currencyCode, "USD", 3); //CreateSpaced((char *)dbaKey.symbol, Params->Symbol, MAX_TICKER); }
LRESULT TapeReaderView::OnIQFeedUpdate( UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { ou::tf::IQFUpdateMessage* msg = reinterpret_cast<ou::tf::IQFUpdateMessage*>( lParam ); if ( 'N' == *msg->FieldBegin( ou::tf::IQFUpdateMessage::QPLast ) ) { // field has "Not Found" in numeric field CWindow::MessageBoxA( "Symbol Not Found", "Error", MB_OK ); m_stateUI = UI_SYMBOLENTRY; UpdateUIState(); } else { std::string sSymbol( msg->FieldBegin( ou::tf::IQFUpdateMessage::QPSymbol ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPSymbol ) ); if ( sSymbol == m_sSymbol ) { std::string sLastTradeTime( msg->FieldBegin(ou::tf:: IQFUpdateMessage::QPLastTradeTime ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPLastTradeTime ) ); if ( 9 == sLastTradeTime.length() ) { std::string sBid( msg->FieldBegin( ou::tf::IQFUpdateMessage::QPBid ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPBid ) ); std::string sBidVol( msg->FieldBegin( ou::tf::IQFUpdateMessage::QPBidSize ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPBidSize ) ); std::string sTick( msg->FieldBegin( ou::tf::IQFUpdateMessage::QPLast ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPLast ) ); std::string sTickVol( msg->FieldBegin( ou::tf::IQFUpdateMessage::QPLastVol ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPLastVol ) ); std::string sAsk( msg->FieldBegin( ou::tf::IQFUpdateMessage::QPAsk ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPAsk ) ); std::string sAskVol( msg->FieldBegin( ou::tf::IQFUpdateMessage::QPAskSize ), msg->FieldEnd( ou::tf::IQFUpdateMessage::QPAskSize ) ); // sPrice.assign( msg->FieldBegin( IQFUpdateMessage::QPExtTradeLast ), msg->FieldEnd( IQFUpdateMessage::QPExtTradeLast ) ); // sSize.assign( msg->FieldBegin( IQFUpdateMessage::QPLastVol ), msg->FieldEnd( IQFUpdateMessage::QPLastVol ) ); int cntPerPage = m_lvTape.GetCountPerPage(); if ( 0 < cntPerPage ) { int ix; while ( cntPerPage <= (ix = m_lvTape.GetItemCount() ) ) { m_lvTape.DeleteItem( ix - 1 ); } m_lvTape.InsertItem( 0, sLastTradeTime.c_str() ); m_lvTape.SetItemText( 0, COLHDR_COL_Bid, sBid.c_str() ); m_lvTape.SetItemText( 0, COLHDR_COL_BidVol, sBidVol.c_str() ); m_lvTape.SetItemText( 0, COLHDR_COL_Tck, sTick.c_str() ); m_lvTape.SetItemText( 0, COLHDR_COL_TckVol, sTickVol.c_str() ); m_lvTape.SetItemText( 0, COLHDR_COL_Ask, sAsk.c_str() ); m_lvTape.SetItemText( 0, COLHDR_COL_AskVol, sAskVol.c_str() ); structRowItems ri; ri.vTime = sLastTradeTime; ri.vBid = msg->Double( ou::tf::IQFUpdateMessage::QPBid ); // ri.vBidVol = msg->Integer( IQFUpdateMessage::QPBidSize ); ri.vTick = msg->Double( ou::tf::IQFUpdateMessage::QPLast ); // ri.vTickVol = msg->Integer( IQFUpdateMessage::QPLastVol ); ri.vAsk = msg->Double( ou::tf::IQFUpdateMessage::QPAsk ); // ri.vAskVol = msg->Integer( IQFUpdateMessage::QPAskSize ); COLORREF cBack = ou::Colour::Beige; // set colours so green range for higher buy/sell, new high buy/sell // set colours so red range for lower buy/sell, new log buy/sell if ( m_bRunning ) { if ( 't' == sLastTradeTime[8] ) { // treat as trade double dblMid = ( ri.vBid + ri.vAsk ) / 2.0; ri.vBate = "Trade"; if ( ri.vTick > dblMid ) { cBack = ou::Colour::LightGreen; ri.vBate = "Buy"; } else { cBack = ou::Colour::LightPink; ri.vBate = "Sell"; } if ( ri.vTick > m_dblMaxTick ) { cBack = ou::Colour::Blue; } if ( ri.vTick < m_dblMinTick ) { cBack = ou::Colour::Orange; } } else { // process bid/ask stuff if ( ( ri.vBid > m_prvValues.vBid ) && ( ri.vAsk < m_prvValues.vAsk ) ) { // new inside bid and new inside ask cBack = ou::Colour::Gray; ri.vBate = "Best Bid/Ask"; } else { if ( ( ri.vBid > m_prvValues.vBid ) || ( ri.vAsk < m_prvValues.vAsk ) ) { if ( ri.vBid > m_prvValues.vBid ) { cBack = ou::Colour::Yellow; ri.vBate = "Best Bid"; } else { cBack = ou::Colour::White; ri.vBate = "Best Ask"; } } else { // regular bid or regular ask change if ( 'b' == sLastTradeTime[8] ) { ri.vBate = "Bid"; cBack = ou::Colour::LightYellow; } if ( 'a' == sLastTradeTime[8] ) { ri.vBate = "Ask"; cBack = ou::Colour::Snow; } } } } m_lvTape.SetItemText( 0, COLHDR_COL_BATE, ri.vBate.c_str() ); } else { m_bRunning = true; m_dblMinTick = m_dblMaxTick = ri.vTick; } m_prvValues = ri; m_dblMinTick = std::min<double>( m_dblMinTick, ri.vTick ); m_dblMaxTick = std::max<double>( m_dblMaxTick, ri.vTick ); m_prvValues = ri; } } } } linebuffer_t* p = reinterpret_cast<linebuffer_t*>( wParam ); m_pIQFeed->UpdateDone( p, msg ); bHandled = true; return 1; }