OANDA-FX-API in der Praxis: v20 REST und Streaming.
Für reines FX-Trading ist OANDA seit Jahren der Quasi-Standard auf der API-Seite. Die v20-API ist sauber dokumentiert, stabil und für 24/5-Engines ausgelegt. Wer FX algorithmisch handeln will, kommt um OANDA selten herum.
Account-Modell und Authentifizierung.
OANDA stellt drei Endpoint-Sets bereit: fxTrade Practice (Demo), fxTrade Live (echtes Geld) und einen eigenen Streaming- Endpoint für Pricing und Transaktions-Events. Authentifizierung läuft durchgehend über einen Bearer-Token, der im API-Dashboard erzeugt wird.
Eine Account-ID adressiert ein konkretes Konto. Ein Login kann mehrere Account-IDs haben (Sub-Accounts), in der API sind sie unabhängig. Praxis-Tipp: pro Strategie ein eigenes Sub-Account anlegen — saubere P&L-Trennung ohne aufwendiges Tagging.
Erster REST-Roundtrip.
Die offizielle Python-Library oandapyV20 ist solide. Ein minimaler
Workflow:
import os
import oandapyV20
import oandapyV20.endpoints.accounts as accounts
import oandapyV20.endpoints.orders as orders
import oandapyV20.endpoints.pricing as pricing
API_TOKEN = os.environ["OANDA_TOKEN"]
ACCOUNT_ID = os.environ["OANDA_ACCOUNT"]
client = oandapyV20.API(access_token=API_TOKEN, environment="practice")
# Account-Status
r = client.request(accounts.AccountSummary(ACCOUNT_ID))
print(f"Balance: {r['account']['balance']} {r['account']['currency']}")
# Aktuelle Preise für EUR/USD und GBP/USD
params = {"instruments": "EUR_USD,GBP_USD"}
r = client.request(pricing.PricingInfo(ACCOUNT_ID, params=params))
for p in r["prices"]:
print(p["instrument"], "bid", p["bids"][0]["price"], "ask", p["asks"][0]["price"])
# Marktorder: 10000 Units long EUR/USD (Mini-Lot)
order_data = {
"order": {
"instrument": "EUR_USD",
"units": "10000",
"type": "MARKET",
"positionFill": "DEFAULT",
}
}
r = client.request(orders.OrderCreate(ACCOUNT_ID, data=order_data))
print("OrderID:", r["orderCreateTransaction"]["id"])
Wichtig: Units sind nicht Lots. OANDA arbeitet mit absoluten Einheiten der Base-Currency. 10.000 Units EUR/USD entsprechen einem Mini-Lot (10 K). Positive Units = Long, negative Units = Short. Diese Konvention ist konsistent durch die gesamte API.
Pricing-Stream — die Kern-Stärke.
Wer FX algorithmisch handelt, will Tick-Daten in Echtzeit. OANDA bietet dafür einen HTTP-Streaming-Endpoint, der pro Instrument Bid/Ask in Sub-Sekunden-Frequenz liefert.
import oandapyV20
from oandapyV20.endpoints.pricing import PricingStream
client = oandapyV20.API(access_token=API_TOKEN, environment="practice")
stream_req = PricingStream(
accountID=ACCOUNT_ID,
params={"instruments": "EUR_USD,GBP_USD,USD_JPY"},
)
try:
for tick in client.request(stream_req):
if tick["type"] == "PRICE":
inst = tick["instrument"]
bid = float(tick["bids"][0]["price"])
ask = float(tick["asks"][0]["price"])
spread = (ask - bid) * 1e4 # in Pips für 4-Decimal-Pairs
print(f"{inst} {bid:.5f}/{ask:.5f} spread={spread:.1f}p")
elif tick["type"] == "HEARTBEAT":
pass # alle 5s — wichtig für Connection-Health
except Exception as e:
print(f"Stream-Fehler: {e}")
Praktisch: die Heartbeat-Events kommen alle 5 Sekunden. Wenn 15 Sekunden keiner kommt, ist die Verbindung tot — selbst wenn die TCP-Verbindung formal noch steht. Das ist die robusteste Disconnection-Detection in der FX-Welt.
Order-Typen und FX-Spezifika.
- MARKET: sofortiger Fill zum aktuellen Bid/Ask. Bei OANDA mit
optionalem
priceBoundals Schutz gegen Slippage. - LIMIT: klassische Limit-Order mit Preis und GTC/GTD-Logik.
- STOP / MARKET_IF_TOUCHED: Trigger-basiert. STOP bricht die aktuelle Marktrichtung, MIT umgekehrt.
- STOP_LOSS / TAKE_PROFIT / TRAILING_STOP_LOSS: bei OANDA
Trade-bezogen, nicht Account-bezogen. Sie hängen direkt am offenen
Trade — Drag-and-Drop-fähig in der OANDA-Web-UI, programmgesteuert per
TradeCRCDO-Endpoint. - GUARANTEED_STOP_LOSS: gegen Gap-Risiko abgesichert (Premium beim Trigger).
Die Trade-bezogenen Stop/TP-Orders sind ein wichtiger Unterschied zu Aktien-APIs: der Stop „lebt" am Trade, schließt also genau jene Position. Wer mehrere Positionen in derselben Währung hat, kann pro Trade individuelle Stops setzen.
Position-Modi: NETTING vs. HEDGING.
OANDA unterstützt beide Modi: im NETTING-Modus kann je Instrument nur eine Netto-Position bestehen — Gegenorders verrechnen direkt. Im HEDGING -Modus existieren Long- und Short-Position parallel, mit getrennten Stops und P&Ls. Der Modus wird auf Account-Ebene gesetzt.
Für die meisten systematischen Strategien ist NETTING die bessere Wahl: einfacher zu verstehen, einfacher zu reconcilen, weniger Margin-Bindung. HEDGING macht nur Sinn, wenn die Strategie wirklich gleichzeitige Gegenpositionen modelliert.
Stabile 24/5-Engines bauen.
FX-Märkte laufen Sonntagabend bis Freitagabend durchgehend. Die Hauptaufgabe einer FX-Engine ist nicht „eine Order absetzen", sondern „durchgehend ohne Eingriff laufen". Die Knackpunkte:
- Streaming-Reconnect: HTTP-Streams sterben nach Stunden — meist durch Proxies, NAT-Timeouts oder Cloud-Loadbalancer. Implementieren Sie einen Watchdog: ohne Heartbeat für 15 Sekunden → neue Verbindung aufbauen.
- State-Recovery: nach Reconnect zuerst aktuelle Positionen und offene Orders über REST nachladen, dann erst weiterstreamen. Niemals auf den Stream allein verlassen.
- Roll-Over-Zeiten: täglicher Rollover (5 p.m. ET) bringt kurzzeitige Liquiditätslöcher. Schließen Sie keine Orders in den ±5 Minuten rund um die Rollover-Zeit.
- Server-Failover: für Live-Betrieb min. zwei Regionen aktiv, mit DNS-Failover oder Active/Passive-Setup.
- Telemetrie: Latenz vom Tick-Event bis zum Order-Submit messen, pro Stunde tracken. Wenn der Median über 200 ms steigt: Infrastruktur prüfen.
Margin, Leverage und regulatorische Realitäten.
OANDA bietet je nach Regulierungsregion unterschiedliche Hebel: in der EU für Retail-Konten 30:1 auf Majors, 20:1 auf Minors. Für Pro-Konten (institutionell) und außerhalb der EU sind deutlich höhere Hebel möglich. Die Margin-Anforderung errechnet sich aus aktuellem Mark und Hebel — bei Hebel 30 sind das ca. 3,3 % des Notional-Werts.
Wichtig: die Margin wird in Account-Währung berechnet, nicht in Instrument-Währung. Wer also ein EUR-Konto fährt und USD/JPY tradet, muss die FX-Konvertierung intern mit einberechnen. OANDA tut das automatisch — aber das eigene Risiko-Modell sollte es ebenfalls tun.
Wann OANDA die richtige Wahl ist.
OANDA ist für reines FX-Trading meine erste Empfehlung. Die API ist stabil, die Doku ist gut, die Ausführung ist transparent (keine Last-Look-Praktiken bei Standard-Konten), und der Streaming-Endpoint ist robust genug für 24/5-Betrieb.
Wer FX und Aktien in einer Engine kombinieren will, könnte alternativ IBKR nehmen — dort ist der FX-Teil aber bewusst minimalistisch (Cash-Forex, keine CFD-Konvertierung). Für FX-only-Strategien führt der Weg meist über OANDA.
Sie planen eine FX-Engine, die fünf Tage durchläuft und nicht jeden Sonntag manuell angestoßen werden muss? Erstgespräch buchen — wir bauen den Stack, der auch nach 6 Monaten noch ohne Eingriff läuft.