{ "info": { "author": "F. Brekeveld", "author_email": "f.brekeveld@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "OANDA REST-V20 API wrapper\n==========================\n\n.. _Top:\n\nAs of march 2018 OANDA no longer supports the v1 REST-API. The only pending\nV20 endpoint was the *forexlabs endpoint*. Instead of launching *forexlabs*\nas a *V20-endpoint*, OANDA choose to support this endpoint from the v1\nREST interface, see: http://developer.oanda.com/rest-live-v20/forexlabs-ep/.\n\n\n.. image:: https://travis-ci.org/hootnot/oanda-api-v20.svg?branch=master\n :target: https://travis-ci.org/hootnot/oanda-api-v20\n :alt: Build\n\n.. image:: https://readthedocs.org/projects/oanda-api-v20/badge/?version=latest\n :target: http://oanda-api-v20.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n.. image:: https://landscape.io/github/hootnot/oanda-api-v20/master/landscape.svg?style=flat\n :target: https://landscape.io/github/hootnot/oanda-api-v20/master\n :alt: Code Health\n\n.. image:: https://coveralls.io/repos/github/hootnot/oanda-api-v20/badge.svg?branch=master\n :target: https://coveralls.io/github/hootnot/oanda-api-v20?branch=master\n :alt: Coverage\n\n.. image:: https://badge.fury.io/py/oandapyV20.svg\n :target: https://badge.fury.io/py/oandapyV20\n :alt: Pypi\n\n.. image:: https://api.codacy.com/project/badge/Grade/5946514e3a7c407291f76e630ce3553b \n :target: https://www.codacy.com/app/hootnot/oandaapiv20utm_source=github.com&utm_medium=referral&utm_content=hootnot/oanda-api-v20&utm_campaign=Badge_Grade\n :alt: Codacy\n\nSupported Python versions:\n\n +-------------------+-----+-----+-----+-----+-----+------+\n | Python | 2.7 | 3.3 | 3.4 | 3.5 | 3.6 | Pypy |\n +===================+=====+=====+=====+=====+=====+======+\n | **oanda-api-v20** | YES | YES | YES | YES | YES | YES |\n +-------------------+-----+-----+-----+-----+-----+------+\n\n\nInteractive\n-----------\n\n.. image:: https://jupyter.readthedocs.io/en/latest/_static/_images/jupyter.svg\n :target: ./jupyter\n :alt: Jupyter\n\nUsing the Jupyter `notebook`_ it is easy to play with the\n*oandapyV20* library.\n\n.. _notebook: ./jupyter/index.ipynb\n\nTOC\n---\n\n + `Install`_\n + `Design`_\n + `Client`_\n - `contrib.requests`_\n - `contrib.factories`_\n - `API-endpoint access`_\n - `Placing a MarketOrder with TakeProfitOrder and StopLossOrder`_\n - `Processing series of requests`_\n - `Streaming endpoints`_\n\nInstall\n-------\n\n.. code-block:: bash\n\n $ pip install oandapyV20\n\n\nor the latest development version from github:\n\n.. code-block:: bash\n\n $ pip install git+https://github.com/hootnot/oanda-api-v20.git\n\nIf you want to run the tests, clone the repository:\n\n.. code-block:: bash\n\n $ git clone https://github.com/hootnot/oanda-api-v20\n $ cd oanda-api-v20\n\n # install necessary packages for testing\n $ grep \"\\- pip install\" .travis.yml |\n > while read LNE\n > do `echo $LNE| cut -c2-` ; done\n\n $ python setup.py test\n $ python setup.py install\n\nExamples are provided in the https://github.com/hootnot/oandapyV20-examples\nrepository.\n\n\n\nDesign\n------\n\nIn the V20-library endpoints are represented as APIRequest objects derived from the\nAPIRequest base class. Each endpoint group (accounts, trades, etc.) is represented\nby it's own (abstract) class covering the functionality of all endpoints for that group. Each endpoint within that group is covered by a class derived from\nthe abstract class.\n\nTop_\n\nClient\n~~~~~~\n\nThe V20-library has a client class (API) which processes APIRequest objects.\n\nTop_\n\ncontrib.requests\n~~~~~~~~~~~~~~~~\n\nThe contrib.request package offers classes providing an easy way\nto construct the data for the *data* parameter of the OrderCreate endpoint\nor the TradeCRCDO (Create/Replace/Cancel Dependent Orders).\n\n.. code-block:: python\n\n mktOrder = MarketOrderRequest(instrument=\"EUR_USD\",\n units=10000,\n takeProfitOnFill=TakeProfitDetails(price=1.10).data,\n stopLossOnFill=StopLossDetails(price=1.07).data\n ).data\n\n\n instead of:\n\n.. code-block:: python\n\n mktOrder = {'order': {\n 'timeInForce': 'FOK',\n 'instrument': 'EUR_USD',\n 'positionFill': 'DEFAULT',\n 'units': '10000',\n 'type': 'MARKET',\n 'takeProfitOnFill': {\n 'timeInForce': 'GTC',\n 'price': '1.10000'}\n }\n 'stopLossOnFill': {\n 'timeInForce': 'GTC',\n 'price': '1.07000'}\n }\n }\n\n\nTop_\n\ncontrib.factories\n~~~~~~~~~~~~~~~~~\n\nThe contrib.factories module offers classes providing an easy way\ngenerate requests.\nDownloading historical data is limited to 5000 records per request. This\nmeans that you have to make consecutive requests with change of parameters\nif you want more than 5000 records.\n\nThe *InstrumentsCandlesFactory* solves this by generating the requests for you,\nexample:\n\n.. code-block:: python\n\n import sys\n import json\n\n from oandapyV20.contrib.factories import InstrumentsCandlesFactory\n from oandapyV20 import API\n\n access_token = \"...\"\n\n client = API(access_token=access_token)\n\n _from = sys.argv[1]\n _to = sys.argv[2]\n gran = sys.argv[3]\n instr = sys.argv[4]\n\n params = {\n \"granularity\": gran,\n \"from\": _from,\n \"to\": _to\n }\n\n def cnv(r, h):\n for candle in r.get('candles'):\n ctime = candle.get('time')[0:19]\n try:\n rec = \"{time},{complete},{o},{h},{l},{c},{v}\".format(\n time=ctime,\n complete=candle['complete'],\n o=candle['mid']['o'],\n h=candle['mid']['h'],\n l=candle['mid']['l'],\n c=candle['mid']['c'],\n v=candle['volume'],\n )\n except Exception as e:\n print(e, r)\n else:\n h.write(rec+\"\\n\")\n\n with open(\"/tmp/{}.{}.out\".format(instr, gran), \"w\") as O:\n for r in InstrumentsCandlesFactory(instrument=instr, params=params):\n print(\"REQUEST: {} {} {}\".format(r, r.__class__.__name__, r.params))\n rv = client.request(r)\n cnv(r.response, O)\n\n\nWhen running this:\n\n.. code-block:: shell\n\n $ python oandahist.py 2017-01-01T00:00:00Z 2017-06-30T00:00:00Z H4 EUR_USD\n REQUEST: v3/instruments/EUR_USD/candles InstrumentsCandles\n {'to': '2017-03-25T08:00:00Z',\n 'from': '2017-01-01T00:00:00Z', 'granularity': 'H4'}\n REQUEST: v3/instruments/EUR_USD/candles InstrumentsCandles\n {'to': '2017-06-16T20:00:00Z', 'from': '2017-03-25T12:00:00Z',\n 'granularity': 'H4'}\n REQUEST: v3/instruments/EUR_USD/candles InstrumentsCandles\n {'to': '2017-06-30T00:00:00Z', 'from': '2017-06-17T00:00:00Z',\n 'granularity': 'H4'}\n\n\nThe output shows it processed three *InstrumentsCandles* requests. The\ndata can be found in */tmp/EUR_USD.H4.out*:\n\n.. code-block:: shell\n\n $ tail /tmp/EUR_USD.H4.out\n ...\n 2017-06-28T01:00:0,True,1.13397,1.13557,1.13372,1.13468,1534\n 2017-06-28T05:00:0,True,1.13465,1.13882,1.13454,1.13603,8486\n 2017-06-28T09:00:0,True,1.13606,1.13802,1.12918,1.13315,12815\n 2017-06-28T13:00:0,True,1.13317,1.13909,1.13283,1.13781,13255\n 2017-06-28T17:00:0,True,1.13783,1.13852,1.13736,1.13771,2104\n 2017-06-28T21:00:0,True,1.13789,1.13894,1.13747,1.13874,1454\n\n\nTop_\n\nExamples\n--------\n\nAPI-endpoint access\n~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n import json\n from oandapyV20 import API # the client\n import oandapyV20.endpoints.trades as trades\n\n access_token = \"...\"\n accountID = \"...\"\n client = API(access_token=access_token)\n\n # request trades list\n r = trades.TradesList(accountID)\n rv = client.request(r)\n print(\"RESPONSE:\\n{}\".format(json.dumps(rv, indent=2)))\n\n\nTop_\n\nPlacing a *MarketOrder* with *TakeProfitOrder* and *StopLossOrder*\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code-block:: python\n\n import json\n\n from oandapyV20.contrib.requests import MarketOrderRequest\n from oandapyV20.contrib.requests import TakeProfitDetails, StopLossDetails\n\n import oandapyV20.endpoints.orders as orders\n import oandapyV20\n\n from exampleauth import exampleAuth\n\n\n accountID, access_token = exampleAuth()\n api = oandapyV20.API(access_token=access_token)\n\n # EUR_USD (today 1.0750)\n EUR_USD_STOP_LOSS = 1.07\n EUR_USD_TAKE_PROFIT = 1.10\n\n mktOrder = MarketOrderRequest(\n instrument=\"EUR_USD\",\n units=10000,\n takeProfitOnFill=TakeProfitDetails(price=EUR_USD_TAKE_PROFIT).data,\n stopLossOnFill=StopLossDetails(price=EUR_USD_STOP_LOSS).data)\n\n # create the OrderCreate request\n r = orders.OrderCreate(accountID, data=mktOrder.data)\n try:\n # create the OrderCreate request\n rv = api.request(r)\n except oandapyV20.exceptions.V20Error as err:\n print(r.status_code, err)\n else:\n print(json.dumps(rv, indent=2))\n\n\nTop_\n\nProcessing series of requests\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nProcessing series of requests is also possible now by storing different requests in\nan array or from some 'request-factory' class. Below an array example:\n\n.. code-block:: python\n\n import json\n from oandapyV20 import API # the client\n from oandapyV20.exceptions import V20Error\n import oandapyV20.endpoints.accounts as accounts\n import oandapyV20.endpoints.trades as trades\n import oandapyV20.endpoints.pricing as pricing\n\n access_token = \"...\"\n accountID = \"...\"\n client = API(access_token=access_token)\n\n # list of requests\n lor = []\n # request trades list\n lor.append(trades.TradesList(accountID))\n # request accounts list\n lor.append(accounts.AccountList())\n # request pricing info\n params={\"instruments\": \"DE30_EUR,EUR_GBP\"}\n lor.append(pricing.PricingInfo(accountID, params=params))\n\n for r in lor:\n try:\n rv = client.request(r)\n # put request and response in 1 JSON structure\n print(\"{}\".format(json.dumps({\"request\": \"{}\".format(r),\n \"response\": rv}, indent=2)))\n except V20Error as e:\n print(\"OOPS: {:d} {:s}\".format(e.code, e.msg))\n\nOutput\n``````\n\n.. code-block:: json\n\n {\n \"request\": \"v3/accounts/101-004-1435156-001/trades\",\n \"response\": {\n \"lastTransactionID\": \"1109\",\n \"trades\": [\n {\n \"unrealizedPL\": \"23.0000\",\n \"financing\": \"-0.5556\",\n \"state\": \"OPEN\",\n \"price\": \"10159.4\",\n \"realizedPL\": \"0.0000\",\n \"currentUnits\": \"-10\",\n \"openTime\": \"2016-07-22T16:47:04.315211198Z\",\n \"initialUnits\": \"-10\",\n \"instrument\": \"DE30_EUR\",\n \"id\": \"1105\"\n },\n {\n \"unrealizedPL\": \"23.0000\",\n \"financing\": \"-0.5556\",\n \"state\": \"OPEN\",\n \"price\": \"10159.4\",\n \"realizedPL\": \"0.0000\",\n \"currentUnits\": \"-10\",\n \"openTime\": \"2016-07-22T16:47:04.141436468Z\",\n \"initialUnits\": \"-10\",\n \"instrument\": \"DE30_EUR\",\n \"id\": \"1103\"\n }\n ]\n }\n }\n\n {\n \"request\": \"v3/accounts\",\n \"response\": {\n \"accounts\": [\n {\n \"tags\": [],\n \"id\": \"101-004-1435156-002\"\n },\n {\n \"tags\": [],\n \"id\": \"101-004-1435156-001\"\n }\n ]\n }\n }\n\n {\n \"request\": \"v3/accounts/101-004-1435156-001/pricing\",\n \"response\": {\n \"prices\": [\n {\n \"status\": \"tradeable\",\n \"quoteHomeConversionFactors\": {\n \"negativeUnits\": \"1.00000000\",\n \"positiveUnits\": \"1.00000000\"\n },\n \"asks\": [\n {\n \"price\": \"10295.1\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10295.3\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10295.5\",\n \"liquidity\": 150\n }\n ],\n \"unitsAvailable\": {\n \"default\": {\n \"short\": \"60\",\n \"long\": \"100\"\n },\n \"reduceOnly\": {\n \"short\": \"0\",\n \"long\": \"20\"\n },\n \"openOnly\": {\n \"short\": \"60\",\n \"long\": \"0\"\n },\n \"reduceFirst\": {\n \"short\": \"60\",\n \"long\": \"100\"\n }\n },\n \"closeoutBid\": \"10293.5\",\n \"bids\": [\n {\n \"price\": \"10293.9\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10293.7\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10293.5\",\n \"liquidity\": 150\n }\n ],\n \"instrument\": \"DE30_EUR\",\n \"time\": \"2016-09-29T17:07:19.598030528Z\",\n \"closeoutAsk\": \"10295.5\"\n },\n {\n \"status\": \"tradeable\",\n \"quoteHomeConversionFactors\": {\n \"negativeUnits\": \"1.15679152\",\n \"positiveUnits\": \"1.15659083\"\n },\n \"asks\": [\n {\n \"price\": \"0.86461\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"0.86462\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"0.86463\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"0.86465\",\n \"liquidity\": 10000000\n }\n ],\n \"unitsAvailable\": {\n \"default\": {\n \"short\": \"624261\",\n \"long\": \"624045\"\n },\n \"reduceOnly\": {\n \"short\": \"0\",\n \"long\": \"0\"\n },\n \"openOnly\": {\n \"short\": \"624261\",\n \"long\": \"624045\"\n },\n \"reduceFirst\": {\n \"short\": \"624261\",\n \"long\": \"624045\"\n }\n },\n \"closeoutBid\": \"0.86442\",\n \"bids\": [\n {\n \"price\": \"0.86446\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"0.86445\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"0.86444\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"0.86442\",\n \"liquidity\": 10000000\n }\n ],\n \"instrument\": \"EUR_GBP\",\n \"time\": \"2016-09-29T17:07:19.994271769Z\",\n \"closeoutAsk\": \"0.86465\",\n \"type\": \"PRICE\"\n }\n ]\n }\n }\n\nTop_\n\nStreaming endpoints\n~~~~~~~~~~~~~~~~~~~\n\nStreaming quotes: use pricing.PricingStream.\nStreaming transactions: use transactions.TransactionsEvents.\n\nTo fetch streaming data from a stream use the following pattern:\n\n.. code-block:: python\n\n import json\n from oandapyV20 import API\n from oandapyV20.exceptions import V20Error\n from oandapyV20.endpoints.pricing import PricingStream\n\n accountID = \"...\"\n access_token=\"...\"\n\n api = API(access_token=access_token, environment=\"practice\")\n\n instruments = \"DE30_EUR,EUR_USD,EUR_JPY\"\n s = PricingStream(accountID=accountID, params={\"instruments\":instruments})\n try:\n n = 0\n for R in api.request(s):\n print(json.dumps(R, indent=2))\n n += 1\n if n > 10:\n s.terminate(\"maxrecs received: {}\".format(MAXREC))\n\n except V20Error as e:\n print(\"Error: {}\".format(e))\n\nCheck the 'examples' directory for more detailed examples.\n\nOutput\n``````\n\n.. code-block:: json\n\n {\n \"status\": \"tradeable\",\n \"asks\": [\n {\n \"price\": \"10547.0\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10547.2\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10547.4\",\n \"liquidity\": 150\n }\n ],\n \"closeoutBid\": \"10546.6\",\n \"bids\": [\n {\n \"price\": \"10547.0\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10546.8\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10546.6\",\n \"liquidity\": 150\n }\n ],\n \"instrument\": \"DE30_EUR\",\n \"time\": \"2016-10-17T12:25:28.158741026Z\",\n \"closeoutAsk\": \"10547.4\",\n \"type\": \"PRICE\",\n }\n {\n \"type\": \"HEARTBEAT\",\n \"time\": \"2016-10-17T12:25:37.447397298Z\"\n }\n {\n \"status\": \"tradeable\",\n \"asks\": [\n {\n \"price\": \"114.490\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"114.491\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"114.492\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"114.494\",\n \"liquidity\": 10000000\n }\n ],\n \"closeoutBid\": \"114.469\",\n \"bids\": [\n {\n \"price\": \"114.473\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"114.472\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"114.471\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"114.469\",\n \"liquidity\": 10000000\n }\n ],\n \"instrument\": \"EUR_JPY\",\n \"time\": \"2016-10-17T12:25:40.837289374Z\",\n \"closeoutAsk\": \"114.494\",\n \"type\": \"PRICE\",\n }\n {\n \"type\": \"HEARTBEAT\",\n \"time\": \"2016-10-17T12:25:42.447922336Z\"\n }\n {\n \"status\": \"tradeable\",\n \"asks\": [\n {\n \"price\": \"1.09966\",\n \"liquidity\": 10000000\n },\n {\n \"price\": \"1.09968\",\n \"liquidity\": 10000000\n }\n ],\n \"closeoutBid\": \"1.09949\",\n \"bids\": [\n {\n \"price\": \"1.09953\",\n \"liquidity\": 10000000\n },\n {\n \"price\": \"1.09951\",\n \"liquidity\": 10000000\n }\n ],\n \"instrument\": \"EUR_USD\",\n \"time\": \"2016-10-17T12:25:43.689619691Z\",\n \"closeoutAsk\": \"1.09970\",\n \"type\": \"PRICE\"\n }\n {\n \"status\": \"tradeable\",\n \"asks\": [\n {\n \"price\": \"114.486\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"114.487\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"114.488\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"114.490\",\n \"liquidity\": 10000000\n }\n ],\n \"closeoutBid\": \"114.466\",\n \"bids\": [\n {\n \"price\": \"114.470\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"114.469\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"114.468\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"114.466\",\n \"liquidity\": 10000000\n }\n ],\n \"instrument\": \"EUR_JPY\",\n \"time\": \"2016-10-17T12:25:43.635964725Z\",\n \"closeoutAsk\": \"114.490\",\n \"type\": \"PRICE\"\n }\n {\n \"status\": \"tradeable\",\n \"asks\": [\n {\n \"price\": \"10547.3\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10547.5\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10547.7\",\n \"liquidity\": 150\n }\n ],\n \"closeoutBid\": \"10546.9\",\n \"bids\": [\n {\n \"price\": \"10547.3\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10547.1\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10546.9\",\n \"liquidity\": 150\n }\n ],\n \"instrument\": \"DE30_EUR\",\n \"time\": \"2016-10-17T12:25:44.900162113Z\",\n \"closeoutAsk\": \"10547.7\",\n \"type\": \"PRICE\"\n }\n {\n \"status\": \"tradeable\",\n \"asks\": [\n {\n \"price\": \"10547.0\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10547.2\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10547.4\",\n \"liquidity\": 150\n }\n ],\n \"closeoutBid\": \"10546.6\",\n \"bids\": [\n {\n \"price\": \"10547.0\",\n \"liquidity\": 25\n },\n {\n \"price\": \"10546.8\",\n \"liquidity\": 75\n },\n {\n \"price\": \"10546.6\",\n \"liquidity\": 150\n }\n ],\n \"instrument\": \"DE30_EUR\",\n \"time\": \"2016-10-17T12:25:44.963539084Z\",\n \"closeoutAsk\": \"10547.4\",\n \"type\": \"PRICE\"\n }\n {\n \"status\": \"tradeable\",\n \"asks\": [\n {\n \"price\": \"114.491\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"114.492\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"114.493\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"114.495\",\n \"liquidity\": 10000000\n }\n ],\n \"closeoutBid\": \"114.471\",\n \"bids\": [\n {\n \"price\": \"114.475\",\n \"liquidity\": 1000000\n },\n {\n \"price\": \"114.474\",\n \"liquidity\": 2000000\n },\n {\n \"price\": \"114.473\",\n \"liquidity\": 5000000\n },\n {\n \"price\": \"114.471\",\n \"liquidity\": 10000000\n }\n ],\n \"instrument\": \"EUR_JPY\",\n \"time\": \"2016-10-17T12:25:45.586100087Z\",\n \"closeoutAsk\": \"114.495\",\n \"type\": \"PRICE\"\n }\n\nTop_\n\nAbout this software\n-------------------\nThe *oanda-api-v20* software is a personal project.\nI have no prior or existing relationship with OANDA.\n\nIf you have any questions regarding this software, please take a look at\nthe documentation first:\n\n * oandapyV20 : http://oanda-api-v20.readthedocs.io/en/latest/?badge=latest\n * OANDA developer docs : http://developer.oanda.com\n * examples : https://github.com/hootnot/oandapyV20-examples\n * Github: https://github.com/hootnot/oanda-api-v20 check the open and closed issues\n\nIf you still have questions/issues you can open an *issue* on Gitub: https://github.com/hootnot/oanda-api-v20", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/hootnot/oanda-api-v20", "keywords": "OANDA FOREX/CFD wrapper REST-V20 API", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "oandapyV20", "package_url": "https://pypi.org/project/oandapyV20/", "platform": "", "project_url": "https://pypi.org/project/oandapyV20/", "project_urls": { "Homepage": "http://github.com/hootnot/oanda-api-v20" }, "release_url": "https://pypi.org/project/oandapyV20/0.6.3/", "requires_dist": null, "requires_python": "", "summary": "Python wrapper for the OANDA REST-V20 API", "version": "0.6.3" }, "last_serial": 3764317, "releases": { "0.2.0": [ { "comment_text": "", "digests": { "md5": "00c21f0166fa34f162e55efe0c2b1577", "sha256": "0049d37be449e8539f6151d7c812cc21b0560eab7dc8255342adaf0689e4fec7" }, "downloads": -1, "filename": "oandapyV20-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "00c21f0166fa34f162e55efe0c2b1577", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 75897, "upload_time": "2016-11-15T17:41:39", "url": "https://files.pythonhosted.org/packages/b0/4b/007c40ffd94b5cf838b43a7b125d053c25ed2f2d281723f4bb67761d4d93/oandapyV20-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62b7e52e582db21d1ee3f6f368de72e7", "sha256": "2cb6b5c017fe52286546e0f4bc0999ce4bde3f1c9cbd73228baff20a77fdd627" }, "downloads": -1, "filename": "oandapyV20-0.2.0.tar.gz", "has_sig": false, "md5_digest": "62b7e52e582db21d1ee3f6f368de72e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40621, "upload_time": "2016-11-15T17:41:42", "url": "https://files.pythonhosted.org/packages/e2/83/380645407bb34103e7392ce124b819a6b44e11c66949c60caf53447f5ac2/oandapyV20-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "ae82e8f82d426673d9edea9e11931c7f", "sha256": "2ff78ea554ba5ee9136900ef976f11dfb0b6288fa299daea37df3f7cec2a4b3b" }, "downloads": -1, "filename": "oandapyV20-0.2.1.tar.gz", "has_sig": false, "md5_digest": "ae82e8f82d426673d9edea9e11931c7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36488, "upload_time": "2016-11-15T19:08:32", "url": "https://files.pythonhosted.org/packages/f1/18/f43d4995cb4004bde826addec980993b477a4845a921301317f73604ed92/oandapyV20-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "1b531be7757c2ad8095e58b280b23eb4", "sha256": "fbc09fa079b71d49cd44e1323582eb51cfff09f1aa6f6787801f3312e4f9ba7d" }, "downloads": -1, "filename": "oandapyV20-0.2.2.tar.gz", "has_sig": false, "md5_digest": "1b531be7757c2ad8095e58b280b23eb4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36813, "upload_time": "2016-11-17T14:45:49", "url": "https://files.pythonhosted.org/packages/a3/a2/aec8c0c0910a5706005bed32d835e60b689b285a55677ebc93bf6a0956d6/oandapyV20-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "098f344fca52aef4658f678cb4dc0bb7", "sha256": "8b79328ba4e43851e832a53b3691e22d6a4e6610c553b8dea78a83a1c7c3e768" }, "downloads": -1, "filename": "oandapyV20-0.2.3.tar.gz", "has_sig": false, "md5_digest": "098f344fca52aef4658f678cb4dc0bb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38871, "upload_time": "2017-04-17T18:38:13", "url": "https://files.pythonhosted.org/packages/6f/41/cf09e4115d38c4f0b31b95aae31c38b5ad0e20338a0a7677fd99ad21986f/oandapyV20-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "b8dec9e23fed76a1844d82ff6248f74b", "sha256": "87e5296053a91644b23e92ddfe9da2014ac4a756c00de8eab8b96342e9221b8e" }, "downloads": -1, "filename": "oandapyV20-0.2.4.tar.gz", "has_sig": false, "md5_digest": "b8dec9e23fed76a1844d82ff6248f74b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38901, "upload_time": "2017-05-15T09:17:11", "url": "https://files.pythonhosted.org/packages/23/34/90c29c570f0e874a2aeea9ec4e8fb36130c37c12d37f7a71ed996354ff59/oandapyV20-0.2.4.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "ea45262333aed07c1ffd7fa8cfa865b5", "sha256": "8de8b90c350f6048d080b5cd8b2f5580ec7a5c7a022579d3002c788d84ea009b" }, "downloads": -1, "filename": "oandapyV20-0.3.0.tar.gz", "has_sig": false, "md5_digest": "ea45262333aed07c1ffd7fa8cfa865b5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39876, "upload_time": "2017-06-28T11:49:31", "url": "https://files.pythonhosted.org/packages/0a/21/1b78affe904aaeed9651564ff07ed9cac4cf588a4f91b7a0c76bd842ede6/oandapyV20-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "5ff7c6b40e931ac566e8ee059cb4be23", "sha256": "9ce49a713c2ffb870c30cdcdbfcd06a17c5594ed0d98847e7ba53ae26021c1cc" }, "downloads": -1, "filename": "oandapyV20-0.4.0.tar.gz", "has_sig": false, "md5_digest": "5ff7c6b40e931ac566e8ee059cb4be23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44744, "upload_time": "2017-07-04T13:25:09", "url": "https://files.pythonhosted.org/packages/6d/4c/503f62c93d8da22c7cc92fe00bcff2650285c66357f3aefcb45a849b02e9/oandapyV20-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "66b7cb8bfb45fd9022c149b867fb14b0", "sha256": "5405813db18f4c39d619b00efc3e36b8163ac53edb7383049d08e3327d19f589" }, "downloads": -1, "filename": "oandapyV20-0.4.1.tar.gz", "has_sig": false, "md5_digest": "66b7cb8bfb45fd9022c149b867fb14b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45034, "upload_time": "2017-07-11T19:01:50", "url": "https://files.pythonhosted.org/packages/3c/e3/9465c92d3f23560035929edaa368344f8c841ef562dfd02475b31779e104/oandapyV20-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "e885659eec71a8c77c273c61910718cf", "sha256": "a62d23ab31a530e95ec2beae38c5ec170618e0f9af38bcdff0d0571ea86860f2" }, "downloads": -1, "filename": "oandapyV20-0.4.2.tar.gz", "has_sig": false, "md5_digest": "e885659eec71a8c77c273c61910718cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45034, "upload_time": "2017-07-24T08:59:24", "url": "https://files.pythonhosted.org/packages/b0/81/f7092ed5b5dabbaa314d12bc75b4c526da877619dae0c020e47c77e63fcb/oandapyV20-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "4c957f23e64e989c36153130f0f4fc29", "sha256": "897cc4447ad9c7c348902fbd27a375daeb0a6ed87d41512b3b8c7056d967a726" }, "downloads": -1, "filename": "oandapyV20-0.4.3.tar.gz", "has_sig": false, "md5_digest": "4c957f23e64e989c36153130f0f4fc29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44970, "upload_time": "2017-08-21T10:10:49", "url": "https://files.pythonhosted.org/packages/da/aa/182d8fcf970fd05b4f7da38e57a80e6fb4587d9744f76689d694918d03ff/oandapyV20-0.4.3.tar.gz" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "b6be3eaa58cf261b3caf89a01a3af5c0", "sha256": "15fe9aeabf8fdc9d75ec98b59b778e5663ed478bf237e771501db4bc24ff664e" }, "downloads": -1, "filename": "oandapyV20-0.4.4.tar.gz", "has_sig": false, "md5_digest": "b6be3eaa58cf261b3caf89a01a3af5c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44940, "upload_time": "2017-09-23T19:57:27", "url": "https://files.pythonhosted.org/packages/07/50/f054a62084df3fc3348c2effd69ed59b95a10567f917ec2c889d16e24e66/oandapyV20-0.4.4.tar.gz" } ], "0.4.5": [ { "comment_text": "", "digests": { "md5": "3ac3de33704f1aadcc630b2d44ba7a76", "sha256": "e497fc334dceba2253b0dc0b2065b5e089e3edcfd5563de94a615a27bc5d5761" }, "downloads": -1, "filename": "oandapyV20-0.4.5.tar.gz", "has_sig": false, "md5_digest": "3ac3de33704f1aadcc630b2d44ba7a76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44991, "upload_time": "2017-09-25T08:07:29", "url": "https://files.pythonhosted.org/packages/2b/b3/0efd0988a9092da51b71e5b9b22700acf4bdb045c1575040267d1f6b1dfc/oandapyV20-0.4.5.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "b8ae4e5e37c96dcc20a45085f0b990e0", "sha256": "ada36437390a9025c76dfed017f4dba3f85a4a2f5ab8197bc9ea3f5aed3d208b" }, "downloads": -1, "filename": "oandapyV20-0.5.0.tar.gz", "has_sig": false, "md5_digest": "b8ae4e5e37c96dcc20a45085f0b990e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48192, "upload_time": "2018-02-18T21:41:05", "url": "https://files.pythonhosted.org/packages/37/f5/4ad0e5754d7c335bf00b5748650967fd48abd5d9a1706d74ff9a6217ab2a/oandapyV20-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "2c07d48e776490d826e15183f11406e5", "sha256": "dd6bbd06685dc8bf062258dd034558058ad3f212bc6f963dbbe0c5ef76afc586" }, "downloads": -1, "filename": "oandapyV20-0.6.0.tar.gz", "has_sig": false, "md5_digest": "2c07d48e776490d826e15183f11406e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50791, "upload_time": "2018-03-07T10:11:52", "url": "https://files.pythonhosted.org/packages/ff/71/923d3d959baf9e2c0f55f5072a3725e4d691248b5befa4beb4112ebe8052/oandapyV20-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "1f548566cb2c71af05c3a1bcaf3e29f2", "sha256": "b5094516a502d85c1f1b0936f48975fefa87667f1da5114e3d0baa330ee7cfdf" }, "downloads": -1, "filename": "oandapyV20-0.6.1.tar.gz", "has_sig": false, "md5_digest": "1f548566cb2c71af05c3a1bcaf3e29f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51208, "upload_time": "2018-03-31T15:42:56", "url": "https://files.pythonhosted.org/packages/e9/a8/521937b037ad3e50e9231edcbba7dd06dba9958d7bf61206f2669fb91844/oandapyV20-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "41a8566cc2d0452c8c74b42c7949afd4", "sha256": "557afb0f3866767c4fa4568bad45758c957d3586dd12f89f9ff50628fa9cdc48" }, "downloads": -1, "filename": "oandapyV20-0.6.2.tar.gz", "has_sig": false, "md5_digest": "41a8566cc2d0452c8c74b42c7949afd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51266, "upload_time": "2018-04-07T12:12:49", "url": "https://files.pythonhosted.org/packages/07/78/c91a4e3fcecf63e4bab17e0d154b3584601c11c8a67e957b6f377f273314/oandapyV20-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "727bf68b7dc0b210efda048666a279a0", "sha256": "173a56b41ab3a19315c2fbea6f9aa3f0c17f64ba84acff014d072c64c1844b28" }, "downloads": -1, "filename": "oandapyV20-0.6.3.tar.gz", "has_sig": false, "md5_digest": "727bf68b7dc0b210efda048666a279a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52740, "upload_time": "2018-04-14T13:04:14", "url": "https://files.pythonhosted.org/packages/0d/d5/f69c978f485db3048886c447398e39c6ec18041e689656e6d31697ea4e7f/oandapyV20-0.6.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "727bf68b7dc0b210efda048666a279a0", "sha256": "173a56b41ab3a19315c2fbea6f9aa3f0c17f64ba84acff014d072c64c1844b28" }, "downloads": -1, "filename": "oandapyV20-0.6.3.tar.gz", "has_sig": false, "md5_digest": "727bf68b7dc0b210efda048666a279a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52740, "upload_time": "2018-04-14T13:04:14", "url": "https://files.pythonhosted.org/packages/0d/d5/f69c978f485db3048886c447398e39c6ec18041e689656e6d31697ea4e7f/oandapyV20-0.6.3.tar.gz" } ] }