Python wrapper for the OANDA REST-V20 API enabling programmatic access to forex and CFD trading
npx @tessl/cli install tessl/pypi-oandapyv20@0.7.0Python wrapper for OANDA REST-V20 API providing programmatic forex and CFD trading access.
Package: oandapyV20 | Install: pip install oandapyV20
from oandapyV20 import API
from oandapyV20.endpoints.accounts import AccountDetails
from oandapyV20.endpoints.orders import OrderCreate
from oandapyV20.endpoints.pricing import PricingInfo
from oandapyV20.contrib.requests import MarketOrderRequest
# Initialize client
api = API(access_token="token", environment="practice")
# Get account
account_id = api.request(AccountList())['accounts'][0]['id']
account = api.request(AccountDetails(accountID=account_id))['account']
# Get pricing
prices = api.request(PricingInfo(accountID=account_id,
params={"instruments": "EUR_USD"}))['prices']
# Create order
order_data = MarketOrderRequest(instrument="EUR_USD", units=1000).data
response = api.request(OrderCreate(accountID=account_id, data=order_data))# Client
from oandapyV20 import API
from oandapyV20.exceptions import V20Error, StreamTerminated
# Endpoints
from oandapyV20.endpoints.accounts import AccountList, AccountDetails, AccountSummary, AccountInstruments, AccountConfiguration, AccountChanges
from oandapyV20.endpoints.orders import OrderCreate, OrderList, OrdersPending, OrderDetails, OrderReplace, OrderCancel, OrderClientExtensions
from oandapyV20.endpoints.trades import TradesList, OpenTrades, TradeDetails, TradeClose, TradeClientExtensions, TradeCRCDO
from oandapyV20.endpoints.positions import PositionList, OpenPositions, PositionDetails, PositionClose
from oandapyV20.endpoints.pricing import PricingInfo, PricingStream
from oandapyV20.endpoints.transactions import TransactionList, TransactionDetails, TransactionIDRange, TransactionsSinceID, TransactionsStream
from oandapyV20.endpoints.instruments import InstrumentsCandles, InstrumentsOrderBook, InstrumentsPositionBook
from oandapyV20.endpoints.forexlabs import Calendar, HistoricalPositionRatios, Spreads, CommitmentsOfTraders, OrderbookData, Autochartist
# Request builders
from oandapyV20.contrib.requests import (
MarketOrderRequest, LimitOrderRequest, StopOrderRequest, MITOrderRequest,
TakeProfitOrderRequest, StopLossOrderRequest, TrailingStopLossOrderRequest,
TakeProfitDetails, StopLossDetails, TrailingStopLossDetails,
PositionCloseRequest, TradeCloseRequest, ClientExtensions
)
# Definitions
from oandapyV20.definitions.orders import OrderType, TimeInForce, OrderPositionFill, OrderState, OrderTriggerCondition
from oandapyV20.definitions.instruments import CandlestickGranularity, PriceComponents
from oandapyV20.definitions.trades import TradeState, TradePL
from oandapyV20.definitions.primitives import InstrumentType, Direction
# Types
from oandapyV20.types import AccountID, DateTime, Units, PriceValue
# Utilities
from oandapyV20.contrib.factories import InstrumentsCandlesFactory
from oandapyV20.contrib.generic import secs2time, granularity_to_timeRequest Pattern: api.request(Endpoint(params)) -> dict
Components:
from oandapyV20.contrib.requests import MarketOrderRequest, TakeProfitDetails, StopLossDetails
order = MarketOrderRequest(
instrument="EUR_USD",
units=1000,
takeProfitOnFill=TakeProfitDetails(price=1.1200).data,
stopLossOnFill=StopLossDetails(price=1.0900).data
).data
api.request(OrderCreate(accountID=account_id, data=order))stream = PricingStream(accountID=account_id, params={"instruments": "EUR_USD"})
for update in api.request(stream):
if update['type'] == 'PRICE':
print(f"Bid: {update['bids'][0]['price']}, Ask: {update['asks'][0]['price']}")from oandapyV20.contrib.factories import InstrumentsCandlesFactory
params = {"from": "2023-01-01T00:00:00Z", "to": "2023-12-31T23:59:59Z", "granularity": "H1"}
all_candles = []
for endpoint in InstrumentsCandlesFactory("EUR_USD", params):
all_candles.extend(api.request(endpoint)['candles'])