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 ,
@@ -83,7 +87,7 @@ def _request(self, method, path, data=None, prefix='/v1'):
8387 return self ._one_request (method , url , opts , retry )
8488 except RetryException :
8589 retry_wait = self ._retry_wait
86- logger .warn (
90+ logger .warning (
8791 'sleep {} seconds and retrying {} '
8892 '{} more time(s)...' .format (
8993 retry_wait , url , retry ))
@@ -125,6 +129,10 @@ def post(self, path, data=None):
125129 def delete (self , path , data = None ):
126130 return self ._request ('DELETE' , path , data )
127131
132+ def data_get (self , path , data = None ):
133+ base_url = get_data_url ()
134+ return self ._request ('GET' , path , data , base_url = base_url )
135+
128136 def get_account (self ):
129137 '''Get the account'''
130138 resp = self .get ('/account' )
@@ -210,78 +218,36 @@ def get_asset(self, symbol):
210218 resp = self .get ('/assets/{}' .format (symbol ))
211219 return Asset (resp )
212220
213- def list_quotes (self , symbols ):
214- '''Get a list of quotes'''
215- if not isinstance (symbols , str ):
216- symbols = ',' .join (symbols )
217- params = {
218- 'symbols' : symbols ,
219- }
220- resp = self .get ('/quotes' , params )
221- return [Quote (o ) for o in resp ]
222-
223- def get_quote (self , symbol ):
224- '''Get a quote'''
225- resp = self .get ('/assets/{}/quote' .format (symbol ))
226- return Quote (resp )
227-
228- def list_fundamentals (self , symbols ):
229- '''Get a list of fundamentals'''
230- if not isinstance (symbols , str ):
231- symbols = ',' .join (symbols )
232- params = {
233- 'symbols' : symbols ,
234- }
235- resp = self .get ('/fundamentals' , params )
236- return [Fundamental (o ) for o in resp ]
237-
238- def get_fundamental (self , symbol ):
239- '''Get a fundamental'''
240- resp = self .get ('/assets/{}/fundamental' .format (symbol ))
241- return Fundamental (resp )
242-
243- def list_bars (
244- self ,
245- symbols ,
246- timeframe ,
247- start_dt = None ,
248- end_dt = None ,
249- limit = None ):
250- '''Get a list of bars'''
221+ def get_barset (self ,
222+ symbols ,
223+ timeframe ,
224+ limit = None ,
225+ start = None ,
226+ end = None ,
227+ after = None ,
228+ until = None ):
229+ '''Get BarSet(dict[str]->list[Bar])
230+ The parameter symbols can be either a comma-split string
231+ or a list of string. Each symbol becomes the key of
232+ the returned value.
233+ '''
251234 if not isinstance (symbols , str ):
252235 symbols = ',' .join (symbols )
253236 params = {
254237 'symbols' : symbols ,
255- 'timeframe' : timeframe ,
256238 }
257- if start_dt is not None :
258- params ['start_dt' ] = start_dt
259- if end_dt is not None :
260- params ['end_dt' ] = end_dt
261239 if limit is not None :
262240 params ['limit' ] = limit
263- resp = self .get ('/bars' , params )
264- return [AssetBars (o ) for o in resp ]
265-
266- def get_bars (
267- self ,
268- symbol ,
269- timeframe ,
270- start_dt = None ,
271- end_dt = None ,
272- limit = None ):
273- '''Get bars'''
274- params = {
275- 'timeframe' : timeframe ,
276- }
277- if start_dt is not None :
278- params ['start_dt' ] = start_dt
279- if end_dt is not None :
280- params ['end_dt' ] = end_dt
281- if limit is not None :
282- params ['limit' ] = limit
283- resp = self .get ('/assets/{}/bars' .format (symbol ), params )
284- return AssetBars (resp )
241+ if start is not None :
242+ params ['start' ] = start
243+ if end is not None :
244+ params ['end' ] = end
245+ if after is not None :
246+ params ['after' ] = after
247+ if until is not None :
248+ params ['until' ] = until
249+ resp = self .data_get ('/bars/{}' .format (timeframe ), params )
250+ return BarSet (resp )
285251
286252 def get_clock (self ):
287253 resp = self .get ('/clock' )
0 commit comments