33import requests
44from requests .exceptions import HTTPError
55import time
6- from .common import get_base_url , get_credentials
6+ from .common import (
7+ get_base_url ,
8+ get_data_url ,
9+ get_credentials ,
10+ )
711from .entity import (
812 Account , Asset , Order , Position ,
9- AssetBars , Quote , Fundamental ,
10- Clock , Calendar ,
13+ BarSet , Clock , Calendar ,
1114)
1215from . import polygon
1316
@@ -61,8 +64,9 @@ def __init__(self, key_id=None, secret_key=None, base_url=None):
6164 self .polygon = polygon .REST (
6265 self ._key_id , 'staging' in self ._base_url )
6366
64- def _request (self , method , path , data = None , prefix = '/v1' ):
65- url = self ._base_url + prefix + path
67+ def _request (self , method , path , data = None , prefix = '/v1' , base_url = None ):
68+ base_url = base_url or self ._base_url
69+ url = base_url + prefix + path
6670 headers = {
6771 'APCA-API-KEY-ID' : self ._key_id ,
6872 'APCA-API-SECRET-KEY' : self ._secret_key ,
@@ -88,7 +92,7 @@ def _request(self, method, path, data=None, prefix='/v1'):
8892 return self ._one_request (method , url , opts , retry )
8993 except RetryException :
9094 retry_wait = self ._retry_wait
91- logger .warn (
95+ logger .warning (
9296 'sleep {} seconds and retrying {} '
9397 '{} more time(s)...' .format (
9498 retry_wait , url , retry ))
@@ -130,6 +134,10 @@ def post(self, path, data=None):
130134 def delete (self , path , data = None ):
131135 return self ._request ('DELETE' , path , data )
132136
137+ def data_get (self , path , data = None ):
138+ base_url = get_data_url ()
139+ return self ._request ('GET' , path , data , base_url = base_url )
140+
133141 def get_account (self ):
134142 '''Get the account'''
135143 resp = self .get ('/account' )
@@ -215,78 +223,36 @@ def get_asset(self, symbol):
215223 resp = self .get ('/assets/{}' .format (symbol ))
216224 return Asset (resp )
217225
218- def list_quotes (self , symbols ):
219- '''Get a list of quotes'''
220- if not isinstance (symbols , str ):
221- symbols = ',' .join (symbols )
222- params = {
223- 'symbols' : symbols ,
224- }
225- resp = self .get ('/quotes' , params )
226- return [Quote (o ) for o in resp ]
227-
228- def get_quote (self , symbol ):
229- '''Get a quote'''
230- resp = self .get ('/assets/{}/quote' .format (symbol ))
231- return Quote (resp )
232-
233- def list_fundamentals (self , symbols ):
234- '''Get a list of fundamentals'''
235- if not isinstance (symbols , str ):
236- symbols = ',' .join (symbols )
237- params = {
238- 'symbols' : symbols ,
239- }
240- resp = self .get ('/fundamentals' , params )
241- return [Fundamental (o ) for o in resp ]
242-
243- def get_fundamental (self , symbol ):
244- '''Get a fundamental'''
245- resp = self .get ('/assets/{}/fundamental' .format (symbol ))
246- return Fundamental (resp )
247-
248- def list_bars (
249- self ,
250- symbols ,
251- timeframe ,
252- start_dt = None ,
253- end_dt = None ,
254- limit = None ):
255- '''Get a list of bars'''
226+ def get_barset (self ,
227+ symbols ,
228+ timeframe ,
229+ limit = None ,
230+ start = None ,
231+ end = None ,
232+ after = None ,
233+ until = None ):
234+ '''Get BarSet(dict[str]->list[Bar])
235+ The parameter symbols can be either a comma-split string
236+ or a list of string. Each symbol becomes the key of
237+ the returned value.
238+ '''
256239 if not isinstance (symbols , str ):
257240 symbols = ',' .join (symbols )
258241 params = {
259242 'symbols' : symbols ,
260- 'timeframe' : timeframe ,
261243 }
262- if start_dt is not None :
263- params ['start_dt' ] = start_dt
264- if end_dt is not None :
265- params ['end_dt' ] = end_dt
266244 if limit is not None :
267245 params ['limit' ] = limit
268- resp = self .get ('/bars' , params )
269- return [AssetBars (o ) for o in resp ]
270-
271- def get_bars (
272- self ,
273- symbol ,
274- timeframe ,
275- start_dt = None ,
276- end_dt = None ,
277- limit = None ):
278- '''Get bars'''
279- params = {
280- 'timeframe' : timeframe ,
281- }
282- if start_dt is not None :
283- params ['start_dt' ] = start_dt
284- if end_dt is not None :
285- params ['end_dt' ] = end_dt
286- if limit is not None :
287- params ['limit' ] = limit
288- resp = self .get ('/assets/{}/bars' .format (symbol ), params )
289- return AssetBars (resp )
246+ if start is not None :
247+ params ['start' ] = start
248+ if end is not None :
249+ params ['end' ] = end
250+ if after is not None :
251+ params ['after' ] = after
252+ if until is not None :
253+ params ['until' ] = until
254+ resp = self .data_get ('/bars/{}' .format (timeframe ), params )
255+ return BarSet (resp )
290256
291257 def get_clock (self ):
292258 resp = self .get ('/clock' )
0 commit comments