Coder Social home page Coder Social logo

resistsupport / oanda-bot-python Goto Github PK

View Code? Open in Web Editor NEW

This project forked from johanbjerke/oanda-bot-python

0.0 0.0 0.0 88 KB

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

License: MIT License

Python 100.00%

oanda-bot-python's Introduction

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.sell_exit = self.buy_entry = (fast_ma > slow_ma) & (
            fast_ma.shift() <= slow_ma.shift()
        )
        # dead cross
        self.buy_exit = self.sell_entry = (fast_ma < slow_ma) & (
            fast_ma.shift() >= slow_ma.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.sell_exit = self.buy_entry = (fast_ma > slow_ma) & (
            fast_ma.shift() <= slow_ma.shift()
        )
        # dead cross
        self.buy_exit = self.sell_entry = (fast_ma < slow_ma) & (
            fast_ma.shift() >= slow_ma.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)
    environment='practice',
    # trading currency (default=EUR_USD)
    instrument='USD_JPY',
    # 1 minute candlesticks (default=D)
    granularity='M1',
    # trading time (default=Bot.SUMMER_TIME)
    trading_time=Bot.WINTER_TIME,
    # Slack notification when an error occurs
    slack_webhook_url='<your slack webhook url>',
    # Line notification when an error occurs
    line_notify_token='<your line notify token>',
    # Discord notification when an error occurs
    discord_webhook_url='<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(from_date="2020-7-7", to_date="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>',
    environment='live',
    instrument='EUR_GBP',
    granularity='H12', # 12 hour candlesticks
    trading_time=Bot.WINTER_TIME,
    slack_webhook_url='<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

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

oanda-bot-python's People

Contributors

10mohi6 avatar johanbjerke avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.