This time I want to buy 50 USD_CAD contracts at the current market price
Procedure:
import requests
import json
url = 'https://api-fxpractice.oanda....'
instruments = 'USD_CAD'
account_id = 'cawa11' #Username
params = {'instruments':instruments ,'accountId':account_id}
access_token = 'a554db3a48ac8180a6996a5547ba1663-ac5947e64456cc5842a34f4ce05e4380'
headers = {'Authorization':'Bearer ' access_token}
r = requests.get(url,headers = headers , params=params )
price = r.json()
print(price)
url = 'https://api-fxpractice.oanda....' #5898545 is part of account 101-011-5898545-001
headers = {'Content-Type' : 'application/x- www-form-urlencoded','Authorization':'Bearer ' access_token}
data = {'instrument':'USD_CAD','accountId':'cawa11','units':50,'type':'market ','side':'buy'}
req = requests.post(url,data=data,headers=headers)
print(req.text)
print(req.json())
The second program error report:
{"code" : 4,"message" : "The access token provided does not allow this request to be made","moreInfo":"http://developer.oanda .com/docs/v1/auth/#overview"}
{'message': 'The access token provided does not allow this request to be made', 'moreInfo': 'http://developer.oanda.com /do...', 'code': 4}
But there is no problem with access token through the normal operation of the first program, and the error list in http://developer.oanda.com/do... Error list
HTTP狀態(tài)代碼 HTTP狀態(tài)消息 信息 詳細(xì)說明
4 401 擅自 提供不允許該請求的訪問令牌進(jìn)行 確保與請求提供的訪問令牌是正確的,是有效的。請參閱認(rèn)證以獲取更多細(xì)節(jié)。
Attached is a document from oanda company:
import http.client
import urllib
import json
import datetime
def checkAndTrade():
conn = httplib.HTTPSConnection("api-sandbox.oanda.com")
conn.request("GET", "/v1/prices?instruments=USD_CAD")
response = conn.getresponse()
resptext = response.read()
if response.status == 200:
data = json.loads(resptext)
if data['prices'][0]['ask'] > 0.994:
headers = {"Content-Type" : "application/x-www-form-urlencoded"}
params = urllib.urlencode({"instrument" : "USD_CAD",
"units" : 50,
"type" : 'market',
"side" : "buy"})
conn.request("POST", "/v1/accounts/8026346/orders", params, headers)
print(conn.getresponse().read())
else:
print(resptext)
def order():
now = datetime.datetime.now()
expire = now + datetime.timedelta(days=1)
expire = expire.isoformat('T') + "Z"
conn = httplib.HTTPSConnection("api-sandbox.oanda.com")
params = urllib.urlencode({"instrument": "USD_CAD",
"units" : 50,
"price" : 0.994,
"expiry" : expire,
"side" : "buy",
"type" : "limit"})
headers = {"Content-Type" : "application/x-www-form-urlencoded"}
conn.request("POST", "/v1/accounts/8026346/orders", params, headers)
print(conn.getresponse().read())
order()
checkAndTrade()
This program may be older and its api address is different from the current api address
Accounts have permission to read data, but may not have permission to place orders
The problems you have now are all related to things in the API. You should study the API documentation carefully, otherwise you will encounter countless similar problems in the future
Unless someone happens to be familiar with this API, I can’t give you any help
============================== =========
If you order and monitor from the website, you will find that your url and data are completely different from those of the website
import requests
access_token = '81e6f8b8ae23d2c0122cfee68cd26fc2-5681d2e539e0c8d01925bad19ff141f5'
url = 'https://api-fxpractice.oanda.com/v3/accounts/101-011-5898545-001/orders'
headers = {'Content-Type' : 'application/json','Authorization':'Bearer '+access_token}
data = {"order":{"instrument":"EUR_USD","type":"MARKET","units":"1"}}
req = requests.post(url,json=data,headers=headers)
print(req.text)
==================================================== ==================
@prolifes:
from vnoanda import OandaApi
if name == '__main__':
token = ''
accountId = ''
api = OandaApi()
api.DEBUG = True
api.init('practice', token, accountId)
# 獲取交易合約列表,通過
#api.getInstruments({'accountId': accountId})
# 獲取價(jià)格,通過
#api.getPrices({'instruments': 'EUR_USD'})
# 獲取歷史數(shù)據(jù),失敗
#api.getPriceHisory({'instrument': 'EUR_USD',
#'granularity': 'D',
#'candleFormat': 'midpoint',
#'count': '50'})
# 查詢用戶的所有賬戶,通過
#api.getAccounts()
# 查詢賬戶信息,通過
#api.getAccountInfo()
# 查詢委托數(shù)據(jù),通過
#api.getOrders({})
# 發(fā)送委托,通過
#api.sendOrder({'instrument': 'EUR_USD',
#'units': '10000',
#'side': 'buy',
#'type': 'market'})
# 查詢委托數(shù)據(jù),通過
#api.getOrderInfo('123')
# 修改委托,通過
#api.modifyOrder({'units': '10000',
#'side': 'buy',
#'type': 'market'}, '123')
# 撤銷委托,通過
#api.cancelOrder('123')
# 查詢所有持倉,通過
#api.getTrades({})
# 查詢持倉數(shù)據(jù),通過
#api.getTradeInfo('10125150909')
# 修改持倉,通過
#api.modifyTrade({'trailingStop': '150'}, '10125150909')
# 平倉,通過
#api.closeTrade('10125150909')
# 查詢匯總持倉,通過
#api.getPositions()
# 查詢匯總持倉細(xì)節(jié),通過
#api.getPositionInfo('EUR_USD')
# 平倉匯總持倉,通過
#api.closePosition('EUR_USD')
# 查詢賬戶資金變動,通過
#api.getTransactions({})
# 查詢資金變動信息,通過
#api.getTransactionInfo('10135713982')
# 查詢賬戶變動歷史,部分通過,某些情況下可能觸發(fā)JSONDecodeError
#api.getAccountHistory()
# 查詢財(cái)經(jīng)日歷,通過
#api.getCalendar({'period': '604800'})
# 查詢歷史持倉比,通過
#api.getPositionRatios({'instrument': 'EUR_USD',
#'period': '604800'})
# 查詢歷史價(jià)差,通過
#api.getSpreads({'instrument': 'EUR_USD',
#'period': '604800'})
# 查詢交易商持倉,通過
#api.getCommitments({'instrument': 'EUR_USD'})
# 查詢訂單簿,通過
#api.getOrderbook({'instrument': 'EUR_USD',
#'period': '604800'})
# 查詢Autochartist,失敗,OANDA服務(wù)器報(bào)錯
#api.getAutochartist({'instrument': 'EUR_USD'})
# 阻塞
input()
import json
import requests
from Queue import Queue, Empty
from threading import Thread
API_SETTING = {}
API_SETTING['practice'] = {'rest': 'https://api-fxpractice.oanda.com','stream': 'https://stream-fxpractice.oan...'}
API_SETTING['trade'] = {'rest': 'https://api-fxtrade.oanda.com','stream': 'https://stream-fxtrade.oanda....'}
FUNCTIONCODE_GETINSTRUMENTS = 0
FUNCTIONCODE_GETPRICES = 1
FUNCTIONCODE_GETPRICEHISTORY = 2
FUNCTIONCODE_GETACCOUNTS = 3
FUNCTIONCODE_GETACCOUNTINFO = 4
FUNCTIONCODE_GETORDERS = 5
FUNCTIONCODE_SENDORDER = 6
FUNCTIONCODE_GETORDERINFO = 7
FUNCTIONCODE_MODIFYORDER = 8
FUNCTIONCODE_CANCELORDER = 9
FUNCTIONCODE_GETTRADES = 10
FUNCTIONCODE_GETTRADEINFO = 11
FUNCTIONCODE_MODIFYTRADE= 12
FUNCTIONCODE_CLOSETRADE = 13
FUNCTIONCODE_GETPOSITIONS = 14
FUNCTIONCODE_GETPOSITIONINFO= 15
FUNCTIONCODE_CLOSEPOSITION = 16
FUNCTIONCODE_GETTRANSACTIONS = 17
FUNCTIONCODE_GETTRANSACTIONINFO = 18
FUNCTIONCODE_GETACCOUNTHISTORY = 19
FUNCTIONCODE_GETCALENDAR = 20
FUNCTIONCODE_GETPOSITIONRATIOS = 21
FUNCTIONCODE_GETSPREADS = 22
FUNCTIONCODE_GETCOMMIMENTS = 23
FUNCTIONCODE_GETORDERBOOK = 24
FUNCTIONCODE_GETAUTOCHARTIST = 25
FUNCTIONCODE_STREAMPRICES = 26
FUNCTIONCODE_STREAMEVENTS = 27
class OandaApi(object):
""""""
DEBUG = False
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
self.token = ''
self.accountId = ''
self.headers = {}
self.restDomain = ''
self.streamDomain = ''
self.session = None
self.functionSetting = {}
self.active = False # API的工作狀態(tài)
self.reqID = 0 # 請求編號
self.reqQueue = Queue() # 請求隊(duì)列
self.reqThread = Thread(target=self.processQueue) # 請求處理線程
self.streamPricesThread = Thread(target=self.processStreamPrices) # 實(shí)時(shí)行情線程
self.streamEventsThread = Thread(target=self.processStreamEvents) # 實(shí)時(shí)事件線程(成交等)
#----------------------------------------------------------------------
def init(self, settingName, token, accountId):
"""初始化接口"""
self.restDomain = API_SETTING[settingName]['rest']
self.streamDomain = API_SETTING[settingName]['stream']
self.session = requests.Session()
self.token = token
self.accountId = accountId
self.headers['Authorization'] = 'Bearer ' + self.token
self.initFunctionSetting(FUNCTIONCODE_GETINSTRUMENTS, {'path': '/v1/instruments',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETPRICES, {'path': '/v1/prices',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETPRICEHISTORY, {'path': '/v1/candles',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETACCOUNTS, {'path': '/v1/accounts',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETACCOUNTINFO, {'path': '/v1/accounts/%s' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETORDERS, {'path': '/v1/accounts/%s/orders' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_SENDORDER, {'path': '/v1/accounts/%s/orders' %self.accountId,
'method': 'POST'})
self.initFunctionSetting(FUNCTIONCODE_GETORDERINFO, {'path': '/v1/accounts/%s/orders' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_MODIFYORDER, {'path': '/v1/accounts/%s/orders' %self.accountId,
'method': 'PATCH'})
self.initFunctionSetting(FUNCTIONCODE_CANCELORDER, {'path': '/v1/accounts/%s/orders' %self.accountId,
'method': 'DELETE'})
self.initFunctionSetting(FUNCTIONCODE_GETTRADES, {'path': '/v1/accounts/%s/trades' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETTRADEINFO, {'path': '/v1/accounts/%s/trades' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_MODIFYTRADE, {'path': '/v1/accounts/%s/trades' %self.accountId,
'method': 'PATCH'})
self.initFunctionSetting(FUNCTIONCODE_CLOSETRADE, {'path': '/v1/accounts/%s/trades' %self.accountId,
'method': 'DELETE'})
self.initFunctionSetting(FUNCTIONCODE_GETPOSITIONS, {'path': '/v1/accounts/%s/positions' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETPOSITIONINFO, {'path': '/v1/accounts/%s/positions' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_CLOSEPOSITION, {'path': '/v1/accounts/%s/positions' %self.accountId,
'method': 'DELETE'})
self.initFunctionSetting(FUNCTIONCODE_GETTRANSACTIONS, {'path': '/v1/accounts/%s/transactions' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETTRANSACTIONINFO, {'path': '/v1/accounts/%s/transactions' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETACCOUNTHISTORY, {'path': '/v1/accounts/%s/alltransactions' %self.accountId,
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETCALENDAR, {'path': '/labs/v1/calendar',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETPOSITIONRATIOS, {'path': '/labs/v1/historical_position_ratios',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETSPREADS, {'path': '/labs/v1/spreads',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETCOMMIMENTS, {'path': '/labs/v1/commitments',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETORDERBOOK, {'path': '/labs/v1/orderbook_data',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETAUTOCHARTIST, {'path': '/labs/v1/autochartist',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_GETAUTOCHARTIST, {'path': '/labs/v1/autochartist',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_STREAMPRICES, {'path': '/v1/prices',
'method': 'GET'})
self.initFunctionSetting(FUNCTIONCODE_STREAMEVENTS, {'path': '/v1/events',
'method': 'GET'})
self.active = True
self.reqThread.start()
self.streamEventsThread.start()
self.streamPricesThread.start()
#----------------------------------------------------------------------
def exit(self):
"""退出接口"""
if self.active:
self.active = False
self.reqThread.join()
#----------------------------------------------------------------------
def initFunctionSetting(self, code, setting):
"""初始化API功能字典"""
self.functionSetting[code] = setting
#----------------------------------------------------------------------
def processRequest(self, req):
"""發(fā)送請求并通過回調(diào)函數(shù)推送數(shù)據(jù)結(jié)果"""
url = req['url']
method = req['method']
params = req['params']
stream = False
if 'stream' in req:
stream = req['stream']
if method in ['GET', 'DELETE']:
myreq = requests.Request(method, url, headers=self.headers, params=params)
elif method in ['POST', 'PATCH']:
myreq = requests.Request(method, url, headers=self.headers, data=params)
pre = myreq.prepare()
r = None
error = None
try:
r = self.session.send(pre, stream=stream)
except Exception, e:
error = e
return r, error
#----------------------------------------------------------------------
def processQueue(self):
"""處理請求隊(duì)列中的請求"""
while self.active:
try:
req = self.reqQueue.get(block=True, timeout=1) # 獲取請求的阻塞為一秒
callback = req['callback']
reqID = req['reqID']
r, error = self.processRequest(req)
if r:
try:
data = r.json()
if self.DEBUG:
print callback.__name__
callback(data, reqID)
except Exception, e:
self.onError(str(e), reqID)
else:
self.onError(error, reqID)
except Empty:
pass
#----------------------------------------------------------------------
def sendRequest(self, code, params, callback, optional=''):
"""發(fā)送請求"""
setting = self.functionSetting[code]
url = self.restDomain + setting['path']
if optional:
url = url + '/' + optional
self.reqID += 1
req = {'url': url,
'method': setting['method'],
'params': params,
'callback': callback,
'reqID': self.reqID}
self.reqQueue.put(req)
return self.reqID
#----------------------------------------------------------------------
def onError(self, error, reqID):
"""錯誤信息回調(diào)"""
print error, reqID
#----------------------------------------------------------------------
def getInstruments(self, params):
"""查詢可交易的合約列表"""
return self.sendRequest(FUNCTIONCODE_GETINSTRUMENTS, params, self.onGetInstruments)
#----------------------------------------------------------------------
def onGetInstruments(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getPrices(self, params):
"""查詢價(jià)格"""
return self.sendRequest(FUNCTIONCODE_GETPRICES, params, self.onGetPrices)
#----------------------------------------------------------------------
def onGetPrices(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getPriceHisory(self, params):
"""查詢歷史價(jià)格數(shù)據(jù)"""
return self.sendRequest(FUNCTIONCODE_GETPRICEHISTORY, params, self.onGetPriceHistory)
#----------------------------------------------------------------------
def onGetPriceHistory(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getAccounts(self):
"""查詢用戶的所有賬戶"""
return self.sendRequest(FUNCTIONCODE_GETACCOUNTS, {}, self.onGetAccounts)
#----------------------------------------------------------------------
def onGetAccounts(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getAccountInfo(self):
"""查詢賬戶數(shù)據(jù)"""
return self.sendRequest(FUNCTIONCODE_GETACCOUNTINFO, {}, self.onGetAccountInfo)
#----------------------------------------------------------------------
def onGetAccountInfo(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getOrders(self, params):
"""查詢所有委托"""
return self.sendRequest(FUNCTIONCODE_GETORDERS, params, self.onGetOrders)
#----------------------------------------------------------------------
def onGetOrders(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def sendOrder(self, params):
"""發(fā)送委托"""
return self.sendRequest(FUNCTIONCODE_SENDORDER, params, self.onSendOrder)
#----------------------------------------------------------------------
def onSendOrder(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getOrderInfo(self, optional):
"""查詢委托信息"""
return self.sendRequest(FUNCTIONCODE_GETORDERINFO, {}, self.onGetOrderInfo, optional)
#----------------------------------------------------------------------
def onGetOrderInfo(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def modifyOrder(self, params, optional):
"""修改委托"""
return self.sendRequest(FUNCTIONCODE_MODIFYORDER, params, self.onModifyOrder, optional)
#----------------------------------------------------------------------
def onModifyOrder(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def cancelOrder(self, optional):
"""查詢委托信息"""
return self.sendRequest(FUNCTIONCODE_CANCELORDER, {}, self.onCancelOrder, optional)
#----------------------------------------------------------------------
def onCancelOrder(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getTrades(self, params):
"""查詢所有倉位"""
return self.sendRequest(FUNCTIONCODE_GETTRADES, params, self.onGetTrades)
#----------------------------------------------------------------------
def onGetTrades(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getTradeInfo(self, optional):
"""查詢倉位信息"""
return self.sendRequest(FUNCTIONCODE_GETTRADEINFO, {}, self.onGetTradeInfo, optional)
#----------------------------------------------------------------------
def onGetTradeInfo(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def modifyTrade(self, params, optional):
"""修改倉位"""
return self.sendRequest(FUNCTIONCODE_MODIFYTRADE, params, self.onModifyTrade, optional)
#----------------------------------------------------------------------
def onModifyTrade(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def closeTrade(self, optional):
"""平倉"""
return self.sendRequest(FUNCTIONCODE_CLOSETRADE, {}, self.onCloseTrade, optional)
#----------------------------------------------------------------------
def onCloseTrade(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getPositions(self):
"""查詢所有匯總倉位"""
return self.sendRequest(FUNCTIONCODE_GETPOSITIONS, {}, self.onGetPositions)
#----------------------------------------------------------------------
def onGetPositions(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getPositionInfo(self, optional):
"""查詢匯總倉位信息"""
return self.sendRequest(FUNCTIONCODE_GETPOSITIONINFO, {}, self.onGetPositionInfo, optional)
#----------------------------------------------------------------------
def onGetPositionInfo(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def closePosition(self, optional):
"""平倉匯總倉位信息"""
return self.sendRequest(FUNCTIONCODE_CLOSEPOSITION, {}, self.onClosePosition, optional)
#----------------------------------------------------------------------
def onClosePosition(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getTransactions(self, params):
"""查詢所有資金變動"""
return self.sendRequest(FUNCTIONCODE_GETTRANSACTIONS, params, self.onGetTransactions)
#----------------------------------------------------------------------
def onGetTransactions(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getTransactionInfo(self, optional):
"""查詢資金變動信息"""
return self.sendRequest(FUNCTIONCODE_GETTRANSACTIONINFO, {}, self.onGetTransactionInfo, optional)
#----------------------------------------------------------------------
def onGetTransactionInfo(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getAccountHistory(self):
"""查詢賬戶資金變動歷史"""
return self.sendRequest(FUNCTIONCODE_GETACCOUNTHISTORY, {}, self.onGetAccountHistory)
#----------------------------------------------------------------------
def onGetAccountHistory(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getCalendar(self, params):
"""查詢?nèi)諝v"""
return self.sendRequest(FUNCTIONCODE_GETCALENDAR, params, self.onGetCalendar)
#----------------------------------------------------------------------
def onGetCalendar(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getPositionRatios(self, params):
"""查詢持倉比例"""
return self.sendRequest(FUNCTIONCODE_GETPOSITIONRATIOS, params, self.onGetPositionRatios)
#----------------------------------------------------------------------
def onGetPositionRatios(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getSpreads(self, params):
"""查詢所有倉位"""
return self.sendRequest(FUNCTIONCODE_GETSPREADS, params, self.onGetSpreads)
#----------------------------------------------------------------------
def onGetSpreads(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getCommitments(self, params):
"""查詢交易商持倉情況"""
return self.sendRequest(FUNCTIONCODE_GETCOMMIMENTS, params, self.onGetCommitments)
#----------------------------------------------------------------------
def onGetCommitments(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getOrderbook(self, params):
"""查詢訂單簿"""
return self.sendRequest(FUNCTIONCODE_GETORDERBOOK, params, self.onGetOrderbook)
#----------------------------------------------------------------------
def onGetOrderbook(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def getAutochartist(self, params):
"""查詢Autochartist識別的模式"""
return self.sendRequest(FUNCTIONCODE_GETAUTOCHARTIST, params, self.onGetAutochartist)
#----------------------------------------------------------------------
def onGetAutochartist(self, data, reqID):
"""回調(diào)函數(shù)"""
print data, reqID
#----------------------------------------------------------------------
def onPrice(self, data):
"""行情推送"""
print data
#----------------------------------------------------------------------
def onEvent(self, data):
"""事件推送(成交等)"""
print data
#----------------------------------------------------------------------
def processStreamPrices(self):
"""獲取價(jià)格推送"""
# 首先獲取所有合約的代碼
setting = self.functionSetting[FUNCTIONCODE_GETINSTRUMENTS]
req = {'url': self.restDomain + setting['path'],
'method': setting['method'],
'params': {'accountId': self.accountId}}
r, error = self.processRequest(req)
if r:
try:
data = r.json()
symbols = [d['instrument'] for d in data['instruments']]
except Exception, e:
self.onError(e, -1)
return
else:
self.onError(error, -1)
return
# 然后訂閱所有的合約行情
setting = self.functionSetting[FUNCTIONCODE_STREAMPRICES]
params = {'accountId': self.accountId,
'instruments': ','.join(symbols)}
req = {'url': self.streamDomain + setting['path'],
'method': setting['method'],
'params': params,
'stream': True}
r, error = self.processRequest(req)
if r:
for line in r.iter_lines():
if line:
try:
msg = json.loads(line)
if self.DEBUG:
print self.onPrice.__name__
self.onPrice(msg)
except Exception, e:
self.onError(e, -1)
if not self.active:
break
else:
self.onError(error, -1)
#----------------------------------------------------------------------
def processStreamEvents(self):
"""獲取事件推送"""
setting = self.functionSetting[FUNCTIONCODE_STREAMEVENTS]
req = {'url': self.streamDomain + setting['path'],
'method': setting['method'],
'params': {},
'stream': True}
r, error = self.processRequest(req)
if r:
for line in r.iter_lines():
if line:
try:
msg = json.loads(line)
if self.DEBUG:
print self.onEvent.__name__
self.onEvent(msg)
except Exception, e:
self.onError(e, -1)
if not self.active:
break
else:
self.onError(error, -1)