oanda rest-v20 api的python包装器

oandapyV20的Python项目详细描述


截至2018年3月,OANDA不再支持v1 rest-api。唯一悬而未决的 v20端点是forexlabs端点。而不是启动forexlabs 作为v20端点,oanda选择从v1支持此端点 rest接口,请参见:http://developer.oanda.com/rest-live-v20/forexlabs-ep/

BuildDocumentation StatusCode HealthCoveragePypiCodacy

支持的Python版本:

Python2.73.33.43.53.6Pypy
oanda-api-v20YESYESYESYESYESYES

交互式

Jupyter

使用jupyternotebook很容易使用 oandapyv20库。

安装

$ pip install oandapyV20

或者github的最新开发版本:

$ pip install git+https://github.com/hootnot/oanda-api-v20.git

如果要运行测试,请克隆存储库:

$ git clone https://github.com/hootnot/oanda-api-v20
$ cd oanda-api-v20

# install necessary packages for testing
$ grep "\- pip install" .travis.yml |
> whileread LNE
> do`echo$LNE| cut -c2-`;done

$ python setup.py test
$ python setup.py install

示例见https://github.com/hootnot/oandapyV20-examples 储存库。

设计

在V20库中,端点表示为从 APIRequest基类。每个端点组(帐户、交易等)都有表示 由它自己的(抽象的)类覆盖该组的所有端点的功能。该组中的每个端点都由派生自 抽象类。

Top

客户

V20库有一个处理APIRequest对象的客户机类(API)。

Top

共同请求

contrib.request包提供了一种简单的方法 为ordercreate端点的data参数构造数据 或者tradecrcdo(创建/替换/取消相关订单)。

mktOrder=MarketOrderRequest(instrument="EUR_USD",units=10000,takeProfitOnFill=TakeProfitDetails(price=1.10).data,stopLossOnFill=StopLossDetails(price=1.07).data).datainsteadof:
mktOrder={'order':{'timeInForce':'FOK','instrument':'EUR_USD','positionFill':'DEFAULT','units':'10000','type':'MARKET','takeProfitOnFill':{'timeInForce':'GTC','price':'1.10000'}}'stopLossOnFill':{'timeInForce':'GTC','price':'1.07000'}}}

Top

贡献工厂

contrib.factories模块提供了一种简单的方法 生成请求。 下载历史数据限制为每次请求5000条记录。这个 意味着您必须在更改参数的情况下连续发出请求 如果你想要5000多张唱片。

instrumentScandlesFactory通过生成对您的请求来解决这个问题, 示例:

importsysimportjsonfromoandapyV20.contrib.factoriesimportInstrumentsCandlesFactoryfromoandapyV20importAPIaccess_token="..."client=API(access_token=access_token)_from=sys.argv[1]_to=sys.argv[2]gran=sys.argv[3]instr=sys.argv[4]params={"granularity":gran,"from":_from,"to":_to}defcnv(r,h):forcandleinr.get('candles'):ctime=candle.get('time')[0:19]try:rec="{time},{complete},{o},{h},{l},{c},{v}".format(time=ctime,complete=candle['complete'],o=candle['mid']['o'],h=candle['mid']['h'],l=candle['mid']['l'],c=candle['mid']['c'],v=candle['volume'],)exceptExceptionase:print(e,r)else:h.write(rec+"\n")withopen("/tmp/{}.{}.out".format(instr,gran),"w")asO:forrinInstrumentsCandlesFactory(instrument=instr,params=params):print("REQUEST: {} {} {}".format(r,r.__class__.__name__,r.params))rv=client.request(r)cnv(r.response,O)

运行此命令时:

$ python oandahist.py 2017-01-01T00:00:00Z 2017-06-30T00:00:00Z H4 EUR_USD
REQUEST: v3/instruments/EUR_USD/candles InstrumentsCandles
{'to': '2017-03-25T08:00:00Z',
 'from': '2017-01-01T00:00:00Z', 'granularity': 'H4'}
