10mohi6
oanda-bot-python
Python

oanda-bot is a python library for automated trading bot with oanda rest api on Python 3.6 and above.

Last updated Feb 4, 2026
35
Stars
18
Forks
9
Issues
0
Stars/day
Attention Score
33
Language breakdown
Python 100.0%
Files click to expand
README

oanda-bot

PyPI License: MIT codecov Build Status PyPI - Python Version Downloads

oanda-bot is a python library for automated trading bot with oanda rest api on Python 3.6 and above.

Installation

$ pip install oanda-bot

Usage

basic run

from oanda_bot import Bot

class MyBot(Bot): def strategy(self): fast_ma = self.sma(period=5) slow_ma = self.sma(period=25) # golden cross self.sellexit = self.buyentry = (fastma > slowma) & ( fastma.shift() <= slowma.shift() ) # dead cross self.buyexit = self.sellentry = (fastma < slowma) & ( fastma.shift() >= slowma.shift() )

MyBot( account_id='<your practice account id>', access_token='<your practice access token>', ).run()

basic backtest

from oanda_bot import Bot

class MyBot(Bot): def strategy(self): fast_ma = self.sma(period=5) slow_ma = self.sma(period=25) # golden cross self.sellexit = self.buyentry = (fastma > slowma) & ( fastma.shift() <= slowma.shift() ) # dead cross self.buyexit = self.sellentry = (fastma < slowma) & ( fastma.shift() >= slowma.shift() )

MyBot( account_id='<your practice account id>', access_token='<your practice access token>', ).backtest()

basic report

from oanda_bot import Bot

Bot( account_id='<your practice account id>', access_token='<your practice access token>', ).report()

advanced run

from oanda_bot import Bot

class MyBot(Bot): def strategy(self): rsi = self.rsi(period=10) ema = self.ema(period=20) lower = ema - (ema * 0.001) upper = ema + (ema * 0.001) self.buy_entry = (rsi < 30) & (self.df.C < lower) self.sell_entry = (rsi > 70) & (self.df.C > upper) self.sell_exit = ema > self.df.C self.buy_exit = ema < self.df.C self.units = 1000 # currency unit (default=10000) self.take_profit = 50 # take profit pips (default=0 take profit none) self.stop_loss = 20 # stop loss pips (default=0 stop loss none)

MyBot( account_id='<your practice account id>', access_token='<your practice access token>', # trading environment (default=practice) envir, # trading currency (default=EUR_USD) instrument='USD_JPY', # 1 minute candlesticks (default=D) granularity='M1', # trading time (default=Bot.SUMMER_TIME) tradingtime=Bot.WINTERTIME, # Slack notification when an error occurs slackwebhookurl='<your slack webhook url>', # Line notification when an error occurs linenotifytoken='<your line notify token>', # Discord notification when an error occurs discordwebhookurl='<your discord webhook url>', ).run()

advanced backtest

from oanda_bot import Bot

class MyBot(Bot): def strategy(self): rsi = self.rsi(period=10) ema = self.ema(period=20) lower = ema - (ema * 0.001) upper = ema + (ema * 0.001) self.buy_entry = (rsi < 30) & (self.df.C < lower) self.sell_entry = (rsi > 70) & (self.df.C > upper) self.sell_exit = ema > self.df.C self.buy_exit = ema < self.df.C self.units = 1000 # currency unit (default=10000) self.take_profit = 50 # take profit pips (default=0 take profit none) self.stop_loss = 20 # stop loss pips (default=0 stop loss none)

MyBot( account_id='<your practice account id>', access_token='<your practice access token>', instrument='USD_JPY', granularity='S15', # 15 second candlestick ).backtest(fromdate="2020-7-7", todate="2020-7-13", filename="backtest.png")

total profit        3910.000 total trades         374.000 win rate              59.091 profit factor          1.115 maximum drawdown    4220.000 recovery factor        0.927 riskreward ratio       0.717 sharpe ratio           0.039 average return         9.787 stop loss              0.000 take profit            0.000
backtest.png

advanced report

from oanda_bot import Bot

Bot( account_id='<your practice account id>', access_token='<your practice access token>', instrument='USD_JPY', granularity='S15', # 15 second candlestick ).report(filename="report.png", days=-7) # from 7 days ago to now

total profit        -4960.000 total trades          447.000 win rate               59.284 profit factor          -0.887 maximum drawdown    10541.637 recovery factor        -0.471 riskreward ratio       -0.609 sharpe ratio           -0.043 average return        -10.319
report.png

live run

from oanda_bot import Bot

class MyBot(Bot): def atr(self, *, period: int = 14, price: str = "C"): a = (self.df.H - self.df.L).abs() b = (self.df.H - self.df[price].shift()).abs() c = (self.df.L - self.df[price].shift()).abs()

df = pd.concat([a, b, c], axis=1).max(axis=1) return df.ewm(span=period).mean()

def strategy(self): rsi = self.rsi(period=10) ema = self.ema(period=20) atr = self.atr(period=20) lower = ema - atr upper = ema + atr self.buy_entry = (rsi < 30) & (self.df.C < lower) self.sell_entry = (rsi > 70) & (self.df.C > upper) self.sell_exit = ema > self.df.C self.buy_exit = ema < self.df.C self.units = 1000

MyBot( account_id='<your live account id>', access_token='<your live access token>', envir, instrument='EUR_GBP', granularity='H12', # 12 hour candlesticks tradingtime=Bot.WINTERTIME, slackwebhookurl='<your slack webhook url>', ).run()

Supported indicators

  • Simple Moving Average 'sma'
  • Exponential Moving Average 'ema'
  • Moving Average Convergence Divergence 'macd'
  • Relative Strenght Index 'rsi'
  • Bollinger Bands 'bbands'
  • Market Momentum 'mom'
  • Stochastic Oscillator 'stoch'
  • Awesome Oscillator 'ao'

Getting started

For help getting started with OANDA REST API, view our online documentation.

Contributing

  • Fork it
  • Create your feature branch (git checkout -b my-new-feature)
  • Commit your changes (git commit -am 'Add some feature')
  • Push to the branch (git push origin my-new-feature)
  • Create new Pull Request
🔗 More in this category

© 2026 GitRepoTrend · 10mohi6/oanda-bot-python · Updated daily from GitHub