class_docstr: Current market data such as bid, ask, last price, etc. for a contract.
  
  Streaming level-1 ticks of type :class:`.TickData` are stored in
  the ``ticks`` list.
  
  Streaming level-2 ticks of type :class:`.MktDepthData` are stored in the
  ``domTicks`` list. The order book (DOM) is available as lists of
  :class:`.DOMLevel` in ``domBids`` and ``domAsks``.
  
  Streaming tick-by-tick ticks are stored in ``tickByTicks``.
  
  For options the :class:`.OptionComputation` values for the bid, ask, resp.
  last price are stored in the ``bidGreeks``, ``askGreeks`` resp.
  ``lastGreeks`` attributes. There is also ``modelGreeks`` that conveys
  the greeks as calculated by Interactive Brokers' option model.
  
  Events:
      * ``updateEvent`` (ticker: :class:`.Ticker`)
class_docstr_tok: ["Current","market","data","such","as","bid",",","ask",",","last","price",",","etc",".","for","a","contract",".","Streaming","level-1","ticks","of","type",":","class",":","`",".TickData","`","are","stored","in","the","``","ticks","``","list",".","Streaming","level-2","ticks","of","type",":","class",":","`",".MktDepthData","`","are","stored","in","the","``","domTicks","``","list",".","The","order","book","(","DOM",")","is","available","as","lists","of",":","class",":","`",".DOMLevel","`","in","``","domBids","``","and","``","domAsks","``",".","Streaming","tick-by-tick","ticks","are","stored","in","``","tickByTicks","``",".","For","options","the",":","class",":","`",".OptionComputation","`","values","for","the","bid",",","ask",",","resp",".","last","price","are","stored","in","the","``","bidGreeks","``",",","``","askGreeks","``","resp",".","``","lastGreeks","``","attributes",".","There","is","also","``","modelGreeks","``","that","conveys","the","greeks","as","calculated","by","Interactive","Brokers","'","option","model",".","Events",":","*","``","updateEvent","``","(","ticker",":",":","class",":","`",".Ticker","`",")"]
docstr: See if this ticker has a valid bid and ask.
docstr_tok: ["See","if","this","ticker","has","a","valid","bid","and","ask","."]
code: def hasBidAsk(self) -> bool:
      """See if this ticker has a valid bid and ask."""
      return (
          self.bid != -1
          and not isNan(self.bid)
          and self.bidSize > 0
          and self.ask != -1
          and not isNan(self.ask)
          and self.askSize > 0
      )
  
imports: from dataclasses import dataclass, field
  from datetime import datetime
  from typing import ClassVar, List, Optional, Union
  from eventkit import Event, Op
  from ib_insync.contract import Contract
  from ib_insync.objects import DOMLevel, Dividends, FundamentalRatios, MktDepthData, OptionComputation, TickByTickAllLast, TickByTickBidAsk, TickByTickMidPoint, TickData
  from ib_insync.util import dataclassRepr, isNan
label_desc: Use image node_id 4 for calling the Ticker obj's underlying member method code with example usage: obj.hasBidAsk() and returns: unknown