REQUEST: v3/instruments/EUR_USD/candles InstrumentsCandles
{'to': '2017-06-16T20:00:00Z', 'from': '2017-03-25T12:00:00Z',
 'granularity': 'H4'}
REQUEST: v3/instruments/EUR_USD/candles InstrumentsCandles
{'to': '2017-06-30T00:00:00Z', 'from': '2017-06-17T00:00:00Z',
 'granularity': 'H4'}

输出显示它处理了三个instrumentscandles请求。这个 数据可在/tmp/eur戋usd.h4.out

$ tail /tmp/EUR_USD.H4.out
...
2017-06-28T01:00:0,True,1.13397,1.13557,1.13372,1.13468,1534
2017-06-28T05:00:0,True,1.13465,1.13882,1.13454,1.13603,8486
2017-06-28T09:00:0,True,1.13606,1.13802,1.12918,1.13315,12815
2017-06-28T13:00:0,True,1.13317,1.13909,1.13283,1.13781,13255
2017-06-28T17:00:0,True,1.13783,1.13852,1.13736,1.13771,2104
2017-06-28T21:00:0,True,1.13789,1.13894,1.13747,1.13874,1454

Top

示例

API端点访问

importjsonfromoandapyV20importAPI# the clientimportoandapyV20.endpoints.tradesastradesaccess_token="..."accountID="..."client=API(access_token=access_token)# request trades listr=trades.TradesList(accountID)rv=client.request(r)print("RESPONSE:\n{}".format(json.dumps(rv,indent=2)))

Top

marketordertakeprofitorderstoplossorder

放置在一起
importjsonfromoandapyV20.contrib.requestsimportMarketOrderRequestfromoandapyV20.contrib.requestsimportTakeProfitDetails,StopLossDetailsimportoandapyV20.endpoints.ordersasordersimportoandapyV20fromexampleauthimportexampleAuthaccountID,access_token=exampleAuth()api=oandapyV20.API(access_token=access_token)# EUR_USD (today 1.0750)EUR_USD_STOP_LOSS=1.07EUR_USD_TAKE_PROFIT=1.10mktOrder=MarketOrderRequest(instrument="EUR_USD",units=10000,takeProfitOnFill=TakeProfitDetails(price=EUR_USD_TAKE_PROFIT).data,stopLossOnFill=StopLossDetails(price=EUR_USD_STOP_LOSS).data)# create the OrderCreate requestr=orders.OrderCreate(accountID,data=mktOrder.data)try:# create the OrderCreate requestrv=api.request(r)exceptoandapyV20.exceptions.V20Erroraserr:print(r.status_code,err)else:print(json.dumps(rv,indent=2))

Top

处理一系列请求

现在也可以通过将不同的请求存储在 数组或来自某个“请求工厂”类。下面是一个数组示例:

importjsonfromoandapyV20importAPI# the clientfromoandapyV20.exceptionsimportV20ErrorimportoandapyV20.endpoints.accountsasaccountsimportoandapyV20.endpoints.tradesastradesimportoandapyV20.endpoints.pricingaspricingaccess_token="..."accountID="..."client=API(access_token=access_token)# list of requestslor=[]# request trades listlor.append(trades.TradesList(accountID))# request accounts listlor.append(accounts.AccountList())# request pricing infoparams={"instruments":"DE30_EUR,EUR_GBP"}lor.append(pricing.PricingInfo(accountID,params=params))forrinlor:try:rv=client.request(r)# put request and response in 1 JSON structureprint("{}".format(json.dumps({"request":"{}".format(r),"response":rv},indent=2)))exceptV20Errorase:print("OOPS: {:d} {:s}".format(e.code,e.msg))

输出

