2017-08-03 1 views
0

Ich versuche, oanda historische Preise für EURUSD zu bekommen. Ich versuche, die letzten 5000. zu bekommen, aber ich empfange nur 180.Kann Oanda historische Preise nicht erhalten

Dies ist mein Code:

def get_data_oanda(num_periods, **keyword_parameters): 
    """ 
    Environment     Description 
    fxTrade (Live)    The live (real money) environment 
    fxTrade Practice (Demo)  The demo (simulated money) environment 
    """ 
    domainDict = { 'live' : 'api-fxtrade.oanda.com','demo' : 'api-fxpractice.oanda.com' } 
    environment = 'demo' 
    domain = domainDict[environment] 
    access_token = 'xxxx' 
    account_id = 'xxxx' 
    instruments = 'EUR_USD' 
    count = num_periods 
    granularity = "M1" 
    try: 
     s = requests.Session() 
     url = "https://" + domain + "/v1/candles" 
     headers = {'Authorization' : 'Bearer ' + access_token, 
        # 'X-Accept-Datetime-Format' : 'unix' 
        } 
     params = {'instrument' : instruments, 'accountId' : account_id, 'count' : count, 'granularity' : granularity} 
     req = requests.Request('GET', url, headers = headers, params = params) 
     pre = req.prepare() 
     resp = s.send(pre, stream = True, verify = True) 
     return resp 
    except Exception as e: 
     s.close() 
     print() 
     print("Caught exception when connecting to stream\n" + str(e)) 


num_periods = 5000 
my_date = datetime.datetime.now(pytz.timezone('America/Sao_Paulo')).strftime('%Y-%m-%dT%H:%M:%S') 
timezone = 'America/Sao_Paulo' 
response = get_data_oanda(num_periods) 
msg = json.loads(response.text) 
candles = msg['candles'] 
for candle in candles: 
    df_data = df_data.append({ 
      'date': datetime.datetime.strptime(candle['time'], '%Y-%m-%dT%H:%M:%S.000000Z').replace(tzinfo=pytz.utc).astimezone(local_tz).strftime('%Y-%m-%d %H:%M:%S'), 
      'instrument': msg['instrument'], 
      "open": candle['openAsk'], 
      "high": candle['highAsk'], 
      "low": candle['lowAsk'], 
      "close": candle['closeAsk'], 
      "volume": candle['volume'] 
     },ignore_index=True) 

Aber df_data hat nur 180 Zeilen, nicht 5000.

[180 rows x 7 columns] 

Wie kann ich das beheben?

Antwort

1

Wie das zu beheben ist, um es auf die Grundlagen zu streichen. Erhalten Sie einen einfachen Anruf requests.get() und drucken Sie den Text. Sobald Sie die API haben, die die Ergebnisse zurückgibt, die Sie benötigen, arbeiten Sie auf der Pandas-Seite. Wenn die API die von Ihnen benötigten Ergebnisse nicht zurückgibt, wenden Sie sich an den Dienstanbieter.

Der richtige Weg, JSON in Pandas zu laden ist viel einfacher, wie folgt aus:

resp = requests.get(url, headers=headers, params=params, stream=True) 
df = pd.read_json(resp.raw) 
df_data = pd.io.json.json_normalize(df.candles) 
df_data['time'] = pd.to_datetime(df_data.time) 

Etwas, dass die meisten Ihrer Code ersetzen, ohne langsame Schleifen.

+0

können Sie versuchen, die Anforderung zu machen Ich habe auf Oanda API? Ich habe bereits eine E-Mail an sie gesendet, aber sie antworten mir nicht –

+0

Buchen Sie einfach die Anfrage selbst und das Ergebnis in Ihrer Frage. Nicht all dieser zusätzliche Code, der nicht relevant ist. –

0

für diese API-Aufruf weiß ich sicher, dass Sie verwenden sollten:

stream = False 

Sehen Sie sich auch eine der API-Wrapper verwenden, die die REST-API für den Zugriff zur Verfügung stehen. Diese reduzieren Ihren Code auf ein paar Zeilen. Die https://github.com/hootnot/oanda-api-v20 können Sie auch mehr als 5000 Datensätze herunterladen.

Für v1 (End-of life Dezember 2017?)

https://github.com/oanda/oandapy

oder v2:

https://github.com/oanda/v20-python

https://github.com/hootnot/oanda-api-v20

https://github.com/oanda/v20-python 
https://github.com/hootnot/oanda-api-v20 
Verwandte Themen