@@ -45,7 +45,7 @@ def _verify_java():
4545
4646 if version < 11 :
4747 print ('Java 11 or higher is required to use this API. You are using using Java '
48- + version + '. Please upgrade to a newer version.' )
48+ + str ( version ) + '. Please upgrade to a newer version.' )
4949 exit (1 )
5050
5151
@@ -142,16 +142,14 @@ def _recv(self, n_bytes: int, progress_bar: bool = False) -> bytearray:
142142 part_size = min (MAX_PART_SIZE , n_bytes - bytes_downloaded )
143143 bytes_downloaded += part_size
144144 part = self ._server .recv (part_size )
145+ if part .__len__ () < 0 :
146+ continue
145147 start += 1
146148 buffer [i : i + part_size ] = part
147149
148150 assert bytes_downloaded == n_bytes
149151 return buffer
150152
151- def _send_ver (self ):
152- ver_msg = f"MSG_CODE={ MessageType .HIST .value } &version=0.5.8\n "
153- self ._server .sendall (ver_msg .encode ("utf-8" ))
154-
155153 def kill (self , ignore_err = True ) -> None :
156154 """Remotely kill the Terminal process.
157155
@@ -259,6 +257,49 @@ def get_hist_stock(
259257
260258 # LISTING DATA
261259
260+ def get_dates_stk (self , root : str , req : StockReqType ) -> pd .Series :
261+ """
262+ Get all option expirations.
263+
264+ :param req: The request type.
265+ :param root: The root symbol.
266+ :return: All dates that Theta Data provides data for given a request.
267+ :raises ResponseError: If the request failed.
268+ """
269+ assert self ._server is not None , _NOT_CONNECTED_MSG
270+ out = f"MSG_CODE={ MessageType .ALL_DATES .value } &root={ root } &sec={ SecType .STOCK .value } &req={ req .value } \n "
271+ self ._server .send (out .encode ("utf-8" ))
272+ header = Header .parse (out , self ._server .recv (20 ))
273+ body = ListBody .parse (out , header , self ._recv (header .size ), dates = True )
274+ return body .lst
275+
276+ def get_dates_opt (
277+ self ,
278+ req : OptionReqType ,
279+ root : str ,
280+ exp : date ,
281+ strike : float ,
282+ right : OptionRight ) -> pd .Series :
283+ """
284+ Get all option expirations.
285+ :param req: The request type.
286+ :param root: The root symbol.
287+ :param exp: The expiration date. Must be after the start of `date_range`.
288+ :param strike: The strike price in USD, rounded to 1/10th of a cent.
289+ :param right: The right of an option.
290+ :param root: The root symbol.
291+ :return: All dates that Theta Data provides data for given a request.
292+ :raises ResponseError: If the request failed.
293+ """
294+ assert self ._server is not None , _NOT_CONNECTED_MSG
295+ strike = _format_strike (strike )
296+ exp_fmt = _format_date (exp )
297+ out = f"MSG_CODE={ MessageType .ALL_DATES .value } &root={ root } &exp={ exp_fmt } &strike={ strike } &right={ right .value } &sec={ SecType .OPTION .value } &req={ req .value } \n "
298+ self ._server .send (out .encode ("utf-8" ))
299+ header = Header .parse (out , self ._server .recv (20 ))
300+ body = ListBody .parse (out , header , self ._recv (header .size ), dates = True )
301+ return body .lst
302+
262303 def get_expirations (self , root : str ) -> pd .Series :
263304 """
264305 Get all option expirations.
0 commit comments