{"request":"v3/accounts/101-004-1435156-001/trades","response":{"lastTransactionID":"1109","trades":[{"unrealizedPL":"23.0000","financing":"-0.5556","state":"OPEN","price":"10159.4","realizedPL":"0.0000","currentUnits":"-10","openTime":"2016-07-22T16:47:04.315211198Z","initialUnits":"-10","instrument":"DE30_EUR","id":"1105"},{"unrealizedPL":"23.0000","financing":"-0.5556","state":"OPEN","price":"10159.4","realizedPL":"0.0000","currentUnits":"-10","openTime":"2016-07-22T16:47:04.141436468Z","initialUnits":"-10","instrument":"DE30_EUR","id":"1103"}]}}{"request":"v3/accounts","response":{"accounts":[{"tags":[],"id":"101-004-1435156-002"},{"tags":[],"id":"101-004-1435156-001"}]}}{"request":"v3/accounts/101-004-1435156-001/pricing","response":{"prices":[{"status":"tradeable","quoteHomeConversionFactors":{"negativeUnits":"1.00000000","positiveUnits":"1.00000000"},"asks":[{"price":"10295.1","liquidity":25},{"price":"10295.3","liquidity":75},{"price":"10295.5","liquidity":150}],"unitsAvailable":{"default":{"short":"60","long":"100"},"reduceOnly":{"short":"0","long":"20"},"openOnly":{"short":"60","long":"0"},"reduceFirst":{"short":"60","long":"100"}},"closeoutBid":"10293.5","bids":[{"price":"10293.9","liquidity":25},{"price":"10293.7","liquidity":75},{"price":"10293.5","liquidity":150}],"instrument":"DE30_EUR","time":"2016-09-29T17:07:19.598030528Z","closeoutAsk":"10295.5"},{"status":"tradeable","quoteHomeConversionFactors":{"negativeUnits":"1.15679152","positiveUnits":"1.15659083"},"asks":[{"price":"0.86461","liquidity":1000000},{"price":"0.86462","liquidity":2000000},{"price":"0.86463","liquidity":5000000},{"price":"0.86465","liquidity":10000000}],"unitsAvailable":{"default":{"short":"624261","long":"624045"},"reduceOnly":{"short":"0","long":"0"},"openOnly":{"short":"624261","long":"624045"},"reduceFirst":{"short":"624261","long":"624045"}},"closeoutBid":"0.86442","bids":[{"price":"0.86446","liquidity":1000000},{"price":"0.86445","liquidity":2000000},{"price":"0.86444","liquidity":5000000},{"price":"0.86442","liquidity":10000000}],"instrument":"EUR_GBP","time":"2016-09-29T17:07:19.994271769Z","closeoutAsk":"0.86465","type":"PRICE"}]}}

Top

流式处理终结点

流式报价:使用pricingstream.pricingstream。 流式事务:使用transactions.transactionsEvents。

要从流中提取流数据,请使用以下模式:

importjsonfromoandapyV20importAPIfromoandapyV20.exceptionsimportV20ErrorfromoandapyV20.endpoints.pricingimportPricingStreamaccountID="..."access_token="..."api=API(access_token=access_token,environment="practice")instruments="DE30_EUR,EUR_USD,EUR_JPY"s=PricingStream(accountID=accountID,params={"instruments":instruments})try:n=0forRinapi.request(s):print(json.dumps(R,indent=2))n+=1ifn>10:s.terminate("maxrecs received: {}".format(MAXREC))exceptV20Errorase:print("Error: {}".format(e))

查看“examples”目录以获取更详细的示例。

输出

{"status":"tradeable","asks":[{"price":"10547.0","liquidity":25},{"price":"10547.2","liquidity":75},{"price":"10547.4","liquidity":150}],"closeoutBid":"10546.6","bids":[{"price":"10547.0","liquidity":25},{"price":"10546.8","liquidity":75},{"price":"10546.6","liquidity":150}],"instrument":"DE30_EUR","time":"2016-10-17T12:25:28.158741026Z","closeoutAsk":"10547.4","type":"PRICE",}{"type":"HEARTBEAT","time":"2016-10-17T12:25:37.447397298Z"}{"status":"tradeable","asks":[{"price":"114.490","liquidity":1000000},{"price":"114.491","liquidity":2000000},{"price":"114.492","liquidity":5000000},{"price":"114.494","liquidity":10000000}],"closeoutBid":"114.469","bids":[{"price":"114.473","liquidity":1000000},{"price":"114.472","liquidity":2000000},{"price":"114.471","liquidity":5000000},{"price":"114.469","liquidity":10000000}],"instrument":"EUR_JPY","time":"2016-10-17T12:25:40.837289374Z","closeoutAsk":"114.494","type":"PRICE",}{"type":"HEARTBEAT","time":"2016-10-17T12:25:42.447922336Z"}{"status":"tradeable","asks":[{"price":"1.09966","liquidity":10000000},{"price":"1.09968","liquidity":10000000}],"closeoutBid":"1.09949","bids":[{"price":"1.09953","liquidity":10000000},{"price":"1.09951","liquidity":10000000}],"instrument":"EUR_USD","time":"2016-10-17T12:25:43.689619691Z","closeoutAsk":"1.09970","type":"PRICE"}{"status":"tradeable","asks":[{"price":"114.486","liquidity":1000000},{"price":"114.487","liquidity":2000000},{"price":"114.488","liquidity":5000000},{"price":"114.490","liquidity":10000000}],"closeoutBid":"114.466","bids":[{"price":"114.470","liquidity":1000000},{"price":"114.469","liquidity":2000000},{"price":"114.468","liquidity":5000000},{"price":"114.466","liquidity":10000000}],"instrument":"EUR_JPY","time":"2016-10-17T12:25:43.635964725Z","closeoutAsk":"114.490","type":"PRICE"}{"status":"tradeable","asks":[{"price":"10547.3","liquidity":25},{"price":"10547.5","liquidity":75},{"price":"10547.7","liquidity":150}],"closeoutBid":"10546.9","bids":[{"price":"10547.3","liquidity":25},{"price":"10547.1","liquidity":75},{"price":"10546.9","liquidity":150}],"instrument":"DE30_EUR","time":"2016-10-17T12:25:44.900162113Z","closeoutAsk":"10547.7","type":"PRICE"}{"status":"tradeable","asks":[{"price":"10547.0","liquidity":25},{"price":"10547.2","liquidity":75},{"price":"10547.4","liquidity":150}],"closeoutBid":"10546.6","bids":[{"price":"10547.0","liquidity":25},{"price":"10546.8","liquidity":75},{"price":"10546.6","liquidity":150}],"instrument":"DE30_EUR","time":"2016-10-17T12:25:44.963539084Z","closeoutAsk":"10547.4","type":"PRICE"}{"status":"tradeable","asks":[{"price":"114.491","liquidity":1000000},{"price":"114.492","liquidity":2000000},{"price":"114.493","liquidity":5000000},{"price":"114.495","liquidity":10000000}],"closeoutBid":"114.471","bids":[{"price":"114.475","liquidity":1000000},{"price":"114.474","liquidity":2000000},{"price":"114.473","liquidity":5000000},{"price":"114.471","liquidity":10000000}],"instrument":"EUR_JPY","time":"2016-10-17T12:25:45.586100087Z","closeoutAsk":"114.495","type":"PRICE"}

Top

关于此软件

oanda-api-v20软件是一个个人项目。 我和OANDA之间没有任何关系。

如果您对本软件有任何疑问,请查看 首先是文档:

如果您还有问题,可以在gitub上打开一个issuehttps://github.com/hootnot/oanda-api-v20

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法启动应用程序:JNLP错误   java根据用户输入在PreparedStatement中使用setTime()或setNull()   java EJB与同步   java以object为键通过hashmap进行搜索   java中的模10^9+7   针对包含其他对象的对象的java OOP最佳实践   如何将字符串作为HTML代码从Java文件读取到JSP页面?   java我的POM怎么了?“解析表达式..检测到递归表达式循环”   用于Hbase的Mapreduce的java NoSuchMethodError   JAVAlang.SecurityException:权限拒绝:启动意图{act=安卓.Intent.action.MAIN cat=[安卓.Intent.category.LAUNCHER]   数组初始化谜语Java   通过arraylist搜索时的java句柄